C4 Model. Mi experiencia + Ejemplo
Siempre he buscado la forma de poder comunicar y visualizar las arquitecturas de manera que puedan ser claras para todos; y así, cualquiera que llegue a la documentación pueda entender la idea en general, pero si a su vez quiere profundizar más en el tema, también lo pueda hacer.
Por eso cuando llegué a la charla de Simon Brown “Visualising software architecture with the C4 model” me brillaron los ojitos 🤩.
¿Qué es C4 Model? ❓
El modelo C4 se creó como una forma de ayudar a los teams de desarrollo de software a describir y comunicar la arquitectura de este, tanto durante las sesiones de diseño iniciales, como cuando se documenta retrospectivamente una base de código existente.
¿Por qué me encantó este modelo? 🤩
- Te da la oportunidad de crear mapas del código en varios niveles de detalle. Similar a lo que hace Google Maps cuando se puede acercar y alejar un área que resulte interesante.
- Al realizar los diagramas comprendí mejor la arquitectura de mi sistema y detecté los puntos que me faltaban reconocer
- El diagrama se puede hacer navegable permitiendo profundizar y retornar cuantas veces se desee.
- Puedes comunicar las decisiones de arquitectura con todos los roles y cada quien puede decidir qué tanto desea profundizar.
Profundicemos en C4 Model 👀
Abstraccciones
Para crear los mapas de su código, primero necesitamos un conjunto común de abstracciones para crear un lenguaje ubicuo que podamos usar para describir la estructura estática de un sistema de software.
El modelo C4 considera las estructuras estáticas de un sistema de software (Software System), en términos de contenedores (Containers), componentes (Components) y código (Code) y las personas usan los sistemas de software que construimos.
Person: Una persona representa a uno de los usuarios humanos de su sistema de software (por ejemplo: actores, roles, personajes, etc.).
Software System: Un sistema de software es el nivel más alto de abstracción y describe algo que ofrece valor a sus usuarios, sean humanos o no. Esto incluye el Software System que está modelando y los otros Software Systems de los que depende su sistema de software (o viceversa).
En muchos casos, un sistema de software es “propiedad” de un solo equipo de desarrollo de software.
Container (applications and data stores): Not Docker! En el modelo C4, un contenedor representa una aplicación o un almacén de datos y debe estar ejecutándose para que el sistema de Software System funcione. En términos reales, un contenedor es algo así como: Server-side web application, Client-side web application, Client-side desktop application, Mobile app, Server-side console application, Serverless function, Database, File system, Shell script, etc.
Component: En el modelo C4, un componente es una agrupación de funciones relacionadas encapsuladas detrás de una interfaz bien definida. Si usa un lenguaje como Java o C#, la forma más sencilla de pensar en un componente es que es una colección de clases de implementación detrás de una interfaz.
Core diagrams 💎
Nivel 1 | Context: A big picture
Un diagrama de contexto del sistema es un buen punto de partida para diagramar y documentar un sistema de software, lo que te permite dar un paso atrás y ver el panorama general.
Los detalles no son lo importante aquí, ya que esta es tu vista alejada que muestra una imagen grande del panorama del sistema. El enfoque debe estar en las personas y los sistemas de software en lugar de las tecnologías, los protocolos y otros detalles de bajo nivel.
Nivel 2 | Container: Responsabilidades de alto nivel de un sistema
El diagrama de contenedores muestra la forma de alto nivel de la arquitectura del software y cómo se distribuyen las responsabilidades a través de ella. También muestra las principales opciones tecnológicas y cómo los contenedores se comunican entre sí. Es un diagrama centrado en la tecnología simple.
Básicamente, un contenedor es una unidad ejecutable/implementable por separado (por ejemplo: un espacio de proceso separado) que ejecuta código o almacena datos.
Nivel 3 | Componentes: Los componentes básicos y las interacciones de una aplicación
Ahora, puedes acercar y descomponer aún más cada contenedor para identificar los principales bloques de construcción estructurales y sus interacciones.
El diagrama de componentes muestra cómo un contenedor se conforma de una serie de “componentes”, qué son cada uno de esos componentes, sus responsabilidades y los detalles de tecnología/implementación.
Nivel 4 | Code: El detalle de la implementación
Finalmente, puedes ampliar cada componente para mostrar cómo se implementa como código; utilizando diagramas de clases UML, diagramas entidad relación o similares.
Este es un nivel de detalle opcional y, a menudo, está disponible a pedido desde herramientas como IDE. Idealmente, este diagrama se generaría automáticamente utilizando herramientas y debería considerar mostrar sólo aquellos atributos y métodos que le permitan contar la historia que desea contar.
Mis aprendizajes ✨
- No se necesitan usar los 4 niveles del diagrama; sólo aquellos que agregan valor.
- Los títulos y lo que significa cada representación (por ejemplo: formas, colores, estilos de borde, tipos de línea, puntas de flecha, etc.) hay que indicarlo en el diagrama para que todos lo entiendan.
- Hay que mostrarlo con negocios, productos, stakeholders, etc. para validar que sea entendible. No sólo centrarse en los perfiles técnicos.
- Hay que usar un lenguaje obicuo.
- Es importante que cada elemento tenga una descripción breve.
- En mi caso, ponerle el nombre a cada línea hizo la gran diferencia ya que me llevó a analizar la interacción entra cada componente.
- Cada línea debe representar una relación unidireccional.
¿En qué herramienta se puede hacer? ⚒️
Existen varias herramientas que ofrecen compatibilidad con el C4 Model. Como yo soy de las personas que no se centra tanto en la herramienta, adapté la que utilizamos en la empresa en donde trabajo, la cual es libre y desde mi punto de vista, sencilla de usar, ahí fue donde realicé mis diagramas. Al final dejo el ejemplo con diagrams.net, pero de todas formas comparto un listado para que uses la que más te agrade.
Text-based modelling tools
Visual modelling tools
Text-based diagramming tools
Visual diagramming tool
Un ejemplo en Diagrams.Net / Draw.io 🧭
En varios de los componentes les puedes dar clic para navegar en el diagrama, también puedes usar los breadcrumbs para adentrarte o alejarte dependiendo de lo que busques. Les comparto un diagrama de ejemplo:
Aquí puedes visualizarlo y te aparecera una opción de edición, esto te creará una copia para que puedas editar. ¡Disfútalo!
Muchas gracias por leer.
Si tienes algún comentario, sugerencia o idea, estaré feliz de leerte y colaborar para crecer juntos❤️
Visítame en www.itzareyes.mx