Video Thumbnail

Frontend собеседование в Wildberries на 400к \\ React умирает

Даниил Лаптев01:04:30
https://www.youtube.com/watch?v=HF7zkpSrByE

Содержание

Краткое резюме

  • Собеседование проходило в несколько этапов, включая техническое интервью по JavaScript, разбор теоретических концепций и практическое задание с написанием мини-библиотеки, похожей на jQuery.
  • Основное внимание уделялось пониманию Event Loop, микротасков и макротасков, работе браузерного рендеринга, а также особенностям HTTP-протоколов, CORS и WebSocket.
  • Обсуждался выбор фронтенд-фреймворка: React, Vue, Angular, Svelte, включая плюсы и минусы каждого. Было выделено, что архитектура и поддержка кода важнее личных предпочтений.
  • Важное место занимала тема масштабируемой архитектуры приложений и ограничений React, в частности проблема с отсутствием жестких архитектурных паттернов и вопросы производительности.
  • Завершилось собеседование вопросами по внутренним процессам компании и положительной обратной связью.

Техническое интервью: JavaScript и Event Loop 🔄

Собеседование началось с задачи на понимание работы Event Loop и порядка выполнения микротасков и макротасков в браузере. Было подробно рассмотрено:

  • Stack — стек вызовов синхронного JavaScript-кода.
  • Микротаски (microtasks) — промисы, обработчики промисов, queueMicrotask(). Они имеют приоритет над макротасками.
  • Макротаски (macrotasks) — таймеры (setTimeout, setInterval), пользовательские события.

Объяснено, что:

«Цикл event loop не завершится, пока не выполнены все микротаски из очереди, после чего выполняется одна макротаска за тик.»

Приведены примеры сложных сценариев, где новая микротаска возникает в процессе выполнения макротаски, и объяснён порядок их обработки. В ходе задания был разобран код с асинхронными вызовами, промисами и таймерами.


Рендеринг страницы в браузере 🎨

Соискателю предложили описать процесс от момента загрузки HTML и ресурсов до отображения страницы пользователю:

  1. Парсинг HTML в DOM.
  2. Подгрузка дополнительных ресурсов (CSS, JS).
  3. Построение CSSOM (дерева стилей).
  4. Формирование Render Tree — объединение DOM и CSSOM.
  5. Этапы рендеринга:
    • Layout (Reflow) — вычисление размеров и расположения элементов.
    • Painting — раскрашивание пикселей на экране.
    • Работа со слоями (например, использование z-index, анимации).

Обсуждались оптимизации, в частности:

  • Минимизация reflow (layout) — самая ресурсоёмкая операция.
  • Использование CSS-свойств, не вызывающих перерисовку и layout, например, transform: translateX(), для плавных анимаций.

Работа со скриптами и загрузкой ресурсов 🛠️

Обсудили особенности загрузки JavaScript:

  • Порядок загрузки скриптов в HTML и потенциал блокировки разметки.
  • Атрибуты async и defer:
    • async — загрузка асинхронная, порядок не гарантируется, скрипт выполняется сразу после загрузки.
    • defer — загрузка асинхронная, но скрипты выполняются в порядке следования, после парсинга HTML.

Указано, что с асинхронными скриптами стоит быть аккуратным, если в них предполагаются манипуляции с DOM, так как DOM может быть ещё не доступен.


Протокол HTTP и CORS 🌐

Вторая теоретическая часть была посвящена протоколу HTTP:

  • Основные методы запросов: GET, POST, PUT, DELETE, PATCH, OPTIONS.
  • Различия между HTTP и HTTPS — HTTPS обеспечивает шифрование и безопасность за счёт SSL/TLS и двойного рукопожатия.
  • Версии HTTP (1.x, 2, 3) — новые версии повышают производительность за счёт параллелизма загрузки, сокращения рекнектов.

Объяснена структура запроса, включая заголовки и тело запроса, а также статус-коды:

  • 1xx — информационные
  • 2xx — успешные (например, 200 OK)
  • 3xx — редиректы
  • 4xx — ошибки запросов клиента (например, 404)
  • 5xx — ошибки сервера

Рассматривались особенности работы с телом запроса в GET (технически тело нежелательно) и POST.

Тема CORS (Cross-Origin Resource Sharing) освещалась как политика безопасности браузеров, запрещающая делать запросы между разными доменами без специального разрешения сервера через заголовки, например:

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Methods

