Pull to refresh

Как я проходил отбор на стажировку бекэнд — разработчиком (C++) в Яндекс по программе Deep Dive (в формате буткемпа)

Reading time6 min
Views29K

Небольшое вступление

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

Сразу предупрежу, по вполне понятным причинам условий задач я вам не скажу, но будет их общее описание.

О чем поговорим:

  1. Кто я и почему решил пойти на стажировку?

  2. Контест

  3. Первое техническое интервью

  4. Второе техническое интервью

  5. Финальная встреча с куратором буткемпа

Кто я и почему решил пойти на стажировку?

Я нахожусь на 3 курсе программной инженерии, под капотом имею парочку пройденных курсов по плюсам и примерно год обучения этому языку (и еще парочке лет вообще сфере программирования).

И недавно у меня начался неприятный период жизни. Учеба в вузе все сильнее и сильнее раздражала (программирования все нет и нет, а есть одна инженерия), к тому же пережил расставание.

Началась сероватая полоса
Началась сероватая полоса

Я захотел кардинально начать менять что-то в своей жизни. И вот как то раз мы собрались с друзьями в комнате почилить и довольно спонтанно решили поискать вакансии. Причем мы все загорелись этой идеей и буквально через несколько дней поиска, я нашел вакансию на позицию бекендера в Яндексе. В шутку, но решил все таки попытать удачу. На следующий день мне прислали письмо с приглашением пройти отбор. Как раз у рекрутера Полины я и узнал, о программе Deep Dive, которая предоставляла релокацию, что было для меня актуально. Заполнив анкетку я перешел к той части, ради которой вы сюда и зашли :)

Контест

После отправления заявки, мне пришла ссылка на Яндекс.Контест. За 6 часов нужно было решить 6 задач. Я выбрал время, чтобы никто и ничто меня не отвлекало, вооружился листочком с ручкой, чаем с печеньками, открыл VS, включил музыку и тут понеслось.

Первые две задачки были не особо сложные, но на них я все-таки потратил какое-то время с непревычки. К третьей задаче у меня оставалась половина времени.
Она была на знание контейнеров. Я сразу обратил внимание на ограничения в пару секунд и на огромные входные данные и понял, что тут за O(N) не пройти. И с этой задачей была настоящая схватка...

За час написано решение, но вот незадача, оно не проходит по времени! Посидел еще в коде какое то время, непонимающе, как можно еще ускорить алгоритм? Сложность должна подойти для ограничений!

Осталось около полутора часов. Я проглядел оставшиеся задачки и не понял вообще как их решать. Одна из них была связана работой с матрицей, вторая с работой с условиями про последнюю говорить страшно.
Оставался час и надо было добивать задачу. За примерно 40 минут я отловил бесконечный цикл (привет, работа с итераторами) и исправил ситуацию, и о чудо! 4 тест пройден. Упали на пятом.
У меня 20 минут и пятый тест из 60. Перечитать условие, посмотреть ограничения. Да! Обычный int не подходит, нужно использовать int64. За пару минут до решение проходит, однозначно победа.

Наконец-то достойный противник эта битва была легендарной!
Наконец-то достойный противник эта битва была легендарной!

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

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

Первое техническое интервью

Вот тут я начал по-настоящему напрягаться. Собеседование проходило по зуму и длилось ровно час. Я особо не готовился, хотел показать себя такой какой есть. Друзья дали смешной, но действенный совет: положить на задний фон Мишку (так я назвал плюшевую игрушку - подушку, что мне подарили) для поддержки, как-нибудь не очень заметно. Все же серьезное собедование :)

Вот так выглядит Мишка
Вот так выглядит Мишка

Сперва мне дали задачку с СИ-строкой, что было для меня удивительно, я же вроде как на бекенд C++ подавал. Ну ладно СИ так си, все-таки алгоритмическое решение проверяют. Добрую половину часа я потратил. Поддерживало то, что интервьюер направлял на решение, подсказывая где могут возникнуть ошибки, а не осуждающе смотрел. Вообще мне понравилось как подсказывают интервьюеры - "вот представьте что у вас есть строка, ну небольшая такая на 5 гигабайт, как вы думаете, как быстро алгоритм ее обработает?". Сразу чувствуется, мыслят в реальных проектах более масштабно. Еще, если я предлагал какое-то неоптимальное решение у меня просили посчитать сложность своего алгоритма. Саму задачу в дополнение попросили решить за консанту по памяти, заводить новую строку нельзя, веселись с той, которую дали. Тут главное быть внимательным.

