Очередная история успеха после череды неудач. Расскажу, чего мне стоило получить офферы от Facebook, Google, Amazon, JP Morgan в Европе, как я готовился, сколько собесов зафейлил перед тем, как удача повернулась ко мне правильной стороной. Ой, нет. Я ж не гугл транслейт. Я могу нормально перевести background на русский. Пусть будет "Немного об авторе". Звучит вполне литературно, что скажете? Ху из я? Меня зовут Андрей. Всем привет! Мне без пары лет 30, и я из Воронежа. Немногим более 6 лет професcионального опыта. На момент начала собесов было чуть меньше 6, но я хитро писал в резюме ~6. Люблю ~, оставляет много пространства для маневра. Худо-бедно получил специалитет на факультете компьютерных наук в ВГУ (это почти как МГУ, только леший знает где, и не МГУ). Первые 4 года провел в аутсорсах. Потом 2 года удаленно работал на Hazelcast и Bricks (американские стартапы). Написал парочку небольших либ на GitHub. Иногда рассказываю что-нибудь эдакое на конференциях. Веду бложек. Получаю магистратуру онлайн в Georgia Tech. Пытаюсь, так сказать, восполнить пробелы своего беззаботного студенчества в ВГУ. Если вдруг кому-то сильно интересно, то можете почекать мое CV вот тут. Жил я в Воронеже, не тужил. Код на машине крутится, лавеха мутится. Правда, все мне хотелось земли заморские посмотреть. Ну, и во всяких FAANG'ах поработать, по возможности. Год назад мои чаяния оформились во вполне конкретный план. Я провел небольшое исследование на тему того, куда же все-таки переезжать. Назвал его по-желтушнее и собрал плюсов на хабре. После, взял небольшой перерыв, прочистил мозги, и принялся за дело. Время: Январь — Февраль 2021. Время рассылать резюмехи. Первым порывом было податься в известные мне компании. Точнее так, в известные МНЕ компании. Чем больше я перебирал их имена в голове, тем больше мне становилось понятно, что, во-первых, моя память — не шибко надежное хранилище с потерей данных, во-вторых, даже если бы я ничего и не забыл, мои знания точно не блистают полнотой. В итоге я выписал список компаний, которые вспомнил на листик. В этот листик добавил разные интересные имена из статей найденных в гугле. Про какие-то компании услышал из видосов Gergely Orosz. Список, однако, вышел скудноватым. Гулять, так гулять! Я прошелся по всем компаниям из S&P 500 и около сотни самых больших из NASDAQ, и выписал интересные названия еще и оттуда. Теперь список вышел на славу. На этом месте логично спросить, почему я интересуюсь только большими компаниями, которые есть или скоро будут на бирже. Причин целый ворох, помимо, "хочется":  Из каждого утюга, где говорят про собесы в большие компании, говорят про рефералы. Об этом пишут в бесконечном количестве блогов и постов на Reddit. Как всем известно, если что-то написано в интернете, то это не может быть не правдой. Не долго думая, я проворошил всю свою сеть коннкетов на LinkedIn, и дополнил это спамом незнакомым инженерам из FAANG в Twitter. Как мне сказал один из них, в том же Google он указывает уровень знакомства с тем, кого рекомендует. Как и следовало догадаться, рефералы на анонимусов ценятся примерно никак. С другой стороны, безмерно крутой и уважаемый мной Gergely Orosz сказал мне, что на них все-таки смотрят в первую очередь. Я бы рекомендовал попросить рефералов у хотя бы как-то знакомых людей, и не заниматься ковровой бомбардировкой незнакомых ни в чем не повинных людей. Лично мне это пользы не принесло. Помимо рефералов я подавался на сайтах компаний. Прошла первая неделя февраля. Я разослал, наверное, 300-400 резюме. И… ничего. Зияющая пустота в моем почтовом ящике. Какие-то компании прекратили перевозить из-за COVID, какие-то меня просто игнорили. Высшие космические силы, мое паучье чутье, и, в конце концов, глас разума подсказали мне, что мне нужно либо набраться терпения, либо менять стратегию. С терпением у меня всегда было плохо, с самого детства, так что оставалось только менять стратегию. Более того, новая стратегия никак бы не помешала насладиться плодами прошлых усилий, правильно? Кто-то там умный предположительно сказал, что хороший вопрос содержит половину ответа. Осталось придумать хороший вопрос. Попробуем вместе? "Как бы мне наняться в классную большую компанию?" Не. Фигня какая-то. "Как сделать свое резюме более заметным?" Вроде, лучше. "Как сделать так, чтобы рекрутеры замечали мое резюме чаще?" В яблочко! Ключевое слово тут рекрутеры. Если они — те люди, которые производят первичный отсев, то им-то и надо писать. Этим я, собственно, и занялся. Открыл LinkedIn, вбил recruiter в строку поиска, и начал фильтровать по компаниям. Фильтровать и спамить с рассказом о том, какой я хороший. Через странички с вакансиями на сайтах самих компаний я получил интервью с Booking в Нидерландах, JP Morgan в Великобритании, Amazon в Германии, Microsoft в США. Спам в личку рекрутерам принес Uber в Нидерландах и Databricks в Нидерландах. Рассылка почти сработала с Microsoft, но рекрутер оказался в Польше, а в Польшу мне не хотелось. Facebook дался мне нелегко. Я написал Michel Weststrate в Twitter. Он сделал immer и mobx. Я когда-то что-то даже коммитил в immer, тогда-то мы и познакомились. Он оказался безумно славным парнем и не пожалел для меня реферала в Facebook. Порекомендовал меня он на позицию фронта в Лондон. Через пару дней меня режектнули без объяснения причин. Печально. Погрустил я, впал в депрессию, подсел на тяжелые наркотики, и сейчас пишу вам из клиники в деревне Усть-Урюпино. К счастью, все было не так. Отказы — это нормально. Я решил, что не теряю абсолютно ничего, если обращусь к другому рефералу — Ensar Basri Kahveci. С ним я вместе работал в Hazelcast, но в разных командах. В этот раз я скинул ему список вакансий, на которые надо было меня подать. Список более широкий и внушительный: и фронт, и фуллстек, и еще что-то, но не помню уже что. Basri тоже оказался наикрутейшим чуваком и закинул меня на них все. Прошло пару дней. Я все продолжал спамить рекрутеров в LinkedIn. Одно из моих сообщений пришлось на парня из Лондона, который нанимал в Facebook. И он ответил! Написал, что видит реферал в системе, и мы договорились о звонке. Реферал в Lyft я получил от крутейшего Andrioid разработчика, Denis Nekludov, с которым мы вместе учились в ВГУ много лет назад.
Мой последний реферал с определенной задержкой пришел от Alex Salo, бога математики, с которым мне тоже довелось учиться в ВГУ (а ВГУ-то неплох!). У меня не было способа оперативной связи с Алексом. К тому моменту, когда он прочел мое сообщение, и как человек добрейшей души и большущего сердца дал мне реферал, я уже подался в Google сам. А у Google такая политика, что можно подаваться не более чем на 3 вакансии в месяц. В итоге, его реферал почти что месяц дожидался пока у меня этот счетчик сбросится. К счастью, дело выгорело, и в марте я вышел на связь с Google в Германии и Швейцарии.  Конечный список компаний, в которые я собеседовался выглядел так: Booking, JP Morgan, Amazon (дважды!), Microsoft, Lyft, Databricks, Uber, Google, Facebook. Большинство, если не все большие компании, будут судить вас по 4 критериям: Многие компании из списка про них даже не вспомнит. Особенно, если вы подаетесь на абстрактного software engineer в вакууме. Будет встречаться чаще, если позиция более конкретная. Например, если вы подаетесь на фронта или в конкретную команду (что редкость для тех же Facebook и Google). У меня спрашивали вопросы по этой теме, когда я собеседовался на фуллстека в Uber и Booking, и на фронта в JP Morgan. К этому разделу я не готовился никак, рассчитывая, что вывезу все на опыте работы в индустрии. Так и получилось. Leetcode. Много литкода.  Если вы уже порядком подзабыли большинство алгоритмов и структур данных, я бы рекомендовал начать с легкой подборки задач на Leetcode. Не надо решать их все. Авторы подборок услужливо отмечают рекомендуемые. Вот их и прорешайте в каждой секции. Далее можно переключаться на подборку средней сложности, действуя по тому же алгоритму. После того как вы прорешаете рекомендуемые задачки из каждой секции, у вас должно быть понимание, какие секции вызывают наибольшие сложности. Эти секции стоит пройти полностью. Сразу после стоит выходить на свое первое скрининговое интервью, его еще называют телефонным.  После того как вы пройдете через первые скрининговые интервью в нескольких компаниях, у вас определится список компаний, где вы не облажались. Я бы рекомендовал с каждой из них бронировать полноценное собеседование, состоящее из нескольких интервью за 1-2 дня, через 3-4 недели после вашего скрининга. По возможности, поставьте интервью как можно ближе друг к другу, чтобы услышать офферы примерно в одно и то же время. Идеальный вариант — это взять неделю отпуска на текущей работе, и пройти через условные 5 компаний за одну неделю. После скрининга стоит перейти к подборкам задачек с фокусом на определенные компании. Они будут платными на литкоде, но это будут не космические деньги. Во многом подборки пересекаются. Более того, вы вряд ли успеете пройти их все и для всех компаний за 3-4 недели. Я бы рекомендовал выбрать 2 наиболее интересные вам компании. В одну неделю прорешивать подборку для одной компании, в другую неделю подборку другой компании. И так далее. В неделю "А" я решал задачи для Facebook, в неделю "Б" задачи для Google. Что ж это за зверь такой? Обычно, в рамках одного абзаца вам опишут систему, и что она должна делать. Вы же должны будете уточнить требования, масштаб, и набросать черновик ее реализации. Представьте себе это как работу с бизнесом. Условный Василий Вротымгерб дал манагеру бюджет в 10 лямов и сказал, что хочет чтобы сделали приложение для его дочки. Она котиков любит смотреть. Манагер вообще не технический, но зато с MBA, то бишь умеет деньги считать. Он 5 лямов положил в карман и пришел к крупной студии. Курпная студия положила 4 ляма в карман и пришла к вам. У вас ребенок как раз в школу собирается. Вы хотите ему частную школу оплатить и брекеты поставить. Вам нужен этот лям. Вам надо за 45 минут интервью (на самом деле около 35, вам же еще представиться надо и small talk поддержать) понять, чего от вас хотят, рассказать примерно, как делать будете, и убедить студию, что вы классный-распрекрасный субподрядчик, который точно бабло не сольет. На некоторых интервью вас попросят сфокусироваться больше на дизайне API и схеме БД. На других буду больше интересоваться как вы обеспечите масштабируемость, отказоустойчивость и производительность. В подготовке мне больше всего помогла книга "System Design Interview – An insider's guide" от Alex Xu. Она кратко и по делу обозревает различные популярные задачи из реального мира. В своей профессиональной деятельности мне иногда выпадает удовольствие порисовать диаграммки и подумать об архитектуре, так что это был единственный мой ресурс для подготовки к системному дизайну. Я хотел больше времени уделить алгоритмам. Если вы хотите чуть больше энергии вложить в системный дизайн, можете подсмотреть список ресурсов у Gergely Orosz в его блоге Это была самая простая часть для меня. Я пробежался через курс "Rock the behavioral interview" на Leetcode и выписал несколько историй из своей практики в гугл док. Обязательно делайте заметки с ответами на вопросы! Не пытайтесь изобразить себя всезнающим и непогрешимым всея программирования. Все знают, что это ложь. Я знаю, что я лажал, и лажал очень крупно. Ошибался, осознавал что-то, учился, и исправлял свои ошибки.  Я начал рассылать резюме в конце января. Мое последнее интервью было в середине апреля, как я и планировал. Это дало мне 10 недель на подготовку. Первые 2 недели я тратил на литкод 2 часа в день в рабочие дни, 4 часа по субботам, брал выходной в воскресенье. Примерно в это время произошло мое первое скрининговое интервью. После него я продолжил литкодить, но уже без выходных. По воскресеньям я фокусировался на категории задач, которая получалась хуже всего. Спустя 2 недели, я начал читать по одной главе "System Design Interview – An insider's guide" каждый рабочий день в дополнение к литкодингу. Как только книга закончилась, я продолжил заниматься литкодом в обычном режиме. Мне пришлось заняться жесткой расстановкой приоритетов и многим пожертвовать. У меня была полноценная работа. Я учился магистратуре. На эти 10 недель я завязал со спортом и жил у компа. Жил на сахаре и кофеине. Набрал около 4 кило. Всей душой полюбил to-do списки. Я думаю, что больше всего мне помогло то, что я начинал день с самого главного — подготовки. После нее я уже занимался задачами из to-do листа в порядке приоритета.   Далее я расскажу про свой опыт интервью в разных копаниях. Я добрался до звонка с рекрутером лишь в конце февраля. Помните "Непрошенный совет #1"? Это было слишком поздно, чтобы провести все раунды интервью, сделать оффер и подготовить документы. Конец истории. Офферы: 0 / 9. Я прошел скрининговое интервью. Там у меня немножко спросили про опыт работы и попросили решить среднюю задачку с литкода. Через неделю молчания мне пришел емейл с отказом из-за визы. Оказывается, они думали, что у меня есть разрешение на работу в США. Наверное, я забыл где-то поставить галочку, что мне нужно спонсировать визу. Не удивлен. В Micrisoft я заслал около 40-50 резюме. Легко мог где-то что-то забыть. Прости меня, Microsoft! Офферы: 0 / 9. Я облажался на первом скрининге. Меня спросили литкод средней сложности. Я его решил, но не оптимальным образом. Что ж, век живи, век учись. Именно поэтому очень важно проходить интервью в нескольких компаниях сразу. Офферы: 0 / 9. У меня было 2 интервью на доменные знания. Еще одно интервью было разбито на 2 части. Сначала я решил легкий литкод. Далее мы перешли к системному дизайну. В тот момент я работал над offline-first приложением с многопользовательским режимом. Как мне бы хотелось верить, именно это когнитивное искажение заставило меня заоверинженирить мой дизайн. Не важно почему, важно, что налажал. Рекрутер мне предложил попробоваться в другую команду, где системный дизайн не та важен. С другой командой у меня было только интервью с менеджером, где мне задавали поведенческие вопросы и спрашивали про опыт. В итоге, мне отказали с вердиктом "недостаток интереса к доменной области команды". Офферы: 0 / 9. После быстрого созвона с рекрутером меня ждало скриниговое интервью, но, на удивление, не на алгоритмы, а на доменные знания. В тот момент Uber нанимал мидлов и синьоров. Это интервью должно было определить мой потенциальный уровень. Рекрутер мне сообщил, что дальше меня будут рассматривать на мидла. Мое ЧСВ пострадало, но я, конечно же, решил не сдаваться и продолжать. Далее у меня было два литкод-интервью средней сложности, классический системный дизайн, и поведенческое интервью с менеджером. Результаты были противоречивые. Мне сказали, что я хорошо прошел поведенческое интервью и классно себя показал на систменом дизайне. Кодинг же оставлял желать лучшего. Они решили, что мне будет скучно на позиции мидла из-за моего хорошего системнго дизайна, но позицию сеньки она предложить готовы не были из-за кодинга.  Офферы: 0 / 9. Это была единственная компания, которая не проводила скрининговое техническое интервью. Меня сразу закинули на полноценный набор интервью (прозвучало корявенько, но я хз как перевести full interview loop). Со мной провели 2 доменных интервью, где мы поговорили за React и JS. Системного дизайна не было. После было интервью с менеджером за опыт и мои командные навыки. Им очень понравилось, что я и сам был своего рода инвестором и менеджил свой портфель. То что я доменеджил его до минусов я упоминать, конечно же, не стал. Как результат, мне предложили синьорскую позицию в Лондоне!  Офферы: 1 / 9. История с Amazon в очередной раз подтверждает "Непрошенный совет #2". Корпорации масштаба FAANG не функционируют как единый организм. Скорее, как множество небольших условно независимых команд. Вам могут отказать в одном регионе, в одной команде, но с радостью принять в другую. Мое первое интервью было с Amazon в Мюнхене. Они прислали онлайн-тест для скрининга. Там была лишь парочка простых литкодов. Немногим после, у меня был скриниговый созвон. На нем меня 70% времени пытали поведенческими вопросами, 30% времени я решал средний литкод. Как мне показалось, все прошло хорошо, но через несколько дней мне пришел отказ.  К счастью, это был не конец приключения. Я не переставал подаваться на вакансии Amazon. Спустя неделю мне позвонили из Amazon в Кэмбридже. Они либо не знали про мое фиаско в Мюнхене, либо им было просто наплевать. Так или иначе я получил свой онлайн тест с содержимым похожим на то, что было в Мюнхене. Парой дней позже я уже был на скрининговом звонке с одним из инженеров. Как обычно, было поведенческое интервью, а сразу за ним два средних литкода. Я нашел оптимальное решение для одного и субоптимальное для второго. Им все понравилось, и меня позвали собеседоваться дальше. Через месяц подготовки я прошел через 4 интервью. 2 алгоритмических с поведенческими вопросами и средними литкодами, один системный дизайн, и один кодинг, который я бы назвал дизайн приложения/сервиса. Мне вбросили набор бизнес требований, я их уточнил, и написал класс, который реализовал нужный функционал. В итоге, им очень понравился мой кодинг, но не совсем устроил мой системный дизайн. Эх, если бы только парень из Uber мог им позвонить и поделиться своими впечатлениями о моем системном дизайне. Как бы то ни было, в Кэмбридж я не прошел, но и это был не конец. Команда в Кэмбридже занималась по-большей части бэкэндом. Они решили, что хоть мой системный дизайн и не достаточно хорош для них, я могу себя хорошо показать на роли фронта в… тадам, Германии! Привет, Мюнхен! Ты по мне скучал? Меня забросили на очередной набор интервью. В этот раз, один средний литкод и один системный дизайн. Теперь им все понравилось, и мне сделали оффер. Оффер на мидла. В этот момент я начал сомневаться в своих прошлых синьорных лычках.  Офферы: 2 / 9. Это был стандартный для FAANG набор. Сначала скрининг со средним литкодом. Через две недели полный набор: 3 алгоритмических интервью, 1 системный дизайн, 1 поведенческое интервью. Каждое алгоритмическое интервью состояло из легкого литкода и среднего литкода следом. Поведенческое интервью и системный дизайн были вполне каноническими. Спустя неделю ко мне вернулись с позитивным фидбеком и аппрувом комитета. Да, в Google перед тем как сделать оффер вас должен заапрувить какой-то секретный комитет. Потом вам должны найти команду. И лишь после этого последует оффер. В течение недели у меня был созвон с 2 разными командами. Обе захотели меня к себе. Мне сделали оффер на L4. Снова мидл! Сомнения в своих прошлых синьорных лычках усилились вдвойне. Офферы: 3 / 9. На первый взгляд, это был еще один стандартный набор интервью для FAANG, но, как говорится, есть нюанс. На тот момент Facebook не нанимал E4 (мидлов), а брал только E5 (сенек) и выше. Пан или пропал. Первый тех скрининг с двумя литкодами: легким и средним, прошел волнительно, но хорошо. Затем в течение месяцев я готовился. Настал день Х. Точнее дни X и Y. Facebook услужливо разрешил разделить интервью на два дня. В первый день, было два алгоритмических интервью. Так же как и на скрининге каждое из них состояло из легкого литкода и среднего литкода. Руки дрожали, спина обливалась потом. Первое интервью я прошел без проблем, а вот второе жестко завалил. Во втором интервью на среднем литкоде я впал в ступор и не выдал ничего. Даже плохого решения не выдал. Только промямлил что-то в конце о том, как бы я сделал. Во второй день у меня был системный дизайн и поведенческое интервью. Поведенческое интервью было стандартным, а систем дизайн был больше сфокусирован на API и схеме БД. Их я прошел без видимых проблем. Спустя несколько дней, когда я уже начал подбирать курсы немецкого для того, чтобы ехать в Мюнхен с Google, мне на мое удивление пришел не отказ, а приглашение на еще одно алгоритмическое интервью. Рекрутер сказал, что на меня был отличный фидбек по системному дизайну и поведенческому интервью, а мнения интервьюеров по алгоритмической части разделились. Это был мой шанс. Я снова погрузился в литкод и совсем не заметил как пролетело несколько дней до дополнительного интервью. Снова легкий литкод и средний. И… Я лажаю на легком литкоде. Неправильно оцениваю big O своего решения. Причем я обнаружил я это только постфактум. Написал свое решение. Интервьюер мне ничего не сказал про big O, но решил, что у меня баг. Я прошел вслух с ним несколько тест кейсов, бага не нашел. Решили двинуться дальше, чтобы успеть прорешать второе задание. Его я прошел с большим волнением, но без каких-либо проблем. Нашел оптимальное решение, правильно оценил big O, накодил его. Мысль о баге все не давала мне покоя. Под конец интервью я спросил можно ли мне скопировать свое решение первой задачи для дебага дома, и мне не отказали. Я составил полноценный набор тестов на одной из онлайн платформ и не обнаружил бага. Зато допер, что налажал с big O. Мне, кровь из носу, надо было показать интервьюеру, что я просто волновался, что бага нет, что я умею счиать big O. Facebook не разглашает email интервьюеров, но я мог увидеть его имя и фамилию. К счастью, парень активно контрибьютил в опен сорс. Я взял его email и commit message и написал на него простыню с ссылкой на свой набор тестов и с подсчетом правильного big O. Я не знаю прочел ли он его, я так и не получил ответа. Главное, что я сделал все, что мог! Через несколько дней мне позвонил рекрутер и ошарашил меня тем, что Facebook хочет видеть меня в своих рядах и приглашает меня на синьорную позицию в Лондон! Офферы: 4 / 9. После интервью с 9 большими и известными компаниями, я получил 4 оффера. Спустя неделю торгов (здесь вы можете найти хороший гайд о том, как их вести) и сомнений, я с огромным облегчением и радостью принял оффер от Facebook. Мне бы хотелось двух вещей: Давайте оставаться на связи! Буду рад видеть вас в Twitter и LinkedIn! Подписывайтесь на новостную рассылку или RSS моего блога. Пишите на email с любыми вопросами. Software Engineer