Как я готовился к собеседованию в Google
Каждый инженер-программист стремится впечатлить людей своим техническим мастерством. Технологические гиганты этого мира — прекрасное место для работы технарей, которые могут предоставить услуги миллиардам пользователей. На моём недавнем собеседовании было несколько раундов, я получил предложения от Google и Amazon. В последние несколько лет онлайн-сообщество очень помогло мне в подготовке к собеседованиям. В этом посте я поделюсь всем о моём пути к собеседованию и верну вклад общества в моё обучение.
Собеседование SWE
Процесс обычно начинается с того, что рекрутер составляет список потенциальных кандидатов. Затем кандидат проходит первоначальный отбор или отборы, в которых определяется, подходит ли он/она для этой работы. Как только это становится ясно, проводится типичное собеседование SWE, включающее следующие этапы:
- Программирование — от 3 до 5 раундов;
- Дизайн систем — 1 раунд;
- Принципы лидерства — 1 раунд.
Я сосредоточусь на подготовке к циклу кодирования, поскольку оно занимает большую часть собеседования. Но мы кратко рассмотрим системный дизайн и навыки лидерства в следующих разделах.
A. Программирование
Инженеры-программисты часто оказываются в сложных ситуациях, например, работают с двусмысленностью, нечёткими требованиями, разбивают сложные задачи на подзадачи, обрабатывают крайние случаи, завершают работу над компромиссом с учётом компромиссов и т. д. Собеседования по программированию — один из способов получить представление об этих навыках.
Ради упрощения этапы программирования сосредоточены на решении проблем с помощью структур данных и алгоритмов. Эти вопросы, как правило, сложны и дают ценную информацию об аналитических способностях кандидата.
Научитесь решать задачи с помощью алгоритмов и структур данных. Этот навык приобретается со временем, к нему нет короткого пути; единственная настоящая формула — последовательность. Практикуйтесь, практикуйтесь и практикуйтесь, пока не разовьёте природную способность решать задачи.
Стратегия подготовки
1. Оценка времени подготовки
Часто оценка времени игнорируется и не считается необходимой. Я предлагаю откалибровать то, насколько хорошо вы умеете решать задачи по алгоритмам и структурам данных. Я изучил свои сильные и слабые стороны и сделал приблизительную оценку времени на подготовку. Эта оценка помогла мне подготовить мой разум к долгосрочной (и краткосрочной) цели и поддержала мотивацию.
«Давайте себе достаточно времени на подготовку. Всегда. Лучше оказаться слишком подготовленным, чем недостаточно подготовленным**».
Общая продолжительность подготовки может различаться, она зависит от вашего опыта. В общем, я разделил уровни подготовки так:
- Новичок может комфортно писать код как минимум на одном языке программирования. Ему не хватает базовых знаний о DS и алгоритмах. С трудом решает лёгкие задачи или решение требует времени.
- Средний. Человек хорошо знает структуры данных и алгоритмы. Нет проблем с лёгким уровнем сложности. Может решить большинство задач средней сложности. Борется с Hard.
- Продвинутый. Нет проблем со средней сложностью. Способен решить большинство сложных проблем.
Перед собеседованием я ставлю себя на средний уровень.
Оценка времени подготовки
2. Платформы, где учится программировать
В основном я практиковался в программировании на LeetCode, InterviewBit и GFG. Перед собеседованием я решил около 320 задач LeetCode, 80 InterviewBit и 30 вопросов GFG.
Как распределялись задачи
Задачи средней сложности очень важны: большинство вопросов на собеседовании имеют среднюю сложность. Решение задач средней сложности сделает вас быстрее и прибавит умения решать проблемы.
На ранней стадии важно начинать с простых и средних вопросов. Начните со сложных задач, как только ощутите адекватную уверенность. Не теряйте мотивацию, если не можете решить сложные задачи. На отработку и совершенствование их решения может потребоваться больше времени, чем вы рассчитывали. Всякий раз, когда я ощущал себя разбитым, чтобы повысить мотивацию, я возвращался к лёгким задачам.
Поддерживайте установку на рост. Каждая проблема, которую вы не можете решить, — это возможность узнать что-то новое.
- LeetCode: без сомнения, одна из лучших платформ. Лучшее в LeetCode — это его сообщество. Дискуссионные форумы очень полезны и предлагают несколько подходов. Не думайте дважды, выбирайте LeetCode Premium; он стоит каждого цента.
- InterviewBit: я настоятельно рекомендую следовать по этому пути. Впечатления от работы на этой платформе максимально приближены к настоящему собеседованию. Иногда ваш код проходит все тестовые случаи, но неоптимален по времени или пространственной сложности (как требуется во время реального собеседования). InterviewBit считает такие материалы неоптимальными и даёт вам дополнительный фидбэк.
- GFG: я использовал эту платформу, чтобы находить задачи и статьи об основах алгоритмов и структур данных. Объяснения тем и реализации там действительно хороши. На GFG также есть набор задач, связанных с конкретными компаниями и темами.
Я не полагался полностью на какой-то один ресурс. Каждый подавал мне новые идеи. Я вёл дневник, постоянно расширяя свои знания.
- Специализация алгоритмы на Coursera: этот трек Coursera потрясающий! Всего в нём 4 курса, охватывающих все основные и несколько продвинутых тем структур данных и алгоритмов. Отлично подходит для новичков.
- Youtube: видеообъяснения. Я слушал их за чаем. Несколько каналов с полезным контентом (Рачит Джайн, Абдул Бари, THNLGf019nRo) — отличные пошаговые инструкции! И BackToBack SWE.
- CTCI и EPI: эти ресурсы дополняли подготовку. Книги дали мне возможность быстро освежить в памяти теорию и задачи. Иногда может показаться, что отдельные темы здесь занимают много времени. Я решил широко охватить разделы до интервью.
- CLRS: Иногда полезен, чтобы найти псевдокод. Удобный ресурс, чтобы получить углублённые знания о теории и о временной сложности алгоритмов.
И последнее, но не менее важное — статьи о BaseCS Вайдехи Джоши. Она пишет интуитивно понятные и простые объяснения по нескольким темам алгоритмов и структур данных.
3. Запускайте таймер
Поскольку продолжительность собеседований сокращается, очень важно работать над тем, как вы решаете проблемы. Как правило, собеседование по программированию длится 45–50 минут, от кандидата ждут, что он решит две средние, одну сложную или одну лёгкую и одну сложную задачи.
Даже если вы могли бы решить исходный вопрос, но потратили больше времени, это означает, что у вас нет достаточно времени, чтобы решить второй.
Я ставил таймер, чтобы отсчитывать время, за которое решал задачи:
- Средняя задача: 20 минут.
- Сложная задача: 40–45 минут.
Новички могут игнорировать время: для них найти правильное решение, очевидно, важнее.
4. Имитация собеседования
Перед настоящим собеседованием я прошёл много имитационных. Имитация собеседования может оказаться весьма полезной. Ранний отказ в тестовой среде даёт вам полезную информацию. Она поможет вам обнаружить пробелы в вашем мыслительном процессе. Старайтесь исправлять каждую ошибку и становиться лучше с каждым ложным интервью.
«Если вы несколько раз пройдёте имитации, расценивайте это как хороший знак».
Бесплатные:
- Имитация на LeetCode.
- [Бесплатно по схеме peer-to-peer — равный равному] Pramp.
- [Бесплатно по схеме peer-to-peer] InterviewBit.
Платные пробные собеседования дают преимущества. Например, обратная связь после интервью даёт много подробностей о том, чего ждал рекрутер.
- [Платно] ExpertMitra.
- [Платно] Mocki.
- [Платно] Пробное техническое собеседование.
5. Подготовьте план продвижения
До сих пор мы много говорили о различных элементах подготовки. Теперь давайте попробуем соединить всё и составить план продвижения! Посмотрите скриншот моего календаря за месяц до собеседования.
Расписание подготовки
Я разбил всю подготовку на задачи. Поставил цели на каждый день за недели (и даже месяцы) до собеседования. Это помогло мне избежать хаотичности и не потеряться в пути к цели.
- В будни я мог выделить несколько часов, потому что занимался офисной работой. Я запланировал решение задач на это время.
- Теорию я читал в выходные, когда ей можно было посвятить много времени.
- Ближе к собеседованию я запланировал имитации. В последние недели я сократил количество сеансов программирования и сосредоточился на чтении CTCI и EPI.
Еженедельное распределение времени
Я знаю, что у многих из нас есть семейные обязанности и работа на полную ставку. Не всё и не всегда идёт по плану. Но идея в том, чтобы сформировать привычку. Следите за своим прогрессом и за тем, что не доделано. Настраивайте график, пока не найдёте подходящий.
B. Дизайн систем
В этом раунде проверяют навыки технического проектирования. Его можно разделить на дизайн низкого уровня (LLD) и дизайн высокого уровня (HLD). Знания в этой области становятся больше с опытом работы в отрасли.
Попытайтесь приобрести знания о таких концепциях, как распределённые системы, балансировка нагрузки, сетевые протоколы, согласованное хеширование, теорема CAP, репликация, сегментирование и т. д.
- Каналы Youtube — Gaurav Sen и Narendra L.
- [Платно] Grokking the System Design Interview (один из лучших ресурсов по системному дизайну. Настоятельно рекомендую).
- [Платно] Проведение интервью по объектно-ориентированному дизайну.
- [Платно] Основы проектирования системы AlgoExpert.
C. Принципы лидерства. Поведение
В отличие от предыдущих раундов этот раздел не технический. Компания рассчитывает узнать больше о кандидате его словами. Компанию могут интересовать:
- Личность кандидата.
- Предыдущие проекты и опыт работы.
- Что вы делали в сложных ситуациях.
- Как вы отвечали на хорошие и плохие отзывы.
Главное — оставаться прозрачным и просто быть собой.
Я выделю раздел, упомянутый в CTCI о модели S.A.R. (ситуация, действие, результат). Идея в том, чтобы определить важные обсуждения, распределяя рассказы с предыдущего места работы. Вот схема навыков работы в обществе (т. н. soft skills), чтобы вы узнали о них больше.
Таблица SAR
Практические советы
- Участвуйте в конкурсах программирования на LeetCode и Codeforces. Следите за проблемами, которые вы не смогли решить, и всегда старайтесь довести дело до конца.
- Я часто пользовался «Shuffle» на LeetCode. Также избегайте решения проблем с большим количеством дизлайков. Обычно они не стоят вашего времени.
- Многие собеседования проводятся вне IDE, например в Google Docs, CollabEdit, так что попробуйте написать производственный код в простом блокноте.
- Думайте вслух во время собеседования. Если вы идете в неправильном направлении, это помогает собеседующему перенаправить вас.
- Я часто начинаю с того, что записываю несколько подходов к любой задаче собеседования. Начиная с простейшего перебора и заканчивая самым оптимальным подходом, определяя структуры данных, пространственную и временную сложность каждого. Это систематическое разбиение проблемы помогает объяснить, как я думаю.
Частые вопросы
Q1. На какие темы структур данных и алгоритмов ориентироваться? На какие ресурсы вы ссылались?
Обучающие ресурсы, упомянутые ранее, будут полезны. Я не добавлял отдельный ресурс для каждой темы, это сделает пост слишком большим.
Темы высокого уровня без определённого порядка:
Связные списки, битовые манипуляции, стеки и очереди, бинарный поиск, кучи, жадные алгоритмы, динамическое программирование, векторы/ArrayList, нотация большое О, время и пространство, сортировки, указатели, окна TCP/IP, системы непересекающихся множеств, операции со строками, графы и деревья, удержание стабильности системы, поиск в ширину и в глубину, рекурсия, поиск с возвратом, хеширования, синтаксическое дерево, обрезка деревьев и индексированных бинарных деревьев.
Q2. Какие языки программирования вы изучали?
Изучите один язык снаружи и внутри; на мой взгляд, этого достаточно. Я предпочитаю Java.
Q3. Откуда вы знаете, какие задачи подходят, чтобы практиковаться для решения всех проблем?
Практически невозможно решить все проблемы. Тем не менее есть максимум 12-15 тем из области структур данных и алгоритмов. Старайтесь лучше овладеть каждой темой, решая тематические задачи. С практикой придет умение определить нужную структуру данных и алгоритм. Сосредоточьтесь на качестве, а не на количестве.
Q4. Есть ли у меня шанс, если я не программирую на соревнованиях?
Да, безусловно. Программировать на конкурсах в этом контексте необязательно.
- Программирование на соревнованиях — это спорт, круг его задач шире производственного программирования. Такие платформы, как CodeChef и Codeforces, более склонны к такому программированию.
- Безусловно, есть области, где соревновательное программирование совпадает с производственным и может быть полезен: например, оно помогает привлечь внимание рекрутера к вашему профилю, умению решать задачи и т. д.
Однако раунды кодирования представляют собой совсем другой этап и имеют разные приоритеты.
Q5. Как получить приглашение на собеседование? Как вы подали заявку?
Рекрутер связался со мной напрямую через LinkedIn. Я не знаю, как отбираются кандидаты. Но у меня есть несколько предложений.
- Пока вы студент, сосредоточьтесь на учёбе. Участвуйте в конкурсах, хакатонах, работайте над интересными и инновационными проектами. Попробуйте сделать вклад в проект с открытым исходным кодом. Есть масса способов сделать ваш профиль особенным.
Самое главное — наслаждайтесь путешествием. Будьте прилежны в работе. Имейте терпение, уважение и всегда стремитесь сегодня быть лучше, чем вчера, а также не забывайте про специальный промокод HABR, который добавит 10% к скидке на баннере. Остальное приложится.
Другие профессии и курсы
ПРОФЕССИИ
КУРСЫ
- Профессия Веб-разработчик
- Профессия QA-инженер на JAVA
- Профессия Frontend-разработчик
- Профессия Веб-разработчик
- Профессия Этичный хакер
- Профессия C++ разработчик
- Профессия Разработчик игр на Unity
- Профессия iOS-разработчик с нуля
- Профессия Android-разработчик с нуля
КУРСЫ
- Курс по JavaScript
- Курс по Machine Learning
- Курс «Математика и Machine Learning для Data Science»
- Курс «Алгоритмы и структуры данных»
- Курс «Python для веб-разработки»
- Курс по аналитике данных
- Курс по DevOps