C4 Model concept page. Simon Brown's 4 levels of architecture diagrams: Context (system + actors + external systems), Container (deployable units like SPA/API/DB/queue), Component (modules inside a container like Controllers/Services/Repositories), Code (class diagrams, optional). 4 scenarios: L1 Context overview, drill L1->L2 Container, drill L2->L3 Component, diagrams-as-code workflow with Structurizr DSL + PR review. 2 ADRs: C4 vs UML/ad-hoc justification, and Structurizr DSL / PlantUML / Mermaid C4 tooling choice.
Архитектурная документация в команде обычно либо слишком общая (один прямоугольник «backend»), либо слишком детальная (UML на 50 классов, который никто не читает). C4 (Simon Brown, 2011) решает эту проблему одним приёмом: четыре уровня зума, каждый на свою аудиторию. Не «лучшая нотация», а общий язык: бизнес читает один уровень, разработчики — другой, security audit — третий, и все понимают одно и то же.
Без C4 типичная картина: на onboarding 2-4 недели уходит только на «что где запущено», PR review требует контекста которого нет, security audit невозможен потому что нет single source of truth по контейнерам и trust boundaries. C4 даёт минимальный обязательный набор: Context + Container — и онбординг сжимается до часов.
«Карта мира → карта страны → карта города → карта района. Каждый уровень отвечает на свой вопрос. C4 — то же самое для software: системы → контейнеры → компоненты → код.»
Четыре уровня — это зум одной и той же системы, не четыре разные диаграммы про разное:
Правило: обязательны L1 + L2, L3 по необходимости (≥10 модулей или критичный сервис), L4 почти никогда.
Три уровня одного e-shop, наложенные «матрёшкой» сверху вниз:
customer, admin (actors) → shop-system (чёрный ящик) → stripe, sendgrid (external). Одна страница, ≤10 элементов.shop-system — spa (React в браузере), mobile-app, api-svc (Node.js на ECS), worker-svc, pg (Postgres RDS), redis (ElastiCache), sqs. Каждое соединение подписано протоколом (JSON/HTTPS, SQL, enqueue jobs).api-svc — ctrl-orders → svc-orders → repo-orders, pay-adapter; ctrl-users → svc-users → repo-users. Маппится на packages/modules в коде.Pulse-рёбра между уровнями (shop-system → spa, api-svc → ctrl-orders) — это визуальный «zoom-into», не настоящие data flows.
L1 System Context — старт всегда отсюда. Одна страница, 5-10 элементов, audience-agnostic: CEO, sales, новый сотрудник в первый день, external auditor — все читают и понимают что делает система. На L1 запрещено: внутренности (БД, очереди), микросервисный split, технологии. Stripe и SendGrid рисуются как external boxes — мы не контролируем их код. Actors — это роли (Customer, Admin, Support agent), не конкретные люди. Skipping L1 («все и так знают») — главный анти-паттерн: новые люди не знают, security audit тем более.
Drill L1 → L2 Container view. Раскрываем чёрный ящик: что запущено внутри. Container в C4 — это deployable unit, не Docker: SPA в браузере — container, mobile binary — container, managed RDS instance — container, S3 bucket — container. Audience сужается до developers + DevOps. Каждое соединение обязано иметь label с протоколом (JSON/HTTPS, SQL, Kafka topic orders.v1) — без него рецензент не понимает intent. Типичный размер: 7-15 боксов. Больше 20 — сигнал что система должна быть разбита на несколько Context-уровневых систем.
Drill L2 → L3 Component view. Раскрываем один container (здесь — API). Компоненты — это packages/modules в коде, не классы (классы это L4). Pattern из примера — Clean Architecture: Controller (HTTP layer) → Service (use case) → Repository (data access) + Adapter (порт к external Stripe в стиле Hexagonal). L3 нужен per-container (отдельная диаграмма для API, отдельная для worker). Skip если container тривиальный (2-3 модуля) — overkill.
Diagrams as Code workflow. Главное в C4 не нотация, а дисциплина обновления. Архитектор открывает docs/architecture/c4/workspace.dsl, добавляет es = container "Elasticsearch" + relationship api -> es "search query" "JSON/HTTPS", коммитит. CI (structurizr-cli export) рендерит Mermaid/PNG, прикладывает к PR comment. Reviewer видит diff в .dsl + rendered preview side-by-side. После merge — docs site обновляется автоматически. Render-время Structurizr CLI ~2s на 30-element workspace, CI overhead ~30s. Drag-drop в Confluence/Lucidchart — категорически нет: невозможно review через PR, vendor lock, gather dust через 6 месяцев.
В диаграмме зашиты два ADR — открой ноду shop-system (ADR-001) и svc-orders (ADR-002).
ADR-001: C4 как обязательный стандарт vs UML / ad-hoc box-and-arrow. UML (1997, OMG) определяет 14 типов диаграмм, в реальности используется 2-3 (class, sequence, иногда component) и каждый рисует по-своему. Ad-hoc «boxes & arrows» в Miro даёт 100% гибкости и 0% смысла без legend. Альтернативы: arc42 (German engineering template на 12 секций, часто комбинируется с C4), TOGAF/Archimate (enterprise overkill для product team), просто Mermaid (lightweight, но без чёткой ментальной модели уровней). Adoption публично: Spotify, ING, Adidas, BBC, FedEx; AWS Well-Architected рекомендует C4-style; OWASP threat modeling строится на C4 Container.
Решение: C4 обязателен, минимум L1+L2 для каждого bounded context. Container view ≠ Docker — это шире. Tooling tier: Structurizr DSL для главного workspace, Mermaid C4 для inline README, PlantUML только для legacy.
ADR-002: Diagrams as Code, рендер в CI. Drag-and-drop инструменты (Lucidchart, draw.io desktop, Confluence whiteboard) дают мгновенный visual feedback, но фундаментально несовместимы с инженерным workflow: нельзя review через PR (бинарный diff), легко забыть обновить (диаграмма отдельно от кода), vendor lock, нет single source of truth. Diagrams as code решает каждый пункт: текстовый файл в repo → diff в PR → рендер в CI → PNG/SVG к docs site.
Решение: docs/architecture/c4/workspace.dsl как single source для Context + Container + Component. CI workflow: при изменении docs/architecture/** или apps/**/Dockerfile или infra/terraform/** — structurizr-cli export → commit rendered Mermaid → PR comment с preview, failed render = blocking check. Каждый container и component обязан иметь description и technology; relationships обязаны иметь label с протоколом.
Tools tier (что выбирают в проде 2025):
| Tool | Когда брать |
|---|---|
| Structurizr DSL | Главный workspace, single source для всех 4 уровней |
| Mermaid C4 | Inline в README/wiki, native GitHub/GitLab render, только Context/Container |
| PlantUML + C4-PlantUML | Legacy, когда Structurizr нельзя; verbose но free и работает 10+ лет |
| D2 (Terrastruct, 2023+) | Beautiful auto-layout, не C4-strict но C4-friendly |
| draw.io / Lucidchart | Только для whiteboard-сессий; никогда как source of truth |
В этом курсе:
Внешние источники: