Дисклеймер:


Я не программирую с трёх лет, не знаю наизусть Кнута, не являюсь призёром олимпиад по информатике и чемпионатов по спортивному программированию, не училась в MIT. У меня за плечами образование по информатике и 6 лет опыта в коммерческой разработке. И до недавнего времени я не могла пройти дальше первого технического скрининга в IT-гиганты из FAANG (Facebook, Amazon, Apple, Netflix, Google и подобные), хотя предпринимала несколько попыток. 

Но теперь всё изменилось, я получила несколько офферов и хочу поделиться опытом, как можно к этому прийти. Речь пойдёт о позиции Software Engineer в европейских офисах перечисленных компаний.

Зачем мне этот FAANG? Мои субъективные плюсы:

  1. хорошие условия, зарплата выше рынка;
  2. простая релокация;
  3. отлаженные процессы;
  4. талантливые коллеги со всего света.

И плюсы подготовки, даже если не получишь оффер:

  1. путешествия;
  2. повышение скорости написания кода;
  3. умение мысленно проверять программу на наличие ошибок (метод пристального взгляда);
  4. навык придумывать каверзные сценарии для тестов;
  5. умение находить узкие места;
  6. тренировка навыков проектирования систем в том числе и более масштабных, чем те, с которыми когда-либо сталкивался.

Привлекаем внимание рекрутера


В моём случае было достаточно LinkedIn. На протяжении нескольких лет я без какой-либо специальной цели поддерживала в своём профиле некоторый уровень активности: регулярно добавляла знакомых и подписывалась на страницы компаний. Довольно скоро начали стучаться первые рекрутеры и чем больше у меня было контактов, тем чаще они предлагали вакансии. Дошло до того, что на последней итерации за пару месяцев мне написали сразу из Google, Microsoft, Amazon и Facebook, это выглядело как картельный сговор.

Минусы такого подхода: никогда не знаешь, когда тебе повезёт. Рекрутер может настигнуть в отпуске с новостью о горящем hiring event, на котором надо быть через неделю. Но в этом случае есть и свои плюсы: скорее всего, из-за срочности вам пойдут навстречу и пропустят один из этапов собеседования — например, в случае Amazon, онлайн с техническим специалистом.

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

Есть другой часто упоминаемый подход — найти человека внутри компании, который вас порекомендует. Это позволит лучше спланировать стратегию подготовки. Но я не буду на нём останавливаться, так как сама не пробовала и могу лишь поделиться слухами, что рекомендация в Google добавляет очки при прохождении собеседования и повышает шансы на положительное решение hiring committee (финальный этап — собрание, где заочно обсуждаются результаты и кандидат утверждается или отклоняется).

Схемы собеседований


Здесь будет краткий обзор процесса собеседований в разных компаниях с примерами, а в следующих разделах я рассмотрю подготовку к каждой части подробнее. Этапы похожи, но их порядок и количество могут отличаться. Например, Google один из лидеров по количеству сессий — целых пять на очном этапе, а потом ещё одно или несколько собеседований с командой.


Схема собеседований в Google (здесь и далее схемы могут немного отличаться в зависимости от офиса и позиции)

Некоторые этапы — телефонное или с командой — могут быть назначены повторно, если у какой-то из сторон есть сомнения. Их число ни на что не влияет, это просто дополнительный шанс, которым нужно пользоваться, предварительно оценив, сколько ещё времени требуется на подготовку (если собеседование техническое). Общий подход у Google и, например, Microsoft — разделение процесса для кандидатов с минимальным опытом работы (< 1 года) и опытных кандидатов. Для первых может дополнительно проводиться онлайн-тестирование (online assessment).


Схема собеседования в Microsoft

Поведенческие вопросы могут быть частью каждой сессии на очном этапе, как, например, это делает Microsoft и Amazon, а могут быть отдельной сессией. Мне, как кандидату, больше нравится второй подход: во-первых, отдельное поведенческое собеседование не крадёт время у решения задач, если интервьюер вдруг оказался разговорчивым, а во-вторых, здорово, когда его ставят после всех технических сессий — можно спокойно переключиться на разговоры о жизни.


Схема собеседований в Amazon

В Microsoft и Amazon поведенческое собеседование интегрировано в технические сессии, наверное, ещё и потому, что часто эти этапы проводят сотрудники из будущей команды. В тех компаниях, где подход отличается, общение с будущим коллегами вынесено в отдельный этап. Например, Google определяет команду уже после успешного прохождения очного этапа. Самый оригинальный процесс у Facebook — выбор команды происходит уже после найма. Новый сотрудник 6 недель проводит в bootcamp — это тестовые проекты в разных командах, а затем принимает решение.


