Процесс проектирования

Базовый System Design
≈ 2 мин чтения

Проектирование — это последовательность вопросов

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

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

Problem
  ↓
Requirements
  ↓
Constraints and scale
  ↓
High-level design
  ↓
Critical components
  ↓
Check bottlenecks and trade-offs

1. Уточнить границы задачи

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

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

2. Зафиксировать требования и ограничения

Дальше разделяем то, что система делает, и то, как хорошо она должна это делать. В следующих темах мы отдельно разберём функциональные и нефункциональные требования. Здесь важно лишь понимать: именно они становятся критериями, по которым потом оценивается архитектура.

3. Нарисовать минимальную рабочую схему

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

Client → API → Application → Storage

Если схема уже объясняет основной путь запроса, её достаточно для начала. Реплики, очереди, кэши и другие элементы стоит добавлять тогда, когда появляется причина для их появления.

4. Углубиться в критичные места

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

5. Проверить решение на рост и отказ

Последний проход — мысленно «сломать» собственную архитектуру. Что произойдёт, если запросов станет больше? Если один компонент перестанет отвечать? Если данные начнут расти быстрее ожидаемого? Такие вопросы обнаруживают слабые места раньше, чем система попадёт в продакшен.

Сильный System Design начинается не со схемы, а с аргументации. Каждый крупный компонент должен появляться потому, что решает уже сформулированную проблему, а не потому, что «так обычно рисуют».