Как готовиться к собеседованию
Вы только что получили приглашение на долгожданное очное собеседование в компанию своей мечты. Рекрутер присылает вам расписание на день. Вы просматриваете список и чувствуете себя довольно уверенно, пока взгляд не останавливается на этой секции: собеседование по проектированию систем.
Собеседования по проектированию систем часто пугают. Вопрос может быть таким расплывчатым, как «спроектируйте известный продукт X». Формулировки неоднозначны и кажутся чрезмерно широкими. Ваше беспокойство вполне понятно. В конце концов, как вообще можно за час спроектировать популярный продукт, на создание которого у сотен, а то и тысяч инженеров ушли годы?
Хорошая новость в том, что от вас этого никто и не ожидает. Проектирование реальных систем чрезвычайно сложно. Например, поиск Google выглядит обманчиво просто, однако объем технологий, стоящих за этой простотой, по-настоящему поражает. Если никто не ожидает, что вы за час спроектируете реальную систему, то в чем тогда польза собеседования по проектированию систем?
Такое собеседование имитирует решение реальной инженерной задачи, в которой два коллеги совместно разбирают неоднозначную проблему и приходят к решению, соответствующему поставленным целям. Проблема открытая, и идеального ответа не существует. Итоговый дизайн менее важен, чем та работа, которую вы проделываете в процессе проектирования. Это дает вам возможность показать свои навыки дизайна, обосновывать свои решения и конструктивно реагировать на обратную связь.
Давайте посмотрим на ситуацию с другой стороны и представим, что происходит в голове интервьюера, когда она заходит в переговорную, чтобы встретиться с вами. Главная цель интервьюера — точно оценить ваши способности. Меньше всего ей хочется дать неопределенную оценку только потому, что сессия прошла неудачно и не дала достаточно сигналов. Так что же интервьюер ищет в собеседовании по проектированию систем?
Многие считают, что такое интервью проверяет только технические навыки проектирования. На самом деле это гораздо больше. Эффективное собеседование по проектированию систем дает сильные сигналы о способности человека сотрудничать, работать под давлением и конструктивно справляться с неопределенностью. Умение задавать хорошие вопросы — тоже критически важный навык, и многие интервьюеры специально обращают на него внимание.
Хороший интервьюер также ищет тревожные сигналы. Избыточное усложнение — настоящая болезнь многих инженеров: они увлекаются архитектурной «чистотой» и игнорируют компромиссы. Часто они не осознают, как быстро растет стоимость слишком сложных систем, и многие компании дорого платят за это невежество. Вам точно не стоит демонстрировать такую склонность на собеседовании по проектированию систем. К другим тревожным сигналам относятся узость мышления, упрямство и т. д.
В этой главе мы рассмотрим несколько полезных советов и представим простой и эффективный подход к решению задач на собеседовании по проектированию систем.
Эффективное собеседование по проектированию систем в 4 шага
Каждое собеседование по проектированию систем отличается от других. Хорошее собеседование такого типа всегда открытое, и универсального решения на все случаи не существует. Тем не менее есть шаги и общие опорные точки, которые присутствуют в любом таком интервью.
Шаг 1 — Понять задачу и определить рамки дизайна
"Почему тигр зарычал?"
В задней части класса взметнулась рука.
"Да, Джимми?" — ответила учительница.
"Потому что он был ГОЛОДЕН".
"Очень хорошо, Джимми."
На протяжении всего детства Джимми всегда первым отвечал на вопросы в классе. Когда учитель что-то спрашивал, в аудитории неизменно находился ребенок, который обожал первым бросаться отвечать, независимо от того, знает он ответ или нет. Этим ребенком всегда был Джимми.
Джимми — блестящий ученик. Он гордится тем, что быстро знает все ответы. На экзаменах он обычно заканчивает первым. Для учителей он лучший кандидат на любые академические соревнования.
НЕ будьте как Джимми.
На собеседовании по проектированию систем быстрый ответ без размышления не приносит никаких дополнительных очков. Отвечать без глубокого понимания требований — серьезный тревожный сигнал, потому что это интервью не является викториной. Единственно правильного ответа здесь нет.
Поэтому не бросайтесь сразу предлагать решение. Замедлитесь. Подумайте глубже и задайте вопросы, чтобы уточнить требования и предположения. Это крайне важно.
Как инженерам, нам нравится решать сложные задачи и сразу переходить к финальному дизайну. Однако такой подход с высокой вероятностью приведет к тому, что вы спроектируете не ту систему. Один из важнейших навыков инженера — задавать правильные вопросы, делать корректные предположения и собирать всю информацию, необходимую для построения системы. Поэтому не бойтесь задавать вопросы.
Когда вы задаете вопрос, интервьюер либо отвечает напрямую, либо просит вас самостоятельно сделать предположение. Если происходит второе, запишите свои предположения на доске или на бумаге. Они могут понадобиться позже.
Какие вопросы стоит задавать? Задавайте вопросы, которые помогут понять точные требования. Вот список, который поможет начать:
-
Какие именно функции мы собираемся реализовать?
-
Сколько пользователей у продукта?
-
Насколько быстро компания ожидает масштабирование? Каких масштабов она ожидает через 3 месяца, через 6 месяцев и через год?
-
Каков технологический стек компании? Какие существующие сервисы можно использовать, чтобы упростить дизайн?
Пример
Если вас просят спроектировать систему новостной ленты, стоит задавать вопросы, которые помогают уточнить требования. Диалог между вами и интервьюером может выглядеть так:
Кандидат: Это мобильное приложение? Веб-приложение? Или и то, и другое?
Интервьюер: И то, и другое.
Кандидат: Какие функции для продукта самые важные?
Интервьюер: Возможность публиковать пост и видеть новостную ленту друзей.
Кандидат: Лента отсортирована в обратном хронологическом порядке или в каком-то особом
порядке? Под особым порядком я имею в виду, что каждому посту присваивается свой вес. Например,
посты от близких друзей важнее, чем посты из группы.
Интервьюер: Чтобы не усложнять, давайте предположим, что лента отсортирована в обратном
хронологическом порядке.
Кандидат: Сколько друзей может быть у пользователя?
Интервьюер: 5000
Кандидат: Каков объем трафика?
Интервьюер: 10 миллионов ежедневных активных пользователей (DAU)
Кандидат: Может ли лента содержать изображения, видео или только текст?
Интервьюер: Она может содержать медиафайлы, включая изображения и видео.
Выше приведены примеры вопросов, которые можно задать интервьюеру. Важно понять требования и прояснить все неоднозначности.
Шаг 2 — Предложить высокоуровневый дизайн и согласовать его
На этом шаге наша цель — разработать высокоуровневый дизайн и прийти вместе с интервьюером к согласию по нему. Во время этого процесса очень полезно сотрудничать с интервьюером.
-
Набросайте первоначальный чертеж дизайна. Попросите обратную связь. Относитесь к интервьюеру как к товарищу по команде и работайте вместе. Многие хорошие интервьюеры любят разговаривать и активно включаться в обсуждение.
-
Нарисуйте на доске или на бумаге блок-схему с ключевыми компонентами. Это могут быть мобильные и веб-клиенты, API, веб-серверы, хранилища данных, кэш, CDN, очередь сообщений и т. д.
-
Сделайте оценки на салфетке, чтобы понять, укладывается ли ваш черновой дизайн в заданные ограничения по масштабу. Размышляйте вслух. Если такие оценки нужны, проговорите это с интервьюером до того, как углубляться в них.
Если возможно, разберите несколько конкретных сценариев использования. Это поможет вам лучше сформировать высокоуровневый дизайн. Кроме того, такие сценарии с большой вероятностью помогут обнаружить граничные случаи, о которых вы пока не подумали.
Стоит ли на этом этапе включать конечные точки API и схему базы данных? Это зависит от задачи. Для крупных задач вроде «Спроектируйте поисковую систему Google» это уже слишком низкий уровень. А для задачи вроде проектирования серверной части многопользовательской игры в покер — вполне уместно. Обсудите это с интервьюером.
Пример
Давайте используем задачу «Спроектируйте систему новостной ленты», чтобы показать, как подходить к высокоуровневому дизайну. Здесь от вас не требуется понимать, как система реально работает. Все подробности будут объяснены в главе "Design A News Feed System".
На высоком уровне дизайн делится на два потока: публикация ленты и построение новостной ленты.
-
Публикация ленты: когда пользователь публикует пост, соответствующие данные записываются в кэш/базу данных, а сам пост добавляется в новостные ленты друзей.
-
Построение новостной ленты: новостная лента собирается агрегированием постов друзей в обратном хронологическом порядке.
На рисунках 1 и 2 показаны высокоуровневые дизайны потоков публикации и построения новостной ленты соответственно.

