Искусство войны ML инженера с FAANG

Добрый вечер, дамы и господа. Я знаю, что статьи про собеседования в крупные IT-компании видели почти все, и у некоторых это уже вызывает непреодолимый приступ тошноты, но когда ты убиваешь порядочный кусок жизни на получение определенного навыка, тебе кажется, что смысл твоей жизни — поделиться этим опытом с другими. У написания этой статьи есть и вторая причина — я видел много разных статей про Frontend и Backend разработку, но никто никогда не писал про то, как проходят собеседования в IT гиганты для специалистов в области DataScience и Machine learning инженеров.

Всех, кто еще не уснул от скуки, прошу пожаловать под кат.

Снятся ли программистам электроовцы

На данный момент я Machine Learning Engineer в Российском подразделении Intel. До Intel я работал в небольшом стартапе. 

Я не заканчивал какие-то топовые Российские ВУЗы, у меня степень магистра простого местного университета (чтобы избежать холиваров я не буду его называть).

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

Процесс релокации у FAANG довольно хорошо отлажен, так что я выбрал именно эти компании, как основной путь к достижению своей цели.

Это статья в том виде, в котором я ее представляю, не про мотивацию, так что просто напишу тут, что найти в себе силы на решение N задач — это пол дела. А вот сохранить вообще веру в человечество после N отказов — это настоящий вызов.

image-loader.svg

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

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

Но перед этим…

Я не боюсь человека, который изучает 10 000 различных ударов

Здесь стоит сказать, что каждая компания играет по своим правилам, но, в целом, вам стоит ожидать примерно таких этапов: тестовое задание (aka online assessment), phone screen и сам onsite.

Тестовое задание

Тестовое задание в случае ML инженеров может быть самым разным. Booking, например, дает небольшой тест на 30 минут, в котором всего 12 вопросов про то, как работают разные алгоритмы и в каком случае какой алгоритм машинного обучения использовать. Mckinsey, Ebay и Amazon дают задачи. Советую перед решением тестового задания сначала поискать какую-то информацию, которая подскажет, чего ожидать. Можно заглянуть в leetcode discussion или же на glassdoor. 

Phone Screen

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

Большинство задач, которые дают крупные компании, можно найти на leetcode.com. Если этого вам показалось мало, то можно прочитать сверху cracking the coding interview и competitive programming. Однако, в случае с ML инженерами ситуация может быть чуть сложнее и для оптимального решения задачи от вас могут ожидать некоторой подкованности в области математики. Экзамен по матану никто вам проводить не будет, конечно, но умение найти минимум функции аналитически или упростить функцию — вполне реальные кейсы, с которыми я сталкивался. Об этом расскажу ниже.

Обычно именно задачи пугают людей больше всего. Дело в том, что большинству инженеров хитроумные алгоритмы для решения повседневных задач не нужны. Но, тем не менее, как-то отбирать хороших специалистов нужно, поэтому там выше решили, что логичнее тестировать на знание computer science. Я к этому нейтрально отношусь, с одной стороны, меня правда бесят все эти вопросы в духе:, а есть ли метод X в библиотеке Y. С другой стороны, я не вижу смысла в том, чтобы ментально насиловать человека 4 собеседованиями на знание алгоритмов. Но спасибо, что хоть про люки не спрашивают.

Я решил чуть больше 450 задач на leetcode (93 easy, 300 medium, 57 hard). И за все собеседования ни разу не было такого, что я не смог решить задачу. Но у меня есть чувство, что я слегка переподготовился. Я считаю, что хватит около 200 задач уровня easy и medium. Исключением может быть собеседование в Google.

Онсайт

Онсайт подразумевает в себе 3–4 алгоритмические задачи, System Design и Behavioral. 

Про задачи я писал выше, они не отличаются на онсайте.

System Design

Если задачи для всех покемонов примерно одинаковые и могут отличаться только сложностью, то вот System Design может быть самый разный. Если вы проходите собеседование как ML специалист, то ожидать вам следует примерно всего, что взбредет в мозг вашего интервьюера:   доказательство теоремы, задизайнить рекомендации Youtube или Rate Limiter — список весьма большой и никого особо не волнует, что вы о значении некоторых слов узнали прямо сейчас на интервью.

