Вопросы на собеседовании: Фронтенд-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.
Смотреть пример резюме: Фронтенд-разработчик →Вопросы
Я отношусь к этому как к решению на основе данных, а не погоне за трендом.
- Сопоставляю реальные боли команды с тем, что фреймворк действительно решает, а не с его маркетингом.
- Строю небольшой прототип на самых рискованных точках интеграции; измеряю размер сборки, производительность в рантайме и удобство для разработчиков.
- Представляю эти данные вместе со стоимостью миграции, временем на обучение и зрелостью экосистемы.
- Если числа не оправдывают смену однозначно, улучшаю текущий стек инкрементально.
Зачем это спрашивают: Интервьюер хочет видеть структурированный процесс принятия решений в условиях неопределённости, а не энтузиазм по поводу новизны. Слабый ответ перечисляет преимущества фреймворка, сильный показывает воспроизводимый процесс оценки.
Я применил миграцию по паттерну strangler fig, которая шла параллельно обычной доставке.
- Новые фичи писались в целевой архитектуре, а общий адаптерный слой позволял старому и новому коду сосуществовать.
- Оба варианта работали параллельно за feature flag, поэтому QA независимо проверял каждый перенесённый раздел.
- За шесть месяцев все критические пути были перенесены, после чего адаптерный слой удалили.
- Доставка фич не останавливалась, потому что ни один спринт не был заблокирован миграцией.
Зачем это спрашивают: Старшие разработчики должны управлять риском миграции, не замораживая продуктовый роадмап. Интервьюер проверяет знание паттернов инкрементальной миграции и кросс-командной координации.
Я предпочитаю композицию вместо конфигурации и проектирую вокруг реальных потребителей.
- Строю небольшие сфокусированные примитивы, которые пользователи собирают, а не один компонент с тридцатью пропсами.
- Беру первые два-три реальных потребителя как источник проектирования и выделяю общие интерфейсы в типы.
- Оставляю escape-hatches вроде renderProp или slot, чтобы потребители переопределяли поведение без форка.
- Прячу внутреннюю реализацию за стабильным публичным интерфейсом, чтобы рефакторить внутренности без поломки вызывающих сторон.
Зачем это спрашивают: Тест на качество проектирования API. Интервьюер отличает разработчиков, думающих о компоненте с точки зрения потребителя, от тех, кто оптимизирует первоначальную реализацию.
Я подбираю стратегию рендеринга под контент каждого роута, а не одну на всё приложение.
- SSR подходит для часто меняющегося, персонализированного контента, но добавляет серверные расходы и сложность кеширования.
- SSG выигрывает для в основном стабильного контента, потому что переносит работу на сборку и даёт очень быстрый TTFB.
- CSR хорош для аутентифицированных дашбордов, где SEO не важен, но ухудшает первую загрузку.
Зачем это спрашивают: Старшие разработчики принимают решения по рендерингу на уровне роута, а не приложения. Интервьюер проверяет понимание последствий каждого подхода для производительности, SEO и эксплуатации.
Я задаю конкретные числа, принуждаю их в CI и фиксирую обоснование.
- Определяю жёсткие лимиты, например 200 КБ сжатого начального JS-бандла и LCP менее 2,5 секунды на среднем устройстве.
- Встраиваю эти числа в CI, чтобы pull request, превышающий бюджет, не проходил сборку.
- Фиксирую обоснование в общем ADR, чтобы команды понимали, зачем существует лимит.
- Раз в квартал пересматриваю пороги по мере развития продукта.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат превращать цели производительности в применимые инженерные практики, а не просто намерения.
Event loop выполняет по одной задаче, затем опустошает микрозадачи перед рендерингом, и это определяет, как я планирую работу.
- Длинные синхронные задачи блокируют loop и делают страницу неотзывчивой.
- Разбиваю дорогие вычисления на части через requestIdleCallback или scheduler.postTask.
- Откладываю некритичную работу в микрозадачи через Promise.resolve.
- Избегаю синхронных чтений и записей в DOM в одной задаче, чтобы не вызывать layout thrashing.
Зачем это спрашивают: Вопрос разграничивает разработчиков, использовавших инструменты профилирования, от тех, кто понимает, почему браузер ведёт себя именно так, что критично для диагностики тонкого джанка.
Я закладываю доступность с самого начала через ARIA Authoring Practices и тестирование на реальных скринридерах.
- Начинаю с ARIA Authoring Practices, чтобы определить ожидаемую навигацию по клавишам и семантику ролей для каждого паттерна.
- Каждому интерактивному компоненту задаю контракт управления фокусом: куда он попадает при открытии и закрытии.
- Тестирую сначала только с клавиатурой, затем с VoiceOver и NVDA, потому что спецификация ARIA и реальные браузеры расходятся.
- Требования к доступности вношу в story каждого компонента в Storybook как критерии приёмки, а не как отдельный аудит.
Зачем это спрашивают: Доступность, это дисциплина проектирования и разработки, а не чек-лист. Интервьюер проверяет, закладывает ли кандидат её с самого начала или рассматривает как посмертную задачу.
Я раскладываю состояние по категориям и держу границы чёткими; библиотека важна меньше, чем эта дисциплина.
- Серверный кеш идёт в React Query или SWR, глобальное UI-состояние в Zustand или минимальный Context, локальное эфемерное в useState.
- Чёткие границы предотвращают синхронизацию серверных данных в глобальный стор с ручным управлением устареванием.
- Производное состояние вычисляю, а не храню, что устраняет целые классы багов синхронизации.
Зачем это спрашивают: Интервьюер проверяет, проектирует ли кандидат архитектуру состояния или просто берёт Redux по привычке. Сильный ответ называет конкретные компромиссы между категориями.
Я строго следую semantic versioning и делаю любой breaking change легко усваиваемым.
- Любое удаление пропа или изменение поведения, это мажорный bump.
- В предыдущем минорном релизе отправляю deprecation-уведомление с кодмодом там, где это возможно.
- Веду CHANGELOG с руководствами по миграции, а не просто дифф.
- Для больших команд провожу office-hours сессию, чтобы потребители задали вопросы до апгрейда.
Зачем это спрашивают: Тест на то, воспринимает ли кандидат поддержку библиотеки как продуктовую ответственность, а не просто кодовую задачу. Коммуникация и поддержка миграции так же важны, как и техническое изменение.
Я нахожу причину до любого исправления, двигаясь от профайлера вглубь.
- Начинаю в браузерном профайлере, чтобы понять, где узкое место: JavaScript, layout/paint или сеть.
- Если в JavaScript, открываю React DevTools Profiler, чтобы найти, что перерендеривается и почему.
- Типичные виновники: inline-объекты или функции, отсутствие мемоизации дорогих значений, или контекст, рассылающий обновления слишком многим потребителям.
- Исправляю причину, а не обматываю всё в memo как заплатку.
Зачем это спрашивают: Интервьюер хочет видеть систематический диагностический процесс, а не список оптимизационных трюков. Слабый ответ сразу предлагает memo или useMemo без измерений.
Я использую трёхуровневую систему токенов из единого источника истины.
- Примитивные токены кодируют сырые значения вроде цветов и отступов; семантические токены отображаются на роли вроде background-primary; компонентные ссылаются на семантические.
- Темы меняют только семантический слой, так что тёмная тема переопределяет семантические токены, а примитивы остаются неизменными.
- Токены генерирую из одного источника, обычно Figma Variables или JSON-схемы.
- Распространяю их как CSS custom properties или платформенные константы через автоматизированный шаг сборки.
Зачем это спрашивают: Тест на понимание архитектуры токенов, а не просто их использования. Трёхуровневая структура и разделение примитивных от семантических, ключевое понимание.
Я делю по роутам и лениво гружу тяжёлые зависимости, опираясь на анализ бандла.
- Анализирую бандл с webpack-bundle-analyzer, чтобы найти крупные зависимости, не нужные на начальном роуте.
- React.lazy и Suspense разделяют каждый роут в отдельный чанк.
- Тяжёлые сторонние библиотеки вроде библиотеки графиков прячу за dynamic import внутри использующего их компонента.
- Слежу за раздуванием общих чанков: если каждый роут тянет одну большую вендорную библиотеку, пересматриваю ленивую загрузку или замену.
Зачем это спрашивают: Code splitting хорошо известен, но старшие разработчики объясняют шаг анализа и граничные случаи, а не только API React.lazy.
E2E держу тонкими, детерминированными и только для критических флоу.
- Ограничиваю E2E критическими флоу вроде аутентификации и оформления заказа; остальное покрываю более быстрыми юнит- и интеграционными тестами.
- Запускаю каждый тест против детерминированного окружения с засеянными данными, чтобы он не зависел от внешних сервисов.
- Проверяю только наблюдаемые результаты, никогда детали реализации.
- Нестабильные тесты немедленно карантинизирую, потому что известные падения приучают команду игнорировать красные сборки.
Зачем это спрашивают: Интервьюер проверяет, уважает ли кандидат пирамиду тестирования и понимает, для чего E2E тесты подходят лучше всего.
Мои главные инструменты, документация с видимыми доказательствами и превращение правильного пути в путь по умолчанию.
- Чтобы продвинуть accessibility-first работу, я провёл двухчасовой воркшоп с реальными демо скринридеров, затем опубликовал краткое руководство в общей вики.
- Сделал соответствие лёгким, добавив ESLint jsx-a11y правила в общий конфиг, так что правильный путь стал путём по умолчанию.
- Отслеживал принятие неформально и отмечал команды, выпускавшие доступные компоненты.
- Это создало социальный импульс без обязательных требований.
Зачем это спрашивают: Влияние на уровне senior, организационное, а не только техническое. Интервьюер проверяет, использует ли кандидат системное мышление для изменения дефолтов, а не только убеждение.
Я работаю с каждой метрикой отдельно и отслеживаю их через реальный пользовательский мониторинг, а не только Lighthouse.
- Для LCP предзагружаю главное изображение через link rel=preload, подаю в современном формате вроде AVIF и никогда не гружу лениво.
- Для CLS резервирую явные размеры каждого изображения и embed и избегаю вставки динамического контента над существующим.
- Для INP профилирую длинные задачи во время взаимодействий и разбиваю их или откладываю некритичную работу.
- Отслеживаю все три в реальном пользовательском мониторинге, потому что лабораторные и полевые оценки часто расходятся.
Зачем это спрашивают: Тест на глубину знания Core Web Vitals. Слабый ответ перечисляет три метрики; сильный описывает конкретные вмешательства для каждой и различает лабораторное и полевое измерение.
Я приоритизирую долг по масштабу ущерба и стоимости исправления сейчас против позже.
- Долг в горячем пути, блокирующий доставку или несущий риски безопасности и доступности, устраняю в текущем квартале.
- Изолированный, хорошо понятый долг, дорожающий незначительно, документирую в бэклоге с чётким триггером срочности.
- Сопротивляюсь кампаниям по долгу в отрыве от продуктовой работы, потому что они редко завершаются и вызывают болезненное переключение контекста.
Зачем это спрашивают: Интервьюер проверяет, принимает ли кандидат прагматичные решения о компромиссах, а не относится ко всему техническому долгу как к одинаково срочному или одинаково откладываемому.
Инстинкт на граничные случаи я вырабатываю через повторение, а не одну лекцию.
- Разбираю конкретный PR вместе, прося их вслух описывать своё мышление.
- Пробел обычно не в знаниях, а в привычке спрашивать, что может пойти не так, до написания счастливого пути.
- Даю структурированное упражнение по отладке на основе прошлого баг-репорта, чтобы выработать этот инстинкт.
- В последующих ревью указываю на упущенный граничный случай и прошу тест до мержа.
Зачем это спрашивают: Интервьюер ищет конкретные стратегии наставничества, а не общие заявления о терпении или обратной связи. Хороший ответ описывает поведенческий цикл, а не разовый разговор.
Cascade layers дают управляемую иерархию специфичности через правило @layer.
- Стили в слое, объявленном позже, побеждают более ранние слои, а стили вне слоёв по умолчанию побеждают любые слоёные.
- Это управляет приоритетом без хаков специфичности через лишние селекторы или !important.
- Использую слои при интеграции стороннего reset или UI-библиотеки, помещая их стили в низкоприоритетный слой.
- Так мои стили компонентов всегда побеждают без посекторальных переопределений.
Зачем это спрашивают: Тест на знание современного CSS. Ключевое понимание, связь между порядком объявления и приоритетом слоя, и преимущество перед традиционным управлением специфичностью.
Micro-frontends решают автономию команд и независимый деплой, а не производительность.
- Рекомендую их только когда несколько команд действительно нуждаются в независимом деплое и координация в монорепо вызывает измеримые проблемы.
- Цена реальна: дублирование бандла, конфликты общих зависимостей, сложность интеграционного тестирования и оверхед оркестрации.
- Для трёх-пяти фронтенд-разработчиков хорошо организованное монорепо с чёткими границами владения даёт ту же автономию без операционной сложности.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат, что micro-frontends, это организационное решение, а не архитектурная оптимизация, и умеет ли объяснить, когда цена не оправдана.
Пайплайн идёт поэтапно с гейтами и держится под восемью минутами.
- Этапы: установка и кеш зависимостей, проверка типов, юнит- и интеграционные тесты, сборка, визуальная регрессия через Chromatic или Percy, деплой на preview-URL.
- Каждый этап должен пройти перед следующим.
- Preview-деплои автоматичны на каждый pull request, чтобы рецензенты проверяли UI без локальной проверки кода.
- Main автоматически деплоится в staging; продакшн-продвижение требует ручного подтверждения.
Зачем это спрашивают: Интервьюер хочет видеть конкретный дизайн пайплайна с мнениями о скорости и ручных воротах, а не общее описание того, что такое CI/CD.
Закрытые вопросы
- 21
Как вы подходите к интернационализации в большом React-приложении, включая поддержку RTL-раскладки?
reacti18nsoft-skills - 22
Что такое виртуальный DOM и каковы его реальные ограничения производительности?
domvirtual-domperformance - 23
Как бы вы реализовали оптимистичные обновления UI и откат при ошибке серверного запроса?
locking - 24
Объясните, как реализовать виртуализированный список для эффективного рендера десятков тысяч строк.
virtualization - 25
Как вы подходите к безопасности во фронтенд-коде, в частности к XSS и CSRF?
xsscsrf - 26
Как вы пишете TypeScript-типы, которые действительно помогают, а не просто заглушают компилятор?
typescript - 27
Каков ваш процесс ревью pull request от менее опытного разработчика?
code-reviewconcurrency - 28
Опишите, как работает module federation и какие проблемы он решает в распределённой фронтенд-архитектуре.
distributedfederation - 29
Как вы управляете feature flags во фронтенд-приложении в масштабе?
soft-skillsfeature-flags - 30
Объясните разницу между useMemo, useCallback и React.memo и когда каждый из них реально стоит использовать.
react - 31
Как бы вы спроектировали функцию совместного редактирования в реальном времени, например общий документ, в React-приложении?
react - 32
Что делает настройку монорепо хорошей для кодовой базы с большим объёмом фронтенда и каковы типичные режимы отказа?
monorepo - 33
Как вы подходите к тестированию React-компонентов, зависящих от сложного асинхронного поведения?
reactcomponentsasync - 34
Опишите пайплайн рендеринга браузера от парсинга HTML до пикселей на экране.
htmlrendering - 35
Как вы балансируете быстрый выпуск с поддержанием качества кода под давлением продукта?
- 36
Объясните разницу между аутентификацией и авторизацией в контексте фронтенда и как вы обрабатываете оба аспекта.
auth - 37
Как бы вы настроили отслеживание ошибок и мониторинг для продакшн-фронтенда?
monitoring - 38
Что такое спецификация CSS containment и как она улучшает производительность рендеринга?
cssperformance - 39
Как вы оцениваете новый инструмент или библиотеку и вводите её в стек команды?
decision-making - 40
Опишите, как вы реализуете надёжную систему форм со сложной валидацией и динамическими полями.
formssystem-designvalidation - 41
Как вы структурируете организацию папок и модулей во фронтенд-приложении для долгосрочной поддерживаемости?
structure - 42
Каковы компромиссы между использованием GraphQL и REST для продукта с большим объёмом фронтенда?
restgraphql - 43
Как вы подходите к веб-производительности для мобильных пользователей на медленных сетях?
performance - 44
Объясните, как реализовать бесконечную прокрутку с хорошей производительностью и доступностью.
a11yperformance - 45
Как вы обрабатываете нормализацию данных на фронтенде и почему это важно?
soft-skillsnormalization - 46
Как вы сообщаете о техническом риске нетехническим стейкхолдерам?
communication - 47
В чём разница между layout, paint и composite в рендеринге браузера и почему это важно для анимаций?
rendering - 48
Как вы мигрируете большое приложение с JavaScript на TypeScript, не блокируя команду?
typescriptjavascript - 49
Как вы обеспечиваете согласованное поведение в браузерах и устройствах для продакшн-приложения?
- 50
Опишите случай, когда выпущенная вами фича имела неожиданный негативный эффект и как вы с этим справились.
- 51
Как вы подходите к документированию библиотеки компонентов так, чтобы другие разработчики реально использовали документацию?
components - 52
Как работает сборщик мусора JavaScript и как неправильный выбор структур данных может вызывать утечки памяти в браузерном приложении?
memorygcjavascript - 53
Как вы подходите к написанию общих утилит, которые реально переиспользуемы без превращения в кладовку?
- 54
Объясните разницу между гидратацией и рендерингом в Next.js-приложении и типичные ловушки.
hydrationnextjs - 55
Как вы обрабатываете CSS-in-JS в масштабе и когда рекомендовали бы против него?
soft-skillscss - 56
Какова ваша стратегия по поддержанию зависимостей в актуальном состоянии без поломки продакшна?
dependencies - 57
Как вы используете web workers для улучшения производительности в браузерном приложении?
web-workerperformance - 58
Опишите, как вы создали бы сложный интерфейс drag-and-drop, работающий и для пользователей клавиатуры.
types - 59
Как вы подходите к progressive enhancement versus graceful degradation в современной фронтенд-разработке?
- 60
Как вы обрабатываете состояния загрузки и skeleton screens без создания layout shift?
soft-skillsuxweb-vitals - 61
Каков ваш опыт работы с Web Components и как они соотносятся с React-компонентами?
reactcomponents - 62
Как вы структурируете аналитику и отслеживание событий во фронтенд-приложении, чтобы поддерживать его обслуживаемость?
- 63
Как бы вы реализовали поддержку офлайн в веб-приложении с помощью service workers?
service-worker - 64
Опишите ваш опыт ведения архитектурного решения во фронтенде, имевшего долгосрочное влияние на команду.
architecture - 65
Как вы проектируете стратегию обработки ошибок для фронтенд-приложения?
design - 66
Что такое принципы SOLID и как они применяются к проектированию компонентов фронтенда?
designsolidcomponents - 67
Как вы подходите к A/B тестированию на уровне фронтенда без создания проблем с производительностью?
testing - 68
Как вы обрабатываете устаревшие API браузера или функции, которые удаляются?
soft-skillsapi - 69
Опишите вашу стратегию наблюдаемости фронтенда за пределами отслеживания ошибок.
observability - 70
Как вы справляетесь с задачей поддержания согласованности стилей общих компонентов, когда команды кастомизируют их локально?
soft-skillscomponents - 71
Что наиболее важно для вас при погружении в незнакомую кодовую базу фронтенда?
onboarding - 72
Как вы подходите к оптимизации производительности анимаций на устройствах низкого класса?
optimization - 73
Как вы проектируете слой получения данных во фронтенд-приложении для его тестируемости и поддерживаемости?
design - 74
Опишите, как заголовки Content Security Policy улучшают безопасность приложения и как их настраивать без поломки функциональности.
cspconfig - 75
Как вы обеспечиваете масштабирование процесса code review в команде при её росте?
code-reviewconcurrency - 76
В чём разница между оптимистичной и пессимистичной блокировкой и как эти концепции применяются к конкурентному редактированию во фронтенде?
lockingconcurrency - 77
Как вы оцениваете влияние нового компонента на доступность перед его выпуском?
componentsa11ydecision-making - 78
Как вы подходите к созданию фронтенда для мультитенантного SaaS-продукта, где у каждого тенанта может быть разный брендинг?
multi-tenancy - 79
Каковы компромиссы монорепо против полирепо для многокомандной фронтенд-организации?
monorepo - 80
Как вы обрабатываете очень большие наборы данных во фронтенде, например экспорт или рендер десятков тысяч записей?
soft-skills - 81
Как concurrent mode в React меняет ваше мышление о рендеринге и получении данных?
reactconcurrency - 82
Как вы структурируете CSS для большого приложения, избегая конфликтов специфичности и глобального загрязнения стилями?
css - 83
Каков ваш подход к парному программированию с разработчиком, имеющим очень другой стиль кодирования?
- 84
Объясните, как вы бы реализовали систему плагинов во фронтенд-приложении.
system-design - 85
Как вы проверяете, что ваши UI-изменения безопасны для выпуска, помимо запуска тест-сьюта?
validation - 86
Как вы безопасно управляете переменными окружения в Next.js-приложении?
nextjsconfig - 87
Каков ваш подход к интернационализации форматирования дат, времени и чисел в разных локалях?
i18n - 88
Как вы справляетесь с задачей поддержания синхронизации библиотеки компонентов Storybook с реальными компонентами приложения?
componentsstorybooksoft-skills - 89
Опишите, как вы бы спроектировали поток аутентификации для Next.js-приложения с использованием JWT.
nextjsauth - 90
Как вы подходите к написанию документации технического решения, чтобы будущие инженеры понимали контекст и могли оспорить его при необходимости?
documentation - 91
Что такое Suspense для получения данных и как он меняет проектирование компонентов?
componentsreactdesign - 92
Как вы обрабатываете загрузку сторонних скриптов без блокировки основного рендеринга страницы?
soft-skills - 93
Как вы обрабатываете длительные фоновые задачи во фронтенде, например генерацию большого отчёта?
soft-skills - 94
Каков ваш подход к версионированию публичной библиотеки UI-компонентов?
componentsversioning - 95
Как вы выявляете и устраняете риск выгорания у себя и коллег?
wellbeing - 96
В чём разница между структурной и номинальной типизацией и как TypeScript обрабатывает каждую?
typescript - 97
Как вы подходите к планированию мощности и оценке трудозатрат для сложного фронтенд-проекта?
capacity - 98
Как вы справляетесь с задачей согласованного кросс-платформенного поведения при общей кодовой базе React Native и React web?
soft-skillsreact - 99
Каков ваш процесс устаревания и удаления компонента из внутренней дизайн-системы?
componentsdesign-systemsystem-design - 100
Как вы думаете о компромиссе между опытом разработчика и опытом конечного пользователя при выборе инструментов и абстракций?