├── InterviewPreparationGuide.pdf
└── README.md
/InterviewPreparationGuide.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beagreatengineer/algo-interview/06a86b97dae2b0febc14100812316c3b054e4770/InterviewPreparationGuide.pdf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [
](https://t.me/careerunderhood) [
](https://t.me/ea_kozlov)
2 |
3 | 🧑💻 Бесплатный, минимально необходимый план подготовки к алгоритмическому интервью в компанию мечты. Для начинающих и опытных специалистов.
4 |
5 | ## Disclaimer
6 | В этой заметке не будет рассуждений о том нужны ли алгоритмы разработчику. (**Моё мнение**: зависит от того чем именно вы занимаетесь).
7 |
8 | Также не будет рассуждений о корректности такого подхода к оценке кандидатов. (**Моё мнение**: каждая компания вольна строить найм как хочется, рынок всё решит)
9 |
10 | Если хочется получить ответы на эти вопросы рекомендую к просмотру видео - [Алгоритмы и структуры данных простыми словами. Зачем осваивать алгоритмы?](https://www.youtube.com/watch?v=CB9bS46vl04).
11 |
12 | ## Предложения по содержанию
13 | Если у вас есть предложения по наполнению репозитория, не стесняйтесь:
14 | - Предлагать идеи через issues ✅
15 | - Предлагать конкретные изменения через PR ✅
16 |
17 | # Что такое алгоритмическое интервью (алгоритмическая секция / алгоритмическое собеседование / coding interview) ?
18 | Интервьюер даёт задачу (одну или несколько) в формате: есть **входные данные** (А), необходимо написать функцию которая принимает А, внутри себя производит набор действий и возвращает результат (B).
19 |
20 | **Цель кандидата**: написать код функции за отведенное время. Оценить алгоритмическую сложность по времени и по памяти.
21 |
22 | # Что оценивается на алгоритмическом интервью?
23 | При правильном проведении из него можно извлечь ценные артефакты о кандидате:
24 | - Как мыслит, как рассуждает о проблеме (в ситуации когда проблема незнакомая и время ограничено это очень заметно)
25 | - Задает ли вопросы и если да то какие
26 | - Как воспринимает обратную связь, прислушивается ли к подсказкам
27 | - Насколько глубоки и широки знания кандидата в Computer Science
28 | - Как кандидат пишет код (пишет ли тесты, каких стандартов оформления придерживается)
29 |
30 | # Факторы влияющие на успех
31 | - Количество решенных задач (Практика)
32 | - Широта и глубина знаний по алгоритмам и структурам данных (Теория)
33 | - Умение вести диалог с интервьюером
34 | - Аналитические способности / интуиция (следствие первых 2х пунктов)
35 | - Везение (попадется ли задача которую вы уже видели)
36 |
37 | **Задача кандидата**: максимизировать свои шансы по каждому из пунктов.
38 |
39 | ## План прохождения интервью 👨💻
40 |
41 | 1. Ознакомься с условием задачи
42 |
43 | Внимательно выслушай интервьюера. Запоминай всё, что он говорит. Это может быть важным дополнительным контекстом для решения.
44 |
45 | 2. Придумай примеры. Уточни ограничения. Задай вопросы
46 |
47 | Убедись, что правильно понял задачу. Начни с того что придумай примеры входных данных и проанализируй какой ожидается результат. Проанализируй пограничные случаи (например - пустой массив / пустая строка / NULL / 0). Уточни у интервьюера есть ли ограничения у входных данных, если этого не указано в описании задачи.
48 |
49 | 3. Придумай наивный алгоритм
50 |
51 | Попробуй придумать любое решение как можно быстрее. Не стоит сразу думать об оптимизациях и идеальном решении. Подойдет максимально топорное решение, но при этом удовлетворяющее примерам из пункта 2. Оцени его сложность по памяти и времени.
52 |
53 | 4. Оптимизация наивного алгоритма, поиск оптимального
54 |
55 | Если интервьюера устраивает придуманное решение с точки зрения сложности, то этот пункт можно пропустить.
56 |
57 | Иначе оптимизируй придуманное ранее решение, ищи в нём:
58 | - Bottlenecks.
59 | - Ненужную работу.
60 | - Повторение одних и тех же вычислений.
61 |
62 | Уточни какое решение ожидает интервьюер с точки зрения сложности.
63 |
64 | 5. Проговори итоговое решение
65 |
66 | Если тебе удалось придумать решение удовлетворяющее интервьюера проговори его вслух по шагам перед тем как кодить. Убедись что понимаешь этапы алгоритма и что понимаешь как закодировать каждый из них.
67 |
68 | 6. Написание кода
69 |
70 | Как только решение сформировалось, начинай писать код. Старайся писать код максимально чисто и модульно, чтобы минимизировать количество ошибок.
71 |
72 | 7. Тестирование
73 |
74 | Вернись к тест-кейсам из пункта 2 и проведи построчный дебаг написанного кода на них. Программа-минимум - это проверить на стандартном примере и на пограничном случае. Аккуратно исправляй найденные ошибки.
75 |
76 | # Подготовка
77 |
78 | ## Практикуемся в решении задач
79 | Не будем изобретать велосипед. Берем любой сайт с задачками и решаем.
80 | Например:
81 | - [LeetCode](https://leetcode.com/)
82 | - [Codeforces](https://codeforces.com/)
83 | - [CodeWars](https://www.codewars.com/)
84 | - [HackerRank](https://www.hackerrank.com/)
85 |
86 | Если вы начинающий и только погружаетесь в алгоритмы и задачи и используете LeetCode настоятельно рекомендую использовать [таблицу](https://docs.google.com/spreadsheets/d/1FW-_sPhLO-NJRW_qzRYC6pT_n0jxkFj5KS1-4-ZbagI/edit?usp=sharing), для выбора задачек. Она позволит плавно идти от простого к сложному без резких перепадов.
87 |
88 |
89 | После того как вы освоились на одной из платформ нужно браться за самые популярные алгоритмические задачи:
90 | - [Curated List of Top 75 LeetCode Questions to Save Your Time](https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-75-LeetCode-Questions-to-Save-Your-Time-OaM1orEU)
91 | - [Grind 75 questions](https://www.techinterviewhandbook.org/grind75/) (Обновленный список с пункта 1)
92 | - [NeetCode 150 Roadmap](https://neetcode.io/roadmap)
93 |
94 |
95 | Также важно постепенно изучить популярные паттерны решения алгоритмических задач:
96 | - [14 шаблонов, которые помогут ответить на любой вопрос по коду на собеседовании](https://tproger.ru/translations/14-templates-to-answer-interview-questions)
97 | - [A pattern-based approach for learning technical interview questions](https://seanprashad.com/leetcode-patterns/)
98 | - [Crack LeetCode, not only how, but also why.](https://github.com/labuladong/fucking-algorithm/tree/english)
99 |
100 | ## Не забываем про теорию
101 | Наступит момент и задачи перестанут поддаваться, потому что не получается придумать ничего кроме наивного/брутфорс решения. Значит пришло время искать идеи где-то кроме своей головы. Например в разделе Discuss на LeetCode :)
102 |
103 | Разобраться с решениями найденными в сети будет проблематично без предварительного изучения конкретной структуры данных или алгоритма. Тут то нам и придут на помощь книги/курсы/справочники.
104 |
105 | ### Основы
106 | Сложность алгоритмов:
107 | - [(FREE) Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!)](https://www.bigocheatsheet.com/)
108 | - [(FREE) Хорошие статья с примерами про оценку сложности алгоритмов](https://habr.com/ru/articles/782608/)
109 |
110 | Книги:
111 | - [(FREE) Problem Solving with Algorithms and Data Structures using Python](https://runestone.academy/ns/books/published/pythonds/index.html)
112 | - [«Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих»](https://habr.com/en/companies/piter/articles/847682/)
113 |
114 | Гайды и репозитории:
115 | - [(FREE) The Definitive Guide to Data Structures for Coding Interviews](https://www.byte-by-byte.com/data-structures/)
116 | - [(FREE) Реализация алгоритмов и структур данных на популярных языках программирования](https://the-algorithms.com/ru)
117 |
118 | Курсы:
119 | - [(FREE) Основы алгоритмов от Яндекс.Образования](https://education.yandex.ru/handbook/algorithms)
120 |
121 | Отдельно выделю сервис [algorithm-visualizer.org](https://algorithm-visualizer.org/) - с его помощью можно визуализировать, работу того или иного алгоритма. Поддерживаются примеры на C++ / JS / Java. Попробуйте поискать задачу с которой не смогли разобраться на этом сайте :)
122 |
123 | Комплексный roadmap, объяснение теории и список задач и решениями на java от бывшего разработчика Google [interviews.school](https://interviews.school/)
124 |
125 | ### Продвинутый уровень (для олимпиад и FAANG)
126 | Бесплатные курсы:
127 | - [(FREE) Алгоритмы: теория и практика. Методы](https://stepik.org/course/217/promo)
128 | - [(FREE) Алгоритмы: теория и практика. Структуры данных](https://stepik.org/course/1547/promo)
129 | - (FREE) Algorithms by Robert Sedgewick [Part 1](https://www.coursera.org/learn/algorithms-part1) & [Part 2](https://www.coursera.org/learn/algorithms-part2)
130 | - [(FREE) Analysis of Algorithms by Robert Sedgewick](https://www.coursera.org/learn/analysis-of-algorithms)
131 |
132 | Гайды и справочники:
133 | - [(FREE) A complete computer science study plan to become a software engineer.](https://github.com/jwasham/coding-interview-university)
134 | - [(FREE) Algorithms for Competitive Programming](https://cp-algorithms.com/) или [(FREE) http://e-maxx.ru/algo/](http://e-maxx.ru/algo/)
135 |
136 | Книги:
137 | - [(FREE) С. Дасгупта, Х. Пападимитриу, У. Вазирани. Алгоритмы](https://alexanderskulikov.github.io/files/algorithms_href.pdf)
138 | - [(FREE) Шень А. Программирование: теоремы и задачи](https://old.mccme.ru//shen//progbook/7edition.pdf)
139 | - [(FREE) Competitive Programmer’s Handbook](https://cses.fi/book/book.pdf) или [Антти Лааксонен: Олимпиадное программирование](https://www.labirint.ru/books/776224/)
140 |
141 | # Пробное интервью
142 |
143 | По своему опыту могу сказать что собеседования это стресс для организма. И часто он мешает показать себя на 100%. Поэтому для достижения успеха важно научиться преодолевать стресс и держать его под контролем. В этом могут помочь mock interview - пробные собеседования ничем не отличающиеся от настоящих с той лишь разницей что ошибка ничего не стоит для вас :)
144 |
145 | Варианты как организовать интервью:
146 | - Попросить друга работающего в BigTech.
147 | - Воспользоваться услугами ментора.
148 | - Найти человека с релевантным опытом в тематическом сообществе.
149 | - Воспользоваться [Pramp - Practice Mock Interviews & Coding Problems - Land Top Jobs](https://www.pramp.com/#/) либо [Техническое mock-собеседование](https://it-interview.io/mock-interview).
150 |
151 | # Дополнительные ссылки вдохновившие меня на этот гайд
152 | - [(FREE) «Подготовка к алгоритмическому собеседованию» от Яндекс.Практикум](https://practicum.yandex.ru/algorithms-interview/)
153 | - [(FREE) Хочу работать в Google: Read Me First! - Методичка по подготовке к интервью в Google от сотрудника Google :)](InterviewPreparationGuide.pdf)
154 | - [(FREE) Data Fest² Minsk 2018: Владимир Игловиков, Как быстро надо бежать, чтобы не отстать: ML edition](https://www.youtube.com/watch?v=v6Wv01GJQnI)
155 | - [(FREE) Как попасть в Google: инструкция по подготовке](https://dou.ua/lenta/articles/google-interview/)
156 | - Книга [Cracking the Coding Interview](https://www.amazon.com/Cracking-Coding-Interview-Gayle-McDowell/dp/0984782850) (переведена на русский как ["Карьера программиста"](https://habr.com/ru/companies/piter/articles/302782/))
157 |
--------------------------------------------------------------------------------