Загрузка…
Загрузка…
frontend / middle_plus / tech_deep
Формат
online
Стадия
tech_deep
Когда
within_quarter
Длительность
—
01
Код
Задача на трансформацию данных: по массиву заказов вернуть массив customer ID со статусом completed, просуммировав суммы (amount) всех заказов по каждому customer ID, отсортировав по убыванию суммы и обрезав до нужного количества элементов.
Сбер, лайвкодинг в CodeSandbox. Интервьюер: «типичная задача для нашего продукта». Кандидат сначала проговорил решение словесно (мапа id→сумма, фильтр по статусу, сортировка, slice), затем закодил. Решение принято, песочница глючила с выводом в консоль.
02
Код
Задача на обход дерева: обойти вложенную древовидную структуру (объект) и собрать значения-примитивы в результирующий массив (рекурсивно, через Object.values).
Сбер, вторая задача лайвкодинга. «Классическая задача у нас на проекте — что-нибудь обойти». Решение принято.
03
Теория
Сталкивался ли ты с такой штукой, как debounce/throttle?
Сбер. Кандидат: работал с самописным debounce и lodash debounce. Вопрос-подводка к задаче на useDebounce.
Заметки
Видео с двумя реальными собеседованиями. Основное — техническое собеседование в Сбер (продукт «навигатор») на Middle+ фронтенд-разработчика с вилкой 300–320 тыс. руб.: две задачи на лайвкодинг, задача на useDebounce и теория по React/оптимизации. После него дали положительный фидбэк и позвали на финальный этап; кандидат попытался отказаться от финала (не в активном поиске), после чего получил «преофер» на 320к. Второй собес — через аутстафф-компанию (название не указано), длился всего 25 минут: 5–6 корных вопросов по JS/React и 3 кейса; после него тоже дали преофер на 250к (вероятно, из-за горящих сроков). Со слов интервьюера Сбера: команда ~12 React-разработчиков, недельные спринты, еженедельные синки по понедельникам, обязательные тесты на новый код, релизы примерно раз в месяц, сборку делает тимлид.
Подготовка
Темы для подготовки по этому собесу: трансформация структур данных и обход деревьев на JS, debounce/throttle и написание кастомного хука useDebounce, организация глобального/локального состояния, декомпозиция компонентов и инверсия зависимостей (SOLID), цикл рендера React и триггеры ререндера, оптимизация длинных списков (пагинация/виртуализация), React.memo/useCallback/useMemo, event loop (включая задачи на порядок console.log), Virtual DOM, ключи при рендере списков, setState в useEffect, а также кейсы на soft skills и проектирование динамических форм по JSON-схеме.
Стиль интервьюера
В Сбере интервьюер — доброжелательная разработчица из команды: задачи «как в реальном продукте», просила сначала проговорить решение словесно и лишь потом кодить, лояльно отнеслась к глюкам песочницы («в любом случае принимаю, выглядит корректно»), следила за таймингом и сворачивала объёмную задачу до концептуального рассказа. На втором собесе — структурированный формат: 5–6 корных вопросов, затем кейсы в чат с рассуждениями вслух, интервьюер активно подсказывал контекст по кейсам.
04
Код
Написать свой хук useDebounce (хотя бы концептуально / псевдокодом): хук принимает строку поиска и delay, выполняет отложенный запрос через searchFunction и возвращает data, статус загрузки и статус ошибки.
Сбер. Полное решение не требовалось из-за нехватки времени — достаточно концептуального рассказа (setTimeout в useEffect, вызов searchFunction по истечении delay). Ответ принят «плюс-минус».
05
Теория
Как ты организовываешь взаимодействие между сторами: как понимаешь, что положить в глобальный стор, а что хранить в локальном стейте компонента?
Сбер. Перед вопросом обсудили опыт со стейт-менеджерами (RTK, MobX, React Query, Zustand); в проекте используется MobX.
06
Теория
При создании нового функционала (например, нового виджета) чем ты руководствуешься при разбивке на компоненты? Есть ли принципы декомпозиции?
Сбер. Follow-up про инверсию зависимостей.
07
Теория
Что такое инверсия зависимостей? Расскажи, что это за принцип.
Сбер. Follow-up к вопросу о разбивке компонентов; интервьюер отметила, что этот принцип применяют у них в проекте.
08
Кейс
Кейс: нужно изменить компонент (кнопку), который используется во многих местах проекта — аналитик просит поменять шрифт только в одном конкретном виджете. Как будешь это делать?
Сбер. Ответ кандидата: новый проп с условием либо дополнительный класс — принят.
09
Теория
Расскажи про цикл рендера компонента в React: как это происходит, какие стадии есть?
Сбер, блок про оптимизацию.
10
Теория
Как React понимает, что нужно что-то перерисовать? Что триггерит ререндер?
Сбер. Follow-up к вопросу о цикле рендера (изменение стейта, контекста/стора, ключей, пропсов).
11
Теория
В приложение пришёл список из 10 000 элементов. Как мы можем его оптимизировать?
Сбер. Ожидаемый ответ: пагинация либо виртуальный скролл (виртуализация).
12
Теория
Расскажи про React.memo: что это такое, для чего используется и всегда ли нужно его использовать?
Сбер. Follow-up: «почему не всегда нужно использовать?» — ожидание: мемоизация тоже расходует ресурсы, оправдана только для нагруженных компонентов; пропсы-функции/объекты нужно оборачивать в useCallback/useMemo.
13
Теория
Расскажи, как работает event loop в браузере (синхронный код, очереди микрозадач и макрозадач, порядок выполнения).
Второй собес (аутстафф), корная часть. Сразу за вопросом — практическая задачка на порядок вывода.
14
Код
Задачка на event loop: определить порядок вывода console.log в коде с синхронным кодом, микрозадачами (промисами) и макрозадачами (таймерами).
Второй собес (аутстафф). Решалась устно, рассуждением; кандидат ответил верно (порядок 1, 6, 5, 2, 3, 4).
15
Теория
Что такое Virtual DOM и какова его роль в React?
Второй собес (аутстафф). Кандидат упомянул также эвристический алгоритм сравнения на двух правилах.
16
Теория
Зачем нужны ключи (keys) при рендере списков в React и как с ними можно «выстрелить себе в ногу»?
Второй собес (аутстафф). «Излюбленный вопрос» интервьюера; выстрел в ногу — использование индексов как ключей.
17
Теория
К какому типу списка всё-таки можно применять индексы в качестве ключей?
Второй собес (аутстафф). Follow-up к вопросу про ключи; ответ: если список не изменяется.
18
Теория
Что произойдёт, если в useEffect сделать setState?
Второй собес (аутстафф).
19
Теория
А если массив зависимостей useEffect не пустой и в нём лежит стейт, который изменяется внутри эффекта — что произойдёт?
Второй собес (аутстафф). Follow-up: ожидаемый ответ — зацикливание, бесконечный ререндер.
20
Кейс
Кейс: что будешь делать, если не знаешь, как решить задачу?
Второй собес (аутстафф), кейсовая часть, кейс 1 (присылался текстом в чат).
21
Кейс
Кейс: твоя задача находится в модуле, который никто не рефакторил и в котором нет тестов. Как поступишь — будешь рефакторить или нет?
Второй собес (аутстафф), кейс 2. Принятый ответ: сначала выполнить задачу из ТЗ, затем подсветить проблему и обсудить ресурсы на рефакторинг/тесты.
22
System design
Кейс на архитектуру: заказчику нужно ~60 форм, бэкенд хранит N XML-файлов (одна форма = один файл) и готов согласовать формат передачи на фронт. Как с точки зрения фронтенд-архитектуры спроектировать модуль для создания и отображения таких форм?
Второй собес (аутстафф), кейс 3 (самый объёмный, с уточняющими вопросами от кандидата). Принятый ответ: CRUD-методы для шаблонов, форма описывается JSON-структурой с бэкенда, универсальный виджет строит форму по JSON; интервьюер добавил, что туда же стоит впихнуть валидацию/маски с бэка.