Что такое system design и как мыслить

System design — это искусство собрать работающую систему из готовых кирпичей и осознанно выбрать между ними.

System design (проектирование систем) — процесс определения архитектуры, компонентов и их взаимодействия так, чтобы система удовлетворяла функциональным и нефункциональным требованиям при заданных ограничениях.

Когда вы пишете функцию, у задачи обычно есть один правильный ответ. В проектировании систем правильного ответа нет — есть только компромиссы (trade-offs). Добавили кэш — ускорили чтение, но получили проблему устаревших данных. Разбили монолит на микросервисы — упростили независимые релизы, но усложнили отладку и сеть. Зрелость инженера измеряется не знанием «модных» технологий, а умением назвать цену каждого решения.

Чем это отличается от алгоритмов

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

АспектАлгоритмыSystem design
Ответодин правильныймножество допустимых, разные компромиссы
Масштабодин процесс, памятьтысячи серверов, сеть, диски
Что оцениваюткорректность и сложностьход мысли, обоснование выбора
Ошибка стоитневерный результатпадение сервиса, потеря данных, деньги

Уровни, на которых мы рассуждаем

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

  • Требования — что система делает (функции) и какой она должна быть (скорость, надёжность).
  • Оценки масштаба — сколько запросов в секунду, сколько данных, какая полоса.
  • Высокоуровневая схема — клиенты, балансировщик, сервисы, хранилища, кэш, очереди.
  • Детали — модель данных, API, шардирование, репликация, кэш-стратегия.
  • Узкие места — где упрётся под нагрузкой и как это лечить.

Базовый словарь

Эти слова будут встречаться постоянно — закрепим их сразу.

ТерминСмысл одним предложением
Клиенттот, кто шлёт запрос: браузер, мобильное приложение, другой сервис.
Сервер / сервиспроцесс, который обрабатывает запросы и возвращает ответ.
Latency (задержка)сколько ждёт один запрос от отправки до ответа.
Throughput (пропускная способность)сколько запросов система обрабатывает в секунду.
Availability (доступность)доля времени, когда система отвечает корректно.

Главное правило

Не бросайтесь рисовать «крутую» архитектуру с Kafka и десятью микросервисами на первой минуте. Сложность — это всегда расход: на разработку, на эксплуатацию, на отладку. Хороший инженер добавляет компонент только тогда, когда у него есть конкретная причина: цифра нагрузки, требование к задержке, риск отказа. «Самое простое решение, которое держит нагрузку» — почти всегда лучший ответ.

Итог

  • System design — это про компромиссы, а не про единственно верный ответ.
  • Идём сверху вниз: требования → оценки → схема → детали → узкие места.
  • Сложность бесплатной не бывает; добавляйте компонент только под конкретную причину.
Проверьте себя
1. Чем задача по проектированию систем принципиально отличается от алгоритмической?
AВ ней всегда один правильный ответ
BВ ней нет единственно верного ответа — есть компромиссы между решениями
CОна проверяет только скорость набора кода
DВ ней не нужно думать о данных
2. Что разумнее сделать в первую очередь, услышав задачу «спроектируйте систему»?
AСразу нарисовать архитектуру с Kafka и микросервисами
BУточнить требования и грубо оценить масштаб
CВыбрать модную базу данных
DНачать писать код эндпоинтов
3. Почему «добавить кэш» — это компромисс, а не бесплатное улучшение?
AКэш всегда замедляет систему
BКэш ускоряет чтение, но порождает проблему устаревших данных и усложняет систему
CКэш невозможно настроить
DКэш работает только в монолите
Поддержать проект