В гайде для подготовки к онсайту от Amazon написано, что вы можете акцентировать внимание на том, в чем вы хорошо разбираетесь. Так что я следовал такому плану: курс grokking Machine learning interview, ML system design,   Cracking the system design на educative. Еще я прочитал Alex xu system design на всякий случай. Если вы идете на уровень выше, то можно еще пройти курс advanced system design. Я часто видел такую ошибку, что люди игнорировали этот этап и полагали, что их опыта им хватит. Скажу так, это может не стать причиной отказа, но серьезно может занизить ваш будущий доход. Да и, в любом случае, это довольно интересно и полезно.

Еще очень полезным может быть сообщество FAANG interview. Ребята регулярно проводят моковые собеседования по алгоритмам и system design. А еще там можно найти реферала. Есть еще FAANG Data Science. Там активность чуть меньше, но ребята тоже делятся опытом собеседований и выкладывают полезную информацию.

Behavioral

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

Советую пройтись по Amazon leadership principles и вспомнить ситуацию на каждый случай. Постарайтесь сделать так, чтобы в вашей истории фигурировали числа: ускорили что-то в N раз, чихнули и это принесло N тысяч долларов, опечатались и сэкономили компании N миллионов — говорите про все.

Итак, пришло время того, зачем вы тут!

image-loader.svg

Интервью в TikTok. Ой, в ByteDance

Подавался по формочке и как-то пропустил, что страна назначения была Сингапур. Туда я не особо собирался, но подумал, что это будет хорошим опытом. Буквально через недели 3 написал рекрутер и без всяких церемоний отправил на собеседование. Что за команда, что за продукт, какие у меня будут обязанности — это все я должен был узнать уже на поле боя. 

Этапы

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

1 этап

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

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

После этого меня попросили рассказать про линейные модели (log reg, linear regression) и на этом разошлись. Приглашение на второй этап пришло на следующий день. 

2 этап

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

Мы быстро перешли к задаче и вот тут началось. Скажу честно, похожую задачу я не видел ни разу ни в книжках, ни на leetcode, ни даже в самом страшном кошмаре. Если коротко, то суть была в следующем: дан массив чисел, нужно было найти такой индекс, который бы разбивал массив на 2 подмассива так, чтобы некоторая целевая функция для этих кусочков была одинаковая. Пришлось потратить примерно 5 минут на то, чтобы понять, что я вообще только что прочитал. Я попросил привести пример и мой товарищ написал массив и сказал, чтобы этот самый индекс я посчитал сам. А, понял, вопросов больше не осталось. Сам трюк в задаче был в том, чтобы упростить эту целевую функцию. Но, если честно, я не совсем понял, в чем принципиальная разница, ведь задача все равно решалась за линию. 

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

Общие впечатления

Мне нравится TikTok своей интересной системой рекомендаций. И было бы здорово поработать над чем-то таким, но я получил отказ на следующий день. 

Интервью в Apple

На протяжении всего процесса меня не покидала мысль, что я собeседуюсь не в Apple, а в какие-то «Рога и копыта». Даже пару раз проверял письма интервьюера, чтобы убедиться в том, что все это правда. Но обо всем по порядку.

Этапы

Подавался я стандартно — через формочку. Должен сказать, что у Apple довольно удобный механизм подачи резюме. Заполняешь один раз и потом просто жмешь кнопку Apply. Звучит, как что-то само собой разумеющееся, но после 50 компаний, куда я подавал резюме, я понял, насколько это большая редкость. Хотите немного пострадать — попробуйте отправить свое резюме в Lego.

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

1 этап

Интервьюер сказал, что не подготовил каких-то вопросов для меня и мы просто поговорили за опыт. Сначала казалось, что где-то тут подвох и вот он сейчас выпрыгнет на меня с каким-то каверзным вопросом. Но нет. Через пару часов мне пришел ответ, что я прошел на следующий этап.

2 этап

На втором этапе я общался с Hiring Manager. Его интересовали особенности питона и с++, multithreading, multiprocessing, куча, стек. Еще меня попросили рассказать про любой алгоритм машинного обучения. Через пару часов пришел ответ, что меня позвали на кодинг. 

3 этап

Собеседующий был довольно неприятный тип. Все время крутил кубик Рубика или другие вещи со своего стола и всем своим видом показывал, какой он умный. Сама задача была довольно простая: найти все уникальные элементы в тензоре. 

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

Общие впечатления

Очень невнятный процесс для компании уровня FAANG. 

Для меня было довольно странно, что для решения задачи нужно использовать стороннюю библиотеку. Позже на reddit я прочитал, что, если вас просят реализовать какую-то функциональность, которая уже реализована в какой-то библиотеке, можете про это сказать.

