Skip to content

Latest commit

 

History

History
156 lines (107 loc) · 15.5 KB

README.md

File metadata and controls

156 lines (107 loc) · 15.5 KB

🧑‍💻 Бесплатный, минимально необходимый план подготовки к алгоритмическому интервью в компанию мечты. Для начинающих и опытных специалистов.

Disclaimer

В этой заметке не будет рассуждений о том нужны ли алгоритмы разработчику. (Моё мнение: зависит от того чем именно вы занимаетесь).

Также не будет рассуждений о корректности такого подхода к оценке кандидатов. (Моё мнение: каждая компания вольна строить найм как хочется, рынок всё решит)

Если хочется получить ответы на эти вопросы рекомендую к просмотру видео - Алгоритмы и структуры данных простыми словами. Зачем осваивать алгоритмы?.

Предложения по содержанию

Если у вас есть предложения по наполнению репозитория, не стесняйтесь:

  • Предлагать идеи через issues ✅
  • Предлагать конкретные изменения через PR ✅

Что такое алгоритмическое интервью (алгоритмическая секция / алгоритмическое собеседование / coding interview) ?

Интервьюер даёт задачу (одну или несколько) в формате: есть входные данные (А), необходимо написать функцию которая принимает А, внутри себя производит набор действий и возвращает результат (B).

Цель кандидата: написать код функции за отведенное время. Оценить алгоритмическую сложность по времени и по памяти.

Что оценивается на алгоритмическом интервью?

При правильном проведении из него можно извлечь ценные артефакты о кандидате:

  • Как мыслит, как рассуждает о проблеме (в ситуации когда проблема незнакомая и время ограничено это очень заметно)
  • Задает ли вопросы и если да то какие
  • Как воспринимает обратную связь, прислушивается ли к подсказкам
  • Насколько глубоки и широки знания кандидата в Computer Science
  • Как кандидат пишет код (пишет ли тесты, каких стандартов оформления придерживается)

Факторы влияющие на успех

  • Количество решенных задач (Практика)
  • Широта и глубина знаний по алгоритмам и структурам данных (Теория)
  • Умение вести диалог с интервьюером
  • Аналитические способности / интуиция (следствие первых 2х пунктов)
  • Везение (попадется ли задача которую вы уже видели)

Задача кандидата: максимизировать свои шансы по каждому из пунктов.

План прохождения интервью 👨‍💻

  1. Ознакомься с условием задачи

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

  2. Придумай примеры. Уточни ограничения. Задай вопросы

    Убедись, что правильно понял задачу. Начни с того что придумай примеры входных данных и проанализируй какой ожидается результат. Проанализируй пограничные случаи (например - пустой массив / пустая строка / NULL / 0). Уточни у интервьюера есть ли ограничения у входных данных, если этого не указано в описании задачи.

  3. Придумай наивный алгоритм

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

  4. Оптимизация наивного алгоритма, поиск оптимального

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

    Иначе оптимизируй придуманное ранее решение, ищи в нём:

    • Bottlenecks.
    • Ненужную работу.
    • Повторение одних и тех же вычислений.

    Уточни какое решение ожидает интервьюер с точки зрения сложности.

  5. Проговори итоговое решение

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

  6. Написание кода

    Как только решение сформировалось, начинай писать код. Старайся писать код максимально чисто и модульно, чтобы минимизировать количество ошибок.

  7. Тестирование

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

Подготовка

Практикуемся в решении задач

Не будем изобретать велосипед. Берем любой сайт с задачками и решаем. Например:

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

После того как вы освоились на одной из платформ нужно браться за самые популярные алгоритмические задачи:

Также важно постепенно изучить популярные паттерны решения алгоритмических задач:

Не забываем про теорию

Наступит момент и задачи перестанут поддаваться, потому что не получается придумать ничего кроме наивного/брутфорс решения. Значит пришло время искать идеи где-то кроме своей головы. Например в разделе Discuss на LeetCode :)

Разобраться с решениями найденными в сети будет проблематично без предварительного изучения конкретной структуры данных или алгоритма. Тут то нам и придут на помощь книги/курсы/справочники.

Основы

Сложность алгоритмов:

Книги:

Гайды и репозитории:

Курсы:

Отдельно выделю сервис algorithm-visualizer.org - с его помощью можно визуализировать, работу того или иного алгоритма. Поддерживаются примеры на C++ / JS / Java. Попробуйте поискать задачу с которой не смогли разобраться на этом сайте :)

Комплексный roadmap, объяснение теории и список задач и решениями на java от бывшего разработчика Google interviews.school

Продвинутый уровень (для олимпиад и FAANG)

Бесплатные курсы:

Гайды и справочники:

Книги:

Пробное интервью

По своему опыту могу сказать что собеседования это стресс для организма. И часто он мешает показать себя на 100%. Поэтому для достижения успеха важно научиться преодолевать стресс и держать его под контролем. В этом могут помочь mock interview - пробные собеседования ничем не отличающиеся от настоящих с той лишь разницей что ошибка ничего не стоит для вас :)

Варианты как организовать интервью:

Дополнительные ссылки вдохновившие меня на этот гайд