Рисунок 1

Рисунок 2
Шаг 3 — Глубокое погружение в дизайн
На этом этапе вы и интервьюер уже должны были достичь следующих целей:
-
согласовать общие цели и рамки функциональности;
-
набросать высокоуровневую схему общего дизайна;
-
получить от интервьюера обратную связь по высокоуровневому дизайну;
-
сформировать первые идеи о том, на каких областях стоит сосредоточиться при глубоком погружении, исходя из этой обратной связи.
Дальше вам нужно вместе с интервьюером определить и расставить приоритеты между компонентами архитектуры. Здесь важно подчеркнуть, что каждое интервью отличается от других. Иногда интервьюер может давать понять, что ей интереснее сосредоточиться на высокоуровневом дизайне. Иногда, если это интервью для кандидата уровня senior, обсуждение может перейти в характеристики производительности системы, особенно в узкие места и оценки ресурсов. В большинстве случаев интервьюер захочет, чтобы вы углубились в детали некоторых компонентов системы. Для сервиса сокращения URL интересно углубиться в дизайн хэш-функции, которая преобразует длинный URL в короткий. Для чат-системы интересными темами являются снижение задержки и поддержка статуса онлайн/офлайн.
Управление временем здесь критически важно, потому что очень легко увлечься мельчайшими деталями, которые никак не демонстрируют ваши способности. Вы должны осознанно показывать интервьюеру сильные сигналы. Старайтесь не уходить в ненужные подробности. Например, подробно обсуждать алгоритм EdgeRank для ранжирования ленты Facebook на собеседовании по проектированию систем — неудачная идея: это отнимает драгоценное время и не доказывает ваше умение проектировать масштабируемую систему.
Пример
На этом этапе мы уже обсудили высокоуровневый дизайн системы новостной ленты, и интервьюер доволен вашим предложением. Дальше мы исследуем два самых важных сценария использования:
1. Публикация поста в ленту
2. Получение новостной ленты
На рисунках 3 и 4 показан детальный дизайн для этих двух сценариев использования. Подробно он будет разбираться в главе "Design A News Feed System".

