Загрузка…
Загрузка…
frontend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
—
01
Поведенческий
Расскажите про свой опыт: чем вы занимались на последнем месте работы?
Вводная часть тех-скрининга
02
Поведенческий
Какого плана задачи вам были интересны на последнем месте работы: продуктовые, инфраструктурные, работа с legacy, вёрстка?
03
Теория
Какие значения будут выведены в консоли и почему? Несколько сниппетов на передачу аргументов в функцию: переприсваивание примитивного аргумента (var n = 1; внутри функции n = 3), мутация свойства переданного объекта (obj.a = 5), полное переприсваивание аргумента-объекта внутри функции (o = 'Hello'), и вариант с заменой объекта с новым свойством.
Разогревочная задача из 4 вариаций одного примера; интервьюер уточнял, чем варианты отличаются друг от друга
04
Теория
Заметки
Транскрипт — первый из трёх этапов собеседования в онлайн-кинотеатр ОК (общая техническая секция для нескольких команд: JS-разогрев, React, промисификация, throttle, затем вопросы кандидата интервьюеру). По итогам первого этапа кандидата пригласили на второй; зарплатные ожидания от 380 000 руб. на руки подтвердили. Автор утверждает, что в итоге получил оффер после трёх этапов (цель серии — оффер 400к+ на руки). Открытая вакансия — middle+/senior frontend. Финал проходит сразу с руководителями нескольких команд. Команда: продукт кино (веб + Smart TV), монорепа, двухнедельные спринты, релизы катят QA, дежурства раз в ~3 месяца. Ранее кандидат работал в Яндексе (со стажёра) и Касперском (JS/TS/Go).
Стиль интервьюера
Интервьюер дружелюбный, сразу на «ты», конспектирует ответы для коллег. Подсказывает и вступает в дискуссию (например, детально разбирал с кандидатом поведение throttle на таймлайне), даёт усложнения к задачам и follow-up-вопросы (useCallback, реактивность стейта). В конце оставил время на вопросы кандидата и подробно рассказал о команде и процессах.
Что будет выведено в консоль и почему? Задача на замыкания: внешняя функция outer с let x = 0 возвращает функцию inner, которая делает x = x + 1; есть также глобальная переменная x = 20; inner вызывается несколько раз, затем выводится глобальный x.
Follow-up: почему inner берёт x именно из скоупа outer (механика поиска переменной по цепочке областей видимости)
05
Теория
Расскажите про контекст выполнения функции (this) в JavaScript: чем отличается this у обычной и стрелочной функции, когда определяется значение this?
Теоретическая врезка после задачи на замыкания
06
Код
Реализуйте React-компонент: квадрат размером 10 на 10 пикселей, у которого цвет меняется по клику в последовательности серый → красный → зелёный, зациклено.
Лайвкодинг; кандидат хранил индекс текущего цвета в стейте и массив цветов как источник правды
07
Теория
Есть ли разница, хранить в состоянии сам цвет или индекс цвета в массиве?
Follow-up по ходу React-задачи
08
Теория
Почему вы не обернули функцию handleClick в useCallback?
Follow-up к React-задаче; ожидаемый ответ — преждевременная оптимизация, useCallback нужен при передаче колбэка в мемоизированный компонент
09
Теория
Можно ли в этом компоненте избавиться от стейта и просто хранить значение индекса в обычной переменной?
Follow-up к React-задаче; ответ — нет, обычные переменные не реактивны и не вызовут обновление UI
10
Код
Дана асинхронная функция auth, которая принимает колбэк-обработчик с сигнатурой (error, data). Напишите функцию, которая выполняет auth, но возвращает промис (промисификация колбэк-функции).
Решение через new Promise с resolve/reject в зависимости от наличия ошибки в колбэке
11
Код
На базе промисифицированной функции напишите функцию tryAuth, которая при возникновении ошибок делает дополнительно n попыток получить данные, а если все попытки исчерпаны — пробрасывает последнюю ошибку наружу.
Усложнение задачи на промисификацию; решение через цикл while с try/catch, декрементом счётчика попыток и throw после выхода из цикла
12
Теория
Есть ли разница, уменьшать напрямую параметр n внутри функции или скопировать его значение в отдельную переменную и менять её?
Follow-up к задаче на retry; ответ — разницы нет, примитив передаётся по значению, создаётся локальная копия
13
Теория
Чем отличается throttle от debounce? Объясните поведение обеих функций на примере ввода в инпут.
Обсуждение перед лайвкодингом; кандидат с интервьюером детально разбирали на таймлайне, какие вызовы срабатывают, а какие пропускаются
14
Код
Реализуйте функцию throttle(fn, delay), которая возвращает обёртку, вызывающую fn не чаще одного раза в delay миллисекунд, с поддержкой аргументов и сохранением контекста this.
Лайвкодинг; решение через флаг blocked и setTimeout; интервьюер уточнял, что отложенный вызов с последними аргументами не нужен; отдельно попросили учесть проброс аргументов и биндинг контекста
15
Поведенческий
Почему вам интересно собеседоваться в ОК?
Вопрос с этапа HR-скрининга, упомянут кандидатом в нарративе