Путь в FAANG

Глоссарий

Если вы сведущи в теме, пропускайте этот раздел. Если несведущи - можете тоже пропустить, но в случае, если какие-то термины непонятны - велкам сюда.
  • FAANG - (Facebook, Amazon, Apple, Netflix, Google) - собирательное название компаний - лидеров мирового IT-рынка. Сюда еще входят Microsoft, Uber и прочие. Иногда под этим понимают крупные компании, которые собеседуют по алгоритмическим задачкам
  • Алгоритмическая задача - задача, основная сложность в которой, - придумать каким способом ее решить внутри. Часто решение умещается в несколько строчек, но сгенерировать его крайне проблемно. Практическое применение в коммерческих проектах ограничено. Примеры: сортировка массива, поиск подстроки в строке и прочее.
  • Спортивное программирование - решение алгоритмических задачек на время. Сложность многих задач превышает необходимую на собеседованиях в FAANG
  • Codeforces - один из лучших сайтов для спортивного программирования.
  • Leetcode - крайне удобный сборник алгоритмических задач, большинство из которых попадаются на собеседованиях. Имеет также и соревновательную часть, но она небольшая. Есть премиальная версия, позволяющая открыть дополнительные фильтры по компаниям, доп. задачи, решения. Польза премиальной версии спорная. Задачи классифицируются, как easy, medium, hard. Бывает конечно, что авторы лажают с оценкой сложности задачи, но, как правило, корректны. Когда я буду говорить о сложности, то буду иметь ввиду именно их классификацию.
  • coding interview - интервью, на котором, как правило, задают алгоритмическую задачу
  • system design interview - интерью, на котором вас просят разработать внутреннюю структуру какого-либо сервиса, например Skype, bit.ly и т.д.
  • behavioral interview - интервью "за жизнь", задают поведенческие вопросы по твоему опыту, могут быть весьма каверзные вопросы и неплохо бы знать, какие ценности выделяет та компания, куда собеседуешься

Предыстория


Вводные условия примерно такие же, как у многих украинских программистов - я не гений, у меня нет историй, как я в 9 лет заинтересовался программированием и закодил что-нибудь для Spectrum, живу в Украине, закончил “Разработку программного обеспечения” в НТУ “ХПИ”, был на обычных проектах без highload и достаточно ленивый. 
В институте один раз был на личной олимпиаде по спортивному программированию и один раз на командной, но, будучи совершенно неготовым, пролетел как фанера над Парижем. Мысли о работе в лидерах мирового рынка у меня конечно возникали, но как что-то отдаленное и во время учебы я даже не пытался попасть на стажировку туда, ограничившись устройством в местный GlobalLogic после третьего курса.


Неудачи

Бестолковые

Часть моей карьеры я был автоматизатором. И именно в такой момент я решил попробовать. Промониторив вакансии на сайте гугла я нашел вакансию плюс-минус под мой профиль и отправил своё резюме. На удивление, мое резюме чем-то привлекло рекрутера и он вышел на меня. Надо сказать, что я тогда придерживался той точки зрения, что готовиться к собеседованиям не надо. Если ты не можешь его пройти без излишней подготовки, то и работать в этой компании не получится. О том, что на собеседованиях в FAANGи спрашивают алгоритмические задачи, которые нужно отдельно практиковать, я не знал. Ожидаемо это был оглушительный провал. Я получил легкую задачку на деревья и решил ее с огромным скрипом и кучей подсказок. Ретроспективно я понимаю, что это была разминочная задача, на которую отводилось первые 10-15 минут. 
После чего я зарегистрировался на сайте codeforces.com, где полагается решать подобные задачки в соревновательном темпе. Но практически не уделял ему внимания на тот момент.
Следующая попытку я осуществил через пару лет уже в Microsoft. Рекрутер сам вышел на меня и я согласился. Понятия не имею почему я опять не готовился. Возможно полагал, что меня спасет сертификация по C#. Честно говоря, о той попытке у меня крайне смутные воспоминания. Но опять все закончилось на телефонном интервью, причем крайне быстро.

Внезачетные

