За пять дней, с 24 по 28 июля 2017 года, я прошел собеседования в LinkedIn, Salesforce Einstein, Google, Airbnb и Facebook; все пять компаний предложили мне работу. Это был замечательный опыт и я понимаю, как мне повезло, что мои усилия оправдали себя, поэтому решил написать об этом. Здесь я расскажу о том, как готовился к собеседованиям, как они проходили и какое впечатление произвели на меня компании.
Как все началось
Я отработал в Groupon почти три года. Это моя первая работа, там были и прекрасные люди, и отличные проекты. Мы делали всякие интересные штуки, вводили перемены внутри компании, публиковали материалы и все в таком духе. Но со временем я стал ощущать, что темп моего самообразования стал затухать (попросту говоря, замедляться), мне не хватало пищи для ума. К тому же, как и всякого разработчика ПО из Чикаго, меня тянуло в Область залива Сан-Франциско — ведь там столько известных компаний.
Жизнь коротка, а профессиональная жизнь еще короче. Обговорив все с женой и заручившись ее полной поддержкой, я решил сделать решительный шаг и в первый раз в жизни поменять работу.
Подготовка
Хотя меня интересовали должности, связанные с машинным обучением, вакансии, которые были доступны в компаниях, различались и номинально, и в плане того, как проводились собеседования. В трех искали инженера по машинному обучению (LinkedIn, Google, Facebook), в одной — инженера по работе с данными (Salesforce), еще в одной — просто разработчика ПО (Airbnb). Соответственно, мне нужно было освежить знания сразу в трех областях: машинное обучение, написание кода и проектирование систем.
Так как я при этом продолжал работать полный день, весь процесс подготовки растянулся на два или три месяца. Вот что я делал.
Код
Соглашусь, что написание кода в ходе собеседования — не лучший способ в полной мере оценить уровень разработчика, однако ничего лучше, чтобы определить, хороший ли вы программист, за короткий временной промежуток, пожалуй, еще не придумали. На мой взгляд, это неизбежное зло, через которое придется пройти, чтобы попасть на желаемое место.
Я практиковался в основном на Leetcode и Geeksforgeeks, хотя Hackerrank и Lintcode — тоже неплохие ресурсы. Несколько недель я повторял распространенные структуры данных и алгоритмы, затем подтянул те области, в которых был не слишком силен, и наконец, принялся за решение типовых заданий. Так как свободного времени у меня было немного, я обычно ограничивался двумя заданиями в день.
Вот несколько советов:
- Тренируйтесь как можно больше. Без этого никак.
- Но вместо того, чтобы прорешивать все 600 заданий на Leetcode, старайтесь выбирать разные типы и тщательно разбираться в каждом. В общей сложности я выполнил около 70 заданий — просто ощутил, что этого хватит. Я смотрю на это так: если 70 заданий не принесли вам пользы, значит, вы неправильно подходили к их выполнению, и от 700 тоже не будет толку.
- Начинайте с самых сложных. После них все остальные будут казаться простыми.
- Если за два часа вы так и не смогли сдвинуться с мертвой точки, подсмотрите в решения. Тратить больше времени, как правило, не имеет смысла.
- Даже если вы успешно выполнили задание, все равно загляните в ответы. Мне нередко приходилось удивляться продуманности и элегантности предложенных там решений, особенно однострочников на Python.
- Используйте тот язык, который знаете лучше всего и который достаточно широко распространен, чтобы на собеседовании не возникло проблем с объяснениями.
Проектирование систем
Эта область теснее связана с реальным опытом работы. На собеседованиях могут задавать разные типы вопросов, в частности об архитектуре системы, объектно-ориентированном дизайне, проектировании схемы базы данных, проектировании распределенных систем, масштабировании и многом другом.
В интернете можно найти много ресурсов, которые помогут с подготовкой. Я в основном читал статьи об опыте собеседований в сфере проектирования систем и построении крупномасштабных систем, а также практические кейсы.
Вот некоторые ресурсы, которые показались мне особенно полезными:
blog.gainlo.co
horicky.blogspot.com
www.hiredintech.com/classrooms/system-design/lesson/52
www.lecloud.net/tagged/scalability
tutorials.jenkov.com/software-architecture/index.html
highscalability.com
На собеседованиях могут затрагиваться разные темы, но в общем и целом лучше подходить к выполнению заданий, руководствуясь двумя общими правилами:
- Сначала разберитесь с требованиями, затем набросайте общую схему и только потом углубляйтесь в детали. Не нужно сразу хвататься за детали, пока не поймете, что именно от вас хотят.
- Идеальных систем не бывает. Выбирайте, чем пожертвовать, исходя из того, какие перед вами поставили задачи.
Подводя итог: лучший способ попрактиковаться в проектировани систем перед собеседованием — сесть и спроектировать какую-нибудь систему; ведь именно этим вам и предстоит заниматься изо дня в день на работе. Не скользите по верхам — глубоко изучите те инструменты, фреймворки и библиотеки, которыми пользуетесь. Скажем, если вы используете Hbase, вместо того, чтобы просто запустить DDL через клиент, постарайтесь вникнуть в общую архитектуру, например: как происходит считывание и запись, как HBase обеспечивает постоянство, зачем нужно полное и неполное уплотнение (minor/major compactions) и где в системе используются кэш LRU и Bloom Filter. Можно даже сравнить HBase с Cassandra, найти сходства и различия. В таком случае, когда вас попросят спроектировать распределенное хранилище, вы не почувствуете себя припертым к стенке.
Много интересного можно также найти на блогах: страницах независимых программистов, блогах инженеров из крупных компаний, а также в официальной документации проектов с открытым кодом.
Самое важное здесь — оставаться любознательным и не переоценивать свои знания. Уподобьтесь губке, которая впитывает в себя все, с чем соприкасается.
Машинное обучение
В собеседованиях в сфере машинного обучения можно выделить два аспекта: теория и проектирование продукта.
Если у вас нет опыта исследований в этой области и вы не оканчивали соответствующего курса с отличием, не помешает почитать специальную литературу. Классические труды вроде Elements of Statistical Learning и Pattern Recognition and Machine Learning — отличный вариант, но если вас интересует более узкая проблематика, можете подобрать что-то на нужную тему.
Убедитесь, что хорошо понимаете базовые концепты: дилемма смещения и разброса, переобучение, метод градиентного спуска, L1/L2 регуляризация, теорема Байеса, бэггинг/бустинг, коллаборативная фильтрация, сокращение размерности и так далее. Ознакомьтесь с самыми распространенными формулами, такими как теорема Байеса, а также с деривациями популярных моделей, например, логистической регрессией и методом опорных векторов. Поработайте с простыми моделями вроде дерева принятия решений и кластеризации методом K-средних. Если упоминаете какие-то модели в своем резюме, изучите их досконально, будьте готовы рассказать о плюсах и минусах.
Что касается дизайна продуктов, нужно представлять себе, как разворачивается процесс создания. Я действовал по такой схеме:
- Определить цель: прогнозирование, рекомендация, кластеризация, поиск или что-то еще.
- Выбрать нужный алгоритм: с учителем или без учителя, классификация или регрессия, обобщенная линейная модель, дерево принятия решений или нейросеть и так далее. Подготовить аргументы в пользу своего выбора.
- Выбрать или создать нужные функции исходя из доступных данных.
- Выбрать метрики для оценки производительности модели.
- Факультативно: указать, как можно усовершенствовать эту модель, прежде чем передать ее в разработку.
Здесь я снова хочу подчеркнуть, как важно оставаться любознательным и постоянно учиться чему-то новому. Попробуйте не просто использовать API для Spark MLlib или XGBoost и сказать: «Готово!» с чувством выполненного долга, но разобраться, почему стохастический градиентный спуск подходит для распределенного обучения, или понять, в чем отличие XGBoost от традиционного градиентного бустинга, то есть в чем специфика его функции потерь, зачем он вычисляет производную второго порядка, и все в таком духе.
Как проходили собеседования
Начал я с того, что отписался HR-менеджерам на LinkedIn и попросил рекомендации. После одной неудачной попытки попасть в звездный стартап (об этом расскажу потом), я тщательно готовился несколько месяцев и наконец, с помощью рекрутеров, набрал собеседований в компаниях из Силиконовой долины на целую неделю. Я прилетел туда в воскресенье и целых пять дней провел в общении с более чем 30 специалистами из лучших IT-компаний в мире. Мне очень повезло — все пять компаний предложили мне вакансии.
Телефонные интервью
Все интервью по телефону проходили стандартно. Отличалась только продолжительность: с кем-то, например, Google, мы говорили час, с другими (Facebook, Airbnb) — 45 минут.
Здесь на первый план выходит квалификация: вы ограничены очень жесткими временными рамками и второго шанса, скорее всего, не будет. Необходимо на лету определить тип задания и в общих чертах объяснить решение. Обязательно проговаривайте свои цели и ход мысли. Поначалу это может вас немного затормозить, но коммуникация играет самую значительную роль в ходе собеседования; чем больше ее — тем лучше. Не пытайтесь зачитать готовое решение, очень высока вероятность, что собеседник раскусит вашу хитрость.
Если вы претендуете на должность инженера по машинному обучению, вам могут предложить вопросы и из этой сферы. Будьте готовы к этому.
Чтобы оптимально распорядиться временем, я назначил три интервью на один и тот же день с интервалом в час. Преимущество здесь в том, при хорошем начале у вас может сработать эффект «поперло»; недостаток, соответственно, в том, что неудачное первое интервью также может повлиять на результаты следующих. Так что эта стратегия подойдет не всем.
Проходить отбор сразу в нескольких компаниях удобно в том отношении, что это дает некоторые льготы. Из-за того, что LinkedIn и Facebook пригласили меня на личную встречу уже после первого телефонного разговора, Airbnb и Salesforce тоже не стали проводить повторное интервью.
Google удивил меня еще больше: они разрешили мне вообще пропустить стадию телефонных интервью и сразу назначили встречу на свободный день, когда услышали, что на следующую неделю у меня уже запланировано четыре собеседования. Я понимал, что будет очень тяжело, но не отклонять же приглашение от Google!
Собеседования
Это было мое первое собеседование «лицом к лицу»; оно проходило в филиале компании в Саннивейл. Офис очень приятный и люди держатся с профессионализмом, как и всегда.
На каждую сессию отводилось по часу. Вопросы по программированию были стандартными, а вот задания, связанные с машинным обучением, местами показались мне сложными. Но при этом отдел кадров заранее переслал мне материалы для подготовки — они очень пригодились и, в конечном счете, никакие из заданий не застали меня врасплох. До меня доходили слухи, что из всех компаний Силиконовой долины в LinkedIn кормят лучше всего, и судя по тому, что я видел, если даже это не на сто процентов правда, то все-таки недалеко от истины.
Сделка с Microsoft, похоже, разрешила финансовые сложности LinkedIn и дала им свободу заниматься по-настоящему классными проектами. Новые функции — видео, профессиональные рекламные объявления — выглядят интересно. Как компания, которая специализируется профессиональном росте, LinkedIn уделяет большое внимание и развитию собственных сотрудников. Многие команды (скажем, те, кто работает над релевантностью рекламы и отбором контента для ленты) сейчас набирают новых сотрудников, так что, если хотите к ним присоединиться, не тяните.
Salesforce Einstein
Проект-суперзвезда от команды суперзвезд. Команда собралась недавно и в ней еще ощущается атмосфера стартапа. Продукт разработан на стэке Scala, так что здесь реально соблюдается типобезопаность! Компания хорошо себя показывает на конференциях, достаточно вспомнить выступления Мэттью Товбина на Scala Days Chicago 2017 и Ли МакГуайер на Spark Summit West 2017.
Собеседование я проходил в их офисе в Пало-Алто. Команда сплоченная и поддерживает здоровый баланс между работой и личной жизнью. Все увлечены своим делом и получают от него удовольствие. Здесь собеседование состояло всего из четырех сессий и прошло быстрее, чем в других компаниях, но мне не хотелось уходить. После собеседования Мэттью даже сводил меня в музей «HP garage».
Неоспоримый лидер индустрии, о котором даже сказать больше нечего — все и так всё знают. Но компания огромная. В смысле вообще просто ОГРОМНАЯ. Мне двадцать минут пришлось ехать на велосипеде, чтобы встретиться там с друзьями. Ну и очереди за едой бесконечные. А так прямо рай для разработчиков.
Я проходил собеседование в одном из зданий кампуса Mountain View, не знаю, в каком именно, потому что территория ОГРОМНАЯ.
Специалисты, с которыми я общался, выглядели очень умными людьми, а потом заговорили и оказались еще умнее. Здорово бы было с ними работать.
Что мне показалось необычным на собеседовании в Google — это то, как серьезно они относятся к анализу сложности алгоритмов. Хорошо усвойте, что такое Big O нотация!
Airbnb
Стремительно растущая компания-единорог с самобытной культурой и, пожалуй, самым красивым офисом в Силиконовой долине. Новые продукты, такие как Experiences и приложение для заказа столиков в ресторанах, нишевый рынок состоятельных людей и продвижение бренда в Китае — все это указывает на положительную перспективу. Хороший выбор для тех, кто не боится риска и хочет поучаствовать в быстро развивающемся проекте, еще не дошедшем до стадии первичного публичного предложения.
Сессия по программированию проходила не совсем обычно: пришлось работать не на доске, а в интегрированный среде разработки, так, чтобы код компилировался и дал нужный результат. Некоторые задания были очень сложными.
Также Airbnb были единственными, кто устроил мне особое интервью с членами разных команд. Это показывает, что компания серьезно относится к корпоративной культуре и одних технических навыков недостаточно, чтобы гарантированно занять место в компании. Лично я получил удовольствие от общения с сотрудниками из других отделов. Мы поболтали о том о сем и к концу сессии остались довольны друг другом.
В общем и целом, я бы сказал, что собеседование в Airbnb оказалось труднее остальных: и длиннее, и задания сложные, и сессии необычного формата. Если вы хотите туда устроиться, сначала ознакомьтесь с корпоративной культурой и ценностями.
Еще один гигант, который продолжает активно расти, но остается компактнее и мобильнее, чем Google. Учитывая его линейку продуктов, которая доминирует на рынке социальных платформ, и крупные вложения в AI и VR, на мой взгляд, у Facebook огромный потенциал для развития в будущем. Тем, кто интересуется машинным обучением, эта компания подойдет идеально, ведь в ней работают такие звезды, как Yann LeCun и Yangqing Jia.
Собеседование мне назначили в Здании №20 — это то, где сад на крыше и окна выходят на океан. Офис Цукерберга расположен там же.
Не знаю, давали ли сотрудникам, которые проводили собеседование, какие-то инструкции на этот счет, но мне не говорили прямо, справился ли я с заданиями. Полагаю, что да.
К полудню четыре предыдущих напряженных дня стали сказываться: у меня разболелась голова. Я продержался все послеобеденные сессии, но чувствовал, что был не на высоте. Я даже удивился, когда узнал, что Facebook тоже готов предложить мне вакансию.
В целом, у меня осталось ощущение, что сотрудники верят в миссию компании и гордятся продуктами, которые создают. Facebook — хорошее место, чтобы строить карьеру: рыночная капитализация в полтриллиона и с постоянным приростом говорит сама за себя.
Обсуждение условий
Это обширная тема, которую я не планировал раскрывать в своей статье, но могу указать на этот материал — он показался мне очень дельным.
Вот общие соображения, которые представляются мне важными:
- Сохраняйте профессионализм
- Знайте свои преимущества
- Выказывайте искренний интерес к людям и проектам
- Проявляйте терпение и уверенность в себе
- Будьте целеустремленным, но не в ущерб вежливости
- Ни в коем случае не лгите
Провальное собеседование с Databricks
Истории успеха всегда начинаются с поражений, и собеседования — не исключение. Еще в мае, перед тем, как предложить свою кандидатуру этим компаниям, я провалил собеседование с Databricks.
В апреле со мной связался один из их сотрудников, Xiangrui, и спросил, интересует ли меня возможность стать частью команды Spark MLlib. Я был на седьмом небе по трем причинам: 1) они программируют на Spark, а я очень люблю Scala; 2) у Databricks крутые инженеры; 3) Spark сейчас совершает переворот в мире больших данных. Такую возможность упускать было нельзя, и через несколько дней я начал проходить отбор.
Планка у них очень высокая и весь процесс занимает довольно много времени: сначала нужно заполнить опросник, потом пройти интервью по телефону, потом выполнить задание по написанию кода и, наконец, сходить на личную встречу.
Мне удалось дойти до этапа личной встречи и побывать у них в офисе в центре Сан-Франциско с видом на Трежер-Айленд.
Со мной общался специалист очень высокого класса, но при этом без всяких претензий. В ходе собеседования у меня часто появлялось чувство, что я дохожу до предела своих возможностей. Все шло более-менее гладко, пока на одной сессии я не прокололся по-крупному — не хватило знаний и подготовки, и все закончилось полным фиаско. Xiangrui был со мной очень любезен и проводил меня туда, куда я собирался после собеседования; было приятно с ним поговорить.
Несколько дней спустя я получил письмо с отказом. Этого следовало ожидать, но какое-то время меня одолевала досада. Пусть я и не смог устроиться в Databricks, но все-таки от всей души желаю им продолжать вносить свой огромный вклад в индустрию и достигать большего.
Заключение
- Жизнь коротка. Профессиональная жизнь еще короче. Не упустите момент, когда нужно сделать шаг.
- Собеседование — это не только собеседование, но и возможность заняться нетворкингом и завести новые знакомства.
- Всегда будьте любознательны и готовы учиться чему-то новому.
- Итог обсуждения условий будет определять ваше удовлетворение от работы.
- Если вам предложили работу, значит, вы удовлетворяете минимальным требованиям. Максимальных требований не существует. Продолжайте совершенствоваться.
Процесс смены работы у меня продолжался долго — с мая, когда я пошел на первое собеседование, до конца сентября, когда наконец принял предложение — и протекал непросто. Готовиться было трудно, ведь мою основную работу никто не отменял. Несколько недель я жил по такому расписанию: выполнял задания для собеседований до часа ночи, потом вставал в 8:30 и целый день проводил, полностью погрузившись в рабочий процесс своей компании.
Пять дней подряд ходить на собеседования в разные компании тоже было серьезным стрессом и большим риском. Я бы не советовал следовать моему примеру, если время у вас не поджимает. С другой стороны, если удастся получить несколько предложений о работе сразу, у вас будет весомое преимущество при обсуждении условий.
Мне хотелось бы поблагодарить HR-менеджеров, которые ориентировали меня по ходу дела, всех людей, которые уделили мне время, и компании за то, что дали мне возможность пройти собеседование и предложили место в команде. И наконец — самое важное — я благодарен своей семье за любовь и поддержку: родителям, которые следят за каждым моим шагом, начиная с самого первого, любимой жене за все, что она для меня делает, и дочке за ее теплую улыбку. Спасибо и вам, что прочитали этот пост!
Автор: nanton