Una arquitectura que només existeix al cap del seu autor és una arquitectura perduda. Documentar-la és allò que permet que l'equip l'entengui, que els nous membres s'incorporin ràpidament, que el negoci confiï en allò que es construeix i que les decisions sobrevisquin a la rotació de persones. Però documentar bé és difícil: els diagrames solen quedar obsolets, barrejar nivells de detall o resultar incomprensibles per a qui no els va dibuixar. En aquesta lliçó aprendràs dues eines fonamentals: el clàssic model de vistes 4+1 de Philippe Kruchten i, sobretot, el modern model C4 de Simon Brown, una manera senzilla i pragmàtica de diagramar arquitectures amb quatre nivells de zoom: Context, Contenidor, Component i Codi.
Contingut
- Per què documentar i per a qui
- El model 4+1 de vistes
- El model C4: la idea del zoom
- Nivell 1: diagrama de Context
- Nivell 2: diagrama de Contenidors
- Nivell 3: diagrama de Components
- Nivell 4: Codi
- Bones pràctiques i eines
- Per què documentar i per a qui
Documentar no és produir centenars de pàgines que ningú no llegirà. És comunicar de manera eficaç a diferents audiències. La regla principal: documenta just el necessari, per a una audiència concreta i amb un propòsit clar.
| Audiència | Què li interessa | Nivell de detall |
|---|---|---|
| Negoci / direcció | Què fa el sistema i amb què es relaciona | Molt alt (context) |
| Arquitectes / nous a l'equip | Estructura general i tecnologies | Mitjà (contenidors) |
| Desenvolupadors | Com s'organitza un mòdul per dins | Detallat (components) |
| Qui implementa una classe | El codi mateix | Màxim (codi) |
Un error clàssic és usar un únic diagrama gegant per a totes les audiències: acaba sent massa detallat per al negoci i massa superficial per al desenvolupador. La solució és oferir diferents vistes a diferents nivells.
- El model 4+1 de vistes
Proposat per Philippe Kruchten el 1995, el model 4+1 parteix de la idea que cap vista única no captura tota l'arquitectura. Proposa quatre vistes més una de transversal.
| Vista | Descriu | Audiència principal |
|---|---|---|
| Lògica | Funcionalitat: objectes, classes, la seva organització | Desenvolupadors, analistes |
| De processos | Concurrència, processos, comunicació, rendiment | Integradors |
| De desenvolupament (implementació) | Organització del codi: mòduls, paquets, capes | Programadors, gestors |
| Física (desplegament) | Mapatge a maquinari: servidors, xarxa | Enginyers de sistemes |
| +1 Escenaris (casos d'ús) | Uneix les quatre vistes mitjançant casos d'ús clau | Tots |
graph TD
E["+1 Escenaris<br/>(casos d'ús)"]
E --- L["Vista Lògica"]
E --- P["Vista de Processos"]
E --- D["Vista de Desenvolupament"]
E --- F["Vista Física"]Aquest diagrama Mermaid situa els escenaris al centre, connectats (amb ---, línies sense direcció) a les quatre vistes. La idea és que els casos d'ús clau "lliguen" i validen la resta de vistes: cada escenari important ha de poder recórrer-se a través de la vista lògica, de processos, de desenvolupament i física. El model 4+1 continua sent conceptualment valuós, però en la pràctica diària molts equips prefereixen avui el C4 per la seva senzillesa i el seu mapatge directe a com es construeix realment el programari.
- El model C4: la idea del zoom
El model C4, creat per Simon Brown, es basa en una analogia amb els mapes: igual que uses diferents nivells de zoom (món, país, ciutat, carrer), una arquitectura s'entén millor amb diferents nivells de detall. C4 defineix quatre nivells, cadascun un "zoom" sobre l'anterior:
| Nivell | Nom | Respon a | Audiència |
|---|---|---|---|
| 1 | Context (System Context) | Com encaixa el sistema en el seu món? | Tots, inclòs el negoci |
| 2 | Contenidor (Container) | De quines peces desplegables es compon? | Equip tècnic |
| 3 | Component (Component) | Com s'organitza un contenidor per dins? | Desenvolupadors |
| 4 | Codi (Code) | Com s'implementa un component? | Qui programa aquest codi |
Conceptes bàsics de C4:
- Persona: un usuari humà del sistema (client, administrador...).
- Sistema de programari: allò que construeixes (o un sistema extern amb què t'integres).
- Contenidor: no és necessàriament un contenidor Docker; és quelcom que s'executa i es desplega de manera independent: una aplicació web, una API, una base de dades, una single-page app, un broker.
- Component: una agrupació lògica de funcionalitat dins d'un contenidor.
Una regla d'or de C4: la majoria dels equips només necessiten els nivells 1 i 2 de manera habitual, i el 3 ocasionalment. El nivell 4 gairebé mai no es dibuixa a mà, perquè el genera l'IDE.
- Nivell 1: diagrama de Context
És el nivell més alt. Mostra el teu sistema com una sola caixa, envoltat dels seus usuaris i dels sistemes externs amb què es relaciona. El seu propòsit és que qualsevol, inclòs el negoci, entengui el panorama general.
graph TD
client["Client<br/>(Persona)"]
sistema["Sistema de Banca en Línia<br/>(El nostre sistema)"]
email["Sistema d'Email<br/>(Extern)"]
core["Core Bancari<br/>(Extern)"]
client -->|"consulta saldo i<br/>fa transferències"| sistema
sistema -->|"envia notificacions via"| email
sistema -->|"llegeix i actualitza comptes a"| coreAquest diagrama de Context mostra una única caixa per a "Sistema de Banca en Línia", envoltada d'una persona (el Client) i dos sistemes externs (Email i Core Bancari). Les fletxes etiquetades descriuen què fa cada relació, no com. Fixa't que no apareix cap tecnologia ni detall intern: en aquest nivell només importa l'abast del sistema i les seves interaccions amb l'exterior. És el diagrama ideal per començar qualsevol conversa, també amb persones no tècniques.
- Nivell 2: diagrama de Contenidors
Fem zoom dins del nostre sistema. Mostrem les unitats desplegables que el componen i com es comuniquen, indicant ja les tecnologies principals.
graph TD
client["Client<br/>(Persona)"]
spa["Aplicació Web SPA<br/>(React)"]
api["API de Banca<br/>(Java, Spring Boot)"]
bd["Base de Dades<br/>(PostgreSQL)"]
core["Core Bancari<br/>(Extern)"]
client -->|"usa, via HTTPS"| spa
spa -->|"crida, JSON/HTTPS"| api
api -->|"llegeix/escriu, SQL"| bd
api -->|"consulta comptes, via API"| coreAquí, dins del sistema de banca en línia veiem tres contenidors propis: una aplicació web single-page en React, una API en Java amb Spring Boot i una base de dades PostgreSQL; més el sistema extern (Core Bancari). Cada fletxa indica el protocol de comunicació (HTTPS, JSON, SQL). Aquest nivell és el més útil en el dia a dia tècnic: mostra d'una ullada l'arquitectura de desplegament, les tecnologies escollides i els fluxos de comunicació. Recorda: "contenidor" aquí significa unitat desplegable, no necessàriament un contenidor Docker.
- Nivell 3: diagrama de Components
Ara fem zoom dins d'un únic contenidor —per exemple, l'API de Banca— per veure com s'organitza internament en components.
graph TD
spa["Aplicació Web SPA"]
subgraph API["API de Banca (Spring Boot)"]
ctrl["Controlador de Transferències<br/>(REST Controller)"]
servei["Servei de Transferències<br/>(lògica de negoci)"]
repo["Repositori de Comptes<br/>(accés a dades)"]
end
bd["Base de Dades"]
spa -->|"POST /transferencies"| ctrl
ctrl -->|"usa"| servei
servei -->|"usa"| repo
repo -->|"SQL"| bdAquest diagrama usa un subgraph per representar les fronteres de l'API de Banca i mostra tres components interns: el controlador REST que rep les peticions, el servei que conté la lògica de negoci i el repositori que accedeix a les dades. És la clàssica separació en capes (presentació, negoci, dades) dins d'un contenidor. Aquest nivell és valuós perquè els desenvolupadors entenguin l'estructura interna, però convé dibuixar-lo només per als contenidors no trivials, no per a tots.
- Nivell 4: Codi
L'últim nivell detalla com s'implementa un component concret, normalment amb un diagrama de classes UML. A la pràctica, gairebé mai no es dibuixa a mà: el genera automàticament l'IDE o eines de documentació, perquè canvia constantment i mantenir-lo manualment és feina perduda.
// El nivell de Codi es correspon amb les classes reals que implementen un component.
// Per exemple, el component "Servei de Transferències" del nivell anterior:
public class ServeiTransferencies {
private final RepositoriComptes repositori;
public ServeiTransferencies(RepositoriComptes repositori) {
this.repositori = repositori; // injecció de dependència del repositori
}
public void transferir(String origen, String desti, BigDecimal import) {
Compte compteOrigen = repositori.cercar(origen);
Compte compteDesti = repositori.cercar(desti);
compteOrigen.retirar(import); // lògica de negoci
compteDesti.ingressar(import);
repositori.guardar(compteOrigen);
repositori.guardar(compteDesti);
}
}Aquest codi mostra com es materialitza el component "Servei de Transferències" en classes concretes. La recomanació de C4 és no dibuixar aquest nivell manualment: si necessites veure'l, deixa que el teu IDE generi el diagrama de classes a partir del codi real. Mantenir diagrames de codi a mà és la causa número u de documentació obsoleta.
- Bones pràctiques i eines
Resum de les notacions i pràctiques recomanades per C4:
- Cada diagrama, autoexplicatiu: amb títol, llegenda i elements clarament etiquetats.
- Etiqueta les relacions: descriu què fa cada fletxa i, si escau, amb quina tecnologia/protocol.
- Un nivell per diagrama: no barregis context amb codi.
- No abusis del nivell 3 ni del 4: dibuixa només allò que aporta valor.
- Documentació com a codi (diagrams as code): defineix els diagrames en text per versionar-los al costat del codi i evitar que quedin obsolets.
Eines habituals:
| Eina | Enfocament |
|---|---|
| Mermaid | Diagrames com a text, integrats en Markdown (com en aquesta lliçó) |
| PlantUML (+ extensió C4-PlantUML) | Diagrames com a text, molt potent per a C4 |
| Structurizr | Eina oficial del model C4, "model únic, múltiples vistes" |
| draw.io / Excalidraw | Dibuix manual ràpid, sense versionat com a codi |
Exemple del mateix diagrama de context en PlantUML amb l'extensió C4:
@startuml !include <C4/C4_Context> Person(client, "Client", "Usuari de la banca en línia") System(banca, "Sistema de Banca en Línia", "Permet consultar saldos i transferir") System_Ext(email, "Sistema d'Email", "Envia notificacions") System_Ext(core, "Core Bancari", "Gestiona els comptes") Rel(client, banca, "Consulta saldo i transfereix") Rel(banca, email, "Envia notificacions via") Rel(banca, core, "Llegeix i actualitza comptes a") @enduml
Aquest fragment PlantUML usa la llibreria oficial C4_Context. Les macros Person, System i System_Ext (sistema extern) creen els elements amb el seu nom i descripció, i Rel defineix les relacions etiquetades. L'avantatge davant de Mermaid és que PlantUML amb C4 coneix la semàntica del model (distingeix persones de sistemes, interns d'externs) i aplica un estil coherent automàticament. En ser text, es versiona al costat del codi i es regenera sense esforç.
Errors Comuns i Consells
- El "diagrama plat d'espaguetis". Un sol diagrama amb tot barrejat no comunica res. Separa per nivells i audiències.
- Diagrames sense llegenda ni etiquetes. Si les caixes i fletxes no s'expliquen, cada lector interpreta el que vol. Etiqueta-ho tot.
- Documentació que envelleix. Els diagrames dibuixats a mà queden obsolets de seguida. Usa diagrams as code i genera el nivell de codi automàticament.
- Excés de detall. No dibuixis els nivells 3 i 4 per a tot. La majoria d'equips viu feliç amb els nivells 1 i 2.
- Consell: comença sempre pel Context. En qualsevol conversa d'arquitectura, arrenca amb el diagrama de context; alinea tothom abans de baixar al detall.
Exercicis
Exercici 1. Associa cada element amb el seu nivell C4: (a) "una base de dades Redis"; (b) "el client i el sistema de pagament extern"; (c) "la classe ServeiComandes"; (d) "el controlador, el servei i el repositori dins de l'API".
Exercici 2. Dibuixa (en Mermaid o PlantUML) un diagrama de Context per a un sistema de gestió d'una biblioteca, amb almenys una persona i un sistema extern.
Exercici 3. Explica per què C4 recomana no dibuixar el nivell de Codi manualment i quina alternativa proposa.
Solucions
Solució 1. (a) Contenidor (nivell 2): una base de dades és una unitat desplegable. (b) Context (nivell 1): persones i sistemes externs. (c) Codi (nivell 4): una classe concreta. (d) Component (nivell 3): agrupacions lògiques dins d'un contenidor.
Solució 2. Exemple en Mermaid:
graph TD
soci["Soci<br/>(Persona)"]
bibliotecari["Bibliotecari<br/>(Persona)"]
sistema["Sistema de Gestió de Biblioteca<br/>(El nostre sistema)"]
email["Sistema d'Email<br/>(Extern)"]
soci -->|"cerca i reserva llibres"| sistema
bibliotecari -->|"gestiona préstecs i catàleg"| sistema
sistema -->|"envia avisos de devolució via"| emailAquest diagrama de Context mostra dues persones (Soci i Bibliotecari), el sistema propi i un sistema extern d'Email, amb relacions etiquetades que descriuen què fa cada interacció, sense entrar en tecnologies ni en l'estructura interna.
Solució 3. Perquè el codi canvia contínuament i mantenir a mà un diagrama de classes el converteix ràpidament en documentació obsoleta i poc fiable, cosa que genera més confusió que ajuda. L'alternativa que proposa C4 és generar aquest nivell automàticament des del mateix codi (amb l'IDE o eines de documentació) quan realment es necessiti, en lloc de dibuixar-lo manualment.
Conclusió
Has après per què i per a qui es documenta una arquitectura, el clàssic model de vistes 4+1 i, en profunditat, el model C4 amb els seus quatre nivells de zoom (Context, Contenidor, Component i Codi), a més de les pràctiques i eines per mantenir la documentació viva mitjançant diagrams as code. Amb això tanques el Mòdul 1, Fonaments de l'Arquitectura d'Aplicacions: ja saps què és l'arquitectura i els seus àmbits, qui és l'arquitecte, com s'especifiquen els atributs de qualitat, com es prenen i documenten les decisions amb els seus trade-offs, i com comunicar-ho tot amb claredat. Sobre aquests fonaments, els mòduls següents aprofundiran en els estils i patrons arquitectònics concrets amb què materialitzar aquestes idees.
Curs d'Arquitectura d'Aplicacions
Mòdul 1: Fonaments de l'Arquitectura d'Aplicacions
- Què és l'Arquitectura d'Aplicacions?
- El Rol de l'Arquitecte de Programari
- Atributs de Qualitat i Requisits No Funcionals
- Decisions Arquitectòniques i Compromisos (Trade-offs)
- Documentació d'Arquitectura: Vistes i el Model C4
Mòdul 2: Principis i Tàctiques de Disseny
- Acoblament, Cohesió i Separació de Responsabilitats
- Principis SOLID Aplicats a l'Arquitectura
- DRY, KISS, YAGNI i Altres Principis de Disseny
- Tàctiques Arquitectòniques per als Atributs de Qualitat
- Gestió del Deute Tècnic
Mòdul 3: Estils i Patrons Arquitectònics
- Arquitectura Monolítica
- Arquitectura en Capes (N-Tier)
- Arquitectura Client-Servidor
- Arquitectura Hexagonal (Ports i Adaptadors)
- Arquitectura Neta i Ceba (Clean & Onion)
Mòdul 4: Arquitectures Distribuïdes i Microserveis
- Introducció als Sistemes Distribuïts
- Arquitectura de Microserveis
- Descomposició de Serveis i Bounded Contexts
- API Gateway, Service Discovery i Comunicació entre Serveis
- Patrons de Resiliència: Circuit Breaker, Retry i Bulkhead
- El Teorema CAP i la Consistència de Dades
Mòdul 5: Arquitectures Dirigides per Esdeveniments i Missatgeria
- Fonaments de l'Arquitectura Orientada a Esdeveniments
- Missatgeria Asíncrona: Cues i Brokers
- Patrons d'Esdeveniments: Event Sourcing i CQRS
- Gestió de Transaccions Distribuïdes: Patró Saga
- Streaming de Dades en Temps Real
Mòdul 6: Disseny Dirigit pel Domini (DDD)
- Conceptes Fonamentals del DDD
- Disseny Estratègic: Bounded Contexts i Llenguatge Ubic
- Disseny Tàctic: Entitats, Agregats i Repositoris
- Mapatge de Contextos (Context Mapping)
Mòdul 7: Dades i Persistència
- Estratègies de Persistència: SQL vs NoSQL
- Patrons d'Accés a Dades: Repository, Unit of Work i DAO
- Base de Dades per Servei i Gestió de Dades Distribuïdes
- Cau i Estratègies d'Invalidació
Mòdul 8: Arquitectura al Núvol i Desplegament
- Fonaments del Cloud Computing (IaaS, PaaS, SaaS)
- Contenidors i Orquestració amb Docker i Kubernetes
- Arquitectura Serverless
- Patrons de Disseny Cloud-Native
- Infraestructura com a Codi (IaC)
Mòdul 9: Qualitat, Seguretat i Observabilitat
- Escalabilitat: Horitzontal vs Vertical i Balanceig de Càrrega
- Alta Disponibilitat i Tolerància a Fallades
- Seguretat per Disseny i Autenticació/Autorització
- Observabilitat: Logging, Mètriques i Traçabilitat
- Rendiment i Proves de Càrrega