Такими я считаю участие в Google Code Jam и Facebook Hacker Cup. Это соревнования по спортивному программированию. На тех, кто попадают в топы, выходят гугловские/фейсбучные рекрутеры. В сумме я предпринимал пять попыток, но все закончились одинаково - проходом квалификационного раунда и вылетом в первом. Причем один раз я не прошел во второй раунд из-за пропавшего интернета. Было обидно, но тот проход был бы больше совпадением.

Комедия

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

Толковая

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

Летом 2017 года я начал готовиться чуть серьезнее - прошел этот курс по алгоритмизации, который позволил мне решать большее количество задач и заполнить пробелы в базе. Могу советовать его всем новичкам.
В начале 2018 года я услышал о том, что Amazon проводит hiring event. И вот к нему я готовился уже серьезнее - зарегистрировался на leetcode, стал регулярнее принимать участие в соревнованиях на codeforces и решал задачки еще на других сайтах. Но уровень решаемых задач был крайне невысок. На онлайн-отборе получил две задачи, одну решил, вторую нет. Спустя некоторое время меня все же пригласили дальше. Видно сначала пригласили всех, кто решил две задачи, а потом уже "остаток". Готовиться я продолжил теми же методами - codeforces+leetcode. Вдобавок нужно было подготовиться к двум новым аспектам: behavioral и system design. С первым мне здорово помогла жена - подобрав истории из моего опыта, которые соответствуют разным принципам, ценимым амазоном. Ко второму я готовился крайне мало, понимая, что нужно больше вытягивать задачки, ведь их будет больше.
Было 4 интервью - 3 на задачки + одно на system design плюс на каждом из них была behavioral задачи. Задачи были уровня около medium/easy, какие конкретно уже даже не помню, но я жутко волновался и запорол минимум полтора интервью. Получив ожидаемый отказ я не слишком расстроился ибо увидел прогресс. Но интервью я прошел таки плохо, поскольку на следующий ивент меня позвали только через два года.

Удачи

Подготовка

В моей подготовке наступила пауза, связанная с рождением ребенка, но постепенно через год я начал возвращаться к практике. Купил премиум на leetcode. Старался заставлять себя решать задачи по тем темам, которые у меня плохо получались. Довольно быстро я ощутил, что easy задачи для меня практически бесполезны, ведь решение в них зачастую очевидно и перешел на medium + иногда hard. К августу 2019 у меня было около 60-70 задач на leetcode и, полагаю еще столько же на других ресурсах. Кроме того, я прочитал знаменитую Cracking the Coding Interview, но она мне не дала ощутимой пользы. Возможно, если бы я добрался до нее до прохождения курса и неплохой практики, то мое мнение было бы другим. Гораздо больше мне помог этот канал. Здесь ребята хорошо объясняют как надо мыслить, чтобы дойти до решения и разбирают паттерны.

Microsoft ✅ 

Я узнал о том, что в сентябре 2019 в Таллинне будет проходить Microsoft Hiring Event и подался на него. Онлайн-отбор состоял из 3 задачек. 1 easy, 2 medium. Я решил все три и достаточно быстро получил приглашение на собеседование.
Было снова-таки 4 интервью - 3 coding, 1 system design + немного behavioral. Одно из кодинг интервью было немного нетипично, ведь меня собеседовали не по алгоритмическим задачкам, а по многопоточности. Благо, интервьюер требовал не конкретных жестких знаний, а скорее общего понимания как это должно работать. Два других кодинга были medium уровня. В одном мне повезло, ведь такую задачу я разбирал в самолете по дороге в Эстонию:-). Последняя задача была easy/medium, основная сложность была в edge cases. Эту задачу я решил очень быстро. Собеседующий явно этого не ожидал, поскольку он не знал о чем со мной дальше говорить, о чем мне и сказал. В итоге остаток интервью обсуждал со мной детали работы операционной системы и процессора с потоками. К счастью, мне это было знакомо. System design, как по мне прошел плохо. Я сделал часть, но явно плавал в некоторых аспектах хранения и передачи данных. Плюс потом со скрипом рассказывал о банальной схеме криптования с открытым ключом. 
Примерно через неделю я получил оффер, но на крайне малую сумму для себя поэтому отказался. Впоследствии майкрософт попробовал улучшить оффер, но все равно было мало плюс сын еще был слишком мал, чтобы идти в садик и "отпустить" жену на работу. Поэтому я его отклонил окончательно.

