Привет, меня зовут Глеб Зарин, я ML-разработчик. Сегодня я расскажу, как я подготовился к собеседованиям на позицию Senior Machine Learning Engineer и получил работу мечты за рубежом.
Расскажу, как я выстроил стратегию подготовки, с чем столкнулся на собеседованиях в разных компаниях и какие выводы из этого сделал. Суммирую свой опыт в эту и прошлые итерации поиска работы, опыт моих знакомых и коллег, а также рекомендации, которые я находил в интернете. Не претендую на универсальность, но мне бы такой рассказ помог.
Немного обо мне. Основной опыт работы я получил в Яндексе: за 6 лет успел поработать аналитиком в рекламе, руководителем аналитики в направлении беспилотных автомобилей и старшим ML-разработчиком собственной задачи там же, в беспилотниках.
Работу я прицельно искал в UK (решили с женой, что хотим переезжать туда). Не буду рассказывать, как получить приглашение на интервью — об этом написано в отличном гайде. Скажу лишь, что я шел немного не по классическому пути и работал всего с пятью компаниями, так как хотел заниматься именно беспилотниками. В классическом случае начальную «воронку» нужно делать намного шире: например, моя жена стартовала со списка из 20 компаний и на выходе получила одно отличное предложение.
Начну с общих советов, а потом расскажу подробнее про:
Code / Algorithms and Data Structures
Machine Learning
System Design
Behavioral Interview
Общие соображения по подготовке
Берите отпуск или уходите с работы. Тщательная подготовка занимает много времени, а если вы хотите попасть в новую для вас область или найти работу за рубежом, то готовиться придётся тщательно (ну или надеяться на удачу и годами болтаться на старой работе). У меня ушло два месяца фултайм работы практически без выходных.
Опыт людей вокруг меня показывает, что попытки совместить подготовку к собеседованиям с основной работой обычно неудачны. Частично это объясняется временем, частично детерминизмом: человек не хочет уходить со старой работы в никуда, потому что это стресс. Никто не любит вылезать из под теплого одеяла.
Но поиск новой работы — это много усилий и геморроя. Пройти его без выхода из зоны комфорта не получится, поэтому лучше сразу принять решение, отрезав себе путь назад. Да, для этого нужно набраться решимости, но взамен вы получите мотивацию, больше доступного времени и свободную голову, которая не будет загружена рабочими задачами.
Так что если у нас есть возможность, берите отпуск; если отпуска нет, то берите неоплачиваемый или вообще уходите с работы. Возможность не работать и посвятить себя всецело поиску работы — это преимущество, пользуйтесь им. Такое вложение быстро окупается более интересной и прибыльной работой. Если у вас нет финансовой возможности не работать, то хотя бы поставьте себе цель — например, получить оффер через 3 месяца. Такая постановка позволит вам сфокусироваться и понизить приоритет текущих рабочих задач в пользу подготовки.
Спрашивайте у hr подробности предстоящего интервью. Так вы сможете лучше подготовиться и не впадать в ступор на собеседовании. Может показаться, что это какая-то нечестная стратегия, но все топовые компании, с которыми я общался, наоборот, сами предоставляют максимально подробную информацию о собеседованиях.
Например, Facebook высылает несколько методичек с подробным разбором содержания собесов, даёт среду и задачи, на которых можно практиковаться, и организует семинары, на которых можно задать вопросы по поводу подготовки, а сами hr-ы скидываю ссылки на их любимые ресурсы по подготовке. Зачем? На самом деле, компании заинтересованы в том, чтобы поставить всех в одинаковые условия — а этого можно добиться, только предоставив всем максимально полную информацию, иначе фактор наличия знакомых в компании начнёт играть слишком сильную роль. Кроме того, компании хотят, чтобы обсуждение прошло содержательно. Конечно, не все компании так поступают — некоторые считают, что стоит держать кандидатов в неведении. На мой взгляд, зря, но тут ничего не поделаешь.
В общем, воспринимайте собеседования как экзамены в институте. Вам нужно вытрясти список вопросов и желательно литературу для подготовки из преподавателя. Узнавайте у hr, что будет на собеседовании и как они рекомендуют готовиться. Некоторые даже сами сольют вам вопросы в нарушение политики компании, потому что у них слишком давно висит вакансия. А некоторые ничего не скажут, но за спрос, как говорится, не бьют.
Пройдите мок-интервью. Подготовка по учебникам — это здорово, но собеседования достаточно специфичны: вам нужно быстро отвечать на непонятные вопросы и делать это, вероятно, на не родном языке.
Отличный способ подготовиться — найди среди ваших знакомых и коллег опытных собеседующих и попросить их устроить вам тестовое собеседование. Я прошел через 7 таких моков и жалею только о том, что не сделал их больше. Старайтесь сделать моки реалистичными: пишите код в онлайн-редакторах, рисуйте схемы на online whiteboard-ах (желательно на тех же, на которых потом будете проходить реальные собеседования). Обязательно следите за временем: примерно на половине собеседований именно время было моим злейшим врагом. Говорите сразу на английском (если собеседование будет на нём). И вам и собеседующему будет тяжело, но это лучшая практика.
После такого собеседования просите обратную связь и сами анализируйте свой перформанс. Я, по итогу такого анализа, вносил корректировки в свой план подготовки и в свой план решения задачи (подробнее о план решения будет ниже).
Откуда брать собеседующих? Я просил своих приятелей, а где не находил, просил коллег — было немного неудобно, но что поделать. Ради подготовки к behavioral interview я нанимал hr, которые устроили мне три таких тестовых собеседования.
Тренируйтесь на корпорациях. Отличные, супер-реалистичные моки вы получите, если пойдёте собеседоваться в FAANG. В этих компаниях процесс собеседований отточен до совершенства. После 45-ти минутных собесов в Meta обычные часовые собесы в стартапы я проходил на расслабоне.
Я всегда туплю на первых двух собесах — просто не могу перестроиться в режим, когда мне задают вопросы, оторванные от реальности, или просят рассказать о всём опыте работы за 3 минуты. Поэтому у меня уже давно есть правило: компания в которую я больше всего хочу, должна быть не первой в списке на собеседование. Компания для «тренировки» не обязательно должна быть из FAANG, но желательно, что бы она была большой, с поставленным на поток процессом собеседований — так меньше вероятность наткнуться на странных интервьюверов, которые будут задавать вопросы, которые вы нигде больше не встретите.
Ваше желание пройти в данную компанию не менее важно, чем способность проходить технические собеседования. Существует мнение, что не стоит показывать своего желания попасть в компанию. Мол, стоит показывать своё равнодушие, чтобы предложили зарплату побольше. Возможно, это где-то и работает, но не в том мире, с которым я сталкивался.
Мотивация пройти на вакансию прямо коррелирует с тем, насколько хорошо будет работать сотрудник (мой опыт найма людей это подтверждает). Поэтому если вы действительно писаетесь кипятком от вакансии — не скрывайте это. Вероятно, вас спросят, почему вы хотите пройти именно в эту компанию именно на эту вакансию — сформулируйте заранее ключевые пункты вашего ответа. Желательно строить ваш ответ вокруг пунктов из описания вакансии и рассказа о ценностях/особенностях компании, которые вы можете прочитать на их сайте.
Вообще, если вы представляете себе индустрию, внимательно прочитаете вакансию, найдёте в сети рассказы об этой компании и подумаете часок над её глобальными планами и локальными проблемами, то сможете рассказать, как, работая на этой вакансии, именно вы, с вашим опытом, поможете эти проблемы решить. Такое понимание дороже всех технических собеседований вместе взятых. Но всё это, конечно, применимо, только если вы и правда хотите попасть в данную компанию. Как такое желание симулировать — я не знаю.
Тренируйтесь проходить собеседования на время. На большинстве собеседований главным врагом для меня было именно время (особенно на 45-ти минутных собесах в Meta). Процесс подготовки можно условно разделить на две части:
Теоретическая подготовка: когда вы читаете учебники и статьи или учитесь решать новые классы задач — в общем, работаете над сложными для вас вопросами.
Тренировки: когда вы на время тренируетесь отвечать на простые и средние вопросы. Для этого можно засекать время самому, проходить мок-собесы и «тренироваться» на компаниях, которые вам не очень важны.
Так вот, с точки зрения прохождения собесов тренировки намного важнее. Я добавлял теоретическую подготовку, потому что мог выделить много времени. И еще потому, что я задрот и мне спокойнее жить с глубоким пониманием предмета.
Для каждого типа интервью составьте план, как вы будете решать задачи. У меня был отдельный план для собеседования по алгоритмам, ML и System Design. В техническом собеседовании есть обязательная программа и есть импровизация. Вам нужно не забыть ничего из обязательной программы (сказать о сложности алгоритма) и оставить побольше времени на импровизацию (поговорить о разных вариантах реализации в зависимости от бизнес-задач).
Я составлял такой план после того, как набирался теоретической базы, и перед тем, как начинал практиковаться проходить собесы: самостоятельные попытки решить задачу за отведённое время, мок-собесы, собеседования в «тестовые» компании. Если что-то шло не идеально на такой попытке (обычно так и было) — я анализировал, что пошло не так, как я могу предупредить повторение такой ситуации в будущем, и дописывал пункт в план. В дальнейшем этот план был всегда перед глазами открыт в отдельном окне (благо все собеседования онлайн). Когда я подходил к настоящему собеседованию, план мне был уже не нужен — всё надёжно было выучено, но его наличие меня успокаивало и страховало (а ещё освобождало мою память).
Ниже я приведу пример своего плана для секций по алгоритмам (написание кода), который вам ничего не скажет, потому что основывается именно на моих ошибках, но может дать понимание, как составить свой. Пункты на английском, потому что я не хотел переключать язык, на котором думаю во время собеседований.
Read twice (прочитать условие задачи дважды).
DIY (прорешать пример вручную в online IDE, где пишу код).
Brute force — time/space (придумать самое простое решение, оценить его сложность и рассказать собеседующему).
Solution — time/space (придумать оптимальное решение, оценить его сложность и рассказать собеседующему.
Break to steps and think through every one (разбить прямо в online IDE решение на основные шаги и для каждого шага продумать отдельные действия).
Make tests (выписать edge cases).
Code (собственно написать код).
Check by walking thought i = 0..n (взять простой пример и вручную прогнать как по всему коду).
Test edgecases (вручную прогнать edge cases).
Не советую делать список длиннее 10 пунктов, иначе не получится быстро по нему проходиться во время интервью.
Окей, общее понимание у нас есть, погнали к детальному разбору.
Алгоритмы и структуры данных.
Оно же собеседование с написанием кода. Теоретическую часть я готовил по книжке Cracking the Coding Interview. Leetcode я прорешивал только последние 20% времени подготовки. Почему так? Потому что я не настоящий разработчик, CS в институте у меня не было, пишу почти всегда на питоне и многие базовые темы у меня отсутствуют. Книжка позволяла сосредоточиться на разборе конкретной темы и изучить её с нуля.
Ещё один большой плюс книжки — она мотивирует к «правильному» подходу к тестированию. Дело в том что в Leetcode слишком высок соблазн запустить проверку, не протестировав алгоритм «вручную». Такая привычка ведёт к тому, что на собеседовании остаются баги в коде. Задачи из книжки, наоборот, мотивируют писать тесты самому — а значит, продумывать edgecases и подходы к тестированию своего кода (что в дальнейшем на собеседованиях в интерактивных средах очень пригодилось, см. вариации ниже.). Литкодом я стал больше пользоваться в конце, когда на мок-собесах и собесах в «тестовые» компании выяснилось, что из-за моего подхода к подготовке я мог отлично решать задачи, если понимал, на какую они тему, и плохо решал, если не понимал, как подойти к задаче, и нужно было импровизировать.
Большинство задач я, конечно, решал на время (после того как первоначально освоил тему). Косяки, которые вылезали на тестовых собесах, я покрывал дополнительными пунктами в плане решения.
Вариации. Вообще алгоритмы традиционно спрашивали на маркерной доске (или листочке). Сейчас (слава богу) перешли на online редакторы кода, где можно писать код, но нельзя его запускать. В дополнение к такому классическому подходу некоторые компании стали проводить собеседование в интерактивной среде, где можно ещё и запускать код.
Что именно от вас ожидается, достаточно сильно варьируется — постарайтесь прояснить вопросы у hr или в начале собеседования. Например, какая политика тестирования: должен я проверить алгоритм вручную, поправить все баги и только потом запускать — или я могу запускать свой код, сколько хочу, с самого начала? Я сталкивался с обоими вариантами и узнавал, что от меня ждёт интервьювер, только на середине собеса.
Ещё один вариант — это автоматическое тестирование на hackerrank. На таком собеседовании у вас будет N часов, за которые нужно решить X задач. Решение будет проверяться автоматически, но плагиат как-то контролируется. Обычно времени даётся много, 2–3 часа, но не обольщайтесь: задач будет тоже много, и вы будете судорожно дописывать код в последнюю минуту.
Последний вариант, о котором я недавно услышал — интервьювер даёт вам ссылку на github и просит локально отрефакторить код. В общем, убедитесь, что помните как клонировать проект и что у вас локально настроена IDE.
Machine learning
Теоретическую часть я повторял по книжке Deep Learning (потому что уже читал её и мне очень нравится подача автора), а классику по книжке The Hundred-Page Machine Learning Book (потому что она короткая и написана практиком). И ни одного вопроса по теоретической части мне не задали :) Видимо, считается что если подаёшься на сеньёрные вакансии, то уж отличие L1 от L2 регуляризации знаешь. Но я всё равно не жалею потраченного времени, лишний раз переработал в голове свою базу знаний по ML.
Что же тогда спрашивают? Зависит от типа собеседования: бывают более формальные под названием ML System Design (aka спроектируйте newsfeed твиттера) и менее формальный разговор про опыт ML проектов.
ML System Design. Я готовился по курсу Grokking the Machine Learning Interview. После того, как разобрал курс тренировался на классических вопросах, которые загуглил. Тренировался прилежно: с планом, на время и на той же online whiteboard, которая будет на реальном собесе.
Applied ML. На таких собеседованиях просили рассказать про какой-нибудь крупный ML проект из CV. Готовиться к такому непосредственно перед собеседованием поздно — нужно несколько лет с головой и ответственностью подходить к рабочим задачам. Но немного стряхнуть пыль поможет:
Выбрать, какой из ваших прошлых проектов наиболее релевантен данной вакансии/компании.
Вспомнить, что подаётся на вход модели и что получается на выходе. Какой loss.
Сформулировать, какой бизнесовый результат и как его измеряли.
Отличный способ подготовиться к таким вопросам — это проходить собесы в «тестовые» компании. На реальных собесах быстро понимаешь, что именно ожидают услышать и в каких подробностях.
System Design
(Aka спроектируйте backend инстаграма). Самый страшный собес для меня, до этого с таким не встречался. Очень пригодились моки с коллегами. Готовился по курсу Grokking the System Design Interview. После разбора курса, как обычно тренировался на нагугленных вопросах с таймером, планом и вайтбордой.
Наличие плана и тренировок здесь критично, потому что за 45 минут невозможно спроектировать большой сервис. Надо понять, что интервьюверу важнее всего — и тут, к сожалению, большая вариация. Некоторым важнее big picture, а некоторые половину времени спрашиваю про конкретный алгоритм. Самый ужас в Meta, где все 45 минут собеседующий молчит и приходится как то гадать.
Behavioral Interview
Такие собеседования обычно проводят менеджеры, но короткую версию может и hr вначале процесса устроить. Что это за интервью и как к нему готовиться, описано в том же Cracking the Coding Interview. Как там и написано, я сделал табличку: вопросы по строчкам, пункты STAR(R) по колонкам, а в ячейках мои key points ответа. А далее тренировался отвечать на них. Я сильно переживал за это интервью и нанял hr-агенство, которое устроило мне три мок-собеса и предоставляло по ходу feedback. Заплатил дорого, но не жалею.
Также советую подготовить 3 рассказа о себе разной длины: в двух предложениях, на один абзац и на пять минут. Вызубренные рассказы позволят вам немного отдохнуть на стрессовом собесе во время проговаривания ответа.
Общий совет для ответа на любой вопрос: отвечайте top -> down: сначала ответьте одним предложением, потом одним абзацем, потом подробно. Такой подход позволит интервьюверу сразу понять о чём вы говорите и остановить вас на нужной глубине, что сэкономит вам драгоценное время.
Если вы до этого не работали в западной компании, то советую уделить особое внимание подготовке к этому интервью. Методы управления местами отличаются (в отличие от алгоритмов или ML). Например, вопросы про feedback culture были для меня настоящим минным полем.
Какой же результат всей этой работы? Прошел ли я с легкостью во все компании куда подавался? Вовсе нет. Где то меня отшили после рассказа о прошлых проектах, в Meta я что-то не то ляпнул на Behavioral Interview и меня отправили на пересдачу, а где то дали уровень middle так как я решил одну из алгоритмических задач не так, как любит интервьютер (все остальное идеально).
Но главное для меня — я прошел в компанию куда больше всего хотел, на сеньёрную позицию и с хорошей оплатой. Какая у этого мораль? Разброс случайности на собеседованиях очень большой. Даже тщательная подготовка ничего не гарантирует. Но она существенно повышает ваши шансы, а в случае отказа (они неизбежно будут) вы будете понимать, что сделали всё, что было в ваших силах и сможете спокойно идти на следующее испытание.
Ссылки:
Гайд по поиску работы
Cracking the Coding Interview
Grokking the System Design Interview
Grokking the Machine Learning Interview
Deep Learning (Goodfellow)
The Hundred-Page Machine Learning Book
Анна — HR который меня готовил к Behavioral Interview
STAR(R) — схема ответа на вопросы Behavioral Interview