O Modelo C4: Visualizando a Arquitetura de Software Como um “Google Maps para Código”

“O Modelo C4 ajuda as equipes a comunicar a arquitetura de software de forma clara, consistente e no nível adequado de detalhe.”
— Simon Brown

Modelo C4 (Contexto, Contêineres, Componentes, Código) é um framework hierárquico e zoomável para documentar arquitetura de software. Foi projetado para ser amigável ao desenvolvedorcompatível com Agile, e legível — indo além dos diagramas confusos e estáticos de “caixas e linhas”.

Permite que as equipes:

  • Comunicar a arquitetura de forma eficaz entre partes interessadas técnicas e não técnicas.

  • Manter documentação consistente e controlada por versão.

  • Focar no o que importa em cada nível de abstração.


🔍 Abstrações Principais do Modelo C4

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

Nível Conceito Propósito
Nível 1: Contexto Sistema e Pessoas Quem usa o sistema? Como ele interage com seu ambiente?
Nível 2: Contêineres Unidades implantáveis Quais são os componentes técnicos de alto nível (aplicativos, bancos de dados, APIs)?
Nível 3: Componentes Agrupamentos lógicos Como a funcionalidade é estruturada dentro de um contêiner?
Nível 4: Código (Opcional) Classes, interfaces, métodos Detalhes de implementação — geralmente gerados por IDEs.

✅ Princípio FundamentalAproxime somente quando necessário.Comece de forma ampla, depois vá se aprofundando.


🧩 Elementos e Relacionamentos Principais

Elemento Descrição Exemplo
Pessoa Ator humano ou usuário ClienteAdministradorAPI de terceiros
Sistema de Software Um sistema que entrega valor Sistema de Banco Online
Contêiner Unidade implantável (em tempo de execução ou implantável) Aplicativo Web, Microserviço, Banco de Dados, Função Serverless
Componente Grupo lógico de funcionalidades relacionadas Módulo de AutenticaçãoProcessador de PagamentosFacade de Mainframe
Relações Conexões em linguagem simples entre elementos "Usa""Chama""Lê/Escreve""Depende de"

💬 Use linguagem natural para relações. Evite termos vagos como “conecta-se a”.


📊 Níveis do Modelo C4 com Exemplos em PlantUML

📌 Todos os exemplos usam o biblioteca C4-PlantUML para consistência e automação.


1. Diagrama de Contexto do Sistema (Nível 1)

Quem usa o sistema? Quais sistemas externos ele interage?

🎯 Público-alvo: Stakeholders não técnicos, proprietários de produtos, executivos.

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title Diagrama de Contexto do Sistema para Banco Online

Person(customer, "Cliente", "Um cliente de banco pessoal")
System(banking_system, "Sistema de Banco Online", "Permite que os clientes visualizem contas e façam pagamentos")
System_Ext(mainframe, "Sistema de Banco de Mainframe", "Armazena todos os dados principais de banco")

Rel(customer, banking_system, "Usa")
Rel_R(banking_system, mainframe, "Obtém informações da conta de")
@enduml

✅ Foco: Escopo e limites do sistema.


2. Diagrama de Container (Nível 2)

Quais são os principais componentes técnicos e suas tecnologias?

🎯 Público-alvo: Arquitetos, desenvolvedores, engenheiros DevOps.

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

Person(customer, "Cliente", "Um cliente de banco pessoal")
System_Boundary(c1, "Sistema de Banco na Internet") {
    Container(web_app, "Aplicativo Web", "Java, Spring MVC", "Entrega conteúdo para o usuário")
    Container(api_app, "Aplicativo de API", "Java, Spring Boot", "Fornece funcionalidades via JSON/HTTPS")
    ContainerDb(db, "Banco de Dados", "Banco de Dados Relacional", "Armazena dados do usuário")
}

System_Ext(mainframe, "Sistema de Mainframe Bancário", "Armazena todos os dados principais de banco")

Rel(customer, web_app, "Usa", "HTTPS")
Rel(web_app, api_app, "Chama", "JSON/HTTPS")
Rel(api_app, db, "Le/Grava", "JDBC")
Rel(api_app, mainframe, "Usa", "XML/HTTPS")
@enduml

✅ Foco: Escolhas de tecnologialimites de implantaçãofluxos de dados.


