Привет, Хабр!

Cегодня поговорим, наверное, о самом серьезном этапе собеседования — live‑coding. На этом этапе вас просят писать код в реальном времени, под пристальным взглядом интервьюера.

На этом этапе выясняется, умеет ли кандидат решать задачи и писать код под реальными ограничениями времени и стресса.

Подготовка

Первое, что стоит сделать, узнав о предстоящем лайвкодинге, взять себя в руки и подготовить почву. Хорошая новость в том, что подготовка очень сильно снижает уровень паники.

Начнем с технической стороны.

Убедитесь, что вы уверенно чувствуете себя в выбранном языке программирования. Для Python, например, необходимо знать базовые вещи: типы данных, управляющие конструкции, функции, работу со структурами данных вроде списков и словарей, основные алгоритмы поиска и сортировки. Никаких сверхъестественных навыков от вас не требуют, достаточной прочной базы. И без этой базы можно растеряться даже в элементарном задании. Например, вас могут попросить перевернуть строку или найти второе максимальное число в списке, и желательно решить без встроенных функций вроде sorted. Если вы никогда не пробовали обходиться без готовых методов, велика вероятность зависнуть с открытым ртом. Так что повторяем основы: как реализовать цикл, как работать с массивами и словарями вручную, как писать простейшие алгоритмы.

Второй момент в подготовки в том, чтобы пробежаться по типовым задачам. Здесь на помощь приходят платформы вроде LeetCode, Codewars и им подобные. Заучивать решения задач бессмысленно. Задача в другом: набить руку в подходах к решению.

Решая разные задачи с ограничением по времени, вы учитесь разбивать проблему на шаги и кодировать их по очереди. Потренируйтесь решать задачки уровня простого и среднего — от классических физ база и поиска простых чисел до операций со строками и сортировками. Прочитали условие, задали уточняющие вопросы, прикинули решение, написал коди и протестировали. Такой цикл должен стать привычным.

Конечно, важно подготовиться и морально. Если есть возможность, попробуйте своеобразную репетицию, договоритесь с товарищем провести вам тестовое интервью с лайвкодингом. Или хотя бы запишите себя на видео во время решения задачи на время. Потом посмотрите: где запнулись, где зависли, где начинали бубнить что‑то неразборчивое. Это немного болезненно, зато предельно полезно.

Отдельно стоит сказать про рабочее окружение. Узнайте заранее, что за формат лайвкодинга вас ждет. Варианты сейчас разные, некоторые дают онлайн‑редактор или площадку вроде HackerRank, другие просят просто шарить экран в вашем IDE, а то и вовсе устраивают парное программирование через VS Code Live Share. Закройте лишние вкладки, уберите на время собеса всплывающие уведомления. Если будете кодить в своем IDE, настройте шрифт покрупнее, интервьюер тоже будет смотреть на экран, пусть ему не придется щуриться.

Не спеши писать код

Итак, день Х настал, вы подключаетесь к звонку, здороваетесь с интервьюером. Вам выдали условие задачи. Что дальше? Первое желание неопытного кандидата в том, чтобы сразу броситься кодить, лишь бы тишина в эфире не затянулась.

Возьмите паузу на обдумывание задачи.

Собеседник обычно ожидает, что вы сначала уточните требования и продемонстрируете понимание. Поэтому не стесняйтесь задать пару вопросов по условию, если там что‑то неясно или двусмысленно. Например, задача: «Найти все перестановки строки». Уточните, а надо вывести их в любом порядке или в лексикографическом? А как насчет повторяющихся символов, считать перестановки уникальными или нет? Такие вопросы покажут, что вы мыслите системно и порядочно. Часто условия нарочно оставляют чуть размытыми, чтобы проверить, будете ли вы их прояснять. Если ограничения (по времени, памяти, размеру входных данных) явно не указаны, спросите о них. От этого зависит выбор решения. Например, для массива из 100 миллионов элементов подход к решению будет другим, чем для массива из 100 элементов.

