Привет!
Недавно Яндекс изменил процесс отбора кандидатов, теперь перед алгоритмической секцией добавилась секция Advanced Code. Секция заявлена как более близкая к практике, в статье я расскажу правила нового формата.
Я не связан с Яндексом, описываю процесс как он выглядит с моей, программерской, стороны. Пару лет назад я проходил три секции лайвкода, получал оффер, но тогда не смог принять его. А на днях побывал на новой секции Advanced code. Лично для меня это испытание прошло тяжело, как говориться lessons learned, но я узнал правила игры, и буду писать сугубо технически про условия и цели. Личную историю и мнение, шероховатости нового процесса, свои эмоции и фейлы уберу в спойлер в конец статьи.
На сегодня описание новой секции от Яндекса такое:
1 секция - Advanced code
Секция длится 1 час.
В отличие от АА это будет более близкая к практике задача.
Тебе предложат ознакомиться с уже существующим небольшим кодом и попросят его дописать или написать какую-то комплементарную часть (например, будет тест, нужно будет реализовать функцию удовлетворяющую этому тесту, или наоборот и т.д.).
Условия проведения секции приближены к реальной работе, разрешается пользоваться интернетом, справками по языку программирования, справками по стандартным библиотекам
Старая добрая секции «алгоритмы» (АА) осталась, она теперь следует за AC. По AA много материалов (видео и примеры от Яндекса, список тем, статьи с опытом прохождения на Хабре, даже перечислены темы, которые там не встречаются), правила игры и критерии оценки доступны всем желающим. Поэтому будет удобно описать новую секцию (AC) в сравнении с AA. А заодно сравнить с подготовкой на leetсode. Да, литкод по-прежнему актуален для подготовки к AA.
Среда разработки. Старая АА пишется в онлайн-блокноте ЯндексКод. Новая секция AC пишется в IDE на компьютере кандидата, ведётся демонстрация экрана. Поэтому к интервью надо подготовить IDE с чистым проектом с подключенной библиотекой для unit-тестов.
Конечная цель нового задания - пройти автотест. Для этого надо сначала понять условия, составить пример для теста, написать автотест, реализовать решение самой задачи. Для сравнения, на литкоде цель та же, с той разницей что тесты предоставлены площадкой. А в секции АА тест так же надо придумать самому, но прогонять его в уме и блокнотике.
Формулировка задач. Важное различие в формулировках задач между литкодами и секциями Яндекса - литкод даёт к задаче примеры входных данных и ожидаемых результатов. На интервью наборы тестовых данные надо составить самостоятельно. Поэтому, готовясь к интервью - читаем формулировку задачи и пытаемся понять задачу не смотря на примеры данных, тренируемся самостоятельно придумать тесты.
Компилируемость. В новой секции код должен компилироваться и выполняться. Как и в литкоде. А в секции АА мы пишем код в блокноте и не запускаем, интервьюер может в фоне попробовать запустить код в том же литкоде или на своём компьютере.
Помощь в интернете. Разрешение гуглить не делает большой разницы. В секции АА если не мы помним название метода мы пишем примерно предполагаемое, интервьюер может подсказать и поправить. А в секции АС мы можем гуглить. Например, если вы забыли как называется функция стандартной библиотеки, или нужен сниппет со стековерфлоу. Знаем что ищем, пишем конкретный запрос, хватаем результат, 10 секунд на круг.
К сожалению, не могу сказать, разрешено ли искать в интернете решение данной или подобной задачи, можно найти механизм и поправить его к месту. Это было бы максимальным “приближением к реальной работе”.
Корнер-кейсы. Литкод тестирует наше решение корнер-кейсами, только показывает их не сразу, а после прохождения простых кейсов, но всё же даёт их если мы забудем. А на интервью, на обоих АА и АС кандидат должен сам их найти. Поэтому, при подготовке на литкоде, перед сабмитом решения тренируемся самостоятельно подумать о возможно непредусмотренных корнер-кейсах.
Примеры задач для подготовки составляют главное различие между секциями. Для АА их не счесть, а для новой секции их нет. Я не буду сливать задачу которая досталась мне на секции, но приведу в пример задачу, которая мне кажется самой похожей на неё. Оригинальную постановку задачи можно посмотреть на hackerrank. Адаптируя её под формат Advanced code, мы получили бы от интервьюера такой текст задачи:
Разработайте класс, реализующий буфер текстового редактора. Класс должен предоставлять методы:
добавления строки s в конец буфера
удаления n последних символов из буфера
отмены последней операции
вывода текста всего буфера
вывод последнего символа буфера
В задаче hackerrank есть уточнение, что операция отмены отменяет операции кроме операций отмены, и смотря на примеры мы видим, что отмену не надо запоминать в истории. В секции же Яндекса примеров не будет, а формулировка задачи будет содержать пробелы для уточнения у интервьюера, например насчёт нюанса с отменой отмены.
План решения задачи довольно прост:
-
Смотрим на требования, согласовываем с интервьюером набор публичных методов.
-
Поскольку конечная цель секции - выполняющиеся автотесты, а на старте нам надо проговорить сценарии использования класса - пишем автотесты. Для начала один позитивный тест, и на дополнительный бал обсуждаем поведение при не очень корректных действиях, как в этом примере “отмена если отменять нечего”.
-
Реализуем наш класс, следим чтобы интервьюер не заснул, периодически озвучивая текущий прогресс и решаемую в данный момент подзадачу. Типовые операции и всё что вы привыкли гуглить - гуглим, интервьюеру должен быть расшарен весь Ваш экран, а не только IDE, чтобы видеть все ваши действия.
-
Запускаем тесты, фиксим до прохождения. Я бы дал дополнительный балл за прохождение тестов с первого раза. Поэтому, если есть время и силы проверяем код глазами.
-
You Are Awesome!
Для сравнения, план решения задачи с секции АА:
-
Понять задачу
-
Написать пример входных и выходных данных, описать корнер-кейсы
-
Озвучить возможные алгоритмы, договориться интервьюером какой реализовывать
-
Реализовать псевдокод
-
Прогнать тесты и продебажить код в голове
-
You Are Awesome!
Личная история
Я получал оффер от Яндекса во время, когда не искал работу. Хотел доделать текущий проект, о чём честно говорил интервьюером, но мы всё же пообщались и дошли до оффера. В течение следующих двух лет отвечал рекрутёрам из Яндекса на их вопросы, что хотел бы пообщаться, когда буду иметь твёрдое намерение идти к ним работать. Когда этот момент настал, я связался с рекрутёрами, мне объяснили, что секции надо перепроходить, что формат изменился и добавилась новая секция Advanced Code. Я попросил поставить секцию на следующую неделю, чтобы иметь время на подготовку. Сел готовиться, но не мог понять, к чему готовиться. Попробовал попросить у кадровика пример — и внезапно получил его. Пример, по которому стало понятно что вообще ничего не понятно, и что единственный способ узнать правила секции — сходить на неё. Я поблагодарил рекрутёра и не ставил требовать более подробного описания секции, указывать на контраст в описании между АА и АС.
Я обдумывал пример, ломал голову в догадках, что же за задача будет стоять на передо мной на собеседовании. Искал примеры «приближенных к реальности» задач для лайвкод‑интервью. В общем, забивал себе голову.
Реальная секция собеседования началась с того, что интервьюер попросил расшарить ему экран с моей IDE, сказал что кадровик должен был предупредить меня об этом. А я готовился писать в онлайн-блокноте.
Затем я получил задачу, которая называлась так же, как та, что мне дал кадровик в качестве примера. Я ему сообщил что эту задачу дали мне для подготовки, но в совсем другой формулировке. Интервьюер возмутился и отвлёкся обсудить этот момент с коллегами. Ну а затем половину секции я освобождал голову от всего, что надумал за неделю подготовки по расплывчатой формулировке к по факту другой задаче. Я был зациклен на «приближенности к практике», а предо мной стояла задачка с литкода, обёрнутая в класс, которую назвали реалистичной, но грубейшими допущениями сделали из неё сюрр. Я бы не возмущался, если бы знал правила игры заранее. Вполне можно придумать отдельный вид задач рядом с литкодом, где задачи вынуждают применять ООП и использовать возможности языка. Будет натянуто, но окай, понятная цель и принятые условности.
Отдельно неприятно было оказаться в положении кандидата, который где-то раздобыл задачу с собеседования заранее. Неудобно перед кадровиком, к которой теперь будут вопросы, почему она сливает задачу. А она ничего не сливает, а в моём случае только запутала меня. И я понимаю её, потому что я наверняка не единственный, кому бросается в глаза разница между описаниям секции АА, по которой разжёвано всё, и новой АС, по которой ничего не понятно. Кандидаты просят инфу, она пытается что-то ответить.
Я думаю, это временные проблемы, пока идёт обкатка нового процесса.
Автор: pjotar