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 и честной оговоркой про два инстанса.