Перейти к содержимому

C4

C4 model — подход к визуализации архитектуры ПО через четыре уровня детализации (контекст, контейнеры, компоненты, код). Для каждого уровня: цель, аудитория, примеры, правила оформления, сравнение с UML и BPMN, типичные ошибки и инструменты (Draw.io, Structurizr, PlantUML).

Введение: Четыре уровня приближения

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

  • Карта мира – где находится страна относительно других стран.
  • Карта города – где находятся районы, парки, вокзалы.
  • Карта района – где находятся улицы и дома.
  • План квартиры – как комнаты расположены, где розетки.

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

УровеньНазваниеЧто показываетКто смотрит
C1Context (Контекст)Система в окружении внешних систем и пользователейЗаказчики, менеджмент
C2Container (Контейнеры)Из каких крупных блоков (приложений, сервисов, БД) состоит системаАрхитекторы, разработчики, аналитики
C3Component (Компоненты)Из каких компонентов состоит каждый контейнерРазработчики
C4Code (Код)Классы, интерфейсы, структура кодаРазработчики (редко используется)

C4 – это не инструмент, а способ мышления и набор правил для создания понятных архитектурных диаграмм. Его придумал Саймон Браун, чтобы наконец-то навести порядок в мире “архитектурных схем-паутин”.

Зачем нужен C4

Проблема, которую решает C4

Часто архитектуру пытаются нарисовать на одной схеме. Получается:

  • Слишком много деталей для бизнеса (им не нужны названия баз данных).
  • Слишком мало деталей для разработчиков (непонятно, как компоненты связаны).
  • Стрелки пересекаются, квадратики сливаются, схема превращается в “спагетти”.

Что дает C4

  • Единый язык для всей команды. Все знают, что на C1 показывают контекст, а на C2 – контейнеры.
  • Разные уровни для разных аудиторий. Показываете заказчику C1, разработчикам – C2 и C3.
  • Иерархия. Каждая диаграмма ведет к следующей, более детальной.

Уровень 1: Контекст (Context)

Что это такое

Это самая верхняя диаграмма. Она показывает:

  • Нашу систему (один квадратик в центре).
  • Пользователей, которые с ней взаимодействуют (человечки).
  • Внешние системы, с которыми она интегрируется (квадратики вокруг).
  • Как они связаны между собой (стрелки).

Аудитория: заказчики, менеджмент, бизнес-пользователи.

Пример C1

Что важно на C1

  • Не показывать внутреннее устройство системы. Она – один квадратик.
  • Показывать реальные внешние системы, а не “базу данных” внутри.
  • Использовать понятные названия, а не технические аббревиатуры.
  • Стрелки должны быть подписаны: “использует”, “интеграция”, “делает заказ”, “отправляет платеж”.

Уровень 2: Контейнеры (Containers)

Что это такое

Теперь “открываем” нашу систему и смотрим, из каких крупных блоков она состоит. Наша система распадается на несколько квадратиков, каждый – отдельный контейнер. Между ними – стрелки с протоколами и форматами данных. В C4 контейнер – это исполняемая единица:

  • Веб-приложение (фронтенд).
  • Бэкенд-сервис (API).
  • База данных.
  • Мобильное приложение.
  • Очередь сообщений.
  • Кэш.

Аудитория: архитекторы, разработчики, системные администраторы.

Пример C2

Что важно на C2

  • Показывать технологию (React, Java Spring, PostgreSQL).
  • Показывать протокол (HTTPS, REST/JSON, JDBC).
  • Каждый контейнер – это отдельное приложение или служба.
  • Не углубляться внутрь контейнеров – это для следующего уровня.

Уровень 3: Компоненты (Components)

Что это такое

Берем один контейнер и “открываем” его. Показываем, из каких компонентов он состоит. Компонент – это логическая группа кода внутри контейнера:

  • Контроллеры (обрабатывают входящие запросы).
  • Сервисы (содержат бизнес-логику).
  • Репозитории (работают с базой данных).
  • Обработчики (реагируют на события).

Один квадратик с уровня C2 превращается в схему из нескольких квадратиков внутри.

