Как успешно пройти следующее собеседование по системному дизайну

Интервью по системному проектированию обычно являются частью процесса собеседования для инженеров-программистов старшего уровня и выше. Эти интервью представляют собой открытые дискуссии, в которых кандидата просят разработать что-то, обычно популярный продукт или услугу. Например, вас могут попросить разработать дизайн для Twitter, YouTube или Google Docs.

Конечно, 30–60 минут недостаточно для разработки любой из этих систем. Настоящие продукты создавались в течение многих лет тысячами разработчиков, работающих полный рабочий день.

Итак, что вы на самом деле должны делать во время собеседования по проектированию системы? Мы можем разбить его на четыре этапа:

  1. Задавайте вопросы и определяйте масштаб
  2. Создайте дизайн высокого уровня
  3. Сделайте глубокое погружение в несколько компонентов
  4. Подведение итогов и обсуждение дальнейших улучшений

Рассмотрим каждый из них ниже.

Задавайте вопросы и определяйте масштаб

Самая большая ошибка, которую вы можете совершить во время собеседования по проектированию системы, — это сразу перейти к проектированию, не задав вопросов. Поскольку вопросы на собеседовании по проектированию системы намеренно расплывчаты, вам следует сотрудничать со своим интервьюером, чтобы определить область проектирования и проверить любые предположения, которые у вас могут быть.

Скорее всего, вы захотите задать некоторые или все из следующих вопросов:

  • Какие функции наиболее важны? (Например, разработка Twitter — это немалый подвиг, поэтому интервьюер может попросить вас сосредоточиться только на новостной ленте.)
  • Сколько активных пользователей в день? (Важно знать, является ли это продуктом версии 1 для крошечного стартапа или давно зарекомендовавшим себя продуктом с миллионами пользователей.)
  • Могу ли я использовать существующие облачные провайдеры, такие как AWS, GCP или Azure? (Иногда они хотят, чтобы вы создали что-то с нуля, но в большинстве случаев вполне приемлемо сказать, что вы будете использовать существующую инфраструктуру, например балансировщик нагрузки (ELB), группы автоматического масштабирования, хранилище документов (S3), очереди сообщений (SQS), кэш (Redis) или CDN (CloudFront).
  • С какими типами данных мы имеем дело? (Полезно знать, работаете ли вы просто с текстом или храните изображения или видео как часть своего сервиса. Тип данных и структура данных вероятно, повлияет на ваш выбор базы данных.)
  • Нужно ли нам принимать во внимание [X]? (Начало собеседования посвящено установлению объема, поэтому спросите интервьюера о различных проблемах, которые следует учитывать в рамках или за рамками. Часто они позвольте вам придерживаться более простого подхода для начала, а затем решать более сложные проблемы ближе к концу интервью, если есть время.)
  • Могу ли я предположить, что [X]? (Сообщите интервьюеру о своих предположениях. Это гарантирует, что вы оба находитесь на одной волне. Интервьюер также может дать вам дополнительные разъяснения на основе ваших предыдущие предположения.)

Как только вы почувствуете, что у вас есть достаточное понимание проблемы, вы можете перейти к высокоуровневому дизайну.

Создайте дизайн высокого уровня

На этом втором этапе вы должны работать с вашим интервьюером, чтобы разработать систему на высоком уровне. Пока не погружайтесь слишком глубоко в один компонент. Вместо этого придерживайтесь общего обзора того, как будет работать система. В настоящее время нет необходимости вникать в схему вашей базы данных или в то, какие конечные точки API вы бы реализовали.

Оставаясь на высоком уровне для начала, вы можете проверить свои идеи с вашим интервьюером. Вы можете обмениваться идеями со своим интервьюером и получать их комментарии. Во время собеседования по проектированию системы вы должны относиться к интервьюеру как к соавтору или коллеге. В конце концов, вы, вероятно, будете работать с ними, если получите работу.

Важно помнить, что, несмотря на то, что это интервью касается ваших навыков технического дизайна, оно также касается ваших коммуникативных навыков.

Можете ли вы объяснить, почему вы предпочитаете один тип базы данных другому? Можете ли вы объяснить, как вы делаете свое приложение масштабируемым? Можете ли вы обсудить компромиссы в теореме CAP, когда речь идет о согласованности, доступности и устойчивости к разделам? Думали ли вы о том, как будете справляться с системными сбоями? И когда ваш интервьюер дает вам обратную связь или просит рассмотреть другой подход, хорошо ли вы отвечаете? Хороший интервьюер будет искать все эти сигналы на протяжении всего интервью.

К концу этого шага у вас должна быть система, которую вы и интервьюер согласовали.

Сделайте глубокое погружение в несколько компонентов

Теперь пришло время углубиться. Опять же, система, которую вы разрабатываете, скорее всего, является копией популярного продукта, поэтому невозможно охватить все за короткий промежуток времени, который у вас есть во время собеседования. Это хорошая идея, чтобы спросить вашего интервьюера, на чем он хотел бы сосредоточиться в следующий раз. Или предложите несколько областей, которые вы хотели бы обсудить более подробно.

Например, при разработке Google Docs, как бы вы справлялись с конфликтами, когда несколько человек редактируют один и тот же документ одновременно?

Или, при создании YouTube, как реализация очереди сообщений поможет отделить компоненты вашей системы, когда пользователи загружают новые видео?

У вас уже есть высокоуровневый проект, поэтому именно в этой части интервью вы можете продемонстрировать глубину своих знаний о том, как работает инфраструктура.

Подведение итогов и обсуждение дальнейших улучшений

В последней части интервью вы можете обсудить дальнейшие оптимизации, которые вы бы сделали, если бы у вас было больше времени. Вы можете обсудить, как вы будете справляться с различными пограничными случаями, какими-либо узкими местами производительности в вашем дизайне или как вы будете масштабировать систему дальше по мере роста приложения.

Это прекрасное время, чтобы продемонстрировать свою внимательность.

Заключение

Вот эти четыре шага для собеседования по проектированию системы:

  1. Задавайте вопросы и определяйте масштаб
  2. Создайте дизайн высокого уровня
  3. Сделайте глубокое погружение в несколько компонентов
  4. Подведение итогов и обсуждение дальнейших улучшений

Следование этому шаблону во время собеседования поможет вам не сбиться с пути и не заблудиться. Теперь удачи на вашем следующем интервью!

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Больше контента в публикации Level Up Coding.
Подписывайтесь: Twitter, LinkedIn, Информационный бюллетень
Level Up меняет рекрутинг в сфере технологий ➡️ Присоединяйтесь к нашему коллективу талантов