Схема собеседований в Facebook

Нетехнический прескрининг


Первый шаг — разговор с рекрутером. Обычно это короткий звонок для описания вакансии или команд, в которые предлагает собеседоваться рекрутер, и для выяснения вашей заинтересованности и мотивации. Конкретной вакансии может и не быть, всё зависит от процесса найма в данную компанию (см. «Схемы собеседований»). Кажется, что этап довольно простой, но и здесь расслабляться не следует. Могут спросить какой-нибудь короткий технический вопрос, например, оценить количество знаков в степени двойки (Google). А могут посчитать опыт недостаточно релевантным или что вы, как кандидат, не сильно заинтересованы (такое практикует Facebook). 

Подготовка к алгоритмическому собеседованию


Технический скрининг — этап, который для меня чаще всего становился последним до того, как я придумала всю эту схему подготовки.
Конечно, мне высылали материалы для ознакомления и рекомендовали потренироваться на Hackerrank/Leetcode. Но никогда не говорили, что нужно решить минимум 100-200 задач, и это именно то число, которое наконец-то позволило мне дойти до успешного финала.
Невооружённым глазом видно, что это от двух месяцев регулярного решения задач при наличии работы и другой жизни. Можно попробовать посвятить этому отпуск и справиться быстрее, но дальше будет подготовка к очному этапу и её всё-таки придётся подружить со своим обычным расписанием.

Я готовилась с помощью Leetcode, и мой выбор был таким по нескольким причинам: 

  • большой банк задач;
  • у большинства из них есть хорошее покрытие тестами;
  • удобная платная разбивка по частотности и компаниям (есть и бесплатные подборки);
  • активное сообщество — можно читать про подходы к подготовке и недавние собеседования.

У Leetcode есть, конечно, и недостатки:

  • практически невозможно добавить свою задачу или тестовый пример — а потому информация начинает устаревать;
  • неточная оценка времени выполнения и памяти — может меняться от запуска к запуску;
  • недостаточно чёткие условия по сравнению с задачами спортивного программирования;
  • не всегда идиоматические интерфейсы функций.

Последние два пункта могут быть и плюсами в том смысле, что с такими проблемами приходится иногда сталкиваться на собеседованиях и нужно быть к ним готовым. Кажется, что Leetcode сейчас просто не справляется с обрушившимся на него потоком информации, но на данный момент всё ещё остаётся лучшим в своём роде инструментом. Его сила в том числе и в сообществе, которое голосует за вопросы, решения и находит ошибки.

Для меня задачи идеально вписались в утро перед работой. После завтрака я ставила таймер и решала пару задач уровня Medium. Таймер важен, так как помогает создать боевые условия. Время по уровням сложности я отводила так: 20 минут на простые, 40 минут на средние, 60 минут на сложные. Выбирала в основном задачи среднего уровня, так как сложные спрашивают довольно редко. Если по истечении времени задача не была сделана, я изучала решение, вносила её в список и возвращалась к ней через некоторое время. Я старалась сначала изучить подход на словах и попытаться его закодить. Решение можно было смотреть на самом сайте — от авторов задачи или комментаторов, также помогали видео у Тушара Роя, он очень понятно объясняет на примерах. Разбор почти любой задачи можно найти и на GeeksForGeeks, но там довольно много ошибок.

Самый универсальный подход — отсортировать все задачи по частотности и начать их решать в порядке убывания.
Если знакомства с computer science до этого не было, стоит сначала пройти фундаментальный курс, но не увлекаться. Ни знание computer science, ни прочитанная книга «Cracking the Coding Interview» не дадут такого эффекта, хотя и довольно полезны для старта. У меня в начале пути был университетский курс, курс Седжвика (раз и два) и упомянутая книга Макдауэлл — всё это не помогло мне пройти даже телефонное собеседование. Во-первых, паттерны решения должны быть на кончиках пальцев, чтобы кандидат мог быстро их видеть и применять. Для этого разбор задачи нужно не просто прочитать, а сначала попытаться придумать (или вспомнить), а если не получилось, после разбора снова написать самому. Желательно делать это с ограничениями по времени и очень хорошим покрытием тестами, как на Leetcode, что ни курсами, ни книгами не обеспечивается. Во-вторых, курсы по computer science, как правило, не рассказывают про практические подходы к решениям вроде двух указателей или «зайца и черепахи»

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

Tips and tricks


