Live coding пугает сильных инженеров не потому, что они «не умеют кодить». Пугает формат: чужой смотрит, таймер идёт, IDE без привычных подсказок, задача сформулирована хуже, чем в тикете. Проверяют здесь не олимпиадный трюк за пять минут. Проверяют, умеете ли вы прояснить условие, выбрать простой рабочий путь, говорить, что делаете, и не замирать, когда упёрлись.
Ниже — что реально оценивают, алгоритм прохождения, два разобранных прохода (не «слив уникальных LeetCode», а процесс на типовых постановках) и протокол, если застряли. Формат чаще встречается на backend и fullstack middle-слотах — это видно по backend-вакансиям. Общий каркас интервью — вопросы на собеседовании. Английский техэкран — те же шаги плюс фразы из интервью на английском.
Коротко:
- Сначала условие, крайние случаи и ограничение по данным — уже часть оценки, не «трата времени».
- Назовите наивное решение и почему его может не хватить. Потом пишите.
- Код инкрементально: рабочий каркас, потом детали. Комментируйте вслух.
- Прогоните 2–3 примера, включая пустой ввод и дубли.
- Молчание хуже наивного кода. Если застряли — скажите, где затык, и сузьте шаг.
Что оценивают — и чего не оценивают
Ход мысли, уточнения, структура, умение проверить себя. Чистота синтаксиса на третьем месте. Идеальный O(n) с первого удара не нужен, если вы не объяснили, зачем. Списывание «я такое видел, вот трюк» без понимания ломается на follow-up «а что если дубли».
Не оценивают скорость печати как добродетель. Не оценивают знание редкого метода стандартной библиотеки, если вы можете написать цикл. Не оценивают молчаливого гения: интервьюер не телепат. На международном слоте ещё и то, можете ли вы вести этот разговор на рабочем английском — ясность важнее артикля.
Алгоритм прохождения, который можно повторять на любой задаче
- Прочитать вслух и пересказать своими словами. «Нужно вернуть индексы двух чисел, сумма которых равна target» — уже проверка, что вы не решили соседнюю задачу.
- Спросить ограничения. Размер входа, отрицательные, дубли, нужен ли стабильный порядок, можно ли менять массив, что вернуть если решения нет, лимит памяти и времени на пальцах.
- Примеры. Один счастливый, один крайний, один «решения нет». Лучше придумать их вместе, чем сразу писать.
- Наивное решение вслух. Два цикла, почему O(n²), для каких n это ещё живое.
- Улучшение или отказ от него. Хеш, сортировка, два указателя — с ценой. Если n крошечный, скажите, что останетесь на наивном.
- Писать маленькими шагами. Сигнатура, пустой возврат, основной путь, крайние случаи.
- Прогон. Те же примеры вслух, пальцем по коду. Потом сложность ещё раз одной фразой.
Не пропускайте пункт 2 из стыда «как будто не понял». Непонятое условие — главный источник красивого неверного кода.
Как звучит думание вслух — не лекция и не шёпот
Короткие фразы. Что сейчас делаете. Какая гипотеза. Что проверяете. Не извиняйтесь за каждую строку. Не читайте код как диктор. Пример ритма:
Перескажу: дан массив чисел и target, вернуть любые два индекса с суммой target. Если пары нет — что вернуть? Пустой массив ок? Дубли значений разрешены? Можно ли одно и то же число дважды, если оно стоит на одном индексе — нет, нужны два индекса.
Наивное: два цикла, O(n²). Для n до пары тысяч, если не сказали иное, это ещё можно показать как baseline. Дальше словарь значение → индекс, один проход: для каждого x смотрю, видел ли уже target − x. Осторожно с тем, чтобы не взять тот же индекс дважды.
Пишу сигнатуру и пустой возврат. Сначала основной путь на примере [2, 7, 11], target 9. Потом проверю [3, 3] и target 6, и пустой массив.
Это и есть продукт раунда: интервьюер может вмешаться, сузить, подсказать. Если вы молчите, вмешаться некуда, остаётся смотреть на курсор.
Разбор 1. Пара с суммой target — процесс, не «секретный трюк»
Постановка типичная для скрининга. Не заучивайте её как уникальную задачу с лидерборда. Заучите разговор вокруг неё. Вход: список целых, target. Выход: два индекса или сигнал, что пары нет. Предположите, что достаточно одной пары.
Уточнения, которые стоит задать: отрицательные; дубли; гарантирована ли пара; нужен ли лексикографически первый ответ; ограничение по памяти. Если интервьюер говорит «считайте, что пара всегда есть» — зафиксируйте это вслух, чтобы потом не гадать.
Наивное: для i по массиву, для j > i, если сумма равна target — вернуть. Сложность по времени квадратичная, по памяти константа. Скажите, при каком n это уже плохо. Улучшение: словарь уже увиденных чисел. Идя слева направо, для текущего числа ищете дополнение. Если нашли — готово. Если нет — кладёте число в словарь. Ошибка, которую ловят: положить число до проверки и случайно сматчить само с собой, когда 2x = target и элемент один.
Пишу сначала наивный двойной цикл, прогоняю [2, 7, 11, 15], target 9 — индексы 0 и 1. Затем [3, 3], target 6 — если я положу 3 в карту до поиска дополнения, могу ткнуть в один индекс дважды. Поэтому сначала ищу, потом записываю. Пустой ввод — сразу пустой ответ. Если пары нет — пустой ответ, не исключение, если не просили иное.
Сложность одного прохода: время линейное от длины, память линейная в худшем случае. Если нельзя тратить память — могу отсортировать пары (значение, старый индекс) и сжать двумя указателями, но потеряю простоту и должен аккуратно вернуть исходные индексы. Для скрининга оставлю словарь, если память не запретили.
После кода не молчите. Спросите: «хотите обработать случай нескольких ответов или достаточно любого». Это выглядит как инженер, а не как человек, который закрыл задачку и выдохнул.
Разбор 2. Идемпотентная обработка событий — ближе к backend
Частый прод-флейвор без олимпиады: «есть поток событий с id, обработчик могут вызвать повторно, нужно выполнить полезную работу один раз». Это не секретная задача с контеста. Это тот же навык, что на вопросах про платежи в интервью backend.
Уточните: события приходят по одному или пачкой; id глобально уникален; можно ли хранить все увиденные id в памяти; нужен ли TTL; что считать «обработал» — успешный побочный эффект или запись в журнал; порядок гарантирован или нет.
Перескажу: функция process(event), повтор с тем же id не должен второй раз списывать / слать письмо / менять статус. Наивное: множество seen в памяти процесса. Это ломается на двух инстансах и после рестарта — скажу это сразу, не буду притворяться, что set закрывает прод.
Для раунда в одном процессе: перед работой проверяю id в set, если есть — возвращаю already processed. Если нет — делаю работу, потом добавляю id. Опасный порядок: добавить id до работы — потеряем событие при падении посередине. Добавить после — при падении после работы, но до записи, будет повтор. Для учебного кода скажу этот компромисс вслух. В проде ключ идемпотентности живёт в базе с уникальным индексом в одной транзакции с побочным эффектом или с outbox.
Прогон: первое событие id=A — работа плюс запись. Второе A — ранний выход. id=B — снова работа. Пустой id — ошибка входа, не тихий skip, если контракт не говорит иное. Если попросят TTL — очередь с временем, не бесконечный set, и отдельно обсудим часы и рассинхрон.
Интервьюер здесь смотрит, видите ли вы границу учебного решения. Человек, который написал set и сказал «готово к горизонтальному масштабу», проигрывает человеку с наивным set и честной оговоркой про два инстанса.
Редактор, язык, время — практические мелочи
Тренируйтесь в том, в чём будете писать: CoderPad, Google Doc, пустой файл, иногда общая доска. Выключите автоимпорты на тренировке, если на интервью их не будет. Заведите пальцами for, map, словарь, очередь — без гугления сигнатуры каждую минуту.
Часы: 35–45 минут типичны. Если 10 минут ушло на условие — это не провал, если условие реально дырявое. Если 10 минут ушло на молчание — провал. Оставьте 5 минут на прогон. Скажите вслух: «я оставляю время на тесты». Это дисциплина, не слабость.
Язык выбирайте тот, которым пишете каждый день, не «более олимпиадный». На английском раунде те же шаги; фразы переспроса — в разговорных шаблонах.
Если застряли
Не смотрите в камеру молча. Назовите слой затыка: не понял условие, не вижу структуру данных, вижу баг в уже написанном, не помню синтаксис. Для синтаксиса можно сказать «я напишу псевдоцикл, потом поправлю имя метода» — обычно разрешают.
Я застрял на том, как не взять тот же индекс дважды, не на самой идее словаря. Вернусь к примеру [3, 3], target 6 и пройду его руками. Если идея словаря всё ещё путается, оставлю двойной цикл, прогоню тесты, и если останется время — вернусь к одному проходу. Можете сказать, какой крайний случай вам важнее закрыть сейчас?
Вернуться к наивному — нормальная стратегия, не капитуляция. Интервьюер часто сам предлагает сузить. Попросить подсказку один раз после своего хода мысли лучше, чем десять минут гордого тупика. Паника с переписыванием всего с нуля на 32-й минуте почти всегда хуже рабочего O(n²) с тестами.
Как готовиться без бесконечного контеста
- 3–4 раза в неделю по 40 минут: одна задача, вслух, в простом редакторе, с таймером.
- Типы: массивы и словари, строки, два указателя / сортировка, очередь, простой граф «посетил / очередь», если в вакансии это светится.
- После решения — двухминутный пересказ: условие, наивное, финальное, сложность, где врал бы в проде.
- Один mock с человеком, который молчит меньше, чем вам комфортно. Карточки общего интервью — в подготовке к интервью; live coding туда же, только с редактором.
Не заменяйте этим SQL и свой сервис, если в вакансии нет явного алго-раунда. Тогда live coding может быть коротким куском на 20 минут, а основной вес — в базах и отказах.
Частые вопросы
Нужно ли решать с оптимальной сложностью?
Сначала корректность и объяснение. Оптимум — если успеваете и понимаете цену. Немой «оптимальный» трюк без прогона часто слабее ясного квадратичного с тестами.
Можно ли гуглить на интервью?
Спросите в начале. Часто нельзя. Не стройте привычку, которая на звонке запрещена. Документацию языка иногда разрешают — уточните.
Что, если задача совершенно новая?
Алгоритм тот же. Пересказ, примеры, наивное. «Не видел эту формулировку» — нормальная фраза. Дальше маленькие шаги. Не изображайте узнавание.
Писать тесты отдельными функциями?
Если среда позволяет — да, два-три вызова. Если нет — прогон вслух по строкам. Главное, чтобы проверка была, не обязательно фреймворк.
Как быть с опечатками и не компилирующимся кодом?
Скажите, что сейчас подчистите. Не начинайте новую архитектуру из-за скобки. Интервьюер отличит нервный синтаксис от путаницы в идее.
Junior без такого формата в вакансии — готовить?
Коротко да: одна задача вслух в неделю, чтобы не онеметь, если формат внезапно появится. Не вместо проекта и письма. Входные слоты — в junior-вакансиях.
Что сделать сейчас
Сегодня возьмите одну простую задачу на массив и словарь. Поставьте таймер на 35 минут. Решайте вслух, по алгоритму выше, в редакторе без подсказок. Запишите голос. Послушайте, где вы молчали дольше десяти секунд — это места, которые надо заполнить фразой, не «ускорить печать».
На этой неделе повторите второй разбор: идемпотентная обработка. Свяжите его с тем, как вы рассказываете свой сервис на backend-интервью. Живой mock — один, с перебиванием. Каркас остальных вопросов не бросайте: live coding редко бывает единственным этапом. Самопрезентацию и вилку держите отдельно — рассказ о себе и ожидания по зарплате — не вшивайте их в код на доске.