Зачем это нужно
Классический подход: архитектор нарисовал диаграмму на год вперёд, команда «должна следовать». Реальность: требования меняются, модели обновляются каждую неделю, нагрузка растёт непредсказуемо. Continuous Architecture (also Evolutionary Architecture) — подход, при котором архитектура развивается вместе с продуктом, а не застывает в документе.
Для ML это особенно актуально: вы не знаете заранее, будет ли в продакшене LightGBM или нейросеть на GPU. Нужны guardrails, которые не дают системе деградировать при изменениях.
Основные идеи
Evolutionary architecture — набор принципов:
Решения откладывают до последнего ответственного момента (не лень, а меньше неверных ставок).
Архитектура поддерживает изменяемость — модульность, слабая связность.
Каждое изменение можно откатить или заменить компонент без «big bang rewrite».
Fitness functions (функции пригодности) — автоматические проверки, что архитектура не «сломалась» молча. Borrowed from evolutionary computation: система «выживает», пока метрики в норме.
Примеры fitness functions для ML-системы:
| Fitness function | Что проверяет | Где запускается |
|---|---|---|
| p95 latency < 200 ms | Performance SLA | CI load test / synthetic monitor |
| Cyclic dependency check | Модули не зависят циклически | CI (arch unit test) |
| Model AUC ≥ baseline | Качество не упало | Training pipeline gate |
| API backward compatible | Clients не ломаются | Contract tests in CI |
| No secrets in repo | Security | pre-commit / CI |
Если fitness function падает — merge блокируется или алерт эскалируется.
Связь с CI/CD и MLOps. Непрерывная архитектура — не отдельный процесс, а часть delivery:
ADR описывает намерение.
C4 описывает текущее состояние.
Fitness functions защищают атрибуты качества при каждом PR.
Postmortem и ADR Superseded — обучение системы на инцидентах.
ML добавляет fitness functions на data drift, prediction distribution, feature schema validation.
Anti-pattern: «Big design upfront» для ML — six-month architecture phase, потом оказывается, что данных для deep learning нет. Лучше: thin vertical slice (online scoring с простой моделью) + fitness functions + итерации.
Как это выглядит на практике
Команда запустила v1 fraud scoring (LightGBM, ADR-003). Через 3 месяца DS хочет neural network.
Evolutionary path:
RFC: «Neural network as secondary scorer» — не замена, а эксперимент за feature flag.
Fitness functions расширяют: новая модель должна match recall baseline на shadow traffic.
Container diagram обновляют: добавляется
ML Inference Service v2параллельно v1.Shadow mode 2 недели — fitness green → ADR-007 Accepted → постепенный rollout.
ADR-003 помечается Superseded для online path.
Jira Epic «Fraud ML v2» содержит stories на fitness functions до stories на модель. Confluence architecture page версионируется.
System Design Space напоминает: каждое решение — trade-off; continuous architecture делает trade-offs явными и проверяемыми.
Что сделать после занятия
Придумайте 3 fitness functions для учебного ML-сервиса — что измерять и где запускать.
Опишите, как бы вы эволюционно заменили простую модель на более сложную без big bang.
Свяжите fitness function с quality attribute из урока 2.2.1.