Что спрашивают на behavioral и system design интервью, или Как я попал в Facebook
Несколько недель назад я начал работать в Facebook, и хочу поделиться субъективным мнением о том, как подготовиться и успешно пройти собеседование.
Я пишу эту статью по двум причинам. Во-первых, в интернете очень много информации о том, как подготовиться к техническим собеседованиям, но очень мало — о behavioral и system design интервью, а это половина процесса. Во-вторых, если бы я знал обо всем, о чем пойдет речь ниже, то еще 12 лет назад устроился бы в Google, а в прошлом году не провалился бы в Amazon. Надеюсь, мой опыт кому-то пригодится.
Несколько слов обо мне: за 13 лет в украинском IT успел поработать как в небольших местных, так и в крупных аутсорсинговых и продуктовых компаниях. Между этим 7 лет посвятил работе над собственным проектом. За свою карьеру я побывал на десятках (а может, и сотнях) собеседований и получил множество отказов. Меня не взяли в Google, Amazon, Snapchat, Shopify и еще в кучу компаний поменьше. Из каждой неудачи я вынес что-то полезное, и в итоге этот опыт обеспечил серию успешных собеседований и оффер в лондонский офис Facebook.
Итак, начнем.
Как сделать так, чтобы вас позвали на первое собеседование
Вариантов тут несколько:
- Посмотрите LinkedIn, возможно, кто-то из ваших контактов уже там работает. Внутренний референс всегда эффективнее.
- Контактируйте с рекрутером напрямую в том же LinkedIn.
- Рассылайте резюме. К сожалению, эффективность этого способа довольно низка, но она далеко не нулевая.
В моем случае сработал второй вариант. В январе мне написала рекрутер из Facebook, но я на тот момент уже принял оффер от одной небольшой канадской компании и решил не рисковать, так как шансы устроиться в Facebook казались уж очень призрачными. В итоге я вежливо отказался, но... пришел COVID-19, и в апреле мне отменили канадский оффер.
Всегда будьте вежливы и старайтесь отвечать на все сообщения LinkedIn, даже и отказом. Никогда заранее не знаешь, в какой момент это может принести пользу.
Общение с рекрутером
Первое, что вас ждет после переписки с рекрутером — это созвон с ним же длительностью примерно 30 минут. Большая часть разговора — это рассказ рекрутера про Facebook и пара стандартных вопросов: немного об опыте, проектах, что любите/не любите и т.п. Но главный вопрос — когда вы готовы пройти первое собеседование. Для многих это может показаться странным, но кандидат выбирает сам. Это может быть и через несколько дней, если кандидат чувствует уверенность, а может быть и через два месяца, если нужно подготовиться. Тут решайте сами, но по личному опыту хочу сказать, что лучше особо не торопиться.
После звонка вы получите письмо от рекрутера следующего содержания:
- общая информация о собеседовании;
- приглашение на live вебинар с одним из инженеров Facebook, который расскажет о том, как будет проходить первое собеседование;
- запись прошлого вебинара;
- несколько обучающих видео о том, как проходит собеседование, чего именно ждать и как себя вести непосредственно во время собеседования. Будет даже видео от Gayle Laakmann McDowell, сделанное специально для Facebook (если что, это автор книги Cracking the Coding Interview);
- ссылки на ресурсы, где можно потренироваться в решении алгоритмов и посмотреть список вопросов, которые задавали людям на прошлых собеседованиях (мой однозначный фаворит — LeetCode).
Вы не поверите, но Facebook вас реально готовит к собеседованию! Честно говоря, я не встречал такого ни в одной компании мира, хотя успел пособеседоваться в очень многих местах.
Как пройти скрининговое собеседование
Оно проходит с одним из инженеров Facebook — техническое, и длится 45 минут. Состоит из следующих этапов: 5 минут — общие технические вопросы, 35 минут — две практические задачи на знание алгоритмов и 5 минут — ваши вопросы.
Первым делом посмотрите все видео, которые вам пришлет рекрутер, регистрируйтесь на Leetcode и начинайте решать задачи из списка топ-100. На этом этапе стоит сконцентрироваться на Easy и Medium задачах. Очень рекомендую не жалеть 35$ и оплатить подписку на месяц или два. С платной подпиской будет доступ к вопросам, которые задают в определенной компании. За 5 собеседований в Facebook меня попросили решить 7 задач. 6(!) из них я до этого встречал на LeetCode в том или ином виде, и лишь одна была не алгоритмическая, а полностью практическая и сконцентрирована на специфике iOS. Кстати, если вы хорошо и быстро решите задачу, то вам могут задать еще дополнительные вопросы в качестве усложнения — и к этому, к сожалению, целенаправленно не подготовиться. Поможет только опыт решения задач.
Сколько нужно решить задач? Я бы сказал, штук 100. В идеале — еще решить все задачи из закладки Facebook. Итого, получится около 150 задач. В моем случае я решал примерно по 2 задачи в день, так что на подготовку ушло около
Кстати, алгоритмические задачи вечны и не меняются! В Facebook меня попросили решить ровно такую же задачу, какую я решал в Google 12(!) лет назад. Так что этот опыт очень пригодится и в будущем.
Вот, к примеру, моя статистика по LeetCode, 160 задач вполне хватило:
Структуры данных
Вам нужно знать следующее: Arrays, Maps / Dictionaries (они же хэш-массивы и ассоциативные хэш-массивы), Stack, Heap, Trees, Graphs, Linked List. Еще хорошо бы знать алгоритм построения Trie, так как он используется в некоторых задачах.
В качестве базового ресурса для изучения структур данных я бы посоветовал всем известную книгу Cracking the Coding Interview и снова тот же LeetCode, где вы сможете выбрать задачи по категориям и потренироваться в их решении.
Интересный момент: в некоторых языках нет определенных структур данных, но вы всегда можете описать их интерфейс и создать решение задачи на основе этой структуры. И только потом, если останется время, добавить имплементацию. К примеру, мне задали задачу, которая оптимальнее всего решалась при помощи Heap, но в iOS нет этой структуры данных, так что я описал предполагаемое решение словами, и интервьюер уже сам предложил считать, что у нас уже есть Heap. В итоге я написал только базовый код алгоритма без имплементации этой конкретной структуры.
Важно! Даже если в вашем языке нет каких-то структур, вы должны четко понимать сложность работы с операциями во всех структурах данных (сложность вставки, удаления, поиска, сортировки и т.д.), что подводит нас к следующему пункту.
Изучение Big O Notation
Этот пункт чрезвычайно важен. Вы должны понимать сложность алгоритмов даже на позицию джуниора! Очень рекомендую уделить этому достаточно времени, тем более что там все не так сложно, как с первой частью.
Если вы новичок, то начните с этой статьи, в которой описываются базовые принципы Big O, а также cнова загляните в Cracking the Coding Interview.
Big O нужно не заучить, а понять. Если вы поймете, почему какой-то небольшой кусок кода выполняется за определенное время, то и оценка сложности всего алгоритма не будет проблемой. Обязательно обратите внимание на LeetCode, так как практически во всех задачах есть описание нескольких возможных решений, и по каждому — оценка временной сложности и количества используемой памяти.
Как вести себя на собеседовании
Тут все просто — разговаривайте. Каждый шаг должен быть озвучен заранее. Не пишите код до того, как обсудите его с интервьюером. Цель интервьюера — понять, как вы мыслите, и найти ваши сильные стороны. Если, к примеру, вы знаете два решения задачи (скажем, простое и сложное или эффективное и не очень), то озвучьте оба и обсудите «за» и «против» по каждому из вариантов.
Пожалуй, по первому этапу это все. Разве что не забудьте подготовить несколько вопросов про Facebook. Очень надеюсь, что первый этап пройдет гладко, и вы получите приглашение на второй этап, о котором мы поговорим сейчас.
Как пройти on-site интервью в офисе
К сожалению, мне сложно что-то рассказать о поездке в офис Facebook, так как у меня ее не было из-за COVID-19. Мое on-site интервью было виртуальным и состояло из четырех звонков с перерывом посередине. Если бы была возможность выбирать между виртуальным вторым этапом или реальным — я бы долго колебался, что лучше. В случае реальной поездки вы посетите офис Facebook, поживете в классной гостинице и посмотрите интересный город за счет компании, зато в случае виртуальных собеседований у вас будет возможность в перерыве посмотреть свои шпаргалки, немного отвлечься и в целом чувствовать себя более комфортно дома.
Второй этап будет состоять из четырех собеседований с четырьмя разными людьми: два технических собеседования + behavioral + system design.
Относительно технической части: она идентична той, что на первом этапе (пара общих вопросов, две задачи, ваши вопросы). Будет лишь одно изменение: задачи станут чуть сложнее. Если на предыдущем этапе стоило решать задачи уровня easy-medium, то теперь пришло время переключиться на medium-hard (но все же с уклоном в medium). LeetCode снова вам в помощь.
А теперь самое интересное. Поговорим об интервью, о которых, как правило, меньше всего информации.
Как пройти Behavioral interview
Это интервью может показаться самым простым, но это совсем не так. Готовьтесь тщательно! Хорошенько покопайтесь в памяти и ответьте на следующие вопросы о себе:
- сильные стороны
(5-7 пунктов); - слабые стороны
(2-3 пункта); - успехи, особенно на последнем месте работы (зависит от длительности работы, за год должно получиться 2 и больше пунктов);
- неудачи
(2-4 пункта); - конфликты/несогласие с коллегами и менеджерами, как вы решали эти вопросы (хорошо бы иметь
2-3 примера в запасе); - примеры проактивности, какие результаты это дало
(4-5 пунктов); - ваши цели, как вы их добиваетесь/добивались, в какую сторону хотите двигаться в будущем
(2-4 пункта); - почему вы хотите работать именно в Facebook и скиллы, которые помогут вам реализовать себя максимально эффективно
(2-5 пунктов); - что вас мотивирует в работе (тоже
2-5 пунктов); - примеры позитивного и негативного фидбека от коллег и менеджеров, как вы на это реагировали.
Вот, к примеру, мои шпаргалки с ответами на большинство этих вопросов (ответы заблурены, так как ценность они имеют только для меня и больше ни для кого):
Безусловно, вам не понадобятся абсолютно все пункты на собеседовании, но я бы очень рекомендовал подготовить запас ответов, чтобы во время собеседования иметь возможность подстроиться под интервьюера и направить разговор в наиболее комфортное русло.
Интересная особенность этого интервью: если опыта у вас уже больше, чем
К примеру, вас могут спросить: «Что бы вы изменили на своем текущем месте работы?». Так как идеальных компаний не бывает, какой-то ответ должен найтись у каждого. И, конечно же, сразу за этим вопросом последует следующий: «Если вам это не нравится, то что конкретно вы сделали для того, чтобы изменить эту ситуацию?». Тут уж ваш шанс блеснуть своей проактивностью.
Как вести себя на собеседовании? Главное — не врите! Если нет ответа на вопрос, то не старайтесь что-то придумать, так как последующие вопросы вас разоблачат. Не пытайтесь выставить свои слабые стороны как сильные, а лучше расскажите, как вы работаете над избавлением от определенных недостатков.
Обязательно посмотрите видео, в котором бывший инженер Facebook рассказывает много интересного про behavioral интервью: как готовиться, что стоит и не стоит говорить, как показать себя с лучшей стороны.
System Design interview
Итак, мы подошли к самой последней и, наверное, самой сложной части. Именно по этой части оценивают ваш seniority level, и именно от этой оценки будет зависеть ваш уровень дохода.
Что представляет собой это интервью? Это обсуждение архитектуры какого-либо приложения/сервиса. Представьте, что вы CTO небольшой компании, и вам необходимо придумать, нарисовать и объяснить архитектуру проекта всей компании: от джуниор-девелоперов и до CEO. К примеру, если это позиция iOS, то будьте готовы, что приложение будет общаться с клаудом, асинхронно загружать данные и медиафайлы, кэшировать все это добро и т. п.
Самый интересный вопрос — как готовиться? К примеру, если вы iOS разработчик, то возьмите свой айфон, посмотрите приложения, которыми вы чаще всего пользуетесь, и... начинайте рисовать архитектуру. В идеале — попросите нескольких коллег/друзей (конечно же, шарящих в вашей предметной области) помочь. Сядьте вместе и распишите архитектуру одного из приложений. Чем больше схем вы нарисуете, тем легче будет вам на собеседовании.
Вот несколько приложений из моего телефона, архитектуру которых я пытался продумать и нарисовать: Facebook, Instagram, Twitter, WhatsApp, Gmail, Notes, YouTube.
В реальной жизни вам, конечно же, не нужно придумывать архитектуру за 40 минут, всегда есть день-неделя-месяц на размышления, и конечный результат получается красивым и стройным. На собеседовании все иначе: нужно все охватить, ничего не забыть, углубиться в детали и еще, к тому же, красиво нарисовать. Хорошая новость — после подготовки (при условии, конечно, что нарисуете хотя бы десяток архитектур) у вас вырисуется шаблон, по которому можно идти на собеседовании. Я, к примеру, даже знал, с какой стороны доски какую часть приложения буду рисовать и как соединять стрелочками. Это о-о-о-очень помогло на самом собеседовании, так как оно у меня было последним и особенно тяжелым (как минимум, сказались усталость и нервы).
Вот пример того, как выглядело мое начало подготовки с друзьями:
И финальный вариант на собеседовании (он не совсем полный, так как часть пришлось стереть по ходу дела из-за нехватки места):
Финальный вариант, как мне кажется, получился более чистый, понятный и простой. Так что не игнорируйте эту часть, тренируйтесь!
Как вести себя на собеседовании
Внимательно слушайте задачу. Повторите вслух то, что вы услышали. Убедитесь в том, что вы правильно поняли задачу.
Задайте уточняющие вопросы. Проблема будет довольно абстрактная, поэтому уточнить будет что. Не делайте предположений об условиях, узнайте все недостающие детали заранее. Вот примерный список вопросов для iOS приложения: возможные ограничения, интерфейс, покупки в приложении, геолокация, приватность, работа в фоне, пуш-уведомления, работа без сети или с плохой связью и т. п.
Начинайте рисовать и проговаривать свои идеи. Это тот момент, когда нужно перехватить инициативу и следующие
Не забудьте охватить все части вашей архитектуры. Двигайтесь от общего к частному. Лучше, если вы скажете о каждой части по чуть-чуть, чем если углубитесь в одну и не успеете объяснить остальные. Вот список того, что было бы хорошо охватить для iOS: сетевая часть и клауд (протоколы, нагрузка на сервер, API), UX, кэширование и БД (Core Data, например), доступ к системным ресурсам и данным (камера, фото, контакты, файлы, локация и т. п.), нотификации и апдейты контента, аналитика, тестирование, нагрузка на CPU/GPU/батарею.
Думайте о будущем! Задача, скорее всего, будет довольно простая, но очень полезно, если вы заложите в архитектуру возможности масштабирования. К примеру, с сервера вам ежедневно приходит 100 записей с какими-то данными. Подумайте, как изменится приложение, если их станет 100 тысяч, не забудьте сразу заложить эту возможность в серверные API (pagination, например). Не удивляйтесь, но даже iOS программисту нужно будет хотя бы примерно описать список требуемых серверных API.
Вот и все. Главное — будьте лидером, отвечайте на немногочисленные вопросы интервьюера и рисуйте красивые диаграммы. При качественной подготовке все должно пойти как по маслу.
Через
Прохождение собеседования — это скилл. Так что тренируйтесь, тренируйтесь и еще раз тренируйтесь. Все возможно!
Удачи :)