Журнал / герои

Сменить Ruby на C++ и устроиться в Яндекс после трёх неудач

История выпускника Практикума, который прорешал больше двухсот задач на алгоритмы, — и наконец прошёл собеседование.

Иногда попасть в компанию мечты удаётся не с первого, не со второго и даже не с третьего раза — но это не повод сдаваться. Дима Коротин, разработчик на С++ в Яндекс.Маркете, столкнулся с трудностями при прохождении алгоритмической секции:  он несколько раз проходил собеседования в Яндекс и проваливался именно на ней. Однако Диму это не остановило, он прошёл курс по алгоритмам в Яндекс.Практикуме и курс Академии Яндекса по C++, усиленно занимался самоподготовкой и всё-таки получил заветный оффер. Ниже — рассказ о его опыте изучения алгоритмов и рекомендации материалов, которые могут помогут подготовиться к секциям.

Переход из Ruby в C++ и решение попасть в Яндекс

Раньше я писал на Ruby, а потом перешёл на С++ — и это оказался совсем другой мир. «Плюсы» часто используют для систем, где важна быстрая реакция на действия пользователя: например в поисковиках, браузерах и игровых движках. Всё это огромные проекты, которые к тому же должны быть максимально быстрыми и производительными.

В какой-то момент мне надоело работать над решениями бизнес-задач и захотелось помогать другим разработчикам. Разбираться с инфраструктурой — как приложение едет в продакшен, как и куда идут запросы, какие есть неоптимальности и как их можно исправить.

Захотелось всё поменять: выучить другой язык, освоить новый стек технологий, ходить на другие конференции и общаться с другими разработчиками. С++ мне очень понравился — в нём особый подход к написанию кода, это строгий и наказывающий за ошибки язык. Он заставляет много думать и перепроверять за собой: не внёс ли я деградацию по времени ответа на запросы пользователя, не добавил ли я случайно утечку памяти, нет ли в коде ошибки, которая «стрельнёт» только через пару месяцев работы программы.

Я начал учить С++ месяцев за пять до увольнения с предыдущей работы — это было примерно год назад. Занимался самостоятельно, смотрел программы на Coursera, читал книги по языку. Затем я уволился и где-то семь-восемь месяцев не работал — только учился. Прошёл несколько курсов, в том числе курс Практикума по алгоритмам, и параллельно искал работу. Чтобы иметь возможность учиться и не думать о заработке, я накопил небольшую подушку безопасности: последние два с половиной года я удерживал себя от бесполезных трат и так сумел собрать сумму, которой хватило примерно на семь месяцев.

До Яндекса я работал в четырёх компаниях, и у меня не было настолько масштабных проектов, как мне бы хотелось. Я стремился решать сложные задачи — такие, где нет очевидного ответа и нельзя просто нагуглить решения, где нужно въедливо читать документацию и самому придумывать и изобретать. А ещё очень хотелось писать на С++. 

Я искал такую компанию, в которой я буду уходить с работы с по-хорошему перегруженным мозгом, где постоянно буду решать большие и значимые задачи. Поэтому шёл именно в Яндекс.

Кроме того, на прежней работе мне сильно не хватало фидбека и код-ревью — как разработчик, я знал, что без этого люди не растут. А в Яндексе это хорошо отлаженный процесс. Ещё, прежде чем принять решение о том, куда я буду пытаться попасть, я поговорил с людьми, которые уже работают в компании. Они рассказали о том, что Яндекс — это не совсем «земля обетованная». Здесь важно прикладывать много усилий, обсуждать свои цели с руководителем — недостаточно просто пройти в компанию для того, чтобы тебе доверили масштабные задачи. Это только подстегнуло мой интерес, и я стал усиленно готовиться к отбору. 

Одна из самых сложных его составляющих — это алгоритмические секции. Поэтому в своей подготовке я сосредоточился именно на алгоритмах и пошёл на программу Практикума «Алгоритмы для разработчиков». Однако решил не забывать и про изучение возможностей С++ и записался на специализацию по нему — курс «Искусство разработки на современном C++»

Подготовка к отбору — учёба на курсах и самостоятельные занятия