Разобравшись с первой задачкой мне задали достаточно озадачивающий вопрос. Он был связан с пониманием устройств контейнеров. Я понимаю, что при заканчивании свободного capacity у вектора с последующим push_back-ом, происходит релокация памяти с инвалидацией итераторов, а вставка в список происходит за O(1), но тем не менее вопрос меня удивил. Врочем включив логигу и некоторые знания я +-что-то ответил, не совсем правильно, не совсем то объяснение, которое ожидали от меня, но все равно это лучше чем промолчать.

Потом поспрашивали простенько про сортировку, тут особо-то и нечего сказать.

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

В целом после собеседования я был недоволен собой, поскольку ответил +- на половину. Но тем не менее я с надеждой ждал фидбека. И вот опять Полина обрадовала меня. Вскоре должно было состоятся второе интервью.

К этому интервью я немного больше поготовился, посмотрел задачки, какие-то базовые алгоритмы. Настало время встречи. Опять зум, опять час, мишка занял свою позицию позади меня и началось.

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

Первая задачка была опять на строки, но в этот раз уже на вход подается string, а не char* s. Вижу условие, на лице появляется улыбка, эту задачку я уже видел, когда готовился. Поискал свои листы, понял, что я просто ее проглядел, наклепав простенький алгоритм, не посмотрев достойного решения и принялся его описывать. Кстати да, в этот раз меня сначала попросили дать словесное описание алгоритма, а только потом его написать. Примерно набросав свою идею (она была не очень элегантной по коду, но вполне подошла по сложности), я принялся ее реализовывать.

мой муд в тот момент
мой муд в тот момент

Тут стоит обратить внимание на некоторые нюансы, которые возникли в ходе решения.

- А типа int для данной задачи нам хватит? А size_t? А если и этого мало, что бы я мог сделать?

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

И еще одна небольшая ошибка, о которой я понимал, но все же не приметил. Пусть s - объект типа string. В цикле я написал что-то типа

for (int i = 0; i < s.size(); i++)

Прошу находчивых отметить в комментариях, в чем тут ошибка :)

Проверить себя

Проблема была в несоответствии типов int-а и size_t контейнера.

Вторая задача была весьма простой, на бинарные деревья. Но я никак не мог увидеть решения. Тут стоит сказать, что если возникает такая трудность можно просто взять и написать на листочке разные варианты. С многочисленными подсказками от интервьюера я все таки понял какой алгоритм нужен, но времени на него не хватило, я наспех написал что-то +- работающее, но как следует протестить код уже не вышло.

После интервью я опять немного напрягся, но в целом мне оно понравилось, мне дали пару советов на будущее, а беседа была позитивной. Вскоре последовал ответ от Полины. Меня пригласили на финальное собеседование с куратором буткемпа.

Финальная встреча с куратором буткемпа

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

Как всегда: зум,час, Мишка.

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

  1. Сперва мне рассказали о самом Яндекс.Маркете. Как развивается сервис, каковы его масштабы.

  2. Затем мне рассказали уже о проведении буткемпа. Период адаптации с тестовым заданием -> работа в первой команде -> работа во второй команде. И еще некоторые уточняющие детали.

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

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

Тут я чуть ли не подпрыгнул от радости, начал плясать, хлопать в ладоши, кричать на всю общагу "ура", включил песню Survival из фильма Tomb Raider. Но тут мне учтивый сосед сообщил, что это еще не значит, что меня приняли на работу. Поэтому я ждал пока пройдут выходные, чтобы мне сообщили итоговый ответ. Вообщем после выходных мне снова написала Полина и уже окончательно сказала, что я принят. Мы созвонились, опять перешли на ты (тут я уже готов был сам это предложить) и обговорили некоторые детали.

В заключение

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

В целом все собеседования проходили вполне комфортно, все интервьюеры вежливые и позитивные люди. Полине отдельный респект, за доброжеталельность :)

Желаю удачи всем будущим соискателям, не бойтесь пробовать, искать решения трудных задач и обращайтесь за "помощью" своих "Мишек" :)

Если к посту проявится интерес, то запилю ещё историю о прохождении стажировки и выживании в Москве.

Tags:
Hubs:
+12
Comments31

Articles