System Design Space
Граф знанийНастройки

Обновлено: 16 апреля 2026 г. в 07:34

Software Architecture: The Hard Parts (краткий обзор)

сложный

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

На практике она собирает в одну рамку декомпозицию монолита, границы владения данными, распределённые транзакции, паттерн Saga, оркестрацию, хореографию и эволюцию контрактов. Благодаря этому удобно обсуждать не только желаемую форму системы, но и цену перехода к ней, риски консистентности и влияние выбора на команды.

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

Практическая польза главы

Сложные компромиссы

Помогает осознанно работать с проблемами распределенных данных, транзакционности и консистентности.

Выбор паттерна

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

Управление рисками

Добавляет практику оценки сценариев отказа до внедрения архитектурного решения в рабочую систему.

Сложный режим интервью

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

Источник

Обзор книги

Детальный разбор книги в блоге tellmeabout.tech

Читать оригинал

Software Architecture: The Hard Parts (Современный подход к программной архитектуре: сложные компромиссы)

Авторы: Neal Ford, Mark Richards, Pramod Sadalage, Zhamak Dehghani
Издательство: O'Reilly Media, 2021
Объём: 462 страниц

Декомпозиция монолита, архитектурные кванты, разделение данных, саги и эволюция контрактов в распределённых системах.

Оригинал
Перевод

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

В центре главы находятся , , , , и . Через них книга связывает декомпозицию монолита, , и с реальными ограничениями системы.

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

Как устроена книга

Книга разделена на две части. Первая отвечает за границы сервисов и архитектурные единицы изменения, вторая за данные, транзакции и координацию распределённого процесса.

Часть I: Декомпозиция

Как разделять монолит, определять границы сервисов и выбирать единицу независимого развёртывания.

Часть II: Данные и транзакции

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

Разбор

Часть I: Декомпозиция

Детальный разбор первой части книги

Читать разбор

Часть I: Декомпозиция

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

Архитектурный квант (Architectural Quantum)

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

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

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

Паттерны декомпозиции

Тактические паттерны
Разделение по компонентам
Смотрим на компоненты и их связи, чтобы понять естественные границы будущих сервисов.
Тактическое ответвление
Копируем часть монолита и постепенно убираем из неё всё лишнее.
Strangler Fig
Постепенно заменяем части монолита новыми сервисами, не переписывая всё сразу.
Parallel Run
Запускаем старую и новую реализацию параллельно, чтобы проверить корректность перехода.
Драйверы декомпозиции
Входящая связанность (afferent coupling)
Показывает, сколько других компонентов зависит от этого элемента.
Исходящая связанность (efferent coupling)
Показывает, от скольких компонентов зависит сам элемент.
Изменчивость компонента
Помогает понять, как часто компонент меняется и стоит ли отделять его раньше.
Устойчивость к отказам
Подсказывает, какие части системы нужно лучше изолировать друг от друга.

Разбор

Часть II: Данные и транзакции

Разбор второй части книги: разделение данных и распределённые транзакции

Читать разбор

Часть II: Данные и транзакции

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

Драйверы разделения данных

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

Разбор

Распределённые транзакции

Разбор распределённых транзакций и паттерна Saga

Читать разбор

Распределённые транзакции: саги

Оркестрация саги

Центральный координатор явно управляет шагами процесса.

+Логика процесса собрана в одном месте.
+Проще обрабатывать ошибки и откаты.
Появляется единая точка отказа.
Растёт связанность с координатором.
Хореография саги

Сервисы реагируют на события друг друга без общего координатора.

+Нет центральной точки отказа.
+Связанность между сервисами ниже.
Труднее увидеть весь ход процесса.
Сложнее разбирать ошибки и компенсации.

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

Разбор

Управление состоянием саг

Разбор паттернов управления состоянием саг

Читать разбор

Управление состоянием саг

Epic Saga (синхронный вариант)

Все сервисы вызываются синхронно. Подход проще в понимании, но повышает связанность и задержку.

Phone Tag (асинхронная цепочка)

Асинхронные вызовы идут от сервиса к сервису. Связанность ниже, но наблюдать за всем процессом и отлаживать его сложнее.

Fairy Tale (событийный вариант)

Полностью событийная модель. Она сильнее ослабляет связанность, но заметно усложняет отладку и понимание потока событий.

Разбор

Контракты и связанность

Разбор контрактов и связанных с ними зависимостей между сервисами

Читать разбор

Контракты и связанность сервисов

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

Типы контрактов

Жёсткие контракты
Явная схема и версионирование. Несовместимые изменения видны сразу.
Гибкие контракты
Паттерн tolerant reader и игнорирование неизвестных полей помогают переживать изменения схемы.
Контракты, определяемые потребителем
Потребитель фиксирует нужный ему контракт и проверяет его через Pact.

Виды связанности

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

Как использовать книгу на интервью по системному дизайну

Что использовать в ответе

  • Архитектурный квант: объясняйте границы развёртывания, изменений и внутренних зависимостей.
  • Паттерн Saga: показывайте понимание распределённых транзакций и компенсирующих действий.
  • Оркестрация и хореография: обосновывайте выбор через сложность процесса, связанность и наблюдаемость.
  • Владение данными: чётко определяйте сервис, который отвечает за запись, модель данных и правила консистентности.

Частые ошибки

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

Книга

Fundamentals of Software Architecture

Рекомендуется прочитать перед этой книгой

Читать обзор

Вывод

10/10
Практичность
9/10
Глубина
10/10
Для интервью

Software Architecture: The Hard Parts обязательна для тех, кто проектирует микросервисы или готовится к сложным архитектурным раундам. Книга даёт практический язык для разговора о декомпозиции, владении данными, сагах и цене компромиссов. Лучше читать её после Fundamentals of Software Architecture.

Связанные главы

Где найти книгу

Чтобы отмечать прохождение, включи трекинг в Настройки