Процесс включал предзапрос OPTIONS (preflight) для проверки разрешений.


WebSocket — двунаправленное соединение 💬

Обсуждался протокол WebSocket как решение для постоянных открытых двунаправленных соединений между клиентом и сервером:

  • Позволяет серверу активно отправлять данные клиенту без необходимости постоянных запросов (polling).
  • Используется, например, в чатах, стриминге данных.
  • Минусы — ресурсоёмкость соединения и сложности с балансировкой нагрузки на сервере.

Были упомянуты перспективы новых протоколов в HTTP/3, которые могут упростить подобные сценарии.


Выбор фронтенд-фреймворка: React, Vue, Angular, Svelte ⚛️

Обсуждение перешло к выбору фреймворков:

  • React — лидер на рынке, но отмечаются проблемы с архитектурой и производительностью.

    «Основная проблема React — это отсутствие единой архитектуры и низкая скорость, поскольку нет компиляции в нативный код, всё обрабатывается через Babel в runtime.»

  • Vue — набирает популярность, отмечается удобство и рост удовлетворённости разработчиков.

  • Angular — имеет жёсткую и проверенную архитектуру, что упрощает масштабирование и поддержку больших проектов.

  • Svelte — компилируется в нативный JS, обещает высокую производительность и компактный код.

Было подчеркнуто, что выбор зависит от команды и опыта разработчиков, а не личных предпочтений. Важен стандарт и поддерживаемость проекта.

Отмечена роль архитектуры и контроля:

«В Angular из коробки есть устойчивые архитектурные паттерны, а в React каждый пишет, как хочет — это создаёт большие трудности при масштабировании.»

Обсуждался опыт проектирования архитектурных приложений, в том числе создание собственного стейт-менеджера на базе эффектора, имитация механизмов Angular через декораторы в React.


Современные тенденции в фронтенде и языке TypeScript ⚙️

  • TypeScript активно развивается, компилятор теперь переписывается на Go для повышения производительности.
  • Планируется глубокая интеграция статической типизации на уровне языка JS.
  • Это позволит упростить отладку и масштабирование проектов, отказаться от «натягивания» типизации на чистый JS.

«JavaScript — язык с большими ограничениями и устаревшим наследием, его сложно улучшать из-за обратной совместимости.»

Появляются новые инструменты и языки, расширяющие возможности фронтенд-разработки.


Практическое задание: реализация mini jQuery 💻

В практическом блоке нужно было реализовать функцию $(), которая:

  • Возвращала объект-обёртку над коллекцией DOM-элементов, выбранных по селектору.
  • Поддерживала методы для работы с классами (addClass, removeClass, toggleClass).
  • Позволяла изменять CSS свойства с сохранением существующих значений.
  • Предусматривала чейнинг — последовательный вызов методов, возвращающих текущий объект.

Рассматривались архитектурные вопросы:

  • Работа с коллекцией элементов, а не с одним узлом.
  • Реализация класса-контейнера с нужными методами.
  • Оптимизация передачи стилей через объект и итерация по ключам.

Было отмечено, что решение с классами и методами — best practice для подобных задач.


Внутренние процессы и особенности работы в компании 🏢

Обсуждался подход в компании к работе:

  • Создание проектов с нуля — даёт свободу и ответственность.
  • Возможность перехода между командами, гибкий обмен опытом.
  • В команде много различных сервисов: видеостриминг, таблицы, графики, формы — разнообразие технологий и задач.

«Свобода разработки даёт невероятное чувство удовлетворения, но за неё надо нести ответственность.»

Отдельно отмечена важность задавать вопросы на собеседовании, чтобы лучше понимать команду и продукт.


Вывод

Это собеседование полноценно охватило современные важные темы фронтенд-разработки: от глубокого понимания JavaScript async-механизмов и браузерного рендеринга до сетевых протоколов и архитектурных стратегий. Практическое задание показало способность кандидата к осознанному построению удобного и расширяемого кода, близкого по стилю к известным библиотекам.

Обсуждение выбора технологий и подходов к масштабированию приложений показало зрелый взгляд, признающий технические ограничения и преимущества каждого решения, вместе с пониманием важности командного стандарта и архитектуры.

Это интервью послужит хорошим ориентиром для разработчиков, которые стремятся понять глубже фронтенд и особенности работы в сильной команде. 🚀