3. Diagrama de Componente (Nível 3)

Como o Aplicativo de API é estruturado internamente?

🎯 Público-alvo: Desenvolvedores, líderes técnicos, líderes de equipe.

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title Diagrama de Componente para o Aplicativo de API no Banco na Internet

Container(api_app, "Aplicativo de API", "Java, Spring Boot")
ContainerDb(db, "Banco de Dados", "Banco de Dados Relacional")
System_Ext(mainframe, "Sistema de Mainframe Bancário")

Container_Boundary(api_boundary, "Aplicativo de API") {
    Component(sign_in, "Controlador de Entrada", "Controlador MVC", "Permite que os usuários entrem")
    Component(security, "Componente de Segurança", "Spring Security", "Gerencia autenticação")
    Component(mainframe_facade, "Facade do Mainframe", "DAO", "Comunica-se com o Mainframe")

    Rel(sign_in, security, "Usa")
    Rel(security, db, "Le/Grava")
    Rel(sign_in, mainframe_facade, "Usa")
    Rel(mainframe_facade, mainframe, "Usa")
}
@enduml

✅ Foco: Estrutura internaresponsabilidadesdependências.


4. Diagrama de Código (Nível 4 – Opcional)

Detalhes de implementação: classes, interfaces, métodos.

🎯 Público-alvo: Desenvolvedores, revisores de código.

⚠️ Não recomendado desenhar manualmente — melhor gerado por meio de IDEs (por exemplo, IntelliJ, VS Code) usando ferramentas de geração automática de diagramas.

Exemplo (simplificado):

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

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

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

SignInController --> SecurityComponent : Usa
SecurityComponent --> Database : Lê/Escreve
MainframeFacade --> MainframeAPI : Usa
@enduml

✅ Melhor prática: Automatize este nível usando ferramentas como PlantUML + plugins de IDE.


✅ Melhores Práticas e Princípios Principais

Princípio Por que isso importa
Aprimoramento Iterativo Comece com o contexto → adicione detalhes apenas quando necessário. Evite sobredocumentar.
Diagramas como Código Armazene .puml arquivos no Git. Permite versionamento, CI/CD, colaboração e comparações (diffs).
Inclua uma Legenda Explique sempre símbolos, cores e convenções (por exemplo, Vermelho = ExternoAzul = Interno).
Foque na Comunicação Os diagramas deveminformar, não impressionar. Simplicidade > completude.
Use diagramas de “Cenário do Sistema” Mostre como múltiplos sistemas interagem em toda a organização.
Use diagramas “Dinâmicos” Adicione diagramas de sequência para mostrar o comportamento em tempo de execução (por exemplo, fluxo de login).
Defina o escopo com responsabilidade Um diagrama de componente deve ter seu escopo definidodentro de um único container. Não misture containers!

🛠 Ferramentas e Ecossistema

  • PlantUML + Biblioteca C4-PlantUML – Gratuito, baseado em texto, controlado por versão.

  • Visual ParadigmLucidchartDraw.io – Suporte ao C4 por meio de modelos.

  • Plugins de IDE – Gere automaticamente diagramas C4 a partir do código (por exemplo, IntelliJ + plugin PlantUML).

  • Integração com CI/CD – Gere diagramas como parte das pipelines de build.


📚 Referências e Leitura Complementar


🎯 Pensamento Final

O modelo C4 não é sobre criar diagramas perfeitos — é sobre contar a história certa no nível de detalhe certo.

Use-o para:

  • Integre novos desenvolvedores mais rapidamente.

  • Alinhe as equipes sobre os limites do sistema.

  • Comunique-se com os interessados sem jargão.

  • Evolua a documentação de arquitetura junto com o código.


✅ Dica Profissional: Comece com um Contexto do Sistema diagrama. Depois, expanda o modelo conforme as necessidades da sua equipe evoluírem — como construir um mapa uma rua de cada vez.


Me avise se você gostaria de:

  • Uma versão em PDF baixável deste guia

  • Um repositório modelo com diagramas C4 no Git

  • Scripts de automação para gerar diagramas C4 a partir do código

  • Uma comparação com outros modelos (por exemplo, Visão 4+1, Zachman)

Feliz diagramação! 🖥️📘