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

Мы попросили Самсонова Ивана рассказать о его критериях оценки кандидатов, а также поделиться советами по подготовке. На видео Иван выступал в роли тимлида, а в обычной жизни он разработчик со степенью в Computer Science и наставник курса «Алгоритмы и структуры данных».


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

Обычно до написания кода я прошу проговорить решение вслух. Иногда человеку сложно это сделать без кода перед глазами — для меня это микроминус. Но я нормально отношусь к рисованию на листочке.

Если кандидат сразу озвучивает верный алгоритм, решает без ошибок — оценивать тут нечего. Либо он знал задачу, либо он хорош. Интересны остальные случаи.

Я слушаю рассуждения, но не оцениваю их с точки зрения правильности. Нормально, если сначала человек идёт в неверном направлении — он пока не знает, как решать, и пытается прийти к решению. 

Если он сам приходит к нужному алгоритму без подсказки — это огромный плюс. 

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

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

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

После написания кода приступаем к самостоятельному поиску ошибок — без запуска. Всегда есть тестовые примеры, на которых можно проверить код. Фатальных ошибок, когда весь алгоритм неверный, быть не может — за этим я слежу на предыдущем этапе. Обычно всё исправляется несколькими символами или строчками.

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

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

Если собеседующий не заметил баг — значит, бага нет. Кандидату задача зачтена :) 

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

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

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

По совокупности плюсов и минусов я выношу вердикт: срочно нанимаем, рекомендуем к найму, не рекомендуем к найму, не нанимаем. Например, Павел на открытом собеседовании показал отличный уровень — он допустил баг только в одном месте, в бинарном поиске. Я бы рекомендовал его к найму.

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

Советы по подготовке

Много практикуйтесь — для уровня прохождения собеседований углубляться в теорию не обязательно. Теория должна идти «по требованию»: получил базовую — идёшь решать, увидел незнакомые подходы — изучил — снова за практику. Главная цель — набрать достаточный набор структур данных и алгоритмов, научиться понимать, на какой алгоритм конкретная задача. 

Не суметь решить какую-то задачу на собеседовании — это нормально. Время ограничено, иногда просто не везёт. Я считаю, на 100 задач среднего уровня, нужно уметь решать 75 в стрессовых условиях, а 95 — дома на диване.

Начните решать задачи с лёгкой ступени и быстро шагайте выше, если всё даётся легко. Если нет идей, подсмотрите решение. Если идеи есть, но что-то не идёт, отложите и вернитесь к задаче позже. У LeetCode есть три уровня сложности, а у Codeforces их гораздо больше — можно отсортировать и спокойно решать в своём темпе.

Не пишите код в блокноте — пользуйтесь IDE. Если очень хочется, отключите автодополнение и убедитесь, что помните основные методы и объекты вашего языка. Если возник баг, попытайтесь найти его без отладки, если не получается — отлаживайте.

