Общий workflow для System Design

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

1. Понять задачу и её границы

Перед обсуждением архитектуры нужно понять, для кого и зачем создаётся система.

  • Определить заинтересованные стороны и их приоритеты. При необходимости составить RACI-матрицу.
  • Понять бизнес-цели и причины создания проекта.
  • Определить конечных пользователей и основные способы использования системы.
  • Собрать функциональные требования.
  • Определить внешние зависимости.
  • Предложить дополнительные полезные функции.
  • Явно исключить требования и сценарии, которые не входят в scope.

2. Уточнить приоритеты и итерации

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

  • Что обязательно должно войти в первую итерацию?
  • Что можно отложить на следующие итерации?
  • Какие функции имеют наивысший приоритет?
  • Как выглядит минимально полезная версия системы?
  • Какие сценарии пока осознанно не поддерживаем?
  • Какие ограничения первой итерации допустимы?
  • По каким критериям поймём, что первая итерация успешна?

Результатом должен стать явно зафиксированный scope первой итерации и примерное разбиение дальнейшего развития системы на этапы:

Все требования
      ↓
Приоритеты
      ↓
Scope первой итерации / MVP
      ↓
Допустимые ограничения
      ↓
Следующие итерации

3. Определить ограничения и нефункциональные требования

Нужно зафиксировать ожидаемый масштаб и требования к качеству системы.

  • Количество пользователей сейчас и ожидаемый рост через год и несколько лет.
  • Среднее и пиковое количество запросов в секунду или месяц.
  • Соотношение операций чтения и записи.
  • Требования ко времени ответа.
  • Текущий и прогнозируемый объём базы данных.
  • Текущий и прогнозируемый объём файлового или объектного хранилища.
  • Требования к безопасности и приватности.
  • Допустимое время простоя, SLA, RTO и RPO.
  • Когда система или первая версия должна быть запущена? Это жёсткий deadline или желательный срок?
  • Есть ли промежуточные этапы и обязательные даты?
  • Каковы размер, опыт и доступность команды?
  • Каковы ограничения по бюджету разработки и эксплуатации?
  • Есть ли обязательный или запрещённый технологический стек?
  • Какие технологии уже используются и поддерживаются внутри компании?
  • Ограничения заказчика: legacy-системы, проприетарное ПО, регуляторные требования и существующая инфраструктура.

4. Выделить архитектурно значимые требования

Из функциональных и нефункциональных требований нужно выделить те, которые сильнее всего влияют на архитектуру — Architecture Significant Requirements (ASR).

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

5. Сделать высокоуровневый дизайн

  • Выбрать архитектурные представления с учётом аудитории: C4, 4+1 или другой подходящий формат.
  • Выбрать архитектурный стиль: монолит, модульный монолит, микросервисы, event-driven architecture и так далее.
  • Выбрать между облачной, on-premise или гибридной инфраструктурой.
  • Определить основные компоненты системы и их зоны ответственности.
  • Выбрать конкретные технологии для компонентов, исходя из требований, ограничений, компетенций команды и стоимости эксплуатации.
  • Объяснить ключевые технологические решения и рассмотренные альтернативы.
  • Определить внешние и внутренние API, а также способы взаимодействия компонентов.
  • Продумать аутентификацию, авторизацию и защиту персональных данных.
  • Определить необходимые правила безопасности и протоколы.
  • Продумать инфраструктуру: балансировку нагрузки, очереди и брокеры сообщений.
  • Набросать ключевые алгоритмы, если они определяют работу системы.
  • Найти возможные узкие места и способы их устранения.
  • Выбрать типы хранилищ: SQL, NoSQL, object storage, search engine и другие.
  • Определить, какие данные кешировать и как кеш повлияет на производительность, безопасность и доступность.
  • Продумать мониторинг, логирование, трассировку, аналитику и автоматическое восстановление после сбоев.
  • Разделить публичные и закрытые части системы.

6. Сверить решение с требованиями

В конце нужно проверить, что предложенная архитектура:

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