Модель C4: визуализация архитектуры программного обеспечения, как «Google Maps для кода»

«Модель C4 помогает командам ясно, последовательно и на нужном уровне детализации передавать архитектуру программного обеспечения».
— Саймон Браун

Модель C4 Model (Контекст, Контейнеры, Компоненты, Код) — иерархическая, масштабируемая структура для документирования архитектуры программного обеспечения. Она разработана с учетом удобства для разработчиковсоответствия Agile, и читаемости — выход за рамки перегруженных, статичных диаграмм «ящиков и линий».

Она позволяет командам:

  • Эффективно передавать архитектуру между техническими и нетехническими заинтересованными сторонами.

  • Поддерживать последовательную документацию с контролем версий.

  • Фокусироваться на том, что важно на каждом уровне абстракции.


🔍 Основные абстракции модели C4

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

Уровень Понятие Цель
Уровень 1: Контекст Система и люди Кто использует систему? Как она взаимодействует со своей средой?
Уровень 2: Контейнеры Развертываемые единицы Каковы высокий уровень технических компонентов (приложения, базы данных, API)?
Уровень 3: Компоненты Логические группировки Как структурирована функциональность внутри контейнера?
Уровень 4: код (необязательно) Классы, интерфейсы, методы Детали реализации — обычно генерируются IDE.

✅ Ключевой принципУвеличивайте только при необходимости.Начните с широкого охвата, затем углубитесь.


🧩 Ключевые элементы и отношения

Элемент Описание Пример
Человек Человеческий участник или пользователь КлиентАдминистраторВнешний API
Программная система Система, создающая ценность Система интернет-банкинга
Контейнер Единица развертывания (время выполнения или развертываемая) Веб-приложение, микросервис, база данных, функция без сервера
Компонент Логическая группа связанных функций Модуль аутентификацииПроцессор платежейФасад мейнфрейма
Связи Связи на простом языке между элементами "Использует""Вызывает""Читает/Записывает""Зависит от"

💬 Используйте естественный язык для связей. Избегайте неопределённых терминов, таких как «подключается к».


📊 Уровни модели C4 с примерами PlantUML

📌 Все примеры используют библиотеку C4-PlantUML для согласованности и автоматизации.


1. Диаграмма контекста системы (Уровень 1)

Кто использует систему? С какими внешними системами она взаимодействует?

🎯 Аудитория: Нетехнические заинтересованные стороны, владельцы продуктов, руководители.

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title Диаграмма контекста системы для интернет-банкинга

Person(customer, "Клиент", "Личный клиент банковского обслуживания")
System(banking_system, "Система интернет-банкинга", "Позволяет клиентам просматривать счета и совершать платежи")
System_Ext(mainframe, "Система банкинга на мейнфрейме", "Хранит все основные банковские данные")

Rel(customer, banking_system, "Использует")
Rel_R(banking_system, mainframe, "Получает информацию о счете из")
@enduml

✅ Акцент: Область и границы системы.


2. Диаграмма контейнеров (Уровень 2)

Каковы основные технические компоненты и их технологии?

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

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

Person(customer, "Клиент", "Личный клиент банковского обслуживания")
System_Boundary(c1, "Система интернет-банкинга") {
    Container(web_app, "Веб-приложение", "Java, Spring MVC", "Предоставляет контент пользователю")
    Container(api_app, "Приложение API", "Java, Spring Boot", "Предоставляет функциональность через JSON/HTTPS")
    ContainerDb(db, "База данных", "Реляционная база данных", "Хранит данные пользователей")
}

System_Ext(mainframe, "Система основного компьютера", "Хранит все основные банковские данные")

Rel(customer, web_app, "Использует", "HTTPS")
Rel(web_app, api_app, "Вызывает", "JSON/HTTPS")
Rel(api_app, db, "Читает/Записывает", "JDBC")
Rel(api_app, mainframe, "Использует", "XML/HTTPS")
@enduml

✅ Акцент: Выбор технологийграницы развертыванияпотоки данных.


3. Диаграмма компонентов (Уровень 3)

Как устроено приложение API внутренне?

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

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title Диаграмма компонентов приложения API в системе интернет-банкинга