Когда я готовилась к собеседованию в определённую компанию, я немного меняла тактику на Leetcode. C платной подпиской там можно просмотреть специальные подборки задач по популярным компаниям и они помогают быстро подготовиться. Многие компании дают одни и те же задачи и выбивается из них, пожалуй, только Google, который поощряет своих интервьюеров придумывать новые. Поэтому решённые 70-80% задач из такой подборки почти гарантируют успех.


Подборка с Leetcode для отдельной компании — самые частотные задачи отмечены комментариями с указанием этапа собеседования

Отдельно хочу отметить бесплатные подборки по онлайн-тестированию (например, для Amazon), которые заботливо собираются сообществом в обсуждениях. Там не так много задач, но они практически полностью совпадают с теми, что могут попасться на онлайн-тестировании. Я очень рекомендую их прорешать, если предстоит такой этап, потому как на нём может быть много подводных камней, которые съедят ваше время. Там не будет человека, с которым можно договориться о более удобном интерфейсе функции или на словах объяснить, что вы ещё хотели бы исправить, но не успели. Только таймер, не всегда привычная сигнатура метода (например, C-массивы для C++) и бескомпромиссные тесты. Для успешного прохождения, к слову, пару тестов можно завалить.

На техническом скрининге обычно используется какой-нибудь простой инструмент для онлайн редактирования кода. Очень банальный совет, помогающий сэкономить немного нервных клеток, — потренироваться заранее с тем инструментом, в котором вы будете писать код. Особенно если это что-то нетривиальное вроде Google Docs, где нужно привыкнуть форматировать всё руками.

Периодически можно прочитать советы «сообщать интервьюеру, если вы видели задачу, которую вам нужно решить». Я довольно скептично к ним отношусь по многим причинам. Во-первых, если вы задачу разобрали, а не выучили наизусть, то будет далеко не очевидно, что вы её уже видели. К тому же всегда можно придумать follow-up, который кандидат не разбирал. Во-вторых, компании в открытую советуют перед собеседованием тренироваться на Leetcode. Будет занимательно, если у интервьюера закончатся незнакомые вам задачи. В-третьих, некоторые решения очень сложно придумать с нуля даже с подсказками интервьюера. Надеюсь, что спрашивают их редко, но полагаться на удачу не следует. Ну и в-четвёртых, если компания правда так переживает из-за известных вам задач, то она мотивирует интервьюеров придумывать новые.

Если я хотела понять, насколько я готова решать новые, не известные мне задачи, я участвовала в соревнованиях по спортивному программированию на Leetcode/Codeforces. Это сложнее, чем собственно собеседование, потому что не с кем обсудить решение и получить подсказку, если есть трудности. Зато нет соблазна запустить свой код на готовых тестах без мысленного прогона на примерах — рискуешь получить штраф. 

Кажется, всё? Нет, есть небольшая деталь, буквально один вопрос, который может испортить всё собеседование. Временные сложности и сложности по памяти стандартных алгоритмов нужно знать наизусть, а остальные — уметь быстро выводить и тренироваться делать это на каждой решаемой задаче. Для определения сложности рекурсивных задач пригодится Master theorem.

English, please


Очевидный инструмент, который необходим для собеседования — это английский. Подход к его изучению не тема нашего разговора, хочу лишь немного остановиться на том, как на практике потренировать его в боевых условиях. Дело в том, что разбор задачи в одиночку не совсем точно воспроизводит собеседование. Потому что, помимо прочего, придётся объяснять свой ход мыслей по-английски и делать это параллельно написанию кода, а в некоторых случаях и вовсе без него. Поэтому идеально будет найти напарника. Это может быть знакомый, который так же готовится к собеседованию, может быть специальный митап (московский пример), а может — случайный собеседник на одной из площадок (раз, два). Ресурсами последнего типа я не пользовалась, но почитать, как это устроено, можно, например, в этой статье.

Очный этап


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

Whiteboard


Помните, как я знакомилась с инструментами для онлайн редактирования кода для первого этапа? На очном собеседовании вместо них часто используется доска. Я купила её домой для подготовки к очному этапу. Эффект был сильнее, чем я ожидала. До этого я побаивалась доски как чистого листа и даже на работе предпочитала её избегать. Но теперь, когда я к ней привыкла, обнаружила, насколько это удобно для собеседований:

  • можно безболезненно исправить решение (по сравнению с бумагой);
  • легко набросать картинку;
  • удобно расписать пример;
  • быстрее и комфортнее, чем печатать на клавиатуре, к которой вы не привыкли (если в случае альтернативы предлагают закодить решение на предоставленном ноутбуке).

System design


