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

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

TL;DR

Вот небольшая предыстория о себе. Я работал в Amazon более 7,5 лет. На момент моего ухода из компании впоследствии было принято на работу более 97% амазонцев. Решение уйти было вызвано желанием искать возможности в другом месте, решать новые задачи и увеличивать свой общий доход. Я был полуактивным интервьюером в Amazon, но, кроме этого, я не готовился к техническим интервью уже несколько лет. После пары месяцев подготовки и собеседований с некоторыми софтверными компаниями я получил несколько предложений. Затем, после некоторых переговоров, я подписал предложение и согласился на должность старшего инженера в Meta (ранее Facebook).

Определите, действительно ли вы старший инженер

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

  • Руководил проектом большего масштаба, чем ваша непосредственная команда, который включал большое количество коммуникаций с внешними командами.
  • Знакомы с концепциями проектирования систем и самостоятельно разработали полусложную систему.
  • Ваш код чистый, хорошо документированный и с надлежащими тестовыми примерами.
  • Наставлял других инженеров/стажеров. Наставничество может принимать различные формы и варьироваться от просмотра чужого кода, активного участия в совещаниях по проектированию или организации обучающих сессий до полного наставничества инженеров с самого начала до тех пор, пока не будет достигнута цель наращивания.
  • Проактивно ищите способы решить проблему без подсказок

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

Перед подготовкой

1. Определите, какая подготовка вам нужна

Первым шагом, который я предпринял, было решение популярных простых вопросов на LeetCode без учета времени, которое ушло на решение каждой проблемы. Я решил около 70% вопросов, не обращая внимания на время. Это также обеспечило отличный курс повышения квалификации для определенных структур данных, таких как PriorityQueue (Heap), которые я никогда не использовал в своей повседневной работе. По результатам я заметил, что мне нужно как минимум 3 месяца, чтобы пройти очные собеседования.

2. Узнайте целевые компании

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

Неделя 1–4, перед телефонными интервью

1. Сосредоточьтесь на алгоритмах/кодировании

На своей прежней должности я уже проектировал крупномасштабные системы. Сложной частью являются вопросы по кодированию, которые требуют больше времени для практики. Что касается сложности вопросов, я потратил 20% своего времени на простые, 70% на средние и 10% на популярные, сложные вопросы (например, Лестница слов 2, Чужой словарь, Минимальная подстрока окна и Разрыв слова 2). Опять же, я не засекала время, но старалась изо всех сил решить проблемы, прежде чем переходить к решениям. Чтобы лучше использовать ограниченное время на подготовку, я создал 10 списков того, что нельзя делать при решении вопросов на LeetCode.

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

2. Подать заявку на вакансии

Я подал заявку на свои целевые позиции в течение первых 2 недель. Время ответа варьировалось: некоторые компании отвечали в течение нескольких дней, некоторые - в течение 1-2 недель, некоторые так и не ответили, а другие отправили отказы на этапе оценки резюме.

В этот период я ​​взял на себя инициативу организовать телефонный скрининг примерно на 6-й неделе с рекрутерами. После того, как даты проверки телефонов были определены, я создал документ для каждой компании и собрал все вопросы по кодированию, дизайну системы и поведению, которые я мог, с помощью поиска на Glassdoor, в разделе обсуждения LeetCode и подготовительных материалах, которые предоставили эти компании.

Неделя 5–6: Окончательная подготовка к экранам телефонов.

Экраны телефонов в значительной степени сосредоточены на кодировании и, возможно, на нескольких поведенческих вопросах. Хорошей практикой является наличие интервала не менее 2-3 дней между каждым собеседованием и использование его для чтения документации по конкретной компании, упомянутой в предыдущем разделе. На этот раз я замерил время во время подготовки к кодированию.

Важной, но часто упускаемой из виду частью являются поведенческие вопросы. Такая компания, как Snap, упоминает, что одним из обязательных вопросов будет Почему Snap? и, честно говоря, это был первый заданный вопрос. Я также собрал список поведенческих вопросов и постарался ответить на каждый точно в ЗВЕЗДНОЙ манере.

Неделя 7–12: Подготовка на месте

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

1. Дизайн системы

Для собеседований на руководящие должности вам следует ожидать как минимум один этап проектирования системы. Это играет важную роль в определении вашего уровня старшинства в окончательном предложении. Обратите внимание, что

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

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

Youtube-канал Tech Dummies: его видео основаны на исследованиях многих технических блогов. Проекты, которые он объясняет, очень близки к архитектуре реальных сервисов. Некоторые видеоролики могут показаться длинными, но при просмотре видеороликов можно усвоить много понятий (например, скетч Считай-минуту).

Youtube-канал Gaurav Sen: стиль объяснения этого конкретного канала очень близок к тому, что ожидается в интервью по проектированию системы. Однако одним недостатком для меня было то, что он ускорил голос в некоторых видео, что может немного разочаровать некоторых зрителей.

Grokking the System Design Interviews: лично я предпочитаю видео тексту, поэтому учебные пособия были для меня невыносимой задачей. Кроме того, они очень сосредоточены на сборе большого количества чисел и расчетов, которые на самом деле не нужны. Если вас специально не спрашивают о чем-то вроде количества необходимых серверов, вам просто нужно приблизительное представление о масштабе системы из собранных цифр. Например, вы должны знать, является ли хранение данных в памяти приемлемым вариантом с учетом требований, или вам нужен другой способ или даже гибридный подход для хранения ваших данных. Это зависит исключительно от вопроса и предпочтений интервьюера.

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

  • Уточнение вопросов, сбор функциональных и нефункциональных данных (например, доступность, согласованность, задержка, надежность, цифры, связанные с использованием системы и т. д.): 10 мин.
  • Дизайн API: 5 мин.
  • Высокоуровневое проектирование (в большинстве случаев используется микросервисная архитектура): 10 мин.
  • Модель данных (например, дизайн таблиц): 5 мин.
  • Ответы на дополнительные вопросы или подробное описание компонента: 10–15 мин.

2. Кодирование

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

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

Существуют также алгоритмы/концепции, которые настоятельно рекомендуется просмотреть на случай, если они появятся в сложных вопросах, к ним относятся кратчайшее расстояние Дейкстры, Беллмана-Форда, алгоритм Прима на MSP, перетасовка Фишера-Йейтса, быстрый выбор, раскраска графа, интервальное дерево и Дерево сегментов.

3. Поведенческий

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

4. Имитация интервью

В Интернете есть несколько имитационных площадок для интервью. Как упоминалось ранее, я использовал TechMockInterview.com и был им вполне доволен. Перед выездным раундом я записался еще на пару сессий с интервьюерами Google/Meta и получил ценные отзывы о своей работе. Следует отметить, что их вопросы были более интересными и более сложными, чем те, что разыгрывались в моих реальных интервью. Они были настолько эффективными, что я чувствовал себя более напряженным в имитациях, чем в реальных интервью! Вот почему тренировочные интервью с друзьями или встречи с профессиональными службами необходимы для оценки вашей работы в реальных ситуациях интервью.

Переговоры и окончательное предложение

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