🧑💻 Бесплатный, минимально необходимый план подготовки к алгоритмическому интервью в компанию мечты. Для начинающих и опытных специалистов.
В этой заметке не будет рассуждений о том нужны ли алгоритмы разработчику. (Моё мнение: зависит от того чем именно вы занимаетесь).
Также не будет рассуждений о корректности такого подхода к оценке кандидатов. (Моё мнение: каждая компания вольна строить найм как хочется, рынок всё решит)
Если хочется получить ответы на эти вопросы рекомендую к просмотру видео - Алгоритмы и структуры данных простыми словами. Зачем осваивать алгоритмы?.
Если у вас есть предложения по наполнению репозитория, не стесняйтесь:
- Предлагать идеи через issues ✅
- Предлагать конкретные изменения через PR ✅
Что такое алгоритмическое интервью (алгоритмическая секция / алгоритмическое собеседование / coding interview) ?
Интервьюер даёт задачу (одну или несколько) в формате: есть входные данные (А), необходимо написать функцию которая принимает А, внутри себя производит набор действий и возвращает результат (B).
Цель кандидата: написать код функции за отведенное время. Оценить алгоритмическую сложность по времени и по памяти.
При правильном проведении из него можно извлечь ценные артефакты о кандидате:
- Как мыслит, как рассуждает о проблеме (в ситуации когда проблема незнакомая и время ограничено это очень заметно)
- Задает ли вопросы и если да то какие
- Как воспринимает обратную связь, прислушивается ли к подсказкам
- Насколько глубоки и широки знания кандидата в Computer Science
- Как кандидат пишет код (пишет ли тесты, каких стандартов оформления придерживается)
- Количество решенных задач (Практика)
- Широта и глубина знаний по алгоритмам и структурам данных (Теория)
- Умение вести диалог с интервьюером
- Аналитические способности / интуиция (следствие первых 2х пунктов)
- Везение (попадется ли задача которую вы уже видели)
Задача кандидата: максимизировать свои шансы по каждому из пунктов.
-
Ознакомься с условием задачи
Внимательно выслушай интервьюера. Запоминай всё, что он говорит. Это может быть важным дополнительным контекстом для решения.
-
Придумай примеры. Уточни ограничения. Задай вопросы
Убедись, что правильно понял задачу. Начни с того что придумай примеры входных данных и проанализируй какой ожидается результат. Проанализируй пограничные случаи (например - пустой массив / пустая строка / NULL / 0). Уточни у интервьюера есть ли ограничения у входных данных, если этого не указано в описании задачи.
-
Придумай наивный алгоритм
Попробуй придумать любое решение как можно быстрее. Не стоит сразу думать об оптимизациях и идеальном решении. Подойдет максимально топорное решение, но при этом удовлетворяющее примерам из пункта 2. Оцени его сложность по памяти и времени.
-
Оптимизация наивного алгоритма, поиск оптимального
Если интервьюера устраивает придуманное решение с точки зрения сложности, то этот пункт можно пропустить.
Иначе оптимизируй придуманное ранее решение, ищи в нём:
- Bottlenecks.
- Ненужную работу.
- Повторение одних и тех же вычислений.
Уточни какое решение ожидает интервьюер с точки зрения сложности.
-
Проговори итоговое решение
Если тебе удалось придумать решение удовлетворяющее интервьюера проговори его вслух по шагам перед тем как кодить. Убедись что понимаешь этапы алгоритма и что понимаешь как закодировать каждый из них.
-
Написание кода
Как только решение сформировалось, начинай писать код. Старайся писать код максимально чисто и модульно, чтобы минимизировать количество ошибок.
-
Тестирование
Вернись к тест-кейсам из пункта 2 и проведи построчный дебаг написанного кода на них. Программа-минимум - это проверить на стандартном примере и на пограничном случае. Аккуратно исправляй найденные ошибки.
Не будем изобретать велосипед. Берем любой сайт с задачками и решаем. Например:
Если вы начинающий и только погружаетесь в алгоритмы и задачи и используете LeetCode настоятельно рекомендую использовать таблицу, для выбора задачек. Она позволит плавно идти от простого к сложному без резких перепадов.
После того как вы освоились на одной из платформ нужно браться за самые популярные алгоритмические задачи:
- Curated List of Top 75 LeetCode Questions to Save Your Time
- Grind 75 questions (Обновленный список с пункта 1)
- NeetCode 150 Roadmap
Также важно постепенно изучить популярные паттерны решения алгоритмических задач:
- 14 шаблонов, которые помогут ответить на любой вопрос по коду на собеседовании
- A pattern-based approach for learning technical interview questions
- Crack LeetCode, not only how, but also why.
Наступит момент и задачи перестанут поддаваться, потому что не получается придумать ничего кроме наивного/брутфорс решения. Значит пришло время искать идеи где-то кроме своей головы. Например в разделе Discuss на LeetCode :)
Разобраться с решениями найденными в сети будет проблематично без предварительного изучения конкретной структуры данных или алгоритма. Тут то нам и придут на помощь книги/курсы/справочники.
Сложность алгоритмов:
- (FREE) Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!)
- (FREE) Хорошие статья с примерами про оценку сложности алгоритмов
Книги:
- (FREE) Problem Solving with Algorithms and Data Structures using Python
- «Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих»
Гайды и репозитории:
- (FREE) The Definitive Guide to Data Structures for Coding Interviews
- (FREE) Реализация алгоритмов и структур данных на популярных языках программирования
Курсы:
Отдельно выделю сервис algorithm-visualizer.org - с его помощью можно визуализировать, работу того или иного алгоритма. Поддерживаются примеры на C++ / JS / Java. Попробуйте поискать задачу с которой не смогли разобраться на этом сайте :)
Комплексный roadmap, объяснение теории и список задач и решениями на java от бывшего разработчика Google interviews.school
Бесплатные курсы:
- (FREE) Алгоритмы: теория и практика. Методы
- (FREE) Алгоритмы: теория и практика. Структуры данных
- (FREE) Algorithms by Robert Sedgewick Part 1 & Part 2
- (FREE) Analysis of Algorithms by Robert Sedgewick
Гайды и справочники:
- (FREE) A complete computer science study plan to become a software engineer.
- (FREE) Algorithms for Competitive Programming или (FREE) http://e-maxx.ru/algo/
Книги:
- (FREE) С. Дасгупта, Х. Пападимитриу, У. Вазирани. Алгоритмы
- (FREE) Шень А. Программирование: теоремы и задачи
- (FREE) Competitive Programmer’s Handbook или Антти Лааксонен: Олимпиадное программирование
По своему опыту могу сказать что собеседования это стресс для организма. И часто он мешает показать себя на 100%. Поэтому для достижения успеха важно научиться преодолевать стресс и держать его под контролем. В этом могут помочь mock interview - пробные собеседования ничем не отличающиеся от настоящих с той лишь разницей что ошибка ничего не стоит для вас :)
Варианты как организовать интервью:
- Попросить друга работающего в BigTech.
- Воспользоваться услугами ментора.
- Найти человека с релевантным опытом в тематическом сообществе.
- Воспользоваться Pramp - Practice Mock Interviews & Coding Problems - Land Top Jobs либо Техническое mock-собеседование.
- (FREE) «Подготовка к алгоритмическому собеседованию» от Яндекс.Практикум
- (FREE) Хочу работать в Google: Read Me First! - Методичка по подготовке к интервью в Google от сотрудника Google :)
- (FREE) Data Fest² Minsk 2018: Владимир Игловиков, Как быстро надо бежать, чтобы не отстать: ML edition
- (FREE) Как попасть в Google: инструкция по подготовке
- Книга Cracking the Coding Interview (переведена на русский как "Карьера программиста")