Пожалуй, это тип собеседования, для которого нет «царской дороги». Надо заметить, что до этого у меня был нулевой опыт в проектировании распределённых систем. Информации по подготовке к system design собеседованию в разы меньше, чем к алгоритмическому. Всё усугубляется тем, что люди, которые публикуют разборы таких задач, часто сами не обладают релевантным опытом. Тем не менее, воодушевлённая паттернами для алгоритмического собеседования, я начала искать что-то похожее и нашла платный курс, который казался простым и эффективным… до первого собеседования, где я поняла, что он очень поверхностный. Там не обсуждалось ни reverse proxy, ни content delivery network, про которые хотели услышать мои интервьюеры. Хватило его только на «троечку». Это, с одной стороны, помогло — позволило получить оффер, при условии, что все остальные части были пройдены хорошо. А с другой — срезало уровень предлагаемой должности, так как этот этап важен для оценки «сениорности» кандидата. Ну и так как все сессии очного этапа суммируются, то лучше не терять здесь баллов — их может просто не хватить для положительного результата.

Во время дальнейшей подготовки я наконец-то нашла отличный бесплатный ресурс. Он тоже довольно краткий — читается за несколько часов, но к каждой части есть ссылки для углубления в материал. Это отличная стратегия вне зависимости от количества времени, которое есть в наличии: можно начать с краткого обзора, а потом изучить подробнее.

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

Поведенческое собеседование


Ещё один тип собеседований, который может быть как отдельной сессией, так и в дополнение к другим — поведенческое собеседование. Я решила готовиться к нему, потому что иногда сложно придумать подходящую ситуацию или ответ на вопрос, а заминку интервьюер может интерпретировать как попытку что-то скрыть. Моя тренировка заняла совсем мало времени и её должно хватить надолго. За образец взяла принципы Amazon как наиболее многочисленные и расписала на каждый принцип 2-3 ситуации из моего опыта. Зачем так много? Дело в том, что один и тот же вопрос могут задать разные интервьюеры в рамках одного очного этапа и будет не очень здорово, если всё будет сводиться к одному проекту. Или, наоборот, зададут несколько вопросов, на которые примером служит один и тот же кейс. Для простоты ответов я также выделяла для каждой ситуации ключевые элементы:

  • сложности;
  • что не получилось (и какие выводы я сделала);
  • что понравилось;
  • как я себя проявила;
  • конфликты.

Часто бывает сложно быстро обрисовать ситуацию интервьюеру, не упустив важных деталей. Рассказать чётко и последовательно поможет разбиение повествования по методике STAR: situation — task — action — result. В этой части важно не злоупотреблять словом «мы», его должно быть минимальное количество. Рассказывайте о том, что сделали именно вы, не преуменьшая своего вклада.

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

Когда очный этап не последний


Как я уже упоминала, некоторые компании устраивают собеседование с командой отдельным этапом. Но и оно может быть не заключительным. На позиции в европейских офисах Google после него следует hiring committee — собрание экспертов, которые определяют соответствие кандидата выбранной позиции. Главную роль играет, конечно, обратная связь от интервьюеров. Но очный этап довольно редко удаётся пройти идеально, и здесь вступают в игру дополнительные детали. Идут в плюс рекомендации действующих сотрудников, а также рекрутер может попросить ссылки на профили Github и Topcoder/Codeforces/Leetcode. Hiring committee — это далеко не формальный этап, процент отказов здесь может быть сравнимым с очным этапом, в редких случаях могут назначить дополнительное собеседование.

P.S.


Однажды я проходила собеседование, к которому долго и упорно готовилась. Я щёлкала задачи как орехи, быстро писала код и чувствовала воодушевление. Техническая часть показалась очень лёгкой, и я завершила звонок в полной уверенности моего прохождения: «Если я уж сейчас не пройду, то не знаю, что им ещё нужно». Не было человека счастливее меня, пока я не прокрутила своё решение ещё раз и не нашла ошибку. Следующие 48 часов я ждала разоблачения, которого не наступило, и я действительно прошла. Так я поняла, что интервьюеры тоже ошибаются, а уверенность — помогает.

Ссылки


  1. Наиболее распространённые паттерны решения задач: бесплатный обзор и платный курс
  2. Паттерны решения задач на динамическое программирование
  3. Видеоразборы задач от Тушара Роя
  4. Формула для вычисления сложности рекурсивных алгоритмов
  5. Peer-to-peer собеседования: раз и два 
  6. Ресурсы для подготовки к system design собеседованию: бесплатный и платный курс 
  7. Алгоритмический курс Седжвика на Coursera: часть 1 и часть 2
  8. Amazon Leadership principles
  9. Техника STAR
  10. Еще по теме: поиск работы в FAANG и успешная подготовка в Google