Финальная подготовка

После произошедшего я продолжил активно готовиться, доведя количество задач к сотне (23 easy + 62 medium + 15 hard). Codeforces я практически отбросил, поскольку уже максимально привык к решению задач в напряженной обстановке. Вариативность же задач, которые не вдавались в ненужные дебри, страдала. Плюс leetcode давал возможность классифицировать задачи по темам и компании, имел площадку для обсуждения задач и я чувствовал больше пользы от него.

Google ✅ 

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

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

Буквально через пару дней мне сообщили, что можно двигаться дальше. Предстояло решить - хочу я дальше идти на позицию автоматизатора или все же девелопера. Девелоперу предстояло 3 coding interview, 1 system design, 1 behavioral. Автоматизатору 1 coding, 1 coding(easy) + testing, 1 automation testing practices, 1 system design, 1 behavioral. Не в последнюю очередь на мое решение повлияло то, что в случае автоматизации мне придется готовиться более разнообразно и вспоминать давно позабытые вещи. Поэтому решил двигаться дальше с development веткой. Onsite должен был состояться в марте в Варшаве, но из-за всем известных событий собеседование было перенесено в онлайн. Согласно рекрутеру, system design интервьюеров меньше, поэтому было решено, что у меня сначала будет 3 coding + 1 behavior. а потом уже, в случае удачи, 1 system design.
На первом интервью мне попалась задача, даже похожую на которую я не нашел на leetcode. Но уровень где-то medium/hard на DSU + bit operation. Довольно быстро я нашел способ как решать ее оптимально, но дальше почему-то из-за мандража я начал как-то сильно нервничать и в итоге плохо написал DSU, озвучивая вслух правильные идеи. Эмоции были смешанные.
Второе интервью было behavioral. Не было ни одного вопроса из топа, который обычно гуглится. Но и не было масштабных вопросов на 10-15 минут. В основном небольшие по конкретным ситуациям.
Третье интервью. Medium задача с продолжением в hard на тему Trie. Hard не успел дописать буквально одну-две строчки, но всю идею успел донести.
Четвертое интервью. Неожиданно повторилась майкрософтовская история и задача была больше на параллелизацию и ее дизайн. Алгоритмической сложности практически не было.

Уже вечером со мной связались и сказали, что будут назначать system design. Я попросил себе две недели паузы на подготовку и прошел этот курс на 80%. Сам курс отличный и помог мне осознать многие вещи. На интервью же была задача, которая снова-таки не упоминается в топах и ее не разбирали. Но я следовал паттерну из пройденного курса и вроде бы неплохо прошел. Повезло в том, что мне не надо было рисовать, а собеседующий сам уже заготовил картинки. Я только писал текст по требованиям. Но это не правило, возможно вам придется рисовать мышкой.

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

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

Amazon ✅ 

Спустя два года снова весенний hiring event. Онлайн-отбор немного видоизменился и теперь нужно было еще описать текстом алгоритм решения задачи и поотвечать на behavioral опросник. Задачи были medium уровня, обе связаны с темой islands на leetcode. Я решил обе задачи очень быстро и тем же вечером получил сообщение о том, что я квалифицировался дальше. К сожалению, из-за коронавируса собеседования проходили по видеосвязи и уже после гугловских собеседований. Как всегда у амазона все интервью начинались с behavioral части.
1. был system design сервиса, который очень часто попадается в топах и примерах. И вот тут пришлось рисовать мышкой. Было не слишком удобно, лучше потренироваться в случае удаленных интервью.
2. Алгоритмической сложности не было, нужно было задизайнить функцию по назначению близкую к production code. Тут я не всегда хорошо понимал, что он от меня хочет. Создавалось впечатление, что ему нужно конкретное решение, которое у него в голове, но при этом он был максимально вежливый и сам признавал, когда меня запутывал.
3. Хард на Trie. Здорово похожий на гугловский, поэтому я справился с ним достаточно легко.
4. Последнюю задачу я не смог найти на литкоде, но подозреваю, что easy/medium. Я сначала решил практически оптимальным путем через сортировку, потом озвучил оптимальный - с использованием max-heap, но не успел его закодить, в том числе из-за проблем с амазоновской системой и моим соединением с интернетом, на чем потерял несколько минут.
На следующий день я узнал, что все 4 собеседующих одобрили мою кандидатуру. Тут проще, чем в Google и не надо ждать одобрения от комитета, директора, так что результат тоже оффер в Ванкувер.

