Пост адресован в первую очередь тем, кто только собирается пройти алгоритмическое собеседование или проходил неудачно. Остальных прошу извинить за вероятно неуместный наставительный и поучительный тон.
Где я?
В прошедшие две недели успешно прошёл секции написания кода в Яндекс, жду финалок. Это уже моя пятая попытка попасть в компанию, причём третья после прохождения курса Яндекс.Практикума по алгоритмам, который я закончил в конце 21-го года, т. е. чуть больше года назад. Задачки в этот раз по моему субъективному ощущению оказались чуть сложнее, чем ожидал и чем попадались в предыдущих попытках. Первая задача была близка к medium, а вторая где-то между medium и hard. Темы: массивы, строки и, конечно же, обожаемые Яндексом хеш-таблицы. Ещё попалась одна задача с матрицей.
Алгоритмы на Практикуме
На курсе практикума я учился хорошо -- прорешал всё за три месяца, со многими сложными заданиями справился самостоятельно, был активен в чатах и давал подсказки другим. И вообще самому курсу в целом даю хорошую оценку. Разработчикам курса удалось довольно многое уместить в столь сжатый срок и, что существенно, не просто кое-как напихать, но и достаточно хорошо разобрать в большинстве случаев. Судя по всему, курс по алгоритмам один из лучших курсов Яндекса, если не самый лучший.
Чтобы не выглядеть аффилированным, отмечу, что были и недостатки. Во время моего прохождения (стоит также отметить, что с 21-го года курс несколько поменялся), некоторые дополнительные сложные темы были разобраны недостаточно подробно или объяснены непонятно (для меня), не доставало иллюстраций, которыми однако всегда снабжались базовые темы. Пару раз я обращался к альтернативным источникам и там объяснения мне 'заходили' лучше. Пару раз попадались задачки, которые я не мог решить, а когда наставник подсказывал решение, то впадал в ступор: 'А как я до такого даже гипотетически мог додуматься, исходя из предоставленной теории?'
В рекламе курса утверждается, что достаточно тратить час в день. Согласиться с этим можно условно. В большую часть дней -- пожалуй, да, плюс-минус, пока всё идёт гладко. Но когда попадается задачка посложнее, возможно придётся напрячься. Несколько раз приходилось ломать голову по многу часов и делать множество 'подходов' в течение целого дня. Можно, конечно, и пропустить в крайнем случае, но немало сложных задач обязательны для выполнения. Можно попросить подсказку, но наставник не всегда отвечает сразу -- иногда ждал полдня, а то и больше. Иногда додумывался сам, не дождавшись.
Отжимания после хорошей учёбы на хорошем курсе
И в этот момент может возникнуть логичный вопрос -- а как же тогда после такого 'хорошего' курса я 'отжимался' ещё целый год и даже больше? Короткий ответ -- курс не является подготовкой к собеседованию.
А теперь развёрнутый ответ.
Алгоритмы знать необходимо и, в частности, курс полезен и рекомендуется, но, как оказалось, его недостаточно.
Не первым и не в первый раз отмечу, что прохождение алгоритмического собеседования это отдельный и особый навык, который требует тренировки, можно даже сказать, зубрёжки ('приседаний'/'отжиманий' и т. п.) Вы должны практиковаться решать несложные задачки на время и без отладки, без запуска, без использования отладочного вывода на leetcode. Решение должно проходить с первого, с самого с*ка первого раза!
Этот процесс скорее всего отличается от того, как вы привыкли программировать раньше. В обычной практике часть ваших ошибок находит среда разработки, часть ошибок вылазят сами при запуске и отладке. Лишний раз напрячь мозг сложнее и непривычнее, чем 10 раз нажать на зелёный треугольник.
После того, как вы написали весь код, читайте и перечитывайте его внимательно строчка за строчкой. Делайте это даже если вы на 100% уверены в том, что всё правильно.
Распространённая ошибка: забыли объявить переменную. Соответственно, для каждой переменной проверьте, что не забыли её объявить. Другая ошибка: объявили, но забыли об её использовании -- проверяйте, что каждая объявленная переменная где-то изменяется. Если в решении несколько функций -- проверяйте, что список параметров при вызове и объявлении функции совпадает -- и количество, и порядок, и во всех вызовах.
Потренируйтесь выполнять сухие тесты. В одних случаях их делать проще, в других сложнее, а в некоторых даже чересчур сложно.
Ну а если вы сделали всё, что написано, проверили/перепроверили, запустили и всё равно получили ошибку, то не материтесь также громко как я. И знайте, что вы не одиноки. Также не торопитесь смотреть отладочный вывод и выяснять в какой строчке произошла ошибка. Вместо этого присмотритесь к входным данным, на которых решение ‘свалилось’. Возможно вы быстро поймёте в чём дело, а если нет, то ещё раз сделайте сухой тест конкретно с этими данными. Бывало, я тратил много сил на пустяковую ошибку и теперь уже не считаю, что это было зря.
На просторах интернета есть не мало видео, как люди проходят пробные собеседования с написанием кода. В основном на английском, но есть и на русском. Рекомендуется к просмотру. Не то, чтобы это очень увлекательно, но зато поучительно. Понаблюдайте, где и как люди косячат, как тестируют свой код, как находят или не находят ошибки.
Также делайте поправку на то, что на собеседовании вы будете испытывать стресс и 'подтупливать'.
Другой курс?
Упомяну бесплатный курс "Подготовка к алгоритмическому собеседованию" от Практикума. У него достаточно высокий порог вхождения и как ‘завершённый’ инструмент для подготовки его навряд ли стоит рассматривать. Но зато, по моему мнению, он отлично подходит в качестве вспомогательного средства. Имеет смысл проходить его после основного курса по алгоритмам. А ещё можно, как вариант, используя его материалы выработать свой собственный бесплатный или частично бесплатный трек. Курс хорошо позволяет увидеть, где у тебя есть пробелы, ну а адресно восполнять можно уже пользуясь другими, возможно разными ресурсами, например, тем же самым Степиком. Бывает так, что одна тема лучше разобрана в одном месте, а другая в другом, о чём я уже писал в начале.
Разобраны особенности прохождения интервью с кодом и здесь данный пост во многом повторяет изложенное там.
Я даже смею думать, что появился он не без моего косвенного участия. После успешного прохождения курса по алгоритмам и неуспешного прохождения собеседования, я написал довольно пространное послание в качестве финальной обратной связи куратору основного курса и вскоре после этого появился дополнительный курс по собеседованиям.
Кот на бумажке
В заключение хочу поговорить о "собеседовании на бумажке". Изначально я написал этот пост в группе ТГ и не собирался публиковать где-то ещё. Однако он вызвал довольно живую и в основном положительную реакцию. Очередной раз нашлись и те, кто несколько пренебрежительно отозвался об 'интервью на бумажке'. Что, мол, никто толком так и не объяснил какой в таком интервью сакральный смысл. В ответ от кого-то последовало опять же известное возражение, что подобные интервью проводят в Google и Meta.
Неразумно вмешиваться в священные войны, но я не воздержусь от того, чтобы вставить свои 5 копеек.
Программирование шариковой ручкой тренирует навык написания чистого кода с первого раза. Если кода 5-10 строчек, то ошибки выявить может быть легко. А если много тысяч строк? Какова может быть цена ошибки в коде? Каковы могут быть трудозатраты на её выявление? Понятно, что есть всякие продвинутые технологии и методологии тестирования, но и ошибка может быть замысловатой.
Добавлю к этому, что сам я проходил такие же алгоритмические интервью с "яндекс-блокнотом" ещё и в Диасофт и в небольшую фирму UBIC. Т. е. не только айти-гиганты теперь уже это практикуют.