Мой день строился примерно так: я вставал и завтракал, потом занимался четыре-пять часов и делал перерыв — гулял, смотрел сериал или фильм. Затем в зависимости от своего состояния работал ещё три-пять часов. Несколько раз в неделю мы созванивались с моим сокурсников в Яндекс.Практикуме и решали задачи на сайтах вроде Codeforces.

Я сочетал обучение в Практикуме и на специализации Академии — первую половину дня занимался одним курсом, а вторую — другим. В некоторые дни занимался только алгоритмами, в некоторые — только C++. Бывало такое, что алгоритмы надоедали, и я полностью забрасывал Практикум на пару дней, занимался только С++ — и наоборот. Пару раз я просто два дня подряд смотрел сериалы и ничем не занимался. Это нормально, ведь если слишком переусердствовать и не давать себе отдохнуть, то можно забросить всё и навсегда.

Программа Академии дала мне возможность узнать о большинстве возможностей C++: в последнем курсе специализации рассказывается о таких нетривиальных темах, как таблицы виртуальных методов, виртуальные деструкторы и неопределённое поведение. Практикум помогает разобрать теорию по алгоритмам на наглядных примерах и научиться правильным подходам к решению задач — я ещё расскажу об этом подробнее.

Кроме того, мне очень помогла книга “Cracking the Coding Interview” — в ней рассказывается о том, как устроены интервью в больших компаниях. Есть общие рекомендации по подготовке, план занятий по дням, советы о том, как проходить собеседование и что говорить на поведенческом интервью. Мне пригодились многие такие знания, и поэтому я советую её всем, кто готовится менять работу — даже если вы не собираетесь в IT.

Вот все источники, которые я использовал для подготовки:

«Алгоритмы для разработчиков» — Яндекс.Практикум. Курс даёт крепкую базу по алгоритмам и возможность заниматься вместе с другими людьми — сокурсниками и наставниками, которые могут помочь.

«Искусство разработки на современном C++» — Академия Яндекса. Благодаря этому курсу я углублённо изучил C++. Преподаватели всё очень просто и наглядно объясняют. К тому же, многое из того, что я узнал на этой специализации, спрашивали на собеседованиях.

«Специализация по алгоритмам и структурам данных» — НИУ ВШЭ. Очень хорошая специализация — подойдёт в качестве введения в алгоритмы. Отличается от других тем, что показывает применение алгоритмов на примерах из жизни. 

YouTube-канал Павла Маврина. Бывший чемпион мира по программированию наглядно объясняет сложные концепции и алгоритмы. Мне кажется, это тот редкий случай, когда умение объяснять и огромная база знаний соединились в одном человеке.

Книга «Сracking the Coding Interview». Полный справочник по тому, как разработчику готовиться к собеседованием: есть как задания на алгоритмы, так и рекомендации по прохождению интервью.

Книга “Algorithms in C++”. Учебник, который помог мне с разбором некоторых алгоритмов — это огромный талмуд, и я советую использовать его скорее как справочник. 

Книга «Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих». В этом сборнике автор использует множество картинок, чтобы наглядно объяснить работу алгоритмов. Книга читается очень легко и поможет тем, кому тяжело читать нагруженные текстовые описания.

Алгоритмические секции: как готовиться и зачем они нужны

Я организовал свою подготовку так, чтобы в итоге попасть на работу в Яндекс. До этого у меня уже было три попытки — но только на четвёртый раз мне дали оффер. Первый раз я откликнулся на вакансию, ещё когда был студентом. Это была скорее амбициозная авантюра, и мне тогда не хватило знаний. Потом откликался ещё пару раз: так, в самом начале учёбы в Практикуме меня позвали попробоваться на разработчика в Яндекс.Такси: однажды я прошёл телеграм-викторину по С++, и ребята из их команды связались со мной после неё. Я знал, что не пройду отбор (мне всё ещё не хватало знаний по алгоритмам), но решил попробовать. Обычно на таких собеседованиях тебе дают пару задач, и их нужно решить без ошибок. Я завалил это собеседование, потому что не был готов и допустил много погрешностей. 

