Каждый инженер-программист стремится произвести впечатление своим техническим мастерством. Технологические гиганты этого мира — прекрасное рабочее место для технарей, которые могут поработать для миллиардов пользователей.
Во время моего недавнего поиска работы я посетил несколько интервью и получил предложения от Google и Amazon. За последние несколько лет онлайн-сообщество очень помогло мне в подготовке. В этом посте я поделюсь со всеми своим подготовительным путешествием и своими знаниями — расплата за помощь :)
Процесс собеседования инженера по разработке ПО
Процесс обычно начинается с того, что рекрутер компании составляет список потенциальных кандидатов. Затем кандидат проходит первоначальный отбор(ы), в ходе которого определяется, подходит ли он/она для этой роли. Как только это будет понятно, типичное собеседование SWE проводится в следующих этапах.
- Программирование — от 3 до 5 раундов
- Системный дизайн — 1 раунд
- Принципы лидерства — 1 раунд
P.S. Я сосредоточусь больше на подготовке к программным интервью, так как они занимают большую часть процесса собеседования. Однако мы кратко рассмотрим системный дизайн и лидерство.
A. Программирование
Инженеры часто оказываются в сложных ситуациях, например, работая с двусмысленностью, нечеткими требованиями, декомпозицией сложных проблем, обработкой пограничных случаев, финализируя решение с учетом всех компромиссов и т.д. Собеседования по программированию — один из способов получить представление об этих навыках.
Для простоты — раунды программирования сосредоточены на решении проблем с помощью структур данных и алгоритмов. Эти вопросы, как правило, сложны и дают ценную информацию об аналитических способностях кандидата.
Научитесь решать проблемы со структурами данных и алгоритмами. Этот навык приобретается со временем.
Нет короткого пути. Единственная работающая формула — это последовательность. Практикуйтесь, практикуйтесь и практикуйтесь, пока не разовьете естественный навык решения проблем.
Стратегия подготовки
1. Оцените время подготовки
Это часто игнорируется и не считается необходимым. Я предлагаю откалибровать ваше текущее отношение к решению проблем с помощью данных и алгоритмов. Я изучил свои сильные и слабые стороны и сделал приблизительную оценку времени на подготовку. Эта оценка помогла мне подготовить мой разум к долгосрочной (или краткосрочной) цели и поддержала мотивацию.
Дайте себе достаточно времени на подготовку. Всегда лучше быть слишком подготовленным, чем недостаточно подготовленным.
Общая продолжительность может варьироваться в зависимости от вашего опыта. В общем, я разделил их на категории ниже.
- Новичок — может с комфортом писать код как минимум на одном языке программирования. Не хватает базовых знаний о структурах и алгоритмах. С трудом (или требует значительного времени) решает легкие задачи.
- Средний — хорошее знание структур и алгоритмов. Нет проблем с легкими задачами. Может решить большинство средних проблем. Испытывает проблемы со сложными задачами.
- Продвинутый — нет проблем со средней сложностью. Способен решить большинство сложных проблем.
Перед собеседованиями я поставил себя на средний уровень.
2. Платформы для программирования и обучения
LeetCode, InterviewBit и GeeksForGeeks были моими главными платформами для практики в программировании. Перед собеседованием я решил около 320 задач LeetCode, 80 на InterviewBit и 30 вопросов в GFG.
Задачи средней сложности очень важны, так как большинство вопросов на собеседовании подпадают под эту категорию. Их решение значительно улучшит вашу скорость и способность решать проблемы.
На ранней стадии важно начинать с вопросов простого и среднего уровня. Приступайте к сложным задачам, как только вы обретете адекватный уровень уверенности. Не теряйте мотивацию, если не можете решить сложные задачи. На отработку и совершенствование этих проблем может потребоваться больше времени. Всякий раз, когда я чувствовал себя разбитым, я возвращался к легким задачам для повышения мотивации.
Сохраняйте установку на рост. Каждая проблема, которую вы не можете решить, — это возможность узнать что-то новое.
- LeetCode: Без сомнения, одна из лучших платформ. Лучшее в LeetCode — это его сообщество. Дискуссионные форумы очень полезны и предлагают несколько подходов. Не думайте дважды, выбирая LeetCode Premium, подписка стоит каждой копейки.
- InterviewBit: Я настоятельно рекомендую следовать треку Программирование. Опыт работы на этой платформе максимально приближен к настоящему собеседованию. Иногда ваш код проходит все тестовые примеры, но может быть не оптимальным по времени/объему (как требуется во время реального собеседования). InterviewBit учитывает это и предоставляет вам дополнительную информацию.
- GFG: Я использовал эту платформу в основном для обнаружения проблем и изучения основ данных и алгоритмов. Объяснения тем и языковые реализации действительно хороши. GFG также предлагает набор реальных задач из конкретных компаний и тем.
Я не полагался полностью на один ресурс для обучения. Каждый ресурс давал мне новые идеи. Я вел дневник, постоянно накапливая и расширяя свои знания.
- Специализация на алгоритмах — этот трек Coursera потрясающий! Всего в нем 4 курса, охватывающих все основные и несколько продвинутых тем. Отлично подходит для новичков.
- Видео-туториалы на Youtube — мое отдохновение! Назову несколько каналов с полезным контентом — Рахит Джайн, Абдул Бари, Тушар Рой (отличные пошаговые руководства!) и BackToBack SWE.
- CTCI и EPI — я использовал их как дополнение к подготовке. Эти книги дали мне возможность быстро освежить в памяти теорию и задачи. Иногда может показаться, что нацеливание на отдельные темы здесь занимает много времени. Но я решил просто освежить свои знания перед интервью.
- CLRS — иногда используется для поиска псевдокода. Удобный ресурс для получения подробных знаний об общем времени алгоритмов (Time complexity) и теории.
И последнее, но не менее важное, статьи Вайдехи Джоши BaseCS. Она пишет интуитивно понятные и простые объяснения по нескольким темам.
3. Использование таймера
Поскольку продолжительность собеседований сокращается, очень важно работать над тем, как вы решаете проблемы. Как правило, программное интервью длится 45–50 минут, и от кандидата ожидается, что он решит — две средние ИЛИ одну сложную ИЛИ одну легкую плюс одну сложную задачу.
Даже если вы могли разобраться с первым вопросом, но потратили больше времени, это означает, что у вас не будет достаточно времени для решения второго.
Я использовал таймер, чтобы отсчитывать время для сеансов программирования
- Средняя задача: 20 минут
- Сложная задача: 40–45 минут
Новички могут проигнорировать этот фактор, поскольку достижение правильного решения, очевидно, более важно.
4. Имитационные интервью
Я провел кучу фиктивных интервью перед настоящими. Это может оказаться весьма полезным. Провал в тестовой среде дает вам полезную информацию. Он поможет вам обнаружить пробелы в вашем мыслительном процессе. Старайтесь исправлять каждую ошибку и становиться лучше с каждым интервью.
«Если вы последовательно проходите имитации интервью, считайте это положительным знаком».
- [Бесплатно] Имитация интервью LeetCode
- [Бесплатное один на один] Pramp
- [Бесплатное один на один] Имитация интервью InterviewBit
Платные пробные интервью дают дополнительные преимущества. В частности, обратная связь после интервью дает много подробностей об ожиданиях интервьюера.
- [Платно] ExpertMitra
- [Платно] Mocki
- [Платно] Technical Mock Interview
5. Подготовьте роадмап
До сих пор мы говорили о различных элементах, которые нужно подготовить. Теперь давайте попробуем соединить эти части вместе и составить дорожную карту!
Рассмотрим ниже снимок моего календаря за месяц до собеседования.
Я разбил всю подготовку на набор задач/этапов. Я ставил ежедневные цели на недели (или даже месяцы) до собеседования. Этот метод помог мне избежать случайности и не заблудиться по пути.
- В будние дни я мог выделить несколько часов, так как был занят офисной работой. Я запланировал занятия по решению задач на это время.
- Теоретические темы были зарезервированы на выходные, когда им можно было посвятить много времени.
- Ближе к интервью я запланировал тестовые интервью. В течение последних недель я сократил количество сеансов программирования и больше сосредоточился на чтении CTCI и EPI.
Я знаю, что у многих из нас есть семейные обязательства и работа на полную ставку. Прогнозируемый график не всегда может идти по плану. Но вся идея здесь в том, чтобы сформировать привычку. Следите за своим прогрессом и незавершенными задачами. Продолжайте улучшать, пока не найдете расписание, которое лучше всего вам подходит.
B. Системный дизайн
В этом раунде у кандидата проверяют навыки технического проектирования. Их можно далее разделить на дизайн низкого уровня (LLD) и дизайн высокого уровня (HLD). Знания в этой области растут с опытом работы в отрасли.
Попытайтесь получить знания о таких концепциях, как распределенные системы, балансировка нагрузки, сетевые протоколы, согласованное хеширование, теорема CAP, репликация и сегментирование и т.д.
- Каналы Youtube — Gaurav Sen и Narendra L
- [Платно] Интервью по системному дизайну (Один из лучших ресурсов по системному дизайну. Настоятельно рекомендую).
- [платно] Интервью по объектно-ориентированному дизайну
- [Платно] Основы проектирования систем AlgoExpert
C. Лидерство/поведение
В отличие от предыдущих этапов, этот не является техническим. Компания рассчитывает узнать больше о кандидате его/ее словами. Поведенческие вопросы могут быть связаны с:
- Личностью кандидата
- Предыдущими проектами и опытом работы
- Действиями, предпринятыми в сложных ситуациях
- Ответами на положительные и отрицательные отзывы
Ключ здесь — оставаться прозрачным и просто быть собой.
Я выделю раздел S.A.R. (Situation, Action, Result — Ситуация, Действие, Результат), упомянутый в CTCI. Идея состоит в том, чтобы выявить важные темы для обсуждения, классифицируя истории на основе предыдущей работы. Чтобы узнать больше об этом, ознакомьтесь с таблицей софт скилов.
Советы
- Участвуйте в конкурсах программирования на LeetCode и Codeforces. Следите за задачами, которые вы не смогли решить, и всегда старайтесь их решать потом.
- Я много использовал «Случайное» на LeetCode. Также избегайте решения проблем со множеством дизлайков. Обычно они никогда не стоят вашего времени.
- Многие интервью проводятся в редакторах, не относящимися к IDE, например. Google Docs или CollabEdit. Так что попробуйте написать код в простом блокноте.
- Думайте вслух во время интервью. Если вы идете в неправильном направлении — это помогает интервьюеру перенаправить вас на правильный путь.
- Я часто начинаю с того, что записываю несколько подходов к любой задаче в собеседовании. Начиная с простейшего перебора и заканчивая наиболее оптимальным, определяя структуры данных и сложность времени/размера для каждого. Этот систематический способ разбить проблему помогает мне объяснить свой мыслительный процесс.