Небольшое вступление
Решил написать данный пост в поддержку начинающим соискателям и поделиться своими впечатлениями. Поскольку, к сожалению, подобных постов я не смог найти и это добавляло некоторое волнение :)
Сразу предупрежу, по вполне понятным причинам условий задач я вам не скажу, но будет их общее описание.
О чем поговорим:
Кто я и почему решил пойти на стажировку?
Я нахожусь на 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х логических секций.
Сперва мне рассказали о самом Яндекс.Маркете. Как развивается сервис, каковы его масштабы.
Затем мне рассказали уже о проведении буткемпа. Период адаптации с тестовым заданием -> работа в первой команде -> работа во второй команде. И еще некоторые уточняющие детали.
Вот это, пожалуй, самая интересная часть. Мне не давали вопросов по теории или каких-то задач, что меня приятно удивило. Но расспросили еще раз о интересных мне направлениях, о проектах, в которых я участвовал, работал ли в команде и какая была моя роль, что делал в случае возникновения ступора или когда понимал, что не успеваю выполнить задание. Некоторые из этих вопросов уже были в анкете, которую я подавал в самом начале, так что рекомендую про них вспомнить :)
Вообщем это была ненапряжная и приятная беседа. Мне сказали ожидать финального решения. Вскоре Полина сообщила, что от команды фидбек положительный и меня рассматривают на стажировку в буткемп.
Тут я чуть ли не подпрыгнул от радости, начал плясать, хлопать в ладоши, кричать на всю общагу "ура", включил песню Survival из фильма Tomb Raider. Но тут мне учтивый сосед сообщил, что это еще не значит, что меня приняли на работу. Поэтому я ждал пока пройдут выходные, чтобы мне сообщили итоговый ответ. Вообщем после выходных мне снова написала Полина и уже окончательно сказала, что я принят. Мы созвонились, опять перешли на ты (тут я уже готов был сам это предложить) и обговорили некоторые детали.
В заключение
Изначально я планировал просто приобрести опыт прохождения собеседований, более подробно узнать, что требуется от бекендера в реальных случаях, ну и, конечно же, протестить свои знания. Я не ожидал, что дойду до этого этапа.
В целом все собеседования проходили вполне комфортно, все интервьюеры вежливые и позитивные люди. Полине отдельный респект, за доброжеталельность :)
Желаю удачи всем будущим соискателям, не бойтесь пробовать, искать решения трудных задач и обращайтесь за "помощью" своих "Мишек" :)
Если к посту проявится интерес, то запилю ещё историю о прохождении стажировки и выживании в Москве.