Получив ответы на вопросы, сформулируйте вслух план решения. Это может быть буквально пара предложений: для начала хочу пробежаться по массиву и посчитать частоты элементов, потом пройтись снова и найти первый уникальный элемент. Такое проговаривание подтверждает интервьюеру, что вы правильно поняли задачу, а еще и дает адекватный план действий. Бывает, кандидат молча думает, думает, проходит 5 минут тишины, и интервьюер начинает переживать, все ли в порядке. Не молчите! Если требуется время на обдумывание, ок, скажите вслух: я прикидываю разные варианты решения, нужно еще минутку. Это лучше, чем полная тишина.

Когда план ясен, можно переходить к самому коду. Но и тут не нужно гнать лошадей.

Начните с простого, рабочего решения, даже если оно не оптимальное. Многие задачки на собеседовании легко решаются просто в лоб. У оптимального, сверхэффективного решения часто больше шансов быть реализованным с проблемками, чем у прямолинейного. Так что сначала пишем код, который просто делает, что надо, а уже если останется время можно его подчистить, улучшить, убрать дублирование, мелкие косяки. Интервьюеры обычно нормально относятся к такому подходу. Более того, они предпочитают увидеть живой процесс улучшения кода, чем когда кандидат сразу выпаливает заученное решение.

Представим, что задача сформулирована так:

«Напишите функцию, объединяющую два отсортированных списка чисел в один отсортированный список».

Казалось бы, ничего хитрого, можно взять и слить списки, а потом вызвать стандартную сортировку. Код получится буквально в пару строк:

def merge_sorted_naive(arr1, arr2):
    return sorted(arr1 + arr2)

В большинстве случаев работает. Сложность такого решения будет O((n+m) * log(n+m)) из‑за вызова сортировки. Но ведь нам явно сказали, что на вход подаются уже отсортированные списки! Скорее всего, ожидается, что мы воспользуемся этим знанием и напишем более эффективное решение. Зачем тратить O(n log n) на сортировку, если можно обойтись линейным временем? Приходит мысль о двух указателях, двигающихся по каждому списку. Реализуем слияние двумя указателями:

def merge_sorted(arr1, arr2):
    i = j = 0
    result = []
    # Пока в обоих списках есть элементы, выбираем меньший и добавляем его
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            result.append(arr1[i])
            i += 1
        else:
            result.append(arr2[j])
            j += 1
    # Один из списков закончился, добавляем остатки другого (они уже отсортированы)
    result.extend(arr1[i:])
    result.extend(arr2[j:])
    return result

# Пример использования:
print(merge_sorted([1,3,5,7], [2,2,6]))  # [1, 2, 2, 3, 5, 6, 7]

Решение потребует O(n+m) времени и памяти, что значительно лучше для больших объемов данных. Главное в том, что мы воспользовались подсказкой из условия: входные данные были отсортированы, значит, можно избежать лишней сложности.

Когда код готов, обязательно протестируйте его на паре примеров, если есть такая возможность.

После первого прогона и беглого теста настало время подумать об оптимизации и рефакторинге. Мы уже обсудили оптимизацию алгоритма, но есть и другие нюансы. Посмотрите на свой код свежим взглядом, все ли названия переменных понятны? нет ли лишних повторений? Возможно, какие‑то кусочки стоит вынести в отдельную функцию (если это не усложнит чтение). Но помните правило: рефакторинг не должен менять сложность алгоритма в худшую сторону. Если очень красивое решение внезапно стало работать медленнее, то это уже не наведение порядка, а шаг назад.

Ошибки новичков (и как их не допустить)

Ошибаться — человечески. Тем более в стрессовой обстановке собеседования. Давайте пройдемся по ряду промахов, которые чаще всего случаются на лайвкодинге у новичков, и подумаем, как их избежать.

Ошибка 1: игнорировать свойства входных данных. Мы уже привели пример с отсортированными массивами. Это частный случай общей проблемы, кандидат не использует подсказки в условии и решает задачу самым прямолинейным способом, хотя можно лучше. Бывает, задача специально сформулирована так, что в ней скрыт более простой путь. Классический пример: «дан отсортированный список, найдите…», сразу думайте о двоичном поиске или двух указателях. Или: «строка длиной N, содержащая только цифры от 0 до 1», ага, значит, можно вместо тяжеловесных структур обойтись простым счетчиком, поскольку диапазон значений ограничен. Совет: прежде чем кодить, выпишите себе на черновике свойства входных данных (отсортированы ли, уникальны ли элементы, диапазоны значений, особые случаи типа пустого ввода) и держите их в уме. Это убережет от решений, которые работают, но не используют всех возможностей задачи.