Может показаться, что алгоритмическая секция — это какой-то странный способ «завалить» задачами хороших разработчиков-практиков, но это не так. Алгоритмы позволяют более эффективно решить задачу, не затрачивая на это программные и вычислительные ресурсы. Например, в Яндекс.Маркете безумно много серверов, и если не оптимизировать запросы и не подключать алгоритмы, то пользователь будет страдать из-за того, что его плюшевый мишка ищется несколько минут. Будут ухудшаться продуктовые метрики, а пользователи разочаруются в продукте. Алгоритмы очень важны, когда мы хотим что-то улучшить и ускорить: например, быстрее обрабатывать запросы пользователя.

Во время подготовки я обращался к теории с курса по алгоритмам в Практикуме — там всё изложено проще и понятнее, чем в некоторых книгах. Ещё курс приучает к правильному отношению к алгоритмам: нужно искать ответ до последнего, потому что готового решения тебе никто не даст, пока ты сам не разберёшься. В моём случае большинство ошибок в задачах на алгоритмы возникало из-за того, что я неправильно читал условия. Теперь я въедливо читаю все входящие данные по задаче.

Кроме того, Практикум приучил меня не расстраиваться. Не решилась третья задача? Ничего, разберусь через неделю-две — на курсе у меня была именно такая ситуация, что я две недели решал задачу, потому что принципиально не хотел искать подсказку именно для неё. Ещё во время учёбы я научился искать недостающую информацию и разбираться самостоятельно.

При этом Практикума недостаточно, чтобы пройти интервью в Яндекс. Вообще, ни одного курса не хватит — нужно много готовиться дополнительно. Курс по алгоритмам — не прямая дорога к собеседованию, а хорошая основа для тех, кто не представляет, что это такое. 

Пройти алгоритмическую секцию мне помогла ещё и подготовка на Leetcode — это такой сервис для решения задач по алгоритмам. Чтобы чувствовать себя уверенно при отборе, мне понадобилось решить не одну сотню задач — но тут у каждого свой подход. Критически важен уровень сложности: если решить 500-600 простых заданий, то это никуда тебя не продвинет. Лучше распределить усилия примерно так: 300–400 среднего уровня, 100–200 — простых и 50–100 — сложных. Порой на собеседованиях мне встречались задачи с Leetcode, и насмотренность помогала быстро находить решение.

Собеседования и корпоративная культура

Книга “Cracking the Coding Interview” советует сначала пройти несколько тренировочных собеседований и только потом идти в компанию мечты. У меня так и получилось. Суммарно я прошёл почти 30 собеседований прежде чем попал в Яндекс. После такого количества интервью уже нет сложностей с вопросами про технологии. Разработчику везде задают примерно одни и те же вопросы, просят рассказать про опыт и проверяют знания теории. Но бывали и необычные собеседования.

Например, в одной из компаний у меня было стресс-интервью — правда я понял это уже потом, когда всё закончилось. Руководитель направления в какой-то момент сказал, что по моему резюме он точно видит — я очень вспыльчивый человек. 

Я не знал, как реагировать, потому что вспыльчивость — это вообще не про меня. А руководитель продолжал давить: «А у вас были моменты, когда бы вы кричали на подчинённых?» После интервью я написал эйчару, что это был какой-то странный разговор, и тогда он рассказал про стресс-интервью. 

В Яндексе такого, конечно, не было — тут всех больше интересует, что ты умеешь, какие у тебя знания. Если и есть какие-то поведенческие тесты, то я их не заметил: возможно, они просто воспринимаются как обычная беседа с эйчаром. Мне кажется, так и должно быть.

Когда мне позвонили из Яндекса и пригласили на интервью, у меня на руках было уже четыре оффера. Я очень сильно волновался, когда вышел после этого собеседования, — у меня прямо руки дрожали. Я так устроен, что больше всего волнуюсь перед и после интервью, а в процессе сосредоточиваюсь на коде.C переживаниями во время алгоритмической секции помогает тщательная подготовка: важно разбирать задачи, много тренироваться.

Сейчас я занимаюсь инфраструктурой в Яндекс.Маркете, и мои ожидания от работы полностью оправдались. Мне уже давно не было действительно интересно решать рабочие задачи — я мог нагуглить решения большинства из них за 20–30 минут. Мне кажется, что на прежних работах нетривиальных задач было всего 10-15%, а в Яндексе — все 90. Без учёбы мне бы вряд ли удалось совершить такой скачок и набраться знаний, чтобы получить намного более интересную работу.