En qualsevol sistema que duri més d'uns mesos sorgeix la mateixa pregunta incòmoda: "per què vam fer això així?". La persona que va prendre la decisió ja no hi és, el context s'ha perdut i l'equip actual dubta entre respectar l'elecció o llençar-la per la borda sense entendre-la. La governança arquitectònica existeix per respondre aquesta pregunta i per assegurar coherència tècnica sense convertir-se en un fre burocràtic. Tradicionalment, governança evocava comitès pesats, documents de centenars de pàgines i un "arquitecte cap" que aprovava tot. Avui busquem el contrari: una governança lleugera, distribuïda i basada en decisions documentades de forma senzilla. L'eina estrella d'aquest enfocament són els Architecture Decision Records (ADR). En aquesta lliçó veurem què és la governança lleugera, com escriure ADR amb una plantilla, com funcionen els comitès d'arquitectura moderns i com definir estàndards que ajudin en comptes d'estorbar.
Contingut
- Què és la governança arquitectònica
- Governança pesada vs lleugera
- Architecture Decision Records (ADR)
- Plantilla d'ADR
- Exemple complet d'ADR
- Comitès d'arquitectura moderns
- Estàndards i guies (golden paths)
- Errors Comuns i Consells
- Exercicis
- Conclusió
- Què és la governança arquitectònica
La governança arquitectònica és el conjunt de pràctiques que asseguren que les decisions tècniques d'una organització siguin coherents, estiguin alineades amb els objectius de negoci i es mantinguin en el temps. Cobreix tres preguntes:
- Qui decideix? Com es distribueix l'autoritat tècnica.
- Com es decideix? El procés per prendre i documentar decisions.
- Com s'assegura el compliment? Com es verifica que el que s'ha decidit es respecta.
L'objectiu no és controlar la gent, sinó reduir el cost de la coherència: que un equip no reinventi la roda, que les decisions importants no es prenguin a la lleugera i que el coneixement sobrevisqui a la rotació de persones. Una bona governança és invisible quan funciona i dolorosa només quan falta.
- Governança pesada vs lleugera
| Aspecte | Governança pesada (tradicional) | Governança lleugera (moderna) |
|---|---|---|
| Autoritat | Centralitzada en un arquitecte/comitè | Distribuïda; equips amb autonomia |
| Decisions | Aprovades per endavant per un òrgan | Preses per qui les implementa, documentades |
| Documentació | Documents extensos, sovint obsolets | ADR breus versionats amb el codi |
| Compliment | Revisions manuals, "portes" | Automatitzat (fitness functions, linters) |
| Velocitat | Lenta; el comitè és un coll d'ampolla | Ràpida; el comitè assessora, no bloqueja |
| Risc | Decisions desconnectades de la realitat | Requereix maduresa i cultura d'equip |
La governança lleugera no significa "cadascú fa el que vol". Significa moure la decisió al lloc on hi ha el coneixement (l'equip que construeix), però exigint que les decisions rellevants es documentin i es verifiquin. El comitè passa de porter a facilitador.
- Architecture Decision Records (ADR)
Un Architecture Decision Record (registre de decisió arquitectònica), idea popularitzada per Michael Nygard el 2011, és un document curt que captura una decisió arquitectònica significativa: el context en què es va prendre, la decisió en si i les seves conseqüències. Característiques clau:
- Un per decisió. No és un document mestre, sinó una col·lecció de fitxes petites.
- Immutable. Un ADR no s'edita un cop acceptat; si la decisió canvia, se n'escriu un de nou que substitueix l'anterior (estat "Reemplaçat per ADR-00X").
- Versionat amb el codi. Viu al repositori, normalment a
docs/adr/, perquè evolucioni al costat del sistema i es revisi en els pull requests. - Breu. Una o dues pàgines. Si necessites més, probablement siguin diverses decisions.
Què mereix un ADR? Decisions que són costoses de revertir o que afecten molts: triar un estil arquitectònic, una base de dades, un protocol de comunicació, una política d'autenticació, etc. No documentis amb ADR el nom d'una variable.
- Plantilla d'ADR
Una plantilla minimalista i molt utilitzada, en Markdown:
# ADR-001: <Títol curt i imperatiu de la decisió> ## Estat Proposat | Acceptat | Rebutjat | Obsolet | Reemplaçat per ADR-00X ## Context Quina situació o problema ens obliga a decidir? Forces en joc, restriccions tècniques i de negoci, supòsits. Fets, no opinions. ## Decisió "Decidim <X> per a <objectiu>." Una afirmació clara en veu activa. ## Conseqüències Resultats positius i negatius de la decisió. Què es torna més fàcil, què es torna més difícil, quins riscos assumim i quin deute generem. ## Alternatives considerades Altres opcions avaluades i per què es van descartar.
Repassem cada secció i per què importa:
- Estat: permet saber d'un cop d'ull si la decisió segueix vigent. El flux típic és Proposat → Acceptat; més endavant pot passar a Reemplaçat.
- Context: és la part més valuosa d'aquí a dos anys. Explica les forces que van portar a decidir. Sense context, una decisió correcta sembla arbitrària.
- Decisió: l'afirmació concreta. En veu activa ("Decidim fer servir PostgreSQL") perquè no hi hagi ambigüitat sobre què es va triar.
- Conseqüències: l'honestedat aquí és or. Tota decisió té un cost; anomenar-lo evita que l'equip futur se senti enganyat.
- Alternatives considerades: demostra que es va pensar. Evita que algú proposi d'aquí a un any una opció ja descartada per bones raons.
- Exemple complet d'ADR
# ADR-007: Adoptar comunicació asíncrona per esdeveniments entre Comandes i Facturació ## Estat Acceptat (2026-03-12) ## Context El mòdul de Facturació s'invocava de forma síncrona des de Comandes en confirmar una compra. Quan Facturació està lenta o caiguda, la confirmació de la comanda falla, encara que el pagament ja s'ha cobrat. En pics de campanya hem vist timeouts i comandes perdudes. Negoci exigeix que confirmar la comanda no depengui de la disponibilitat de Facturació. ## Decisió Decidim desacoblar Comandes i Facturació mitjançant esdeveniments asíncrons. Comandes publicarà un esdeveniment `PedidoConfirmado` en un broker de missatgeria (RabbitMQ). Facturació el consumirà i generarà la factura de forma diferida. ## Conseqüències Positives: - Confirmar una comanda ja no depèn de Facturació: més disponibilitat. - Facturació pot processar al seu ritme i reintentar davant de fallades. Negatives: - La factura ja no és immediata: consistència eventual. El client veurà "factura en procés" durant segons. - Augmenta la complexitat operativa: cal monitoritzar el broker i les cues. - Necessitem idempotència a Facturació per no duplicar factures si l' esdeveniment es reentrega. ## Alternatives considerades - Mantenir síncron amb reintents i circuit breaker: redueix el problema però no l'elimina; la confirmació segueix acoblada a Facturació. - Crida síncrona amb timeout curt i cua interna: afegeix complexitat sense les garanties del broker.
Observa com l'exemple aplica la plantilla amb dades reals: el context narra un problema concret (timeouts en campanya), la decisió és inequívoca (esdeveniments via RabbitMQ) i les conseqüències no amaguen el cost (consistència eventual, necessitat d'idempotència). Qualsevol que llegeixi això d'aquí a dos anys entendrà per què Facturació és asíncrona i no intentarà "arreglar-ho" tornant-la síncrona.
- Comitès d'arquitectura moderns
El comitè d'arquitectura no ha desaparegut, però ha canviat de paper. En el model modern sol organitzar-se com un ART (Architecture Review Team) o, més informalment, una guild d'arquitectura:
- Composició rotatòria: no només "arquitectes", sinó enginyers sènior de diversos equips. Evita la torre de vori i reparteix el coneixement.
- Funció assessora, no de porter: revisa ADR proposats, aporta perspectiva transversal i detecta encavalcaments o incoherències, però rarament bloqueja.
- Cadència lleugera: reunions curtes i freqüents, idealment sobre ADR ja escrits (es revisa un document, no s'improvisa en una pissarra).
- Decisions per consens informat: si no hi ha acord, l'equip que assumeix el cost decideix, deixant-ho registrat.
graph TD
Equipo[Equip proposa ADR] --> PR[Pull Request amb l'ADR]
PR --> Guild[Guild d'Arquitectura revisa]
Guild -->|comentaris| PR
Guild -->|sense objeccions de pes| Acept[Estat: Acceptat]
Acept --> Repo[(Repositori docs/adr)]El flux del diagrama integra la governança en el procés de desenvolupament: l'ADR es proposa com un pull request, es discuteix com qualsevol canvi de codi i, en aprovar-se, queda versionat. La governança deixa de ser un esdeveniment a part i es torna part de la feina diària.
- Estàndards i guies (golden paths)
Perquè els equips tinguin autonomia sense caos, l'organització defineix estàndards i golden paths (camins daurats):
- Estàndard: una regla que s'ha de complir ("tota API REST exposa OpenAPI", "els logs surten en JSON"). Idealment, verificable de forma automàtica.
- Golden path (camí daurat): la forma recomanada i suportada de fer una cosa comuna (plantilla de microservei, pipeline de CI/CD llest). No és obligatori, però és el camí fàcil: qui se'n surt, assumeix el cost.
- Guia: recomanació sense obligatorietat ("preferim injecció per constructor").
La clau és distingir el que és obligatori i automatitzable del que és recomanat. Com més es pugui verificar amb eines (linters, fitness functions, plantilles), menys cal vigilar a mà. Un bon estàndard no es documenta en un PDF: es codifica en una comprovació que fa fallar el build si s'incompleix.
# Exemple: un estàndard codificat com a check al pipeline de CI
# "Tota imatge de contenidor ha de declarar un usuari no-root"
verificar-usuario-no-root:
stage: seguridad
script:
- test "$(grep -c '^USER ' Dockerfile)" -ge 1 || (echo "Falta directiva USER" && exit 1)Aquest fragment converteix un estàndard de seguretat ("no executar com a root") en una comprovació que fa fallar el build si el Dockerfile no inclou una directiva USER. És governança executable: ningú no ha de recordar la regla ni revisar-la a mà, perquè el pipeline la imposa. Veurem aquesta filosofia portada a l'extrem en la propera lliçó sobre fitness functions.
- Errors Comuns i Consells
- Documentació que ningú no llegeix ni manté. Un wiki gegant i obsolet és pitjor que res. Prefereix ADR curts versionats amb el codi.
- Editar ADR acceptats. Trenca la traçabilitat històrica. Si la decisió canvia, escriu un ADR nou que reemplaci l'anterior.
- Comitè que bloqueja tot. Si cada decisió necessita aprovació prèvia d'un òrgan central, el lliurament es paralitza. El comitè assessora; l'equip decideix i documenta.
- Documentar decisions trivials. Reserva els ADR per a decisions cares de revertir o que afecten molts. No documentis el format d'una data amb un ADR.
- Estàndards només sobre paper. Si un estàndard no es pot verificar automàticament, s'incomplirà en silenci. Codifica'l sempre que puguis.
- Consell: numera els ADR de forma seqüencial i mai no reutilitzis números. L'històric complet, inclosos els rebutjats i reemplaçats, és part del valor.
- Exercicis
Exercici 1. Decideix quines d'aquestes decisions mereixen un ADR i quines no: (a) triar entre REST i gRPC per a la comunicació entre serveis; (b) el nom del paquet arrel; (c) fer servir autenticació amb JWT; (d) l'ordre dels imports.
Exercici 2. Escriu un ADR seguint la plantilla per a aquesta decisió: "l'equip farà servir PostgreSQL com a base de dades principal en comptes de MongoDB". Inventa un context raonable.
Exercici 3. La teva organització vol garantir que tots els serveis exposin un endpoint /health. Ho plantejaries com a guia, estàndard o golden path? Com ho verificaries?
Solucions
Solució 1. Mereixen ADR: (a) i (c), perquè són decisions costoses de revertir i afecten tots els equips. No mereixen ADR: (b) i (d), que són convencions trivials; van en una guia d'estil o en el linter, no en un ADR.
Solució 2. (Exemple) Estat: Acceptat. Context: necessitem transaccions ACID i relacions fortes entre comandes, línies i clients; l'equip domina SQL i no preveiem dades sense esquema. Decisió: decidim fer servir PostgreSQL com a base de dades principal. Conseqüències: guanyem integritat referencial i transaccions; renunciem a la flexibilitat d'esquema de MongoDB i assumim que dades molt variables requeririen columnes JSONB. Alternatives: MongoDB (descartat: no necessitem esquema flexible i perdríem transaccions multidocument fàcils).
Solució 3. El millor és un estàndard ("tot servei exposa /health") reforçat amb un golden path (la plantilla de servei ja inclou l'endpoint, així complir-lo és gratis). La verificació s'automatitza: un test de contracte en CI que arrenca el servei i comprova que /health respon 200, fent fallar el build si no.
- Conclusió
La governança arquitectònica moderna aposta per ser lleugera, distribuïda i executable: moure les decisions a l'equip que té el coneixement, documentar-les amb ADR breus i immutables versionats al costat del codi, i convertir el comitè en un assessor en comptes d'un porter. Hem vist com escriure ADR amb una plantilla i un exemple complet, com operen les guilds d'arquitectura i com els estàndards guanyen força quan es codifiquen en comprovacions automàtiques en comptes de quedar-se sobre paper. Aquesta darrera idea —verificar l'arquitectura automàticament— és el pont perfecte cap a la lliçó següent: Fitness Functions i Arquitectura Evolutiva, on aprendrem a escriure proves que comproven que l'arquitectura es manté sana a mesura que el sistema evoluciona.
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
