¿Qué es el modelo C4?
Cuatro niveles de zoom sobre un sistema, cada uno respondiendo a una pregunta que planteó el anterior, y deliberadamente ninguna notación propia: por eso viaja bien entre equipos.
7 min de lecturaC4 model1 de 3
La respuesta corta
- C4 son cuatro niveles de zoom sobre un sistema - contexto, contenedores, componentes, código - y cada nivel existe para responder a una pregunta que planteó el de encima.
- Es una convención, no una notación. C4 dice qué corresponde a un diagrama y te deja las formas a ti, y por eso puede dibujarse en UML, en ArchiMate o en cajas y flechas.
- Un contenedor es algo desplegable o ejecutable - una aplicación, un servicio, una base de datos - no un contenedor Docker. Es el nivel del que más partido saca la mayoría de los equipos y el que más se salta.
- El nivel 4 rara vez compensa dibujarlo a mano. Si quieres las clases, genéralas desde el código, donde ya son ciertas.
01Cuatro preguntas, en orden#
El modelo C4 es un conjunto de cuatro diagramas sobre un mismo sistema, cada uno más cercano que el anterior. Su aportación real no es el dibujo, es el orden. Cada nivel responde a una pregunta, y esa respuesta plantea la pregunta para la que existe el nivel siguiente.
| Elemento | Notación | Qué significa |
|---|---|---|
| 1. Contexto del sistema | Una caja, más sus personas y vecinos | Una caja para tu sistema, rodeada de las personas y los demás sistemas con los que habla. Nada de interior. El diagrama que pueden leer por igual alguien que acaba de llegar y quien decide el presupuesto. |
| 2. Contenedores | Cajas dentro de la frontera del sistema | Esa única caja, abierta. Las cosas desplegables o ejecutables por separado - aplicación web, API, base de datos, broker - y las llamadas entre ellas. |
| 3. Componentes | Cajas dentro de un contenedor | Un contenedor, abierto. Sus partes estructurales principales y sus dependencias. Vale la pena dibujarlo cuando un contenedor es lo bastante grande como para que se discuta sobre él. |
| 4. Código | Clases | Las clases dentro de un componente, es decir, un diagrama de clases UML. Genéralo o sáltatelo; dibujar este nivel a mano es la vía más rápida a un diagrama obsoleto. |
El público se estrecha según bajas. El nivel 1 es para cualquiera con interés en el sistema, incluida gente que nunca leerá código. El nivel 4 es para el equipo, en una semana en la que está reestructurando algo. Ese gradiente es el argumento para dibujar los dos primeros y parar hasta que alguien pida más.
02C4 es una convención, no una notación#
Esta es la parte que se pierde. C4 no define formas, estilos de línea ni semántica de relaciones. Te dice qué corresponde a cada diagrama y para quién es, y luego: dibújalo como tu equipo ya dibuja las cosas.
La consecuencia práctica es que C4 se compone con la notación que ya tienes en lugar de sustituirla. Un diagrama de contenedores dibujado con componentes UML es a la vez un diagrama UML legal y un diagrama C4 correcto. Dibujado en ArchiMate, el mismo contenido se proyecta sobre componentes de aplicación y nodos tecnológicos. Ambas cosas están bien. Lo que no está bien es un diagrama cuyas cajas significan tres cosas distintas porque nadie dijo de qué nivel se trataba.
Como no hay notación que comprobar, la disciplina tiene que venir de otro sitio: etiqueta cada caja con lo que es, cada línea con lo que hace y por qué protocolo, y no mezcles nunca dos niveles en un mismo lienzo. Esas tres reglas hacen casi todo el trabajo que de otro modo haría una especificación por ti.
03El problema es la palabra contenedor#
C4 es anterior al dominio de Docker y usa contenedor en su sentido antiguo y general: algo que tiene que estar en marcha para que el sistema funcione y que puede desplegarse por su cuenta. Una aplicación de una sola página es un contenedor. También lo son una base de datos, una función serverless, un broker de mensajes y una aplicación móvil.
El nivel 2 es donde está casi todo el valor, y es el nivel que los equipos se saltan: en parte por el nombre y en parte porque es el primer diagrama que fuerza una decisión real sobre qué es el sistema en realidad. El artículo del diagrama de contenedores recorre uno de principio a fin.
04Usarlo sin que quede obsoleto#
Un conjunto de diagramas C4 tiene el mismo modo de fallo que cualquier otra documentación de arquitectura: es exacto el día en que se dibuja y calladamente falso seis meses después. Ayudan dos cosas, y ninguna va de dibujar.
La primera es mantener los niveles en un solo modelo en vez de en cuatro dibujos sin relación. Si la API de tu diagrama de contexto y la de tu diagrama de contenedores son el mismo elemento, renombrarla es una edición; si son dos cajas que casualmente comparten etiqueta, son dos ediciones y una se olvidará. Ese es el argumento a favor de un modelo detrás de las vistas, y es el mismo argumento que desarrolla en extenso mantener un modelo al día.
La segunda es dibujar menos niveles. Un diagrama de contexto y uno de contenedores que sean ciertos valen más que cuatro niveles de los que dos son ficción. El nivel 4 en particular debería generarse desde el código o dejarse fuera: un diagrama de clases dibujado a mano es la instantánea de una opinión, y el compilador tiene una más reciente.
En una línea cada uno
- 01Cuatro niveles, cuatro preguntas: quién lo usa, cuáles son las piezas, qué hay dentro de una pieza, cuáles son las clases.
- 02C4 define el contenido, no la notación: dibújalo en UML, en ArchiMate o en cajas simples, y sé coherente.
- 03Un contenedor es cualquier cosa desplegable o ejecutable por separado. No tiene nada que ver con Docker.
- 04Dibuja los niveles 1 y 2, añade el 3 donde haya una discusión que zanjar, y genera o deja fuera el 4.
05Preguntas frecuentes#
¿Qué significa C4?
Context, Containers, Components y Code: los cuatro niveles de detalle, desde el sistema entero en su entorno hasta las clases dentro de un componente. El nombre es el índice.
¿Es C4 un sustituto de UML?
No, y tampoco una alternativa. C4 dice qué cuatro diagramas dibujar y qué va en cada uno; UML aporta una notación con semántica definida. Se componen: un diagrama de contenedores C4 dibujado en notación de componentes UML es un diagrama UML legal y un C4 correcto.
¿Qué es un contenedor en C4?
Algo que tiene que estar ejecutándose para que el sistema funcione y que puede desplegarse por separado: una aplicación web, una app móvil, una API, una base de datos, un broker de mensajes. No es un contenedor Docker, y esa colisión de nombres es la mayor fuente de confusión sobre el modelo.
¿Hay que dibujar los cuatro niveles?
No. La mayoría de los equipos dibujan los niveles 1 y 2 y paran. El nivel 3 compensa en un contenedor lo bastante complejo como para que se discuta su interior, y el nivel 4 casi nunca: el código ya es la descripción del código.
En esta serie
- 01¿Qué es C4?
- 02Diagrama de contenedores
- 03C4 vs UML
Lecturas relacionadas
Diagramas de estructura
Práctica del modelado
Diagramas de estructura
Fundamentos
Práctica del modelado