Начинайте приходить в форму заранее, если планируете сменить работу. Вспоминайте, что забылось, решайте по чуть-чуть каждый день и побольше на выходных. Сходите на пару собеседований в малоинтересные конторы, чтобы выйти на важное собеседование в форме.

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


  1. opusmode
    19.04.2024 13:43
    +17

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

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

    3. Сейчас, кстати, разбираюсь ещё с одним сервисом яндекса, не буду говорить с каким. Саппорт мой вопрос поставил в тупик. Как я понимаю, плоха не только внешняя документация, но и внутренняя. Так что толку от ваших алгоритмов, если примерно никто нормально не понимает, как работают ваши сервисы?


    1. qwertypal
      19.04.2024 13:43
      +1

      Согласен! Нужно быть специфическим яндекс подобным, чтобы с ними общаться на одном языке.


  1. DSRussell
    19.04.2024 13:43
    +11

    Такого собеседования в нормальной компании быть недолжно, насторожится и выбрать другую компанию

    Перестать нести деньги в компании которые обещают сделать вас программистом, тестировщиком или еще кем либо за N месяцев, это еще один звоночек чтобы выбрать другого работодателя


  1. Sergey_Kh
    19.04.2024 13:43

    Я ни разу не программист и видео еще не смотрел, но разве это не что-то типа кода ниже? Или тут смысл сделать все вручную?:

    def solution(data):
    ____def check(x):
    ________nonlocal counter
    ________counter += not x
    ________return x
    ____counter = 0
    ____return list(filter(check, data)) + [0] * counter

    (сорри, я настолько не программист, что даже не могу понять, как в этом редакторе отформатировать текст как код и как сделать, чтобы редактор не уничтожал пробелы)


    1. wataru
      19.04.2024 13:43
      +3

      Начните пустой абзац, слева будет знак +. Ткните в него и выберите "код". Появится поле для ввода кода. Или выделите текст, появятся кнопки над ним, выберите <>.

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

      Я не питонист, т.ч. не уверен 100%, но я бы такое решение принял на "leaning no hire". Естественно, если у вас и остальные решения такого же уровня были бы. По одной этой простой задачке судить рано.


  1. ilyamodder
    19.04.2024 13:43
    +18

    Как вы считаете, нормально ли, что вам приходится выпускать статьи "как пройти собеседование типа X в Яндекс" вместо того, чтобы придумать такие собеседования, которые бы реально отсеивали кандидатов по их профессионализму, а не по тому, как много они ваших статей прочитали?


    1. wataru
      19.04.2024 13:43

      Предлагайте! Только помните, что там сотни кандидатов сплошным потоком, надо сделать все более менее объективно, технологии внутри яндекса все проприетарные (так что по какому-нибудь условному реакту не погоняешь кандидата). А еще туда, несмотря на ненавистные всеми алго-собеседования, ломятся куча вайтишников и прочих самозванцев, ведь зарплаты там неплохие, да и строчка в резюме потом дает хороший буст к нанимаемости. И вам очень важно иметь низкое количетсов ложно-положительных результатов, ведь вы нанимаете и из других городов, и платите за переезд и большую зарплату.


      1. ilyamodder
        19.04.2024 13:43
        +4

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


        1. wataru
          19.04.2024 13:43

          Чтобы снижать ложное-отрицательные результаты.

          Делаю вывод, что отсеиваются недостаточно много

          Вы опечатались? По контексту подходит, что вы считаете, что отсеивается слишком много. Если бы отсеивалось недостаточно много, то наоборот вводились бы какие-то дополнительные секретные практики и каверзные вопросы.

          Предложения более хороших вариантов собеседований, которые оценивают профессионализм, применительно к яндексу, я так понимаю, от вас не будет?


          1. ilyamodder
            19.04.2024 13:43

            Да, не совсем верно выразился, смысл хотел передать такой, что подходящих кандидатов в итоге совсем не остается.

            Предложения более хороших вариантов собеседований, которые оценивают профессионализм, применительно к яндексу, я так понимаю, от вас не будет?

            Слушайте, а я подписывался, что их предоставлю, или что? Я даже не критиковал Яндекс в своем комментарии, я лишь вопрос задал, видят они в этом проблему или нет. К тому же это не только у них так и не только с алгоритмами, можно на System Design еще посмотреть, тоже в докладах или статьях на тему «как подготовиться» говорят «мы ожидаем, что кандидат почитал статьи и посмотрел видосы и понимает, как такие собеседования проходить, только там еще круче — готовиться решением задач не надо, а надо выучить скрипт, по которому надо отвечать интервьюверу так, как он этого ожидает.


            1. wataru
              19.04.2024 13:43

              Да, не совсем верно выразился, смысл хотел передать такой, что подходящих кандидатов в итоге совсем не остается.

              Да не, остается. Просто если кандидаты будут заранее иметь представление о собеседовании, то они будут меньше тупить и паниковать. И общий уровень прошедших подрастет.


  1. ReadOnlySadUser
    19.04.2024 13:43
    +12

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

    Или не ходите на алгоритмические собеседования :D Нафига они сдались вообще кому-то?)


    1. zergon321
      19.04.2024 13:43

      Они сейчас везде. Их не избежать


      1. ReadOnlySadUser
        19.04.2024 13:43
        +8

        По моему опыту: совсем не везде, даже не в половине случаев. Но Яндекс пытается всех убедить, что это их дроч на собесах - эт нормально, что так и надо)

        UPD: речь, конечно идёт о собеседованиях на middle/senior. С джунов, в общем-то, кроме алгоритмов и спросить обычно нечего.


      1. NineNineOne
        19.04.2024 13:43
        +4

        Не везде требуют алгоритмы. Я общаюсь только с компаниями, которые не заставляют решать алгоритмы на собесах, и таких компаний много. Алгоритмы в качестве способа отсеять кандидатов - такое же странное решение, как устроить тест на скорость печати слепым методом. Большинство печатают медленно и с ошибками, и что теперь фильтровать их на собесах? Вот и алгоритмы большинству не пригодятся никогда, но фильтровать решили почему-то именно по алгоритмам)

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


  1. astrofyysikko
    19.04.2024 13:43

    Именно по этой причине в яндексе такой провал по многим проектам, баги, ошибки, отсутствие нормальной аналитики. А все потому что берут туда людей которые умеют решать задачки, а уровень senior+ идут уже в нормальные компании, где нужен опыт и знания. Благо от это треша как в яндекс и мейл-групп, много компаний уже отошли.