├── 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 | --------------------------------------------------------------------------------