Ошибка 2: скрытая дорогостоящая операция. Вы можете быть уверены, что у вас алгоритм O(n), а на деле он тихонько превращается в квадратичный. Например, собираетесь вы пройтись циклом по списку, O(n), казалось бы. А внутри цикла вызываете метод, который сам за линейное время работает. В итоге общий порядок уже O(n^2), хоть вложенных циклов в коде и нет.

Допустим, нужно найти пересечение двух списков. Пишут: for x in list1: if x in list2: result.append(x). На маленьких массивах сработает, а на больших привет, квадратичная сложность, потому что x in list2 скрытая дорогостоящая операция.

Узнав о задаче, сразу оценивайте, какие объемы данных могут быть и какая сложность считается приемлемой. Интервьюер обычно подсказывает, сколько примерно есть времени на решение. Если, скажем, дали только 10 минут, значит, скорее всего, ожидается решение порядка O(n). Если времени полчаса или больше, возможно, задача потребует более сложного алгоритма, или состоит из нескольких этапов. Отталкивайтесь от этого. В примере с пересечением списков оптимальным был бы вариант перевести один список во множество (операция O(n)), а затем одним циклом проверять вхождение в это множество (операция O(1) в среднем). Код улучшенного решения:

def has_common_element(list1, list2):
    set2 = set(list2)
    for x in list1:
        if x in set2:
            return True
    return False

# Пример:
print(has_common_element([1, 2, 3], [5, 3, 9]))  # True

Теперь вместо O(n*m) мы получили O(n + m) за счет использования set. Будьте внимательны с встроенными функциями и операторами, думайте, что происходит под капотом. len(list) в Python O(1), а вот проверка x in list уже O(n), имейте в виду.

Ошибка 3: суета. В таком состоянии очень легко наделать глупостей, забыть элементарный синтаксис, начать метаться между двумя подходами и ни один не довести до конца, пропустить очевидный баг. Но интервьюер тоже человек. Ему гораздо приятнее видеть уверенного, пусть и медлительного разработчика, чем гениального, но дерганного. Поэтому задача номер один в том, чтобы успокоиться и сохранять ясность ума.

Вы не обязаны быть идеальным. Если уж совсем ничего не идет, скажите честно, что вы слегка заволновались. Большинство интервьюеров нормально реагируют на такое откровение, это лучше, чем молчать.

Кстати, о словах. Если чувствуете, что происходит какой‑то диалог, реагируйте. Часто интервьюеры подсказывают или направляют обсуждением.

Ошибка 4: плохое управление временем. Следите за часами, не до секунд, но чтобы понимать, когда нужно ускориться. Если видите, что застряли на каком‑то шаге, а время уходит, озвучьте это.

Ошибка 5: игнорирование крайних случаев. Допустим, вы быстро выдали решение для среднего сценария, когда входные данные более‑менее нормальные. Но стоит задать пустой массив или отрицательное число вместо положительного, всё ломается. Еще на этапе планирования полезно перечислить крайние случаи: пустой ввод, минимальные/максимальные значения параметров, повторяющиеся данные, невалидные данные.

Ошибка 6: плохой стиль кода. В первую очередь оценивают ваше мышление и умение решить задачу. Но и код читают! Если он как лапшичка, с переменными a, b, c и кучей магических чисел, осадочек останется. Конечно, на чистоту кода у вас мало времени, и красоту типичного проекта от вас не ждут. Однако следить за базовым порядком нужно, отступы, скобочки, читаемые имена переменных, никаких безумных однострочников, которые вы сами не поймете. Лучше написать явно и просто, чем выпендриться и утонуть в своей же гениальности.

Заключение

Live‑coding тот еще челлендж, спору нет. Но при правильном подходе оно перестает быть непосильным испытанием.

Не бойтесь просить обратную связь! Если вам отказали после лайвкодинга, вежливо спросите что‑же там пошло не так. Эти сведения бесценны для роста.

Удачи вам на собеседованиях!


Секция с кодом захватила Ru Big Tech