Container(api_app, "Приложение API", "Java, Spring Boot")
ContainerDb(db, "База данных", "Реляционная база данных")
System_Ext(mainframe, "Система основного компьютера")

Container_Boundary(api_boundary, "Приложение API") {
    Component(sign_in, "Контроллер входа", "Контроллер MVC", "Позволяет пользователям входить")
    Component(security, "Компонент безопасности", "Spring Security", "Обрабатывает аутентификацию")
    Component(mainframe_facade, "Фасад основного компьютера", "DAO", "Общается с основным компьютером")

    Rel(sign_in, security, "Использует")
    Rel(security, db, "Читает/Записывает")
    Rel(sign_in, mainframe_facade, "Использует")
    Rel(mainframe_facade, mainframe, "Использует")
}
@enduml

✅ Акцент: Внутренняя структураответственностьзависимости.


4. Диаграмма кода (Уровень 4 – необязательно)

Детали реализации: классы, интерфейсы, методы.

🎯 Аудитория: Разработчики, проверяющие код.

⚠️ Не рекомендуется рисовать вручную — лучше генерировать с помощью IDE (например, IntelliJ, VS Code) с использованием инструментов автоматического создания диаграмм.

Пример (упрощённый):

@startuml
class SignInController {
  +signIn()
  +validateCredentials()
}

class SecurityComponent {
  +authenticate()
  +generateToken()
}

class MainframeFacade {
  +fetchAccountData()
  +sendTransaction()
}

SignInController --> SecurityComponent : Использует
SecurityComponent --> Database : Читает/Записывает
MainframeFacade --> MainframeAPI : Использует
@enduml

✅ Лучшая практика: Автоматизируйте этот уровень с помощью инструментов, таких как PlantUML + плагины IDE.


✅ Лучшие практики и ключевые принципы

Принцип Почему это важно
Итеративное уточнение Начните с контекста → добавляйте детали только при необходимости. Избегайте избыточной документации.
Диаграммы как код Храните .puml файлы в Git. Позволяет версионирование, CI/CD, совместную работу и сравнение изменений.
Включите легенду Всегда объясняйте символы, цвета и соглашения (например, Красный = ВнешнийСиний = Внутренний).
Сфокусируйтесь на коммуникации Диаграммы должныинформировать, а не впечатлять. Простота > полнота.
Используйте диаграммы «Ландшафт системы» Покажите, как несколько систем взаимодействуют в рамках организации.
Используйте «динамические» диаграммы Добавьте диаграммы последовательности, чтобы показать поведение во время выполнения (например, процесс входа).
Ответственно определяйте границы Диаграмма компонентов должна быть ограниченав пределах одного контейнера. Не смешивайте контейнеры!

🛠 Инструменты и экосистема

  • PlantUML + библиотека C4-PlantUML – Бесплатно, основано на тексте, с контролем версий.

  • Visual ParadigmLucidchartDraw.io – Поддержка C4 с помощью шаблонов.

  • Плагины для IDE – Автоматически генерировать диаграммы C4 из кода (например, IntelliJ + плагин PlantUML).

  • Интеграция CI/CD – Генерировать диаграммы как часть процессов сборки.


📚 Ссылки и дополнительные материалы


🎯 Последняя мысль

Модель C4 не о создании идеальных диаграмм — это о том, чтобырассказать правильную историю на правильном уровне детализации.

Используйте её для:

  • Быстрее вводить новых разработчиков в проект.

  • Согласовать команды по границам системы.

  • Общаться со заинтересованными сторонами без жаргона.

  • Развивать документацию архитектуры вместе с кодом.


✅ Совет профессионала: Начните с диаграммыКонтекст системыдиаграммы. Затем развивайте модель по мере изменения потребностей вашей команды — как строить карту по одной улице за раз.


Сообщите мне, если вам нужно:

  • PDF-версию этого руководства для скачивания

  • Шаблонный репозиторий с диаграммами C4 в Git

  • Скрипты автоматизации для генерации диаграмм C4 из кода

  • Сравнение с другими моделями (например, 4+1 View, Zachman)

Приятного рисования диаграмм! 🖥️📘