Загрузка…
Загрузка…
frontend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
62 мин
01
Код
Напишите Type Guard, который на вход принимает union (строка либо число) и проверяет, что значение является строкой.
Лайвкодинг в среде JS/TS. Интервьюер хотел понять, насколько часто кандидат использует тайпгарды.
02
Теория
Если есть функция, которая обязательно принимает строку, и мы вызываем её, передавая значение типа string | number — будет ли ошибка типов в TypeScript? Что нужно сделать, чтобы её использовать (сужение типа через тайпгард)?
Обсуждение на примере типов user / admin и сужения через typeof/тайпгард.
03
Теория
Как с помощью служебного слова extends проверить/ограничить тип? Где оно применяется (generic-типы)?
Кандидат вспомнил слово extends; уточнили, что оно для generic-типов и недоступно в рантайме JavaScript.
04
Заметки
Техническое собеседование на frontend-позицию с лайвкодингом в онлайн-среде (JS/TS платформа). Кандидата зовут Михаил. Заявлено было полтора часа, по факту дали ~час. Сначала блок вопросов по TypeScript (тайпгарды, сужение типов, any/unknown, extends), затем основная JS-задача с асинхронной загрузкой картинок и оптимизацией. В конце один из интервьюеров ушёл на следующее техническое собеседование. Также упомянуто, что у кандидата будет время задать вопросы по проекту/стеку/технологиям, а про команду расскажет руководитель.
Подготовка
Стоит уверенно владеть TypeScript: тайпгарды и сужение типов, разница any/unknown, назначение extends в generic. По JS — асинхронность (Promise, await, параллельное выполнение с ограничением concurrency), оптимизация алгоритмов фильтрации с использованием Set/Map, обработка краевых случаев (нечётное число элементов, корректные индексы).
Стиль интервьюера
Интервьюер доброжелательный, даёт подсказки и наводящие вопросы (например, про Set/Map для оптимизации, про проблему с индексами и нечётным количеством). Сначала проверяет базу TypeScript на простейших примерах, чтобы оценить уровень, затем переходит к практической задаче. Поощряет уточняющие вопросы по условию.
Теория
Есть функция bar, которая принимает значение и прокидывает его в функцию f, ожидающую строку. Если запустить это в TypeScript — будет ли ошибка, когда в bar передаётся тип any?
05
Теория
Чем тип unknown отличается от any в TypeScript?
Кандидат пояснил, что any принимается без проверок, а unknown требует проверки перед использованием.
06
Теория
Какую проверку нужно сделать для значения типа unknown, чтобы использовать его как строку?
Ожидаемый ответ — проверка через typeof.
07
Код
Решите задачу: получить список картинок с сервера, отфильтровать те картинки (url), которых ещё нет на сервере, и отправить (загрузить) их на сервер по одной. Даны моковые данные и мок-функции сервера; реализовать в рамках заданной функции (можно разбивать на вспомогательные функции).
Основная лайвкодинг-задача. Использовать готовую функцию загрузки (строка 26), отправлять только url без id (id присваивается на сервере).
08
Теория
Оцените сложность алгоритма фильтрации картинок, который вы написали.
Кандидат определил квадратичную сложность (вложенный перебор по двум массивам).
09
Код
Есть ли способ упростить сложность алгоритма (например, до линейной / в один проход), если в каждом массиве по тысяче элементов? Подсказка: какие особые структуры данных в JavaScript могли бы помочь (Set/Map)?
Кандидат реализовал решение через Set из url для линейной сложности.
10
Код
Доработайте загрузку картинок так, чтобы они отправлялись в очереди, но не более двух за раз (две параллельно): отправляются первые две, дожидаемся их завершения, затем следующие две и т.д.
Дополнительный пункт задачи. Обсуждались Promise.all/await, реальная параллельность вместо последовательного await, обработка нечётного количества элементов и корректные индексы.
11
Кейс
Как обработать случай, когда количество элементов нечётное (чтобы не отправлять лишний/undefined элемент)? Будет ли при текущей реализации действительно параллельная отправка по два или всё равно последовательная по одному?
Follow-up к задаче с очередью: проверка на индекс и реальная параллельность через await перед Promise.