Как подготовиться к сложному собеседованию по system design?

Бесплатное пошаговое руководство. Время чтения — 12 минут
ex-Team Lead в Яндекс
Владимир Балун

руководство для тех, кто:

  • готовится к собеседованию по System Design и хочет улучшить свои навыки в проектировании систем;
  • недавно провалил собеседование по проектированию большой системы;
  • посмотрел видео по System Design на YouTube и ничего не понял;
  • давно работает и кому тяжело демонстрировать свои знания и навыки в условиях ограниченного времени, которое выделяется на собеседование.

Читай шаг за шагом или сразу переходи к интересующему разделу по якорной ссылке. Главное помни: это руководство не сделает тебя экспертом, но поможет подготовиться к сложному собеседованию по System Design и чувствовать себя увереннее

Автор — владимир балун, ex-team lead в яндекс

руководил разработкой системы трейсинга (11ГБ/с трафик)
Yandex
разрабатывал системы трейсинга и непрерывного профилирования
Ozon
разрабатывал движок по подбору таргетированной рекламы
Tinkoff
разрабатывал Kaspersky Endpoint Security
Kaspersky Lab
поддерживал ICQ и разрабатывал My Teams
Mail.ru
руководил курсом Golang Developer.Professional
OTUS
Saint HighLoad++, GolangConf, CodeFest, Стачка и E-CODE
Спикер конференций
Откроется после 6-ой главы
Содержание

1) Зачем нужно собеседование по System Design

Проектирование системы — один из этапов в процессе найма backend-разработчиков. Оно предназначено для проверки hard skills:

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

Кроме того, собеседования по System Design (проектированию ИТ-систем) популярны у работодателей, потому что на них легко проверить твои навыки общения и оценить умение решать реальные задачи в условиях неопределенности.

Опытный разработчик может сказать:
«В мире много платных и бесплатных решений, из которых я могу собрать систему, как из деталей конструктора. Если мне нужна база данных, я возьму PostgreSQL и буду хранить свои данные в нем, а сервис реализую на популярном фреймворке для написания HTTP сервисов моего любимого языка программирования»
И это будет отличным решением, если ты собрался писать сервис для небольшой аудитории, но сервисы большой компании сложнее устроены и намного сильнее нагружены.

Если рассматривать Google, Яндекс, VK, Тинькофф и других, то у них все используемые решения очень быстро перестают помещаться на один сервер, а учитывая требования высокой доступности, обязательно располагаются в нескольких локациях. И, как только система становится распределенной, сложность ее архитектуры и реализации на порядок увеличивается. System Design собеседование проверяет твои навыки по проектированию и работе с подобными системами.

Многие боятся таких собеседований. Вопросы на них могут быть расплывчатыми и слишком общими.
Например: «Спроектируйте общеизвестный сервис X»
Отсутствие энтузиазма у кандидата вполне объяснимо. В конце концов, кому под силу в течение часа спроектировать популярный сервис, над которым работали сотни или тысячи инженеров?

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

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

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

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

Представь себя на месте интервьюера и попробуй понять: что он пытается узнать во время собеседования по проектированию той или иной системы?

Интервьюер хочет увидеть, что ты:
  • корректно и просто выражаешь свои мысли
  • знаешь и понимаешь системные требования и ограничения
  • можешь отстаивать свои технические решения (как во время разговоров с коллегами на работе)
  • имеешь навыки и опыт проектирования больших высоконагруженных систем

Хороший интервьюер также ищет отрицательные признаки. Чрезмерно усложненные архитектурные решения — болезнь инженеров, которые восхищаются чистотой архитектуры и не желают идти на компромиссы. Они зачастую не догадываются о тех расходах, которые влекут за собой переусложненные системы, и многим компаниям это неведение дорого обходится. Эту склонность явно не стоит демонстрировать. Среди других нежелательных качеств можно выделить узкий кругозор и упрямство:)

2) кому предлагают пройти собеседование по System Design

Секция по System Design проводится только для backend-разработчиков

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

Важно понимать, что от компании к компании может все сильно различаться. Например, в Тинькофф и Яндексе собеседование по System Design мидлам раньше не давали. Обычно его проводили тем, кто претендует на роль сеньора и выше
В большинстве случаев, если тебе предлагают пройти собеседование, ты претендуешь на позицию, как минимум, старшего специалиста

3) как пройти интервью по проектированию ИТ-систем

Собеседование по System Design может быть абсолютно разным от компании к компании. Тебя могут ждать:

  • Проектирование популярного сервиса с нуля
  • Проектирование новой функциональности для существующего сервиса
  • Рассказ об архитектуре твоего проекта (тебе придется рассказать архитектуру с прошлого месте работа и подумать, что было сделано плохо, что можно улучшить и как). Если архитектура с прошлого места под NDA, то тебя могут попросить изобразить архитектуру мечты твоего прошлого проекта, учитывая все боли и проблемы
Часто тема System Design интервью оказывается связана с твоей предметной областью или предметной областью компании, в которую ты устраиваешься.

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

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

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

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

