Разбор собеседования
Собеседование на Frontend-разработчика: вопросы, ответы и разбор
Собеседование фронтенд-разработчика редко ограничивается одним разговором. Обычно это несколько этапов подряд: скрининг, техническое интервью с вопросами по JavaScript, CSS и фреймворку, живое решение задачи на созвоне и часто ещё тестовое задание дома. Особенность роли в том, что теорию проверяют вместе с практикой прямо во время встречи: вас просят написать код на экране, объяснить, почему выбрано именно такое решение, или найти баг в чужом фрагменте. Интервьюер смотрит не только на знания, но и на то, как вы рассуждаете вслух, задаёте ли уточняющие вопросы про требования и что делаете, когда решение не складывается сразу. Отдельно оценивают, различаете ли вы задачи фронтенда и бэкенда: как договариваетесь о контракте API, что делаете с ошибками сети, как ведёт себя интерфейс во время загрузки.
Пройдите собеседование с ИИ по этой профессии
ИИ задаст вопросы по роли «Frontend-разработчик», выслушает ответы голосом и покажет, где не хватило фактов. Первый персональный разбор бесплатно, без регистрации.
Пройти собеседование с ИИДолжность подставится автоматически. Резюме и описание вакансии можно не загружать.
Как обычно проходит встреча
Скрининг с рекрутеромот 20 до 30 минут
Обсуждают стек, опыт, формат занятости, ожидания по зарплате и причины поиска работы. Технических деталей мало, но обычно спрашивают, с каким фреймворком и какой версией вы работали последний год, есть ли опыт с TypeScript и приходилось ли поддерживать легаси-код.
Техническое интервьюот 45 до 60 минут
Разработчик или тимлид спрашивает про механику JavaScript, вёрстку, работу выбранного фреймворка, взаимодействие с API, состояние приложения и производительность. Часто просят разобрать фрагмент кода на экране или объяснить, как бы вы реализовали конкретный компонент и почему именно так.
Live-coding или практическая задачаот 45 до 90 минут
Нужно написать код прямо на созвоне: реализовать функцию вроде debounce или группировки данных, собрать компонент с запросом и состояниями загрузки и ошибки, исправить баг в готовом фрагменте. Оценивают, уточняете ли вы требования до начала, проверяете ли граничные случаи и как объясняете ход мыслей.
Тестовое заданиенесколько дней на выполнение
Дают не всегда, но для многих вакансий просят сделать небольшое приложение на стеке компании: список с фильтрацией, форма с валидацией, работа с публичным API. Смотрят на структуру проекта, читаемость компонентов, обработку ошибок и пустых состояний, наличие хотя бы базовых тестов и понятный README с командами запуска.
Финальное интервью с руководителемот 30 до 40 минут
Обсуждают результаты тестового, задачи команды, процессы код-ревью и релизов, формат работы и условия оффера. Здесь чаще спрашивают про мотивацию, работу со сроками и опыт взаимодействия с дизайнером, бэкендом и продактом, а не про синтаксис.
Что на самом деле оценивают
Понимание JavaScript на уровне механизмов
Работодателю важно, что вы понимаете, как работает язык: замыкания, прототипы, контекст вызова, event loop с микрозадачами и макрозадачами, приведение типов. Это отличает разработчика, который сможет разобраться в чужом асинхронном коде и найти причину плавающего бага, от того, кто подбирает решение по шаблонам со Stack Overflow.
Опыт с фреймворком и его экосистемой
Проверяют глубину, а не факт использования React, Vue или Angular: понимаете ли вы правила хуков и что происходит при обновлении состояния, как работает реактивность, где хранить состояние и как избегать лишних перерисовок. Спрашивают и про экосистему: роутинг, работа с серверными данными, формы и валидация, сборщик.
Владение вёрсткой и CSS
Несмотря на фреймворки и готовые библиотеки компонентов, ценят тех, кто может сверстать адаптивный интерфейс руками: понимает специфичность селекторов, разницу flexbox и grid, поведение position и overflow, работу с контекстом наложения. От этого зависит скорость исправления визуальных багов и качество кастомных компонентов, которых нет в библиотеке.
Командная работа и код-ревью
Смотрят, умеете ли вы читать чужой код, оставлять конкретные комментарии в ревью вместо оценок, спокойно принимать замечания и договариваться с бэкендом о контракте API и форматах ошибок. Фронтенд почти никогда не работает изолированно, поэтому это проверяют на примерах из вашей практики.
Внимание к производительности и загрузке
Проверяют, задумываетесь ли вы о размере бандла, лишних ре-рендерах, количестве запросов и скорости отрисовки первого экрана, умеете ли пользоваться профайлером и Lighthouse. Медленный интерфейс заметен пользователю сразу, а починить его вслепую, без замеров, обычно не получается.
Умение объяснять технические решения
Оценивают, сможете ли вы понятно рассказать дизайнеру или продакту, почему предложенная анимация тормозит на слабых устройствах, почему задача с виду простая, а времени займёт больше, и какие есть варианты решения с разной ценой. Это влияет на то, доверят ли вам общение с командой напрямую.
Вопросы и разбор ответов
1Расскажите про замыкания в JavaScript и приведите пример, где они пригодились в реальном проекте.
Что проверяют. Понимание фундаментальных механизмов языка, а не заученного определения.
Слабый ответ
«Замыкание это когда функция помнит своё окружение». Определение верное, но дальше кандидат не может назвать ни одного места, где применял его сам, и не объясняет, почему переменная внешней функции остаётся доступной после её завершения.
Сильный ответ
Замыкание возникает, когда внутренняя функция сохраняет доступ к переменным внешней функции даже после того, как та завершила выполнение. Я использовал это, когда делал debounce для поля поиска: внешняя функция хранила идентификатор таймера, а внутренняя при каждом вводе сбрасывала его и запускала заново. Ещё замыкания удобны для приватного состояния в модуле, когда счётчик или кэш не должны быть доступны снаружи. Из-за замыканий же бывают и баги: например, обработчик внутри useEffect держит устаревшее значение состояния, если забыть про зависимости.
2Как устроен event loop и почему setTimeout с нулевой задержкой не выполнится сразу?
Что проверяют. Понимание асинхронности, разницы микрозадач и макрозадач, а не поверхностное знание термина.
Слабый ответ
«Event loop это то, что делает JS асинхронным, браузер сам разбирается с очередью». Ответ не касается setTimeout: кандидат не разделяет стек вызовов, очередь макрозадач и микрозадачи, поэтому не может сказать, что раньше выполнится, колбэк промиса или таймер с нулевой задержкой.
Сильный ответ
Event loop берёт задачу из очереди только тогда, когда стек вызовов пуст. setTimeout с нулевой задержкой всё равно попадает в очередь макрозадач и ждёт, пока отработает весь синхронный код, а затем все микрозадачи, то есть колбэки промисов и queueMicrotask. Поэтому колбэк выполнится после текущего синхронного блока, а не мгновенно, и промис, созданный позже таймера, отработает раньше него. Я разбирался с этим, когда состояние в компоненте обновлялось не в том порядке, в каком приходили ответы, и порядок пришлось выстраивать явно, а не через таймер.
3Что такое виртуальный DOM и зачем React использует ключи в списках?
Что проверяют. Понимание внутренней работы фреймворка, а не только умение писать компоненты.
Слабый ответ
«Виртуальный DOM это копия реального DOM, поэтому React работает быстрее». Про сравнение деревьев кандидат не рассказывает, а ключи объясняет так: «нужны, чтобы в консоли не было предупреждения», и предлагает ставить индекс массива, не видя проблемы при вставке элемента в начало списка.
Сильный ответ
Виртуальный DOM это лёгкое представление дерева элементов в виде обычных JS-объектов. При изменении состояния React строит новое дерево, сравнивает его с предыдущим и применяет к реальному DOM только отличия, потому что операции с настоящим DOM дороже. Ключи нужны, чтобы React сопоставил элементы старого и нового списка по идентичности, а не по позиции. Если взять индекс массива и вставить элемент в начало, React решит, что изменились все элементы: переиспользует чужие DOM-узлы, и введённый текст в инпутах или состояние чекбоксов уедет к соседним строкам. Поэтому ключом беру стабильный идентификатор из данных.
4Пользователи жалуются, что форма подтормаживает при вводе. Как вы будете искать и устранять причину?
Что проверяют. Практический опыт диагностики производительности, а не перечисление приёмов наизусть.
Слабый ответ
«Оборачиваю всё в useMemo и React.memo, обычно помогает». Диагностики нет: кандидат не смотрел профайлер, не знает, какие компоненты перерисовываются на каждый символ, и не учитывает, что сплошная мемоизация добавляет сравнение пропсов и часто ничего не ускоряет.
Сильный ответ
Сначала записываю профиль во вкладке Profiler в React Developer Tools и смотрю, что перерисовывается на каждое нажатие клавиши и почему. Обычно причина в том, что состояние поля лежит слишком высоко и тянет за собой всё дерево, или в том, что на каждый ввод идёт тяжёлый расчёт либо запрос. Опускаю состояние поля вниз, к самому инпуту, тяжёлые соседние компоненты изолирую и мемоизирую вместе со стабилизацией пропсов, на запрос ставлю debounce и отменяю предыдущий через AbortController. Если тормозит длинный список подсказок, добавляю виртуализацию. После правок повторяю замер в профайлере и проверяю на слабом устройстве с троттлингом CPU, а не полагаюсь на ощущения.
5Объясните разницу между flexbox и grid и когда что выбираете.
Что проверяют. Практическое владение вёрсткой, а не заученные определения из документации.
Слабый ответ
«Grid для сеток, flex для строк, я обычно беру flex, потому что привычнее». На уточняющие вопросы кандидат не отвечает: не знает, чем justify-content отличается от align-items, как работает flex-basis и что делать с элементом, оставшимся один в последнем ряду.
Сильный ответ
Flexbox хорош для одномерной раскладки, когда элементы идут в строку или колонку и нужно распределить между ними свободное место: панель навигации, кнопки в футере карточки, ряд тегов с переносом. Grid удобен, когда важно контролировать и строки, и столбцы: каркас страницы с шапкой, сайдбаром, контентом и подвалом через grid-template-areas или адаптивная плитка карточек на repeat с auto-fill и minmax, которая сама меняет количество колонок без медиазапросов. На практике комбинирую: grid для общей структуры, flex внутри блоков. Отдельно слежу за тем, чтобы у flex-элементов был min-width, иначе длинный текст растягивает колонку и ломает раскладку.
6Как вы обрабатываете ошибки при работе с сетевыми запросами?
Что проверяют. Надёжность асинхронного кода и внимание к тому, что видит пользователь при сбое.
Слабый ответ
«Оборачиваю в try-catch и показываю alert». Что происходит с интерфейсом дальше, кандидат не рассказывает: нет разделения сетевой ошибки и ответа с кодом 4xx, нет состояний загрузки и ошибки в UI, нет логирования и повторной попытки, а про то, что fetch не бросает исключение на статус 500, кандидат не знает.
Сильный ответ
У запроса всегда есть три состояния в интерфейсе: загрузка, успех, ошибка, и все три я предусматриваю сразу. В коде обрабатываю reject промиса, отдельно проверяю статус ответа, потому что fetch не считает 4xx и 5xx ошибкой. Различаю случаи: сеть недоступна, невалидные данные формы, истёк токен, упал сервер. Пользователю показываю понятный текст и действие, например кнопку «Повторить», а не текст исключения, ошибку отправляю в мониторинг вместе с контекстом запроса. Для идемпотентных запросов делаю повтор с ограничением числа попыток и увеличением паузы, а гонки при быстрых переключениях фильтров закрываю отменой предыдущего запроса через AbortController, чтобы устаревший ответ не перезаписал состояние.
7Как вы решаете, где хранить состояние: внутри компонента, в контексте или в глобальном сторе?
Что проверяют. Умение проектировать поток данных в приложении и не тащить всё в глобальное состояние.
Слабый ответ
«Кладу всё в Redux, так удобнее, потом всегда доступно». Кандидат не отличает серверные данные от состояния интерфейса, не может объяснить, зачем локальному инпуту глобальный стор, и не задумывается, что при изменении общего объекта состояния перерисовывается половина приложения.
Сильный ответ
Сначала спрашиваю, кому нужны эти данные. Состояние одного поля, открытая вкладка, ховер живут в самом компоненте через useState. Если данные нужны нескольким соседям, поднимаю состояние к ближайшему общему родителю. Контекст беру для редко меняющихся вещей: тема, локаль, текущий пользователь, потому что частые обновления в контексте перерисовывают всех потребителей. Серверные данные держу отдельно, в React Query или похожем инструменте, где уже есть кэш, повторные запросы и инвалидация, чтобы не хранить копию ответа руками. Глобальный стор оставляю для сквозного клиентского состояния, например корзины или незавершённой формы через несколько шагов. Ещё часть состояния, например фильтры и страницу списка, храню в URL, чтобы ссылку можно было переслать и не потерять контекст.
8Что вы делаете, чтобы интерфейс работал с клавиатуры и был доступен для скринридеров?
Что проверяют. Понимание семантики и доступности, а не только визуальное соответствие макету.
Слабый ответ
«Расставляю aria-label где просят и добавляю alt у картинок». Кандидат кликабельные элементы делает через div с onClick, о фокусе в модальном окне не думает, о том, что при выключенной мыши по интерфейсу пройти невозможно, узнаёт от интервьюера.
Сильный ответ
Начинаю с семантики: кнопка это button, ссылка это a с href, поля формы связаны с label, заголовки идут по уровням. Это бесплатно даёт фокус, обработку Enter и Space и правильное объявление в скринридере, тогда как div с onClick приходится чинить руками через tabindex и обработчики клавиш. В модальном окне удерживаю фокус внутри, закрываю по Escape и возвращаю фокус на элемент, который окно открыл. Динамические сообщения об ошибке и успехе помечаю aria-live, чтобы их зачитали. Слежу за видимым состоянием фокуса и контрастом текста. Проверяю так: прохожу сценарий одной клавиатурой, прогоняю страницу через axe DevTools и слушаю ключевые экраны скринридером.
9Что вы сделаете, если первая загрузка приложения занимает слишком много времени?
Что проверяют. Понимание сборки, метрик загрузки и умение работать по замерам, а не наугад.
Слабый ответ
«Сожму картинки и включу кэширование». Кандидат не знает, из чего состоит бандл, не разделял код по маршрутам и не может назвать ни одной метрики загрузки, поэтому не сможет показать, стало ли лучше после правок.
Сильный ответ
Сначала измеряю: снимаю Lighthouse и смотрю в Performance, что происходит до первой отрисовки, какие метрики проседают, LCP или время до интерактивности. Дальше разбираю бандл анализатором и смотрю, что в него попало: обычно находится тяжёлая библиотека дат или графиков, подключённая целиком, или иконки, импортированные пакетом. Заменяю или импортирую точечно, разделяю код по маршрутам через динамический import и подгружаю редкие экраны лениво. Проверяю шрифты: подключаю с font-display swap и предзагружаю основной, у изображений первого экрана ставлю нужные размеры и современный формат, остальные загружаю лениво. Смотрю на количество запросов до отрисовки, лишние переношу за первый экран. После каждой правки повторяю замер и фиксирую результат, чтобы понимать, что именно помогло.
10Расскажите о самом сложном баге, который вы находили и исправляли.
Что проверяют. Реальный опыт отладки, системность мышления и честность вместо приукрашивания.
Слабый ответ
«Был сложный баг с вёрсткой, но я его быстро починил, деталей уже не помню». Ни симптома, ни инструмента, ни причины: интервьюер не понимает, локализовали проблему вы или её нашёл кто-то другой, а вы применили подсказку.
Сильный ответ
На прошлом проекте страница со временем начинала подтормаживать: у пользователей, которые не перезагружали вкладку весь день, интерфейс отвечал с задержкой. Симптом был плавающий, поэтому я воспроизвёл его сценарием с многократным переходом между разделами, снял несколько снапшотов памяти во вкладке Memory и сравнил их. Оказалось, что обработчики события resize и подписка на сокет не снимались при размонтировании компонента, ссылки на старые узлы оставались живыми. Добавил cleanup в useEffect, отписку в общем хуке, которым пользовались все экраны, и правило линтера на подписки без отписки. После этого повторил замер: рост памяти прекратился, задержки ушли.
11Как вы решаете, что компонент пора разбить на несколько мелких?
Что проверяют. Умение проектировать структуру интерфейса и мыслить категориями ответственности и переиспользования.
Слабый ответ
«Разбиваю, когда файл становится большим». Критерий только про объём: кандидат не говорит про зоны ответственности и переиспользование, а после дробления по строкам пропсы начинают протаскиваться через несколько уровней и читать код становится сложнее, чем было.
Сильный ответ
Главный признак не длина файла, а количество ответственностей. Если компонент одновременно ходит за данными, хранит состояние формы, валидирует её и рисует сложную таблицу, я разделяю: запрос и логику выношу в хук, таблицу и её строку делаю отдельными компонентами, которые получают готовые данные. Проверяю себя вопросом, можно ли описать назначение компонента одним предложением без слова «и». Отдельно выделяю то, что уже понадобилось второй раз в интерфейсе, но не делаю «универсальный» компонент заранее: обычно из-за этого появляется десяток флагов в пропсах. Если после разбиения приходится прокидывать пропсы через три уровня, значит границы выбраны неудачно и лучше передать содержимое через children.
12В чём разница между == и === и почему по умолчанию стоит выбирать строгое сравнение?
Что проверяют. Знание приведения типов, которое напрямую влияет на предсказуемость кода.
Слабый ответ
«=== быстрее, поэтому пишу его». Про приведение типов кандидат не вспоминает, на вопрос, что вернёт сравнение пустой строки с нулём через ==, отвечает наугад и не может объяснить, чем в этих сравнениях отличаются null и undefined.
Сильный ответ
Оператор == приводит операнды к общему типу перед сравнением, из-за чего появляются неочевидные результаты: пустая строка равна нулю, строка с числом равна числу. Оператор === сравнивает и значение, и тип, поэтому результат предсказуем и код проще читать. Я использую === по умолчанию и привожу типы явно, например через Number или String, когда данные приходят из инпута или из параметров URL строкой. Единственное место, где сознательно пишу нестрогое сравнение, это проверка на null и undefined одновременно через == null, и такую строчку обычно поясняю комментарием или заменяю на явную проверку.
13Опишите ситуацию, когда вы не согласились с решением дизайнера или бэкенд-разработчика. Как договорились?
Что проверяют. Умение отстаивать техническую позицию аргументами и приходить к решению без конфликта.
Слабый ответ
«Обычно соглашаюсь, чтобы не спорить, дизайнеру виднее». Позиции нет: кандидат не пробует показать техническую цену решения, поэтому в команде о проблемах производительности или неудобном контракте API узнают уже после релиза.
Сильный ответ
Дизайнер предложил анимацию списка, при которой на каждый кадр пересчитывался layout, и на бюджетных телефонах прокрутка заметно дёргалась. Я не стал спорить в чате: записал профиль во вкладке Performance, показал на созвоне падение частоты кадров и объяснил причину простыми словами, что браузер пересобирает раскладку на каждом шаге. Предложил вариант через transform и opacity, визуально близкий к задумке, собрал оба на тестовой странице, и мы проверили их на реальном слабом устройстве. Выбрали второй. С бэкендом похожая история была про формат ошибок: договорились о едином теле ответа с кодом и сообщением и записали это в описание API, чтобы не разбирать каждый эндпоинт отдельно.
14Как вы тестируете свой код на фронтенде и какими инструментами пользовались?
Что проверяют. Системность подхода к качеству, а не знание синтаксиса тестовых библиотек.
Слабый ответ
«Проверяю руками в браузере, тесты у нас писали QA». Для маленькой правки это работает, но кандидат не может сказать, как убедиться, что рефакторинг ничего не сломал, и на вопрос, что бы он покрыл тестами в форме оформления заказа, отвечает общими словами.
Сильный ответ
Юнит-тестами покрываю чистую логику: утилиты, форматирование, расчёты в корзине, кастомные хуки. Компоненты тестирую через React Testing Library от поведения пользователя: нахожу элементы по роли и тексту, ввожу данные, проверяю, что показалось сообщение об ошибке, а не заглядываю во внутреннее состояние. Запросы подменяю на уровне сети через MSW, чтобы проверить ветки успеха, ошибки и пустого ответа. Один-два ключевых сценария, например авторизация и оформление заказа, покрываю end-to-end в Playwright и гоняю в CI на пул-реквестах. Покрытие не считаю целью: в первую очередь пишу тесты на то, что уже ломалось, и на код, который планируется рефакторить.
Вопросы по реальному продукту и интеграциям
В запросах кандидатов встречаются собеседования в конкретные продуктовые команды. Название компании меняется, но проверка обычно одна: умеет ли разработчик объяснить работу интерфейса внутри живой системы, а не только показать учебный компонент.
Как разбирать проект с интеграцией в учётную или складскую систему?
Покажите поток данных: откуда приходит состояние, как обрабатываются задержка и ошибка, где проходит валидация, как пользователь понимает, что действие принято. Отдельно назовите свой код, контракт с backend и способ проверить сценарий после релиза.
Что отвечать про сложный интерфейс, если визуально он выглядит просто?
Сложность может быть в состоянии, правах, доступности, производительности или совместимости. Выберите один узел, объясните ограничение и компромисс. Не усложняйте рассказ количеством библиотек, если они не повлияли на решение.
Как построить ответ, чтобы его засчитали
Репетиция самопрезентации
Проверьте, как ваши ответы звучат вслух
Знать сильный пример недостаточно — важно быстро вспомнить его и ясно показать личный вклад. Пройдите короткую голосовую репетицию и получите разбор конкретики, результата и формулировок.
Проверить свои ответы бесплатно
Ошибки, которые чаще всего стоят оффера
- Отвечать заученными определениями из документации, не приводя примеров из своей практики
- Начинать писать код на live-coding сразу, не уточнив требования, формат входных данных и граничные случаи
- Молчать во время задачи и не проверять написанное на пустом массиве, дублях и ошибке запроса
- Считать вопросы про CSS и семантику второстепенными по сравнению с фреймворком
- Говорить «мы сделали» про командные проекты, не поясняя, какие модули и решения были вашими
- Указывать в резюме технологии, о которых можете рассказать только по документации, без опыта задач
- Оптимизировать вслепую, предлагая мемоизацию и кэш до того, как назван способ измерить проблему
- Не подготовить вопросы работодателю про стек, легаси-код, процесс код-ревью и релизный цикл
- Спорить с интервьюером вместо того, чтобы объяснить свою позицию и выслушать контраргумент
Свои факты, которые стоит вспомнить заранее
Большая часть провальных ответов это не незнание, а невозможность вспомнить конкретику под давлением. Выпишите это до встречи.
- Вспомните фреймворки, библиотеки и версии, с которыми работали последний год, и что в них менялось
- Подготовьте один-два примера бага или проблемы производительности, которые вы диагностировали сами: симптом, инструмент, причина, результат
- Освежите инструменты тестирования, указанные в вашем резюме, чтобы не путаться в деталях при уточняющих вопросах
- Продумайте, как описать свой вклад в командные проекты через конкретные экраны, модули и фичи
- Подготовьте ссылки на пет-проекты или пул-реквесты в открытых репозиториях, интервьюер может попросить показать код прямо на созвоне
- Вспомните, как у вас были устроены ветки в git, сборка и деплой, какие таск-трекеры использовали
- Восстановите в памяти, как строилось общение с бэкендом: где лежала документация API, как согласовывали изменения контракта
Чек-лист перед встречей
- Повторить механику JavaScript: замыкания, прототипы, this, event loop с микрозадачами, приведение типов
- Разобрать выбранный фреймворк на уровне внутренней логики: обновление состояния, правила хуков или реактивность, работа списков и ключей
- Порешать несколько типовых задач на живое кодирование с проговариванием вслух: debounce, группировка массива, компонент с запросом и состояниями загрузки и ошибки
- Повторить вёрстку руками: адаптивная сетка на grid, выравнивания во flex, специфичность селекторов, позиционирование
- Подготовить два-три примера сложных задач из практики с конкретными деталями решения и результатом
- Проверить окружение для live-coding: браузер, редактор, демонстрация экрана, микрофон, стабильный интернет
- Составить список вопросов работодателю про стек, долю легаси-кода, процесс код-ревью и частоту релизов
- Просмотреть код в своих пет-проектах и репозиториях, если ссылки указаны в резюме, и быть готовым объяснить решения
Пройдите собеседование с ИИ по этой профессии
ИИ задаст вопросы по роли «Frontend-разработчик», выслушает ответы голосом и покажет, где не хватило фактов. Первый персональный разбор бесплатно, без регистрации.
Пройти собеседование с ИИДолжность подставится автоматически. Резюме и описание вакансии можно не загружать.
Частые вопросы
Нужно ли знать несколько фреймворков сразу, чтобы пройти собеседование?
Глубокое знание одного фреймворка из вакансии важнее поверхностного знакомства с тремя. Спросят скорее про правила хуков, обновление состояния и работу списков, чем про сравнение синтаксиса. Если опыт с другим фреймворком есть, скажите об этом: это плюс, но не замена знанию основного стека.
Что делать, если задачу на live-coding не получается решить полностью?
Ход рассуждений важнее идеального решения. Проговаривайте, какую гипотезу проверяете и почему, напишите рабочий вариант в лоб и скажите, как бы его улучшили, спросите интервьюера, стоит ли двигаться в выбранную сторону. Частичное решение с понятным планом обычно оценивают выше, чем долгое молчание.
Спрашивают ли фронтендеров алгоритмы?
В крупных компаниях бывают задачи на массивы, строки и рекурсию, но чаще просят прикладное: реализовать debounce или throttle, обойти дерево комментариев, сгруппировать данные для рендера, разобрать структуру ответа API. Полезно повторить сложность операций с массивами и объектами и уметь оценить, что будет при большом списке.
Стоит ли показывать пет-проекты, если нет коммерческого опыта?
Стоит, если проект показывает работу с реальными задачами: запросы к API, обработка ошибок и пустых состояний, понятная структура, тесты, деплой. Подготовьтесь рассказать, почему выбрали такой подход и где что переделывали. Учебный клон популярного приложения по видеоуроку впечатляет меньше, чем маленький, но доведённый до конца проект.
Как отвечать, если не знаешь ответ на технический вопрос?
Скажите прямо, что с этим не сталкивались, и расскажите, как стали бы разбираться: где посмотрите в документации, что проверите в песочнице или devtools, у кого уточните. Можно рассуждать вслух и назвать свою гипотезу, обозначив её как предположение. Это лучше, чем уверенно выдавать неверный ответ.
Важно ли знание TypeScript, если в вакансии указан JavaScript?
Чаще да: многие команды постепенно переводят проекты на TypeScript, и знание типов пригодится уже на испытательном сроке. Достаточно понимать базовую типизацию, интерфейсы и типы, дженерики, типизацию пропсов и ответов API. Даже если требование не обязательное, это обычно работает в плюс.
Обязательно ли делать тестовое задание, если оно объёмное?
Вы вправе спросить, сколько времени на него закладывают и что именно будут оценивать. Если объём похож на полноценный проект, разумно предложить альтернативу: разбор вашего кода из пет-проекта или расширенное live-coding. Если беретесь, уточните стек и приоритеты, доведите до рабочего состояния основные сценарии и опишите в README, что осознанно оставили за рамками.
Собеседования на смежные должности
Как подготовлен этот материал
Редакция отделяет универсальную механику интервью от требований конкретной вакансии. Мы не обещаем «правильный» ответ и не предлагаем выдумывать опыт: каждый пример нужно сверить с задачами вакансии и заменить собственными фактами. Перед публикацией проверяются структура, повторяемость, внутренние ссылки и формулировки, которые могут ввести кандидата в заблуждение.
Материал обновлён 18.08.2026. Разбор основан на типовой практике найма и не содержит гарантий по результату конкретного собеседования.