Выводы

Тут постараюсь осветить субъективные вещи, которые были для меня неочевидны перед всем этим процессом, здесь не будет стандартного "готовьтесь усерднее".
  1. В одном из материалов на dou занятие теорией сравнили с вдохом, практикой - выдохом. Чередуйте эти занятия соответственно.
  2. Старайтесь как можно скорее отвязаться от решения easy задач. Да, это практика, да, это приятно решить очередную задачу и поднять свою статистику. Но вы просто теряете на этом время. Решать их, ИМХО, приемлемо пока вы совсем не разбираетесь в этой теме. Как только начинает появляться понимание - переключайтесь на medium. Моя статистика - easy/medium/hard 23/92/21 и мне кажется, что я в начале решал многовато легких, пока не понимал этот принцип.
  3. В случае литкода смотрите на лайки к задаче, а если у вас есть премиум, то еще и в каких компаниях она встречается. Периодически попадаются задачи, сложность которых только в том, что решение занимает целую простыню и когда смотришь статистику, то видишь, что встречалась она в каком-нибудь блэкберри 2 года назад в последний раз. Количество дислайков у нее, как правило, соответствующее
  4. Решая задачи, не забывайте про покрытие разных тем. Вы можете прорешать сотни задач, так и не наткнувшись, например на DSU. Списков тем гуглится много, плюс у литкода есть фильтры по темам, по-моему, даже не в премиуме.
  5. Даже если вы решили задачу сами, не поленитесь зайти в Discuss, там могут быть описаны другие, более легкие подходы, какие-то трюки, которые вам могут помочь в будущем.
  6. Тренируйтесь решать в некомфортных ситуациях - объясняя у доски другому человеку, на соревновании, не используя IDE. Вообще про IDE стоит забыть во всех случаях, кроме контестов. Так как все эти скобочки, запятые и прочее сами себя на собеседовании скорее всего не поставят и отдебажить "ломом" уже не получится.
  7. Этот совет встречается часто, но я все-таки повторюсь. Озвучивайте даже самое тупое решение и думайте вслух. Если вы понимаете, что вам это дается с трудом - практикуйтесь.
  8. Не стоит бояться неудачи, но готовиться надо, ведь в случае полного провала, компания поставит вас в "черный список" на год-другой. Перед своим основным собеседованием сходите на схожие в другие компании, возможно на неинтересную позицию, локацию, неважно. Главное, чтобы процесс собеседования был похож - решение алгоритмических задачек.
  9. Разбирайте задачи с интервью, вспоминайте процесс и где вы застопорились, чего вам не хватило. Возможно вам нужен инсайт, новый паттерн решения, которые нужно поискать в других источниках.
  10. Старайтесь запоминать не решения, а подходы. Все равно на интервью вряд ли вы вспомните добуквенно решение одной из 200 задач. А самих подходов и структур данных, которые встречаются на собеседованиях, не так и много, с ними проще. Если вы понимаете на собеседовании, что решали эту задачу, но помните плохо, лучше решайте как заново.
  11. Больше говорите на интервью, озвучивайте свои сомнения. Если вы не уверены, что успеете записать реализацию какой-то тривиальной объемной функции, можете сказать об этом собеседующему. Скорее всего вам разрешат пока оставить заглушку на месте функции и реализовать ее уже потом, если будет время.
  12. Коронавирусная специфика - будьте готовы на System Design рисовать мышкой, неплохо бы потренироваться в нескольких редакторах.
  13. Понимайте в какую компанию идете собеседоваться и что от вас ожидается. Например, если идете собеседовать в Amazon, проработайте истории или ключевые моменты для behavior interview

Итог

Из 4 интервью, к которым я хоть как-то готовился мне удалось пройти 3. Конечно в этом был и весомый процент удачи, без этого никуда. Но, в общем, это показывает, что не обладая превосходными входными условиями, все реально. Я принял предложение Google, но на июль 2020 пока работаю из Украины в связи с карантином.


Комментарии

Популярные сообщения