Рисунок 3

Рисунок 4
Шаг 4 — Завершение
На этом финальном этапе интервьюер может задать вам несколько дополнительных вопросов или дать свободу обсудить другие важные моменты. Вот несколько направлений, по которым можно пойти:
-
Интервьюер может попросить вас указать узкие места системы и обсудить возможные улучшения. Никогда не говорите, что ваш дизайн идеален и его невозможно улучшить. Улучшить можно всегда. Это отличная возможность показать критическое мышление и оставить хорошее финальное впечатление.
-
Полезно кратко подвести итог своему дизайну. Это особенно важно, если вы предлагали несколько вариантов решений. Освежить память интервьюера после длинной сессии бывает очень полезно.
-
Интересно поговорить о сценариях ошибок: отказах серверов, потере сети и т. д.
-
Стоит упомянуть и эксплуатационные вопросы. Как вы будете мониторить метрики и логи ошибок? Как будете раскатывать систему?
-
Интересная тема — как справиться со следующим витком роста масштаба. Например, если ваш текущий дизайн поддерживает 1 миллион пользователей, какие изменения понадобятся, чтобы поддерживать 10 миллионов?
-
Предложите другие улучшения, которые вы бы внесли, если бы у вас было больше времени.
В завершение приведем краткий список того, что стоит и чего не стоит делать.
Что стоит делать
-
Всегда просите уточнения. Не считайте, что ваше предположение автоматически верно.
-
Поймите требования задачи.
-
Не существует ни единственно правильного ответа, ни лучшего ответа на все случаи. Решение, подходящее для молодой стартап-компании, отличается от решения для зрелой компании с миллионами пользователей. Убедитесь, что вы понимаете требования.
-
Дайте интервьюеру понять, о чем вы думаете. Общайтесь с ним во время интервью.
-
По возможности предлагайте несколько подходов.
-
После того как вы согласовали с интервьюером общий чертеж решения, переходите к деталям по каждому компоненту. Сначала проектируйте самые критичные компоненты.
-
Проверяйте свои идеи об интервьюера. Хороший интервьюер работает с вами как товарищ по команде.
-
Никогда не сдавайтесь.
Чего не стоит делать
-
Не приходите неподготовленным к типичным вопросам собеседования.
-
Не прыгайте сразу к решению, не уточнив требования и предположения.
-
Не уходите в слишком глубокие детали одного компонента в самом начале. Сначала покажите высокоуровневый дизайн, а уже затем углубляйтесь.
-
Если вы застряли, не стесняйтесь просить подсказку.
-
И снова: общайтесь. Не молчите и не думайте в полной тишине.
-
Не думайте, что интервью заканчивается в тот момент, когда вы показали дизайн. Оно не закончено, пока интервьюер сам не скажет, что все. Просите обратную связь рано и часто.
Распределение времени по шагам
Вопросы на собеседовании по проектированию систем обычно очень широкие, и 45 минут или даже час — это недостаточно, чтобы покрыть весь дизайн целиком. Поэтому управление временем критически важно. Сколько времени стоит тратить на каждый шаг? Ниже приведен очень грубый ориентир по распределению времени для 45-минутной сессии. Помните, что это лишь оценка: реальное распределение времени зависит от масштаба задачи и требований интервьюера.
Шаг 1. Понять задачу и определить рамки дизайна: 3–10 минут
Шаг 2. Предложить высокоуровневый дизайн и согласовать его: 10–15 минут
Шаг 3. Глубокое погружение в дизайн: 10–25 минут
Шаг 4. Завершение: 3–5 минут