Анализ трейдоффов
ATAM-lite: sensitivity points, tradeoff points, риски — словарь для рассуждений о конкурирующих -ilities под реальными ограничениями. Закрывающий синтез: каждый паттерн — это ответ на трейдофф, нет лучшей архитектуры, есть только fit-for-forces.
B2B биллинговая платформа работала на event-sourced агрегате заказов два года. Архитектурный ревью-борд получил запрос: «Нам нужно право на удаление по GDPR для данных клиентов. Клиент может запросить удаление всей своей персональной информации в течение 30 дней».
Инженер, построивший event store, сказал: «Это невозможно. Весь смысл event sourcing в том, что журнал неизменяем. События заказов содержат имя клиента, адрес и платёжные данные. Мы не можем их удалить, не переписывая историю».
Юрист ответил: «Невозможно — не вариант. Статья 17 GDPR не опциональна».
Комната зашла в тупик. Оба были правы. Команда приняла ряд индивидуально разумных архитектурных решений — event sourcing для аудируемости, неизменяемый журнал для надёжности, богатые события для воспроизведения — и совокупность этих решений сделала обязательное юридическое требование структурно невыполнимым без дорогостоящей миграции.
Проблема была не в том, что event sourcing был неправильным выбором. Проблема была в том, что команда никогда не анализировала, какие quality attributes решение об event sourcing улучшает, какие ухудшает и какие риски вводит — включая риск применимости регулирования «права на удаление». Они приняли решение, исходя из его преимуществ, и обнаружили его стоимость в продакшне, под юридическим давлением, два года спустя.
Это режим отказа, для предотвращения которого существует анализ трейдоффов.
Словарь ATAM: sensitivity points, tradeoff points, риски
Architecture Tradeoff Analysis Method (ATAM) разработан в Software Engineering Institute (SEI) Университета Карнеги-Меллон. Полный процесс ATAM тяжеловесен — несколько дней структурированных воркшопов. Но вводимый им словарь легковесен и немедленно полезен для повседневных архитектурных рассуждений.
Три концепции важны:
Sensitivity point (точка чувствительности): проектное решение, оказывающее сильный эффект на одну quality attribute. Его изменение значительно улучшает или ухудшает эту характеристику, тогда как другие атрибуты относительно не затрагиваются. Пример: партиционирование таблицы событий заказов по customer ID значительно улучшает задержку запросов на отчёты по клиентам, с минимальным эффектом на пропускную способность записи или согласованность данных. Решение чувствительно к задержке.
Tradeoff point (точка трейдоффа): проектное решение, влияющее на несколько quality attributes в противоположных направлениях. Улучшение одной атрибуты ухудшает другую. Пример: event sourcing улучшает аудируемость и возможности темпоральных запросов — но ухудшает модифицируемость (неизменяемый журнал усложняет удаление по GDPR) и операционную простоту (перестройка проекций, управление снэпшотами). Решение — это tradeoff между аудируемостью и модифицируемостью.
Риск: архитектурное решение, которое может привести к тому, что quality attribute не достигнет требуемого уровня в каком-то будущем, правдоподобном, но ещё не реализованном сценарии. Пример: использование журнала событий как источника истины для PII клиентов — это риск, если к системе применяется регулирование права на удаление.
Словарь делает рассуждения точными: вместо «эта архитектура хороша» или «эта архитектура рискована» можно сказать «это решение — tradeoff point между аудируемостью и модифицируемостью — мы принимаем ухудшенную модифицируемость в обмен на аудируемость и должны явно миtigировать риск GDPR».
Применение ATAM-lite к биллинговой платформе
Команда биллинговой платформы, применяя словарь ATAM ретроспективно к решению об event sourcing, получила бы:
Quality attributes в области: аудируемость, задержка, модифицируемость, операционная простота, соответствие регулированию.
Решение: хранить агрегат заказов как журнал событий; состояние заказа восстанавливается воспроизведением событий.
Sensitivity point: производительность воспроизведения чувствительна к объёму журнала событий. По мере роста журнала время холодного старта воспроизведения растёт пропорционально.
Tradeoff point: неизменяемость журнала событий обменивает модифицируемость на аудируемость. Каждое событие сохраняется постоянно — это актив для аудиторских следов и обязательство для требований удаления данных. То же свойство, которое делает систему отличным аудитовым журналом, делает её плохо подходящей для систем, подпадающих под регулирование права на удаление.
Риск: если к этой системе применяется регулирование права на удаление, неизменяемый журнал событий сделает соответствие структурно сложным. Риск правдоподобен (GDPR вступил в силу в 2018 году; платформа работает в ЕС) и не смягчён на момент принятия решения.
Документирование этого на момент принятия решения — в ADR для event sourcing — не предотвратило бы проблему GDPR. Но сделало бы трейдофф явным, вынудило бы команду рассмотреть варианты смягчения на этапе проектирования, когда они дешёвы, и дало бы инженеру и юристу общий фрейм для разговора два года спустя.
▸Why this works
Почему важно называть трейдофф, если команда всё равно сталкивается с той же проблемой? Потому что называние меняет временную шкалу и опции. Tradeoff point, выявленный на этапе проектирования, имеет варианты смягчения: шифровать PII-поля и удалять ключ (crypto-shredding), хранить PII в отдельном изменяемом хранилище и ссылаться на него по ID в событиях, проектировать события содержащими только неличные данные заказа. Tradeoff point, обнаруженный в продакшне под юридическим давлением, имеет один вариант: дорогостоящая миграция в условиях дедлайна. Ценность анализа трейдоффов — не в предотвращении трейдоффов; это в обнаружении их на этапе проектирования, когда стоимость их устранения минимальна.
Команда биллинговой платформы оценивает два варианта кросс-модульного взаимодействия: (A) синхронные REST-вызовы между модулями, (B) доменные события на внутрипроцессной шине. Инженер говорит: «Вариант A проще, вариант B более decoupled». Старший инженер отвечает: «Этот фрейм скрывает tradeoff point — позвольте быть точнее». Как выглядит точный фрейм ATAM?
Трек как инструментарий трейдоффов
Каждый раздел этого трека вводил структурный паттерн. Каждый паттерн — ответ на трейдофф. Оглядываясь назад:
Раздел 01 — Coupling и cohesion: фундаментальные силы. Каждое структурное решение обменивает зацепление (насколько модули знают друг о друге) на связность (насколько сфокусирован каждый модуль). Высокое зацепление обеспечивает разделяемое состояние и низкую задержку ценой независимой эволюции.
Раздел 02 — Направление зависимостей: стабильные абстракции (интерфейсы, порты) улучшают модифицируемость, позволяя конкретным реализациям меняться, не затрагивая вызывающих — ценой косвенности и абстракционных накладных расходов. DIP — это tradeoff point между модифицируемостью и простотой.
Раздел 03 — Слоевая архитектура: N-tier слоение улучшает разделение ответственностей и тестируемость — но строгая граница слоёв создаёт ловушку transaction-script и fat service layer. Анемичные доменные модели обменивают богатство на простоту.
Раздел 04 — Hexagonal: ports and adapters улучшают тестируемость (домен тестируем без инфраструктуры) и модифицируемость (инфраструктура заменяема) ценой структурных накладных расходов.
Раздел 05 — Clean/Onion: концентрическое правило зависимостей максимизирует изоляцию домена — ценой шаблонного кода use cases и «налога чистой архитектуры».
Раздел 06 — DDD: bounded contexts применяют языковые и модельные границы — улучшая точность модели и автономию команды ценой интеграционных накладных расходов (context maps, ACL, слои трансляции).
Раздел 07 — CQRS: разделение моделей чтения и записи улучшает масштабируемость чтения и ясность записи ценой сложности синхронизации. Модель чтения может быть устаревшей.
Раздел 08 — Event sourcing: неизменяемый журнал событий улучшает аудируемость и обеспечивает темпоральные запросы — ценой модифицируемости (GDPR), операционной сложности (проекции, снэпшоты) и eventual consistency. Как узнала биллинговая платформа.
Раздел 09 — Event-driven: хореография улучшает развязку и устойчивость ценой распределённой трейсируемости и согласованности. Оркестрация улучшает наблюдаемость и согласованность ценой зацепления центрального координатора. Саги обменивают согласованность на доступность.
Раздел 10 — Decomposition: modular monolith обменивает независимость деплоя на операционную простоту. Микросервисы обменивают операционную простоту на независимость деплоя и автономию команды. Distributed monolith — режим отказа при неправильном сочетании обоих.
Раздел 11 — Evolution: ADR’ы делают ПОЧЕМУ явным; fitness functions применяют, что структурные свойства выполняются. Оба — инвестиции в долгосрочную модифицируемость ценой краткосрочных накладных расходов.
Ни один из этих паттернов не является универсально правильным. Каждый — ответ на конкретный набор сил. Силы — это ограничение: размер команды, сложность домена, регуляторная среда, требования к производительности, организационная структура, скорость изменений. Паттерн — это ответ.
Стартап строит начальную версию B2B биллинговой платформы. CTO предлагает: «Нам стоит использовать полный DDD с bounded contexts, CQRS для агрегатов заказов и биллинга, event sourcing для аудируемости и modular monolith с принудительными границами с первого дня». Старший инженер отвечает: «Это слишком много архитектуры для наших текущих сил». Используя словарь трейдоффов из этого урока, в чём конкретный аргумент?
Мета-принцип: fitness for forces, а не универсальные best practices
Раздел 00 ввёл фрейм: нет лучшей архитектуры, есть только fit-for-forces. Это закрывающий тезис трека.
Каждый паттерн в этом треке имеет контекст, в котором он — правильный ответ, и контекст, в котором он — неправильный. Силы, делающие hexagonal architecture правильной для domain-heavy приложения (тестируемость, независимость от инфраструктуры, долгосрочная модифицируемость), отсутствуют в простом CRUD-сервисе. Силы, делающие event sourcing правильным для аудит-критичной финансовой системы (неизменяемая история, темпоральные запросы, соответствие регулированию), — это в точности силы, делающие его неправильным для потребительского приложения, подпадающего под право на удаление, где модифицируемость персональных данных — жёсткое требование.
Задача архитектора — не применить наиболее сложный доступный паттерн. Это — определить силы и выбрать структурный ответ, соответствующий этим силам с наименьшим количеством лишних трейдоффов.
ADR’ы и fitness functions — инструменты, делающие этот процесс долговечным:
- ADR фиксирует, какие силы присутствовали, какие трейдоффы были приняты и почему — чтобы будущие инженеры могли оценить, применимы ли силы по-прежнему.
- Fitness function применяет, что структурные свойства, взятые на себя командой, по-прежнему поддерживаются — чтобы архитектура не дрейфовала от намерения.
Архитектура — это глагол. Это непрерывный процесс оценки сил, выбора структурных ответов, фиксации обоснования и поддержания важных свойств. Вот что означает «архитектура — это глагол».
▸lesson.inset.note
Полный процесс ATAM включает несколько воркшопов, выявление бизнес- и архитектурных драйверов, прохождение сценариев и план смягчения рисков. Фрейм «ATAM-lite» здесь — это словарь: sensitivity points, tradeoff points, риски — применяемый неформально в проектных обсуждениях и ADR’ах. Не нужно проводить формальный воркшоп ATAM, чтобы извлечь пользу из словаря. Точное использование терминов в повседневных архитектурных разговорах даёт большую часть пользы при малой доле стоимости.
Биллинговая платформа выросла до 15 команд. Архитектурная команда предлагает декомпозировать modular monolith на микросервисы. Старший инженер хочет провести ATAM-lite анализ перед решением. Используя sensitivity points, tradeoff points и риски, что выявляет строгий анализ?
- 01В чём разница между sensitivity point и tradeoff point в словаре ATAM?
- 02Как словарь трейдоффов связан с форматом ADR из предыдущего урока?
- 03Каков мета-принцип, закрывающий трек, и как ADR'ы и fitness functions ему служат?
Кризис GDPR на биллинговой платформе был вызван не плохой архитектурой. Он был вызван архитектурой, трейдоффы которой никогда не были сделаны явными. Event sourcing был правильным выбором для аудируемости. Он также был tradeoff point: та же неизменяемость, которая делала аудитовый журнал ценным, делала удаление данных клиентов структурно сложным. Этот трейдофф был обнаруживаем на этапе проектирования. Он не был обнаружен до двух лет спустя, под юридическим давлением, когда исправление стало дорогостоящим.
ATAM-lite даёт словарь для явного формулирования этих трейдоффов до того, как они становятся кризисами: sensitivity points (одна атрибута, одно решение), tradeoff points (несколько атрибутов, противоположные эффекты), риски (правдоподобные будущие сценарии, где деградированная атрибута становится блокирующим ограничением). Словарь не предотвращает трейдоффы — архитектура и есть трейдоффы. Он открывает их на этапе проектирования, когда смягчение дёшево.
Каждый раздел этого трека был конкретным трейдоффом: зацепление vs связность, стабильность vs гибкость, согласованность vs автономия, аудируемость vs модифицируемость, простота vs устойчивость. Паттерны — hexagonal, DDD, CQRS, event sourcing, modular monolith, saga — не ответы для универсального применения. Это ответы на силы. Задача архитектора — точно определить силы, выбрать соответствующий ответ, зафиксировать обоснование в ADR и применять результирующие свойства fitness functions.
Архитектура — это глагол. Это непрерывный процесс оценки сил, сознательного принятия трейдоффов и поддержания важных свойств. Нет архитектуры, правильной навсегда — есть только архитектуры, соответствующие силам, присутствовавшим при их проектировании, и дисциплина пересматривать их при изменении сил.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.