Тем не менее, у всех интервью по проектированию IT-систем есть общие черты. Рассмотрим основные этапы стандартного сценария, поскольку правильная стратегия и знания являются ключевыми факторами, чтобы успешно пройти собеседование:

  • Сбор и формализация требований (5-10 минут)
  • Приблизительная оценка нагрузки (5 минут)
  • Проектирование API для будущей системы (5 минут)
  • Проектирование высокоуровневой архитектуры и модели данных (20-30 минут)
  • Обсуждение отказоустойчивости и масштабируемости архитектуры (5 минут)
  • Расчет необходимых ресурсов (железа) для будущей системы (5-10 минут — требуется не везде)
Не думай как программист, думай как технический руководитель

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

1. Собери и формализуй требования

Вероятно, ты сталкивался на работе с непонятными ТЗ и требованиями, которые приходилось формализовывать. Здесь так же. Интервьюер не ждет, что ты сразу же начнешь проектировать систему, потому что нельзя сделать то, не знаю что. Это проверка в том числе soft skills и тебе нужно начать диалог, чтобы выяснить, что именно предстоит проектировать

Представь, что тебя попросили разработать «сервис обмена фотографиями» с некоторыми минимально определенными возможностями. Можно сразу начать проектировать что-то вроде Instagram, исходя из предположения, что все изображения будут относительно небольшими, не будут рассматриваться подробно, и что приемлемо значительное сжатие для экономии памяти и пропускной способности. Но интервьюер не сказал ни слова о проектировании Instagram, а кроме него существует множество различных типов сервисов обмена фотографиями. Например, Flickr или 500px — сервисы для фотографов, чтобы демонстрировать работы в высоком разрешении.

В жизни решения, связанные с проектированием, часто происходят в условиях нехватки данных. Конечно, важны метрики проекта для его правильного развития и, конечно, аналитики и менеджеры продукта постараются обеспечить тебя наиболее полной информацией. Но и этого может быть мало.
Если вводных данных недостаточно, можно и нужно выдвигать обоснованные гипотезы на основе той информации, которая уже известна
Сначала тебе нужно определить функциональные требования, т.е. какие функции будут доступны пользователю. Например, будут ли в системе оповещения о пропущенных звонках или поиск товаров по названиям. Здесь очень важно задавать правильные вопросы и уточнять, что входит в задачу, чтобы не тратить время на неважные детали. В конце нужно сделать приоритизацию функциональных требований, чтобы на следующих этапах понимать, чему уделять больше внимания, а чему меньше.
Не трать много времени на сбор функциональных требований. Твоя задача — формализовать основную функциональность.

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

1) Количество пользователей
  • Вопрос:
    Какое количество пользователей (DAU / MAU) ожидается в будущем приложении, а также, как оно будет расти?
    Ответ:
    50 000 DAU
2) Поведение пользователей
  • Вопрос:
    Сколько в среднем один пользователь будет создавать запросов к будущему приложению в день?
    Ответ:
    Один пользователь в среднем будет делать 12 запросов в день к приложению
3) Регионы использования приложения
  • Вопрос:
    На аудиторию каких регионов/стран будет запущено будущее приложение?
    Ответ:
    Только на СНГ
4) Сезонности в приложении
  • Вопрос:
    Будут ли сезонности, когда приложением в определенный период будут пользоваться большое количество пользователей?
    Ответ:
    Да, сезоны осенних и предновогодних распродаж
5) Условия хранения данных
  • Вопрос:
    Данные храним всегда или можно удалять/агрегировать какие-либо данные спустя какое-либо время?
    Ответ:
    Храним всегда
6) Лимиты и ограничения
  • Вопрос:
    Если делаем подписки, то какое максимальное количество подписчиков может быть у пользователя?
    Ответ:
    1 000 000 подписчиков
7) Временные ограничения
  • Вопрос:
    За сколько письмо должно успевать доходить до адресата?
    Ответ:
    Не более, чем за 5 секунд
8) Доступность приложения
  • Вопрос:
    Сколько по времени приложение может быть недоступно за год?
    Ответ:
    Не более чем несколько часов простоя в год
В конце также определи сравнительную важность нефункциональных требований между собой. Так ты поймешь, чему уделять больше внимания, а чему меньше.

2. Приблизительно оцени нагрузку

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

Твоя задача — понять порядок и характер нагрузки, а потом рассказать об этом интервьюеру. В контексте нагрузки, чаще всего требуется:

Регистрация занимает <1 минуты

Зарегистрируйся на платформе, чтобы продолжить

Задачи, которые встречаются чаще всего + материалы для подготовки

Продолжение + 16 типичных ошибок и советы по подготовке

После регистрации откроются:

2 урока по System Design: теория партиционирования и шардирования

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

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

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

На собеседовании ты должен показать не только знания, но и практику. Работают реальные кейсы: например, создание сервиса с высокой нагрузкой или проектирование системы хранения информации. Важно уметь оценить требования, предложить несколько вариантов реализации и объяснить их плюсы и минусы.

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

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

Партиционирование

Виды и способы + сценарии использования