Методология системного дизайна
Разбор системного дизайна на интервью — это не угадывание правильной архитектуры, а воспроизводимый процесс, который ведут сверху вниз. Сначала выясняют, что система делает и под какой нагрузкой работает, затем считают порядок величины этой нагрузки, после этого фиксируют, какую доступность можно обещать, и только потом рисуют компоненты. Пропустить любой из ранних шагов — значит проектировать наугад: непонятно, что считать, какие компоненты станут критичными и чем оправдать каждое решение.
Главная ловушка темы — начать с конца. Кандидат слышит «спроектируй маркетплейс» и сразу тянет на доску Kafka, шардированный Postgres и распределённый кэш, не выписав ни одной роли пользователя и ни одной цифры нагрузки. В итоге он переусложняет систему под требования, которых нет, тащит технологию, которую не понимает, и пытается показать весь свой кругозор вместо того, чтобы решить заданную задачу. Эта тема разбирает методологию по слоям — от сбора требований до эксплуатационной готовности, — чтобы у ответа был скелет, а не поток сознания.
Карта темы
- Сбор требований — функциональные требования (что система делает: роли, права, поиск, оплата) против нефункциональных (DAU/MAU, рост, размер контента, соотношение чтения и записи, латентность и доступность).
- Оценка нагрузки — расчёт на салфетке: из DAU и действий на пользователя получают средний и пиковый QPS, объём хранилища за год и ширину канала, чтобы определить критичные компоненты и оправдать архитектуру.
- Бюджеты доступности — девятки и их цена в простое за год, разница SLA, SLO и SLI, и почему нельзя обещать больше девяток, чем готов оплатить.
- Выбор стиля API — REST для простого, кэшируемого и внешнего против gRPC для бинарного, типизированного и внутреннего трафика между сервисами, с обоснованием выбора.
- HLD против LLD — высокоуровневый дизайн как коробочки и стрелочки (сервисы, хранилища, очереди, потоки данных) против низкоуровневого (схемы, индексы, сигнатуры API, структуры и алгоритмы).
- Эксплуатационная готовность — бэкапы и протестированное восстановление, версионированные миграции, метрики и распределённая трассировка, без которых дизайн остаётся картинкой.
- Ошибки на интервью — модная технология без понимания, дизайн сверх требований, попытка блеснуть всем сразу, игнор продуктовых метрик и оверинжиниринг.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Сразу рисовать архитектуру, не собрав требования | Проектируешь под несуществующую задачу — решение мимо цели |
| Путать функциональные и нефункциональные требования | Считаешь не ту нагрузку, обещаешь не ту доступность |
| Пропустить оценку нагрузки | Нечем оправдать выбор компонентов и число узлов |
| Считать back-of-envelope ради галочки | Цифры не влияют на дизайн — оценка превращается в ритуал |
| Брать средний QPS вместо пикового | Система ложится в дневной пик, на который её не рассчитали |
| Обещать больше девяток, чем готов оплатить | SLA не выдержан — штрафы и репутационные потери |
| Путать SLA, SLO и SLI | Не понимаешь, что измеряешь и за что отвечаешь контрактом |
| Выбирать REST или gRPC без обоснования | Внешний API на gRPC неудобен клиентам, внутренний на REST теряет в латентности |
| Смешивать HLD и LLD в одном шаге | Тонешь в схемах таблиц до того, как нарисованы сервисы и потоки |
| Не заложить бэкап и восстановление | Бэкап есть, а восстановление не протестировано — данные не вернуть |
| Тянуть технологию, которую не понимаешь | На уточняющих вопросах дизайн рассыпается |
| Проектировать больше, чем нужно по требованиям | Оверинжиниринг — время уходит на то, что задача не просила |
Значение для собеседований
Методология системного дизайна — обязательная senior-тема Go-интервью, и проверяют здесь не каталог технологий, а дисциплину мышления. Интервьюер смотрит, ведёшь ли ты разбор сверху вниз: задаёшь ли уточняющие вопросы и разделяешь ли функциональные требования от нефункциональных, считаешь ли нагрузку вслух и используешь ли эти цифры для выбора компонентов, понимаешь ли цену девяток и разницу SLA/SLO/SLI, обосновываешь ли стиль API и не путаешь ли уровень HLD с уровнем LLD. Сильный кандидат начинает просто и усложняет систему только тогда, когда этого требует конкретное требование.
Что обычно проверяют:
- Как ты собираешь требования и чем функциональные требования отличаются от нефункциональных.
- Как из DAU и действий на пользователя получить средний и пиковый QPS, объём хранилища и ширину канала, и зачем эта оценка нужна.
- Что означают девятки доступности в простое за год и в чём разница SLA, SLO и SLI.
- Когда выбирать REST, а когда gRPC, и как обосновать выбор стиля API.
- Чем высокоуровневый дизайн (HLD) отличается от низкоуровневого (LLD) и в каком порядке их делать.
- Что входит в эксплуатационную готовность — бэкапы с протестированным восстановлением, миграции, метрики и трассировка.
Типичный неверный ответ: сразу начать рисовать коробочки и стрелочки и тянуть модные технологии, не собрав требования и не посчитав нагрузку. Это запускает разбор того, что без функциональных и нефункциональных требований непонятно, что вообще проектируется, что без оценки QPS и объёма хранилища нечем оправдать выбор компонентов, что обещать пять девяток без бюджета на них — это будущий нарушенный SLA, и что показывать весь кругозор вместо решения заданной задачи — самый частый способ провалить системный дизайн.