Live coding пугает сильных инженеров не потому, что они «не умеют кодить». Пугает формат: чужой смотрит, таймер идёт, IDE без привычных подсказок, задача сформулирована хуже, чем в тикете. Проверяют здесь не олимпиадный трюк за пять минут. Проверяют, умеете ли вы прояснить условие, выбрать простой рабочий путь, говорить, что делаете, и не замирать, когда упёрлись.

Ниже — что реально оценивают, алгоритм прохождения, два разобранных прохода (не «слив уникальных LeetCode», а процесс на типовых постановках) и протокол, если застряли. Формат чаще встречается на backend и fullstack middle-слотах — это видно по backend-вакансиям. Общий каркас интервью — вопросы на собеседовании. Английский техэкран — те же шаги плюс фразы из интервью на английском.

Коротко:

  • Сначала условие, крайние случаи и ограничение по данным — уже часть оценки, не «трата времени».
  • Назовите наивное решение и почему его может не хватить. Потом пишите.
  • Код инкрементально: рабочий каркас, потом детали. Комментируйте вслух.
  • Прогоните 2–3 примера, включая пустой ввод и дубли.
  • Молчание хуже наивного кода. Если застряли — скажите, где затык, и сузьте шаг.

Что оценивают — и чего не оценивают

Ход мысли, уточнения, структура, умение проверить себя. Чистота синтаксиса на третьем месте. Идеальный O(n) с первого удара не нужен, если вы не объяснили, зачем. Списывание «я такое видел, вот трюк» без понимания ломается на follow-up «а что если дубли».

Не оценивают скорость печати как добродетель. Не оценивают знание редкого метода стандартной библиотеки, если вы можете написать цикл. Не оценивают молчаливого гения: интервьюер не телепат. На международном слоте ещё и то, можете ли вы вести этот разговор на рабочем английском — ясность важнее артикля.

Алгоритм прохождения, который можно повторять на любой задаче

  1. Прочитать вслух и пересказать своими словами. «Нужно вернуть индексы двух чисел, сумма которых равна target» — уже проверка, что вы не решили соседнюю задачу.
  2. Спросить ограничения. Размер входа, отрицательные, дубли, нужен ли стабильный порядок, можно ли менять массив, что вернуть если решения нет, лимит памяти и времени на пальцах.
  3. Примеры. Один счастливый, один крайний, один «решения нет». Лучше придумать их вместе, чем сразу писать.
  4. Наивное решение вслух. Два цикла, почему O(n²), для каких n это ещё живое.
  5. Улучшение или отказ от него. Хеш, сортировка, два указателя — с ценой. Если n крошечный, скажите, что останетесь на наивном.
  6. Писать маленькими шагами. Сигнатура, пустой возврат, основной путь, крайние случаи.
  7. Прогон. Те же примеры вслух, пальцем по коду. Потом сложность ещё раз одной фразой.

Не пропускайте пункт 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 редко бывает единственным этапом. Самопрезентацию и вилку держите отдельно — рассказ о себе и ожидания по зарплате — не вшивайте их в код на доске.