По поводу класса: в Google и Facebook рекомендуют писать именно классы, чтобы проще было работать с follow up к задачам. Задачи на leetcode тоже выполнены как классы. Впрочем, я уверен, что если бы там была функция, спросили бы, а почему не класс?  

Интервью в NVIDIA

Подавался стандартно, по формочке. Мне ответили в течении 2-х недель. Видимо, строчка Intel все-таки сыграла какую-то роль.

Этапы

Как обычно, никакого звонка. Вся информация в письме. Всего собеседование включает в себя 2 этапа. 

1 этап

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

Была задача. Кто бы мог подумать. Max points on a line. С этой проблемой я сталкивался до этого и честно сказал про это. Весь мой ход мысли был озвучен, интервьюер согласился с моим подходом и я пошел писать код. 

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

На следующий день пришел отказ. На мою просьбу все-таки написать, что пошло не так, мне прислали список книг. Книжки — это хорошо, будет что почитать.

Общие впечатления

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

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

Интервью в LinkedIn

LinkedIn нашел меня, как ни странно, через LinkedIn.

Этапы

Мне позвонила рекрутер и предложила пройти собеседование в Ирландский офис LinkedIn. Это был первый раз, когда мне дали полное представление о команде, кто чем занимается, какие могут быть задачи, чего ожидать на phone screen и какие зарплатные вилки есть. Казалось бы что-то, что должно быть само собой разумеющееся, но это одна из немногих компаний, которая сразу проговорила все детали

1 этап

Мне попалась задача применить функцию ax^2 + bx + c к некоторому массиву. Массив, a, b и c даны. Ограничение было таким, что a > 0. Суть простая: найти минимум функции и потом двумя указателями сформировать результат. Я написал решение довольно быстро, но и сам интервьюер отметил, что задача довольно простая, особенно для магистра. Понял, рано радоваться.

Дальше меня попросили рассказать про любой ML алгоритм и дали бизнес задачу: предсказать цену на отель / апартаменты. Тут я рассказал про то, какие могут быть признаки, как их обрабатывать, какую модель выбрать, какие метрики использовать. Вроде все прошло хорошо, но через пару часов я получил отказ. Оказалось, что первые 2 этапа прошли отлично, но на последнем интервьюер хотел услышать больше деталей. Только потом прочитав курс про ML System Design я понял, что можно было добавить. Вот сейчас было обидно.

image-loader.svg

Общие впечатления

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

Другие компании, куда меня не взяли

  • Google (реферал) — Написали, что получили мой реферал и обещали вернуться с ответом, но пропали.

  • Facebook (реферал) — ничего не написали, но прислали survey.

  • Amazon (реферал) — прошел все этапы, после чего получил отказ. Оказалось, что позиция, куда я собеседовался, больше про backend, поэтому мой опыт посчитали нерелевантным. 

  • Mckinsey — успешно прошел все этапы, но на данный момент, я не тот специалист, который им нужен. (Может быть тот, которого они заслуживают?) 

  • Snap — после Phone Screen рекрутер написал, что у меня слишком сильный бэкграунд и они постараются расти дальше, чтобы там было для меня место. Жду, на вас вся надежда.

  • Booking — прошел Phone screen, после чего HR пропала. Она стабильно отвечает на письма, но до сих пор не прислала ссылку на onsite.

  • Affirm — написали по ошибке. Когда узнали, что я из России, свернули лавочку.

  • Microsoft (реферал) — кандидатов из России рефералить нельзя. Им нужно отправлять специальное письмо в Москву. Письмо отправил, но никто не ответил. Наверное, там полный завал.

И еще около 50 компаний, которые прислали стандартный ответ: «Здравствуйте, мы очень внимательно вас изучили и вы нам не нравитесь. До свидания, присылайте свое резюме еще.»

По ком звонит колокол

Однажды Эрнест Хемингуэй поспорил, что напишет самый короткий рассказ, способный растрогать любого. Он выиграл спор, написав: «We were impressed with your skills and experience, however, the team has decided not to move forward with your candidacy for this role.»

В заключении, хочется сказать, что, во-первых, оставляйте хотя бы 2–3 строчки фидбека людям, которым решили отказать. Когда человек потратил на собеседование 2–6 часов, то очень обидно получать шаблонный ответ в духе: «мы вам перезвоним.»

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

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

Если кому-то интересна моя судьба, то свой оффер я все-таки получил.

Спасибо за внимание.

Еще полезные ссылки:

© Habrahabr.ru