Программирование, машинное обучение, и жизнь
Этим летом я проходил собеседование на роль Software Engineer в Google Zürich. Процесс меня приятно удивил - оказалось, что алгоритмическим задачкам отводится не так уж много времени, а такие важные области как software engineering и software design прорабатываются весьма тщательно.
После того как вы отправили резюме (очень желательно - через знакомого гуглера), вам в течении недели должен ответить рекрутер. Вы договоритесь о времени звонка и поговорите о том, в каком офисе вы бы хотели работать, на какой позиции, какой у вас предыдущий опыт разработки и т.д. Рекрутер подробно опишет какие дальнейшие шаги вас ждут и что вам нужно повторить перед собеседованиями. Можно взять 2-3 недели на подготовку, но если вам недостаточно этого времени, то лучше начать подготовку заранее.
Лучшая рекомендация по подготовке - статья Get that job at Google by Steve Yegge. Еще очень важный совет, который я получил от моего знакомого гуглера - налегать на практику. Читаете книгу по математике/алгоритмам - решайте все упражнения. Решайте много олимпиадных задач, участвуйте в соревнованиях. Если есть возможность - перейдите на более подходящие для обкатки новых навыков проекты в текущей компании.
Следующий шаг - phone screening. Вы договоритесь о времени, когда вам удобно пройти собеседование по телефону или GTalk, на котором нужно будет решить одну-две задачи в Google Docs, проанализировать ее сложность (big-O) и ответить на дополнительные вопросы. Задача этого интервью (их бывает одно или два) - отсеять тех, кто не умеет решать рядовые для инженера Google задач.
Если вы прошли phone screening, то с вами договариваются о дате для прохождения серии интервью в одном из офисов Гугла (обычно - в том, где вы планируете работать). В моем случае это было 5 интервью по 45 минут с часовым перерывом на обед. Кроме этого обеденного перерыва специальных перерывов нет, но перед началом каждой 45-минутки вам предлагают сходить за водой-чаем-кофе, в туалет . Задача этих интервью - протестировать с разных сторон ваши возможности в решении инженерных задач, проверка вашего опыта software engineering и system design, изучение ваших способностей решать задачи за пределами зоны комфорта.
В течении трех недель вы либо получаете результат: предложение о работе (job offer), либо вежливое “нет”. Если нет - можно снова начать этот же процесс через год.
У хороших интервьюеров есть заготовки задач, которые задают канву вашему разговору и на которых можно проверить разные ваши навыки. Из пяти моих on-site интервьюеров только один задавал “стандартные” задачи из набора “140 google interview questions” и “Cracking the Coding Interview”.
Когда я читал отзывы проходивших собеседование, то встречал очень много отзывов именно о задачах. “Все решил, но не взяли”, “Дурацкие задачки, мы же не в институте” и т.п. По моим ощущениям, задачки намного менее объемные чем на соревнованиях по программированию (даже при том что я участвовал только в любительском втором дивизионе). Если вы хорошо повторили (или же изучили, как это было в моем случае) алгоритмы и структуры данных, а затем еще и хорошенько потренировались на площадках codeforces.ru, topcoder.com, то реализация решений не будет отвлекать много вашего внимания, а на первый план выйдет ваше умение рассуждать, задавать хорошие уточняющие вопросы, объяснять возможные варианты решения, обсуждать возможные варианты улучшения первоначального решения.
Про это я читал в какой-то статье, мне даже говорил про это рекрутер, но что это такое (и почему это важно) - я осознал только на первом интервью. Суть хода в том, что в процессе разговора интервьюер нащупывает вашу зону комфорта/компенентности, проверяет насколько хорошо вы решаете задачи в этой зоне, а затем расширяет задачу за пределы этой зоны. Ощущение такое как будто только прочитал задачу C или D из условий соревнования, и у тебя нет ни малейшей идеи как к ней подступиться. Если есть опыт “взлома задач”, мозговых штурмов, поиска в разных направлениях одновременно, то это сильно помогает. Я каждые 2-3 минуты генерировал новые возможные подходы к решению, пока не начали прорисовываться более-менее рабочие варианты. Такой подход на интервью я встретил впервые и очень зауважал те компании и тех интервьюеров, которые могут такое устроить.
Я видел какой код пишется на соревнованиях по программированию и побаивался, что гугловое интервью проходят в основном такие программисты, но оказалось что “все под контролем”. Одно из собеседований посвящено system design. Вам рассказывают требования к продукту и просят спроектировать программную систему, которая бы отвечала этим требованиям. Потом постепенно дополняют требования - большие нагрузки, большие данные и т.п. Потом просят спроектировать в деталях один из важнейших компонентов.
Кроме system design много внимания уделяется и software engineering: как и зачем писать тесты, как работать командой, как писать расширяемый код и т.п.
Если у вас есть какие-то вопросы по процессу собеседования - пишите в комментарии. Хочу сразу развеять один миф, который я несколько раз слышал в Киеве.
У меня диплом “инженерa-электрикa” маленького степного университета, что совсем не помешало мне получить Google job offer и разрешение на работу в Швейцарии. Мой профессиональный опыт (6 лет разработчиком и 3 года менеджером) компенсировал недостаток формального образования.
comments powered by Disqus