Аудитория: разработчики, технические лиды.

Пример C3

Что важно на C3

  • Показывать ключевые компоненты, а не каждый класс.
  • Использовать термины, понятные разработчикам.
  • Не углубляться до уровня классов – это уже C4.

Уровень 4: Код (Code)

Что это такое

Это уровень классов, интерфейсов, наследования. На практике используется редко – для этого есть IDE и генераторы документации.

Аудитория: разработчики, которые пишут конкретный код.

Что важно

В большинстве проектов этот уровень не документируют отдельно. Код сам себя документирует. Диаграмма C4 обычно останавливается на C3.

Как рисовать C4 диаграммы

Инструменты

ИнструментОписание
Draw.io / diagrams.netБесплатный, есть библиотека с элементами C4. Можно использовать готовые элементы.
StructurizrИнструмент, созданный автором C4. Позволяет описывать диаграммы кодом (DSL) и генерировать все уровни.
PlantUML + C4Есть расширение для PlantUML, позволяющее рисовать C4.
Miro / LucidchartМожно рисовать вручную, но придется соблюдать стиль самостоятельно.

Правила оформления (стиль C4)

Саймон Браун рекомендует определенный стиль:

ЭлементКак рисовать
Наша система / контейнерСиний прямоугольник
Внешняя системаСерый прямоугольник
ПользовательЧеловечек
База данныхЦилиндр
СтрелкиПодписаны (что передается, какой протокол)
ЦветаМинимум, не радуга

Пример C1 в PlantUML (с C4 расширением)

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml

Person(customer, "Клиент", "Покупатель интернет-магазина")
System(ecommerce, "Интернет-магазин", "Позволяет покупать товары онлайн")
System_Ext(payment, "Платежная система", "Обрабатывает платежи")
System_Ext(delivery, "Служба доставки", "Доставляет заказы")

Rel(customer, ecommerce, "делает заказ", "HTTPS")
Rel(ecommerce, payment, "отправляет платеж", "API")
Rel(ecommerce, delivery, "передает заказ", "API")

@enduml

C4 vs другие нотации

НотацияДля чегоПлюсыМинусы
C4Архитектура системыИерархичность, понятность, единый языкТребует дисциплины
UMLДетальное проектированиеМощный, стандартСложный, перегружен
BPMNБизнес-процессыПонятен бизнесуНе про архитектуру

C4 отлично дополняет UML и BPMN. На C4 вы показываете “скелет” системы, а на UML – детали внутри компонентов.

Типичные ошибки при проектировании C4

Ошибка 1: Смешивать уровни

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

Как исправить: Делайте отдельную диаграмму для каждого уровня.

Ошибка 2: Показывать базы данных на C1

На уровне контекста внешняя система – это что-то, что находится за пределами вашей ответственности. База данных – это часть вашей системы, ее показывают на C2.

Ошибка 3: Не подписывать стрелки

Стрелка без подписи – это “что-то туда идет”. Всегда подписывайте, что передается и как.

Ошибка 4: Слишком много деталей

На C2 не нужно показывать все контроллеры и сервисы. Для этого есть C3.

Ошибка 5: Забывать про внешние системы

Система не живет в вакууме. Всегда показывайте внешние системы, с которыми она интегрируется.

Резюме для системного аналитика

  1. C4 - это четыре уровня приближения. Контекст (C1) -> Контейнеры (C2) -> Компоненты (C3) -> Код (C4).

  2. Разные уровни для разных аудиторий. C1 для бизнеса, C2 для архитекторов, C3 для разработчиков.

  3. Главное правило - не смешивать. Одна диаграмма - один уровень детализации.

  4. C4 не заменяет UML и BPMN, а дополняет их. На C4 показываете архитектуру, на UML - детали внутри компонентов.

  5. Стрелки всегда подписывайте. Что передается, какой протокол, в каком формате.

Проверка знаний

Вопрос 1 из 4
Что такое C4-модель?
Когда C4 особенно полезна?
Какой принцип лежит в основе C4?
Что важно учитывать в C4-диаграммах?

Вопросы, где были ошибки