OTUS совместно с экспертами платформы algocode проведёт открытый онлайн-урок, посвящённый прохождению секцию лайвкодинг задач на собеседованиях.

Дата и время: 29 ноября в 12:00 (МСК)
Формат: онлайн
Спикер: Даниил — Team Lead в крупной технологической компании, имеет более 5 лет опыта и провёл свыше 50 технических собеседований.

В рамках этой секции необходимо показать:

- Знание языка программирования
- Понимание computer science
- Умение быстро погружаться в лайвкодинг задачу
- Написать рабочее решение у базовой версии
- Сделать усложнение (часто связано с конкурентностью)
- А еще нужно не облажаться с computer science вопросами

Темы урока:

  • В чем особенности секции у Яндекс, Авито, Т-Банк, Ламода и других

  • Какие темы стоит подтянуть

  • Разберем примеры вопросов и правильные ответы

    Но и это не все: прямо на уроке спикер разберет пошаговое решение реальных лайвкодинг задач.

Подробности доступны на странице урока.

Справочная информация:
Материалы algocode включены в программу курса OTUS «Golang Developer. Professional».

Комментарии (22)


  1. AdrianoVisoccini
    24.11.2025 14:42

    Мой лайфхак для лайвкодинга - если задачу или условия диктуют(что часто бывает) я открываю комментарий в коде и пишу задачу туда. По отзывам собеседующих для них это выглядит как большой гринфлаг, мол догадался записать и потом сверялся с задачей. 99% людей этого не делают, держат условие в голове, забывают, переспрашивают или в середине решения начинают делать не то
    Не знаю на сколько это правда влияет, но по моему идя как минимум норм


    1. KoIIIeY
      24.11.2025 14:42

      Мой лайфхак для лавйкодинга - можно расслабиться, меня не возьмут :)

      Нет более мерзкого способа проводить собес, чем лайвкодинг, разве что лайвкодинг на бумаге.


      1. AdrianoVisoccini
        24.11.2025 14:42

        я не очень понимаю в чем смысл лайвкодинга алгоритмов, там все зависит от знания не имеющих отношения к работе(чаще всего) вещей и того догадаешься ли ты их применить или нет
        Однако, я вполне себе понимаю прикол лайвкодинга чего-то близкого к работе. Написать простенький круд на собеседовании - отличный способ понять умеет ли кандидат код писать и пользоваться IDE


        1. KoIIIeY
          24.11.2025 14:42

          Плохой способ, даже если нанимаете абсолютно нулевого стажера, потому что он вообще ни о чем не говорит, разве что кроме того что можете не сойтись во мнениях по поводу стиля.

          Но стиль современные иде приводят к общему с помощью линтеров, так что и тут бесполезная трата времени.


          1. vvbob
            24.11.2025 14:42

            Я даже согласен с утверждением из статьи, лайфкодинг реально проверяет умение человека кодить в стрессовой и максимально некомфортной среде под психологическим давлением.

            Другое дело - а нафига? Если у вас на работе людям приходится втаких условиях работать, то, наверное, стоит не пытаться нанять каких-то суперменов, умеющих писать код в горящем здании под обстрелом и в консольном текстовом редакторе без IDE.

            Лучше, наверное, нанять каких-то толковых менеджеров, которые наладят рабочие процессы, так что-бы не нужно было с пылающей задницей фиксить баги прямо на продовом сервере.


            1. AdrianoVisoccini
              24.11.2025 14:42

              Я даже согласен с утверждением из статьи, лайфкодинг реально проверяет умение человека кодить в стрессовой и максимально некомфортной среде под психологическим давлением.

              Но ведь можно сделать так, чтобы лайвкодинг не был стрессовой ситуацией + делать поправку на то, что у челвоека стресс при принятии решений.

              С такими рассуждениями, можно вообще все виды тех интервью отмести.
              Тестовое задание что проверяет? Умение найти ваше тестовое в интернете?
              А вопросы по теории умение заучить теорию и отвечать на нее под стресом? А зачем? На работе будут теорию спрашивать?

              какие инструменты лучше лайвкодинга покажут что человек хотя бы немного действительно умеет код писать руками?


              1. vvbob
                24.11.2025 14:42

                Но ведь можно сделать так, чтобы лайвкодинг не был стрессовой ситуацией + делать поправку на то, что у челвоека стресс при принятии решений.

                В реальности имеем что имеем. Решение олимпиадных задачек в неудобном онлайн редакторе, с минимумом времени и с сопящем за спиной надсмотрщиком. Что-бы пройти такой квест надо тупо надрачивать литкод с полгода-год, только и всего, после прохождения собеса все это забыть как страшный сон.


                1. AdrianoVisoccini
                  24.11.2025 14:42

                  В реальности имеем что имеем

                  Тут могу только сказать, что будущее отрасли, в том числе, и в наших руках

                  У меня есть идея как это реализовать в потенциальн-коммерческом варианте, но в одиночку я такое не тяну


              1. vvbob
                24.11.2025 14:42

                С такими рассуждениями, можно вообще все виды тех интервью отмести.Тестовое задание что проверяет? Умение найти ваше тестовое в интернете?А вопросы по теории умение заучить теорию и отвечать на нее под стресом? А зачем? На работе будут теорию спрашивать?

                Нуу.. да! Так и есть!

                Успешное прохождение квеста с "лайфкодингом литкода" показывает исключительно то, что человек потратил кучу времени на подготовку к допросу по теме литкодинга, то что он при этом будет полезным членом команды вообще не гарантируется.


                1. AdrianoVisoccini
                  24.11.2025 14:42

                  ну да, с литкодом я уже оговорился - шляпа полная
                  а вот сделать в лайвкодинге что-то идентичное натуральному, ну там ручку какую реализовать несложную или отрефачить чужой кусок говнокода, по моему не такая и плохая идея. Причем, чтобы снизить вот этот вот момент из разряда решил/не рещил, можно задачу ставить как некое направдение и не результат. Ну т.е "давай порефачим вот этот код, расскажи как ты рассуждаешь" и пофиг если он за 30 минут не закончит все переделывать, можно будет понять, понимает ли человек че как работает или нет


                  1. vvbob
                    24.11.2025 14:42

                    Да, это намного лучше.

                    Впрочем, по моему мнению, все покажет только испытательный срок, на собесе можно только отсеять совсем уж "красные флаги", когда человек либо невменяемый в общении, либо вообще полный ноль в профессии.


          1. AdrianoVisoccini
            24.11.2025 14:42

            так а если нанимаешь не нулевого стажера? Мидла например
            Чего плохого дать ему написать пару классов и посмотреть он вообще понимает, как IDE работает или накрутил опыт и только через нейронку может код писать?

            Скажем так, если этот способо "плохой" то какой "хорошщий"? только не говорите что "00 золотых вопросов по джава" или "тестовое задание"


            1. KoIIIeY
              24.11.2025 14:42

              Просто спросить чем уже занимался, сказать чем вы планируете его занять и "почувствовать" подходит или нет.

              Кодит круды с нейронкой - да на здоровье, раз получается :)


              1. AdrianoVisoccini
                24.11.2025 14:42

                "почувствовать"

                Ну тоесть "найм по вайбу"?
                это мало того что не научно, так ещё и немного незаконно. Получается что отказ специалисту вы даете из собственных ощущений, что противоречит ТК РФ. Это недоказуемо конечно, но все таки

                Лайкодинг имеет хотя бы какую-то доказательную силу.


                1. KoIIIeY
                  24.11.2025 14:42

                  Найм как был по вайбу, так и останется по вайбу, с лайвкодингом или без него.

                  Но без лайвкодинга вайба больше.


                1. kalombo
                  24.11.2025 14:42

                  Лайкодинг имеет хотя бы какую-то доказательную силу.

                  Если там будут задачи имеющие отношения к реальности, то, пожалуй, да. Типа возьми клиента, сходи в сервис, отдай json. Пользуйся чем хочешь, гуглом, нейронкой и т.д. Как на работе.

                  А вот литкод, тоже найм по вайбу. Нанимаете тех, кто подготовился по литкоду, ну или в целом, есть скил решения литкод задач, неважно откуда. Который с решениями задач вашей компании слабо кореллирует.


                  1. AdrianoVisoccini
                    24.11.2025 14:42

                    Тут согласен на все 100. Проверять человека на задачах из литкода это бред полнейший

                    Моя идея - сделать "пробник" рабочего приложения - похожий стек, похожая архитектура, пара ручек, база, все дела. Кандидату надо будет склонировать гит(уже проверка не так ли?), запустить докер, собрать приложение, получить задачу, которая будет "идентична натуральной". В процессе рассказать немного чего он тут видит и че он об этом всем думает. Потом сделать задачку и закомитить её в гит

                    По моему куда полезнее чем "расскажи как под капотом работаем мапа"


          1. itstranger
            24.11.2025 14:42

            Лайв кодинг может помочь проверить скорее не хадр скилы, а как вообще человек кодит. Я с такими требованиями не встречался, но если бы мне поручили провести лайвкодинг, то дал бы простую задачу которую без доп контекста даже топовые нейронки до сих пор решают не верно. Лайвкодинг я бы проводил так: дал бы описание задачи в удобном формате для кандидата и попросил бы её решить с демонстрацией экрана у себя на компьютере в любой удобной для него ide. Причём разрешил бы даже нейронкой или гуглом пользоваться (ведь задачу нейронка решит не верно и кандидату придётся понять где ошибка и доработать её). При этом я бы не сидел, как профессор с троечником на экзамене, а постоянно бы направлял, общался, задавал наводящие вопросы, потому что мне моё время дорого и сидеть по часу молча, я не хочу.

            И тут вопрос, а что бы я вообще проверил таким лайвкодингом? А намного больше, чем вы сможете проверить в вашей яндекс web ide с задачкой из литкода.

            1) Мне важно было бы увидеть ide человека с которой он работает в привычных условиях (особенно если удаленка). Если человек, говорит, что он мидл-сеньор, но открывая например VSCode, у него нет ни одного плагина и он путается в интерфейсе, то что-то тут не то.

            2) Нейронки сейчас используют очень многие, бороться с этим бессмысленно да и зачем? Следовательно, я хочу увидеть как человек пишет промпт, т.к. это важно и влияет напрямую на качество ответа нейронки. Если человек пишет "ну там это напиши чтобы всё работало по красоте вот задача:", то уже понятно, что человек не особо понимает, что хочет видеть в результате.

            3) Как и говорил задачи бы брал с подвохом и нейронка в большинстве случаев кандидату выдало не верное решение, следовательно ему придётся показать, как он умеет решать задачи в данной ситуации, когда llm не спасает. Заучить решение задач с лит кода каждый может, а вот решить живой кейс нет.

            Как по мне, только такой лайв кодинг имеет смысл и реально хоть что-то может показать. Всё остальное это извиняюсь за выражение дроч ради дрочи.


            1. KoIIIeY
              24.11.2025 14:42

              Моя бы воля - я бы и камеру не включал на собесе :)

              Я кодю лежа на диване, попивая кофе, смотря телевизор и слушая музыку, мне надзиратель не нужен.

              Уж лучше тестовое, чем эти ваши лайвкодинги.


              1. AdrianoVisoccini
                24.11.2025 14:42

                Уж лучше тестовое, чем эти ваши лайвкодинги.

                проблема в том что тестовое это решение для очень узкого круга компаний. Если компания большая -тестовое сразу улетает в паблик и все просто присылают уже готовое решение. Придумывать тестовое каждому - запарное занятие если у тебя 1000 кандидиатов в месяц. Плюс невозможно проверить он его вообще сам писал? Может нейронка полостью? А если не нейронка то может друг который шарит или кто-то за денежки?


  1. vvbob
    24.11.2025 14:42

    На этом этапе выясняется, умеет ли кандидат решать задачи и писать код под реальными ограничениями времени и стресса.

    Надо пойти дальше, проверять - может ли кандидат писать код, когда его лупят палкой по голове, а он подвешен вниз головой за ноги над пропастью.. Это ведь так часто встречающиеся в обычной работе кейсы!


  1. antonb73
    24.11.2025 14:42

    Яркий пример когда отсутствие компетенций в оценке специалиста пытаются компенсировать используя плохие методы. Лучше так чем ничего - только не понятно, почему это подаётся не как объективный недостаток компании, её профессиональную незрелость в области найма инженеров, а наоборот?