Architettura evolutiva: far evolvere il software senza riscrivere tutto
Architettura SoftwareSoftware DeliveryScaling

Architettura evolutiva: far evolvere il software senza riscrivere tutto

L'architettura software non si progetta una volta sola. Si fa evolvere insieme al business, in modo incrementale. La guida per chi vuole modernizzare senza fermare la delivery.

QMates· Software Advisory31 marzo 202612 min

C'è un mito duro a morire nell'ingegneria del software: che l'architettura si progetta all'inizio, una volta sola, e poi si mantiene.

La realtà è diversa. Ogni sistema software che dura più di due anni deve evolvere. Il business cambia, il mercato cambia, le tecnologie cambiano, il team cresce. Un'architettura progettata per le esigenze di oggi diventa un vincolo entro 12-18 mesi.

L'alternativa alla riscrittura totale, rischiosa e costosa, è l'architettura evolutiva: un approccio in cui le decisioni architetturali vengono prese in modo incrementale, validate continuamente; il sistema evolve insieme al business senza mai fermare la delivery.

Il concetto nasce dal lavoro di Neal Ford e Rebecca Parsons in Thoughtworks, formalizzato nel libro Building Evolutionary Architectures (O'Reilly). Questo articolo lo rende pratico per chi guida un team di sviluppo in una PMI o scaleup e vuole capire come applicarlo.

Cos'è l'architettura evolutiva?

L'architettura evolutiva è un approccio in cui il sistema software evolve in modo incrementale, guidato dai vincoli di business e validato continuamente da metriche automatizzate.

Non è "non decidere". È decidere al momento giusto, con le informazioni giuste, e verificare che ogni decisione regga nel tempo.

Si basa su tre principi:

  • Cambiamento incrementale guidato: ogni modifica all'architettura è piccola, reversibile e misurabile. Non si pianificano grandi migrazioni; si fanno evoluzioni continue
  • Molteplici dimensioni architetturali: l'architettura non è solo il codice. Include la struttura dei dati, i confini tra moduli, le dipendenze tra team, i tempi di rilascio. Ogni dimensione deve evolvere in modo coordinato
  • Fitness function come guardrail: metriche automatizzate che validano le proprietà architetturali nel tempo. Se una modifica degrada una proprietà importante, la fitness function la intercetta prima che arrivi in produzione

L'effetto pratico: il sistema resta in produzione, la delivery non si ferma, e l'architettura migliora in modo continuo anziché degradare.

Perché l'architettura tradizionale non regge

L'architettura progettata a monte, il cosiddetto "big design up front", funziona quando i requisiti sono stabili e prevedibili. Nel software moderno questo accade raramente.

Il problema non è che l'architettura iniziale sia sbagliata. È che diventa sbagliata con il tempo:

  • Il prodotto evolve in direzioni non previste
  • Il team cresce e le dipendenze tra componenti diventano colli di bottiglia
  • Le tecnologie scelte tre anni fa oggi sono un vincolo
  • Il costo di ogni modifica cresce perché il sistema è rigido

È il fenomeno del costo del cambiamento: in un sistema con architettura rigida, il costo di ogni modifica cresce esponenzialmente. Aggiungere una funzionalità che tre anni fa richiedeva due giorni oggi ne richiede tre settimane; non perché il team sia meno bravo, ma perché l'architettura non è stata fatta evolvere.

Chi non fa evolvere l'architettura accumula vincoli. I vincoli si pagano in velocità di rilascio, qualità del prodotto e capacità di trattenere le persone nel team. È un problema che impatta direttamente il business: roadmap inaffidabili, opportunità di mercato perse, costi che crescono senza che il valore cresca allo stesso ritmo.

Schema di tre fitness function architetturali: tempo di rilascio, accoppiamento moduli, latenza API, con soglie di salute e degradazione
Schema di tre fitness function architetturali: tempo di rilascio, accoppiamento moduli, latenza API, con soglie di salute e degradazione

Cosa sono le fitness function?

Le fitness function sono il cuore operativo dell'architettura evolutiva: metriche automatizzate che validano le proprietà architetturali nel tempo e impediscono al sistema di degradare mentre il team aggiunge funzionalità.

Non sono test funzionali. I test verificano che il codice faccia quello che deve fare. Le fitness function verificano che il sistema mantenga le proprietà architetturali che contano.

Tre esempi concreti:

  • Rilasciabilità: il tempo dalla modifica al rilascio in produzione resta sotto i 30 minuti. Se supera la soglia, qualcosa nell'architettura sta diventando un collo di bottiglia
  • Modularità: nessun modulo ha più di 3 dipendenze dirette. Se un modulo ne accumula di più, sta diventando un punto di accoppiamento che bloccherà il team
  • Performance: la latenza delle API principali resta sotto i 200 millisecondi al 95° percentile. Se degrada, l'architettura non regge il carico o ha introdotto complessità inutile

Le fitness function girano nella pipeline di integrazione continua, come i test; anziché verificare il comportamento del codice, verificano la salute del sistema.

Un esempio pratico per una PMI: una fitness function che misura quanti moduli devono essere toccati per aggiungere un nuovo metodo di pagamento. Se la risposta è "più di due", il confine tra i moduli non è nel posto giusto; saperlo prima di iniziare il lavoro cambia tutto.

Non servono strumenti sofisticati per iniziare. Un test che gira in CI e fallisce quando una soglia viene superata è già una fitness function.

Come si prendono le decisioni architetturali

Nell'architettura evolutiva, le decisioni non vengono prese tutte all'inizio. Vengono ritardate al momento in cui si ha più informazione e documentate in modo che chiunque possa capirle anche tra sei mesi.

Lo strumento per questo sono gli ADR (Architecture Decision Records): documenti leggeri, in formato testuale, che registrano ogni scelta architetturale con tre elementi.

  • Contesto: qual era la situazione, quali vincoli c'erano
  • Decisione: cosa abbiamo scelto e perché
  • Conseguenze: cosa cambia, cosa si guadagna, cosa si perde

Un esempio reale:

ADR-007: Separazione del modulo pagamenti
Contesto: Il modulo pagamenti è accoppiato al modulo ordini. Ogni modifica ai pagamenti richiede test dell'intero flusso ordini (4 ore). Il team pagamenti è bloccato dal team ordini per 3 rilasci su 5.
Decisione: Estrarre il modulo pagamenti con un'interfaccia API propria. Comunicazione asincrona via eventi con il modulo ordini.
Conseguenze: Il team pagamenti può rilasciare in autonomia. Il flusso ordini → pagamenti richiede un integration test dedicato. Complessità operativa aumentata (due servizi invece di uno).
Stato: Accettato, marzo 2026.

Gli ADR non sono burocrazia: sono la memoria delle decisioni. Quando qualcuno tra sei mesi chiede "perché usiamo gli eventi qui invece di una chiamata diretta?", la risposta è scritta, con il contesto che l'ha generata.

La pratica è semplice: un file Markdown per ogni decisione, numerato progressivamente, in una cartella del repository. Zero strumenti aggiuntivi.

Diagramma del pattern Strangler Fig: un modulo viene estratto dal monolite e isolato dietro un confine API, mentre il resto del sistema continua a funzionare
Diagramma del pattern Strangler Fig: un modulo viene estratto dal monolite e isolato dietro un confine API, mentre il resto del sistema continua a funzionare

Evoluzione incrementale vs riscrittura totale

La tentazione è sempre la stessa: "buttiamo tutto e ripartiamo da zero".

È una tentazione comprensibile. Il sistema vecchio è pieno di complessità accidentale, scelte che nessuno ricorda, codice che "nessuno vuole toccare". L'idea di un foglio bianco è attraente.

Le riscritture totali, però, falliscono con una frequenza impressionante. Il motivo: il sistema vecchio ha anni di logica di business codificata; casi limite, eccezioni, regole che nessuno ha documentato ma che il codice gestisce. Riscrivere significa reimplementare tutto questo da zero, spesso senza sapere che esiste. Nel frattempo il sistema vecchio continua a evolversi perché il business non si ferma.

Il risultato tipico: la riscrittura dura il doppio del previsto e costa il triplo.

L'alternativa è l'evoluzione incrementale. Il pattern più efficace è lo Strangler Fig (dal nome della pianta che cresce attorno a un albero fino a sostituirlo):

  1. Identificare il modulo con più attrito: quello che rallenta il team, genera più bug, blocca la delivery
  2. Definire un confine chiaro tra quel modulo e il resto del sistema (il cosiddetto anti-corruption layer)
  3. Costruire la nuova versione del modulo dietro quel confine
  4. Migrare il traffico gradualmente dalla vecchia alla nuova implementazione
  5. Quando la migrazione è completa, rimuovere il vecchio modulo

Il sistema resta in produzione per tutta la durata dell'operazione. La delivery non si ferma. Il rischio è contenuto perché si lavora su un modulo alla volta.

Per approfondire il tema nel contesto specifico dell'architettura: microservizi o monolite, ovvero quando ha senso estrarre un servizio e quando è meglio restare con un monolite ben strutturato.

L'architettura vincola l'organizzazione (e viceversa)

La legge di Conway dice che la struttura del software riflette la struttura dell'organizzazione che lo produce. Non è una teoria: è un'osservazione empirica confermata da decenni di pratica.

Se i team sono organizzati per tecnologia (un team frontend, un team backend, un team database), il software avrà tre strati accoppiati che non possono evolvere indipendentemente. Se i team sono organizzati per dominio di business (un team pagamenti, un team catalogo, un team logistica), il software tenderà naturalmente verso moduli indipendenti.

Far evolvere l'architettura senza toccare l'organizzazione non funziona.

Questo è il punto che la maggior parte delle iniziative di modernizzazione sottovaluta. Si investono mesi nel ridisegno architetturale, ma i team restano organizzati come prima; il software torna a riflettere la vecchia struttura nel giro di pochi sprint.

L'architettura evolutiva richiede che l'organizzazione evolva insieme al software:

  • Team con ownership chiara: ogni modulo ha un team responsabile, con autonomia decisionale sui confini del proprio dominio
  • Confini organizzativi allineati ai confini architetturali: se il software è diviso in moduli, i team devono essere divisi allo stesso modo
  • Comunicazione tra team gestita come comunicazione tra moduli: interfacce chiare, contratti espliciti, nessuna dipendenza implicita

Il change management nel software non è un progetto tecnico: è un progetto organizzativo guidato da persone con competenze tecniche profonde, perché le scelte architetturali vincolano le scelte organizzative e viceversa. È questo che facciamo con il servizio di innesto nell'organizzazione.

Come valutare se la tua architettura ha bisogno di evolvere

Non serve un audit formale per capire se l'architettura è un vincolo. Bastano cinque domande:

  1. Aggiungere una funzionalità richiede modifiche a più di 3 componenti? Se sì, i confini tra i moduli non sono nel posto giusto.
  2. Il tempo medio di rilascio supera le 2 settimane? Se sì, il processo di rilascio è troppo accoppiato o la pipeline è un collo di bottiglia architetturale.
  3. I team si bloccano a vicenda per dipendenze? Se sì, l'architettura non consente l'autonomia necessaria. (Approfondimento sulle dipendenze tra team)
  4. C'è codice che "nessuno vuole toccare"? Se sì, c'è un modulo critico senza ownership chiara: il punto più fragile del sistema.
  5. Le stime sono sistematicamente sbagliate? Se sì, la complessità accidentale dell'architettura rende imprevedibile il costo di ogni modifica.

Se la risposta è sì a 3 o più domande, l'architettura non è un supporto: è un vincolo attivo che rallenta il business.

Per misurare l'impatto concreto puoi usare il nostro calcolatore di impatto: stima quanto tempo e costo sta assorbendo l'attrito architetturale nella tua organizzazione.

Cosa fare concretamente

Non servono grandi piani; servono tre passi concreti.

Nei progetti di Intervento Mirato, l'architettura più difficile da evolvere non è mai quella tecnicamente più complessa: è quella in cui le decisioni architetturali esistono solo nella testa di 2-3 persone. Introdurre gli ADR (Architecture Decision Records) in un team che non li ha mai usati richiede meno di una settimana di lavoro — ma richiede che qualcuno faciliti le prime tre decisioni, perché il formato è semplice ma l'abitudine di documentare le scelte architetturali non lo è. L'effetto collaterale più utile degli ADR non è la documentazione: è che il team smette di discutere le stesse decisioni ogni sei mesi.

1. Definire 2-3 fitness function. Scegli le proprietà architetturali che contano di più per il tuo business: tempo di rilascio, accoppiamento tra moduli, performance. Scrivi un test che gira in CI e fallisce quando la soglia viene superata. Non serve un framework; un semplice script che misura e confronta è sufficiente.

2. Registrare le prossime 5 decisioni come ADR. Ogni volta che il team prende una decisione architetturale nelle prossime due settimane, scrivila. Contesto, decisione, conseguenze, stato. Cinque ADR bastano per creare l'abitudine. Dopo un mese non riuscirai più a farne a meno.

3. Identificare il modulo con più attrito e isolare i confini. Qual è il modulo che genera più rallentamento, più bug, più blocchi tra team? Quello è il primo candidato per l'evoluzione incrementale. Definisci un confine chiaro (un'interfaccia, un contratto API) tra quel modulo e il resto del sistema. Non devi riscriverlo subito: devi isolarlo. L'isolamento è il primo passo per poterlo far evolvere.

Se serve aiuto a capire dove partire, a identificare il modulo critico, a definire le fitness function giuste o a progettare i confini: è esattamente il tipo di lavoro che facciamo con l'intervento mirato e l'innesto nell'organizzazione.

L'architettura evolutiva non è una metodologia da adottare in blocco. È un cambio di prospettiva: smettere di progettare sistemi perfetti e iniziare a costruire sistemi che sanno cambiare. Le organizzazioni che lo fanno non hanno bisogno di modernizzare, perché non smettono mai di evolvere.

Per approfondire i temi trattati: Building Evolutionary Architectures di Neal Ford e Rebecca Parsons (O'Reilly, 2a ed. 2023), Team Topologies di Matthew Skelton e Manuel Pais (IT Revolution, 2019), e il Technology Radar di Thoughtworks. Sul nostro sito: l'hub sull'evoluzione architetturale, il costo del cambiamento nel software e perché la roadmap è sempre in ritardo.

Raccontaci dove sei bloccato

Prototipo fragile, legacy pesante o delivery imprevedibile – partiamo da lì