Technical interview: формат, задачи, как готовиться
Как проходит техническое собеседование на фронтендера: форматы, типы задач, как решать алгоритмические задачи, что спрашивают, типичные ошибки.
Форматы собеседований
Live coding
Пишете код в реальном времени, пока собеседующий смотрит. Может быть в Google Docs, CoderPad, CodeSandbox или просто в экране.
Плюсы: видят, как вы думаете. Минусы: стресс, опечатки, нет автодополнения.
Take-home задание
Вам дают задание, вы делаете дома за 2–7 дней. Присылаете ссылку на GitHub.
Плюсы: без стресса, можно гуглить. Минусы: занимает время, могут оценить несправедливо.
System design / архитектура
Обсуждаете архитектуру приложения. Рисуете схемы, обсуждаете выбор технологий. Обычно для middle+.
Задачи по алгоритмам
Решаете алгоритмическую задачу. На листочке, в CoderPad или Whiteboard. Формат LeetCode-style.
Типичный процесс
В большинстве компаний 3–5 этапов:
1. Скрининг с HR (15–30 мин)
— Кто вы, какой опыт, зарплатные ожидания
2. Техническое интервью #1 (45–60 мин)
— Вопросы по JS/фреймворку + live coding задача
3. Техническое интервью #2 (45–60 мин)
— Алгоритмы или более глубокие вопросы
— Или take-home ревью
4. System design / Meet the team (45–60 мин)
— Архитектура, обсуждение опыта (middle+)
5. Финал с менеджером (30 мин)
— Софт-скиллы, мотивация, оффер
Для junior обычно 2–3 этапа. Для middle/senior — 4–5.
Как решать алгоритмические задачи
Шаг 1: Уточните условие
Не бросайтесь писать код. Задайте вопросы:
- Что на входе? (массив чисел, строки, есть ли дубликаты)
- Что на выходе? (число, массив, boolean)
- Какой размер входных данных? (10 элементов или 10 миллионов)
- Есть ли ограничения по памяти?
- Может ли быть пустой массив? null?
Это показывает инженерный подход. Собеседующий оценит.
Шаг 2: Придумайте решение
Сначала — наивное. Потом оптимизируйте.
«Можно я начну с простого решения за O(n²), потом подумаю,
как ускорить?»
Говорите вслух. Собеседующий хочет видеть ход мыслей, а не молчание и потом готовый ответ.
Шаг 3: Напишите код
Пишите чиственно, с говорящими именами переменных:
// Плохо
function f(a, t) {
let m = {}
for (let i = 0; i < a.length; i++) {
let c = t - a[i]
if (m[c] !== undefined) return [m[c], i]
m[a[i]] = i
}
}
// Хорошо
function twoSum(nums, target) {
const seen = new Map()
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i]
if (seen.has(complement)) return [seen.get(complement), i]
seen.set(nums[i], i)
}
return []
}
Шаг 4: Протестируйте
Прогоните через примеры:
«Проверю на примере: nums = [2, 7, 11, 15], target = 9»
i=0: nums[0]=2, complement=7, seen пустой → seen.set(2, 0)
i=1: nums[1]=7, complement=2, seen.has(2) → return [0, 1] ✓
Проверьте edge cases:
- Пустой массив
- Один элемент
- Нет решения
- Все элементы одинаковые
Шаг 5: Оцените сложность
«Время: O(n) — один проход по массиву.
Память: O(n) — Map хранит до n элементов.»
Какие задачи встречаются
Строки и массивы
- Разворот строки
- Палиндром
- Анаграмма
- Слияние отсортированных массивов
- Максимальная сумма подмассива (Kadane)
- Sliding window (подстрока без повторов)
Хэш-таблицы
- Two Sum
- Подсчёт частот
- Группировка анаграмм
Стек и очередь
- Правильные скобки
- Обратная польская запись
- BFS (обход в ширину)
Связные списки
- Разворот списка
- Обнаружение цикла
- Средний элемент
Деревья
- Обходы (inorder, BFS)
- Максимальная глубина
- Симметричность
- Ближайший общий предок
Динамическое программирование
- Фибоначчи
- Прыжки по лестнице
- Рюкзак (базовая версия)
Как готовиться
1–2 месяца до собеседований
Неделя 1–2: Основы
Повторите фундамент:
- Типы данных, хоистинг, замыкания
this, прототипы- Event Loop, промисы
map/filter/reduce
Неделя 3–4: Алгоритмы
Решайте по 2–3 задачи в день. Порядок:
- Easy задачи на массивы и строки
- Easy на хэш-таблицы
- Easy на стек/очередь
- Medium на two pointers, sliding window
Неделя 5–6: Фреймворк
- Жизненный цикл, хуки
- Реактивность, состояние
- Компоненты, props/emit
- Типичные паттерны
Неделя 7–8: Практика
- Мок-собеседования (с другом или платные сервисы)
- Решение задач вслух с таймером
- Повторение сложных тем
Где практиковаться
| Ресурс | Для чего |
|---|---|
| LeetCode | Алгоритмические задачи |
| FrontSkill | Фронтенд-задачи |
| Codewars | Задачи разной сложности |
| HackerRank | Задачи + certification |
Сколько задач решать
Качество важнее количества. 50 задач, которые вы поняли — лучше, чем 200 решённых методом тыка.
На каждую задачу:
- 20–30 минут попыток
- Если не получается — посмотрите решение
- Разберите решение, перепишите самостоятельно
- Через 3 дня решите снова без подглядывания
Поведение на интервью
Говорите вслух
Даже если не знаете ответ:
«Не уверен на 100%, но думаю, что...»
«Я бы подошёл так: сначала..., потом...»
«Знаю, что есть паттерн X, но подробно расскажу,
как я понимаю его работу...»
Молчание — хуже частичного ответа.
Не бойтесь спрашивать
«Можно уточнить — речь про сортированный массив?»
«Мне разрешено использовать Set?»
«Нужно оптимизировать по времени или по памяти?»
Это не слабость — это уточнение требований, как в реальной работе.
Если застряли
«Я застрял. Давайте попробую начать с наивного решения...»
«Могу я рассмотреть частный случай, чтобы понять паттерн?»
Не тратьте 20 минут на одну ошибку
Если код не работает 5 минут — спросите подсказку. Потратить 20 минут на пропущенную точку с запятой — плохая стратегия.
Частые ошибки
Начинать писать сразу — без уточнения требований и обсуждения подхода.
Молчать — собеседующий не видит, что вы думаете.
Игнорировать edge cases — пустой массив, null, дубликаты.
Писать нечитаемый код — короткие имена переменных, нет структуры.
Паниковать — если задача не идёт, скажите об этом и попробуйте другой подход.
Не проверять решение — всегда прогоняйте через пример.
Итог
- 3 формата: live coding, take-home, system design
- Решайте задачи: уточните → наивное решение → оптимизируйте → код → тест
- Готовность: 1–2 месяца, 2–3 задачи в день
- Говорите вслух — это половина оценки
- 50 понятых задач лучше 200 решённых наугад
- Спрашивайте, если непонятно — это нормально