C4
C4 model — подход к визуализации архитектуры ПО через четыре уровня детализации (контекст, контейнеры, компоненты, код). Для каждого уровня: цель, аудитория, примеры, правила оформления, сравнение с UML и BPMN, типичные ошибки и инструменты (Draw.io, Structurizr, PlantUML).
Введение: Четыре уровня приближения
Представьте, что вам нужно объяснить, как устроен город. Можно показать одну карту, где есть все: страны, города, районы, улицы, дома, квартиры. Но на такой карте ничего не разобрать. Поэтому используют разные карты:
- Карта мира – где находится страна относительно других стран.
- Карта города – где находятся районы, парки, вокзалы.
- Карта района – где находятся улицы и дома.
- План квартиры – как комнаты расположены, где розетки.
В архитектуре программного обеспечения работает та же логика. C4 – это подход к моделированию, который предлагает использовать четыре уровня детализации (четыре “С”):
| Уровень | Название | Что показывает | Кто смотрит |
|---|---|---|---|
| C1 | Context (Контекст) | Система в окружении внешних систем и пользователей | Заказчики, менеджмент |
| C2 | Container (Контейнеры) | Из каких крупных блоков (приложений, сервисов, БД) состоит система | Архитекторы, разработчики, аналитики |
| C3 | Component (Компоненты) | Из каких компонентов состоит каждый контейнер | Разработчики |
| C4 | Code (Код) | Классы, интерфейсы, структура кода | Разработчики (редко используется) |
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")
@endumlC4 vs другие нотации
| Нотация | Для чего | Плюсы | Минусы |
|---|---|---|---|
| C4 | Архитектура системы | Иерархичность, понятность, единый язык | Требует дисциплины |
| UML | Детальное проектирование | Мощный, стандарт | Сложный, перегружен |
| BPMN | Бизнес-процессы | Понятен бизнесу | Не про архитектуру |
C4 отлично дополняет UML и BPMN. На C4 вы показываете “скелет” системы, а на UML – детали внутри компонентов.
Типичные ошибки при проектировании C4
Ошибка 1: Смешивать уровни
Пытаться на одной диаграмме показать и контекст, и контейнеры, и компоненты. Получается каша.
Как исправить: Делайте отдельную диаграмму для каждого уровня.
Ошибка 2: Показывать базы данных на C1
На уровне контекста внешняя система – это что-то, что находится за пределами вашей ответственности. База данных – это часть вашей системы, ее показывают на C2.
Ошибка 3: Не подписывать стрелки
Стрелка без подписи – это “что-то туда идет”. Всегда подписывайте, что передается и как.
Ошибка 4: Слишком много деталей
На C2 не нужно показывать все контроллеры и сервисы. Для этого есть C3.
Ошибка 5: Забывать про внешние системы
Система не живет в вакууме. Всегда показывайте внешние системы, с которыми она интегрируется.
Резюме для системного аналитика
C4 - это четыре уровня приближения. Контекст (C1) -> Контейнеры (C2) -> Компоненты (C3) -> Код (C4).
Разные уровни для разных аудиторий. C1 для бизнеса, C2 для архитекторов, C3 для разработчиков.
Главное правило - не смешивать. Одна диаграмма - один уровень детализации.
C4 не заменяет UML и BPMN, а дополняет их. На C4 показываете архитектуру, на UML - детали внутри компонентов.
Стрелки всегда подписывайте. Что передается, какой протокол, в каком формате.