App e sistemi
Riscrivere da zero un intero sistema legacy sembra una ripartenza pulita, ma il vecchio codice custodisce regole e correzioni accumulate negli anni, che spesso nessuno ha messo per iscritto. Analizziamo le opzioni che vanno dalla stabilizzazione alla sostituzione graduale, la gestione dei dati durante la transizione, l’ordine dei passi e i rischi che si possono misurare.
Molte aziende sul mercato da diversi anni hanno un sistema di cui, in riunione, si parla con cautela. Su di esso girano la fatturazione, il magazzino o la produzione. È passato per molte mani, pochi lo conoscono nel dettaglio e ogni modifica è lenta e costosa.
Quando finalmente arriva il momento di decidere, sul tavolo compare di norma una frase: riscriviamo tutto da zero. Suona allettante, ma è rischioso: il vecchio codice è un archivio di regole di business, eccezioni e correzioni accumulate negli anni, che spesso nessuno ha messo per iscritto, e chi lo butta via in un colpo solo butta via anche questa conoscenza. Eppure la modernizzazione dei sistemi legacy non si riduce all’alternativa tra «lasciare com’è» e «riscrivere» e, per un sistema critico di grandi dimensioni, di solito è più sicuro sostituirlo per parti senza interrompere l’operatività.
Michael Feathers, autore del libro Working Effectively with Legacy Code, definisce il codice legacy semplicemente come codice senza test. Un sistema legacy, quindi, non si riconosce dall’età, ma dalla possibilità di modificarlo in sicurezza. I sintomi tipici:
Sono tutte forme di debito tecnico: l’articolo Un’azienda è un solo prodotto lo affronta come principio che riguarda l’intera organizzazione.
Vale anche per lo Stato. In un rapporto del luglio 2025, l’ente di controllo statunitense GAO ha indicato gli 11 sistemi federali più critici che necessitano di modernizzazione. Otto di questi utilizzano linguaggi obsoleti come COBOL e assembler e sette, secondo le agenzie, funzionano con vulnerabilità note che senza modernizzazione non si possono eliminare.
Il big bang rewrite consiste nel costruire un nuovo sistema da zero e nel far passare su di esso l’intera azienda in un colpo solo. Promette una ripartenza pulita e una tecnologia moderna. Joel Spolsky, in un saggio del 2000, aggiunge un motivo meno lusinghiero: i programmatori considerano il vecchio codice un pasticcio soprattutto perché leggere codice è più difficile che scriverlo. Definisce la riscrittura del codice da zero il peggior errore strategico che un’azienda di software possa commettere. Come esempio cita Netscape: la versione 6.0 è arrivata alla prima beta pubblica quasi tre anni dopo la versione 4.0 e nel frattempo la quota di mercato dell’azienda calava bruscamente.
È un’opinione netta, ma i meccanismi concreti del fallimento si possono identificare:
Il nome strangler fig pattern deriva da una metafora di Martin Fowler: nel 2001, nelle foreste pluviali del Queensland, ha osservato i fichi strangolatori, che avvolgono progressivamente l’albero ospite fino a sostituirlo. Allo stesso modo il nuovo sistema non nasce al posto del vecchio, ma al suo fianco. Ne prende in carico le funzioni una dopo l’altra, finché il vecchio non può essere spento.
La documentazione di Microsoft ne descrive il meccanismo: tra gli utenti e i due sistemi si inserisce una facciata, cioè un intermediario che sposta gradualmente le richieste dal vecchio sistema al nuovo, ad esempio, in una prima fase, solo quelle per il calcolo dei preventivi. Gli utenti non sanno nulla della migrazione. Secondo Feathers, il vecchio sistema resta come riserva in caso di problemi.
Fowler ne ammette il costo: un’architettura transitoria per far funzionare in parallelo i due sistemi, destinata a scomparire a lavoro concluso. A suo avviso, il rischio più basso e il valore ottenuto prima lo compensano, perché le parti sostituite sono piccole. Avverte però che, senza un cambiamento della cultura e del management, anche il nuovo sistema finirà in un pasticcio simile.
Il codice si può sostituire un pezzo alla volta, ma durante la transizione i dati servono a entrambi i sistemi contemporaneamente. La migrazione dei dati, cioè il trasferimento delle informazioni dalla vecchia struttura alla nuova, non è una semplice copia. I ricercatori del Trinity College Dublin avvertono che i dati dei sistemi legacy tendono a essere di scarsa qualità, vanno mappati sulla nuova struttura e in molti casi anche ripuliti. In pratica si tratta, ad esempio, di duplicati, di campi usati per altri scopi e di valori che solo il vecchio codice sa interpretare.
Microsoft raccomanda di separare i dati gradualmente, un’area alla volta: popolare il nuovo database con un caricamento iniziale, propagare gli aggiornamenti successivi con la tecnica del change data capture, cioè intercettando le modifiche nel vecchio database, verificare che i dati coincidano prima del passaggio ed eliminare i vecchi oggetti solo dopo la validazione del nuovo sistema. Fino ad allora si può tornare indietro, dopo diventa molto più complesso e rischioso.
Durante la transizione deve essere chiaro, per ogni tipo di dato, quale sistema rappresenta l’unica fonte di verità. Se l’indirizzo di un cliente si può modificare in entrambi i sistemi, c’è il rischio che ciascuno ne riporti uno diverso. La nostra conclusione pratica: un determinato dato le persone devono modificarlo sempre in un solo sistema e gli altri sistemi si limitano a riprenderlo da lì. Al ruolo più ampio dei dati è dedicato l’articolo I vostri dati sono il vantaggio.
Feathers fa notare che le persone hanno in testa un’idea di ciò che il sistema fa e dimenticano di andare a vedere che cosa fa in realtà. Sono utili tre fonti:
Gli autori di Thoughtworks raccontano di un team che stava testando in produzione la sostituzione di un middleware di integrazione, cioè del software che collega gli altri sistemi. Poco dopo, i report direzionali critici hanno smesso di quadrare. Al termine di una lunga indagine si è scoperto che il database del middleware veniva replicato in un data warehouse da cui i report attingevano i dati. A risolvere la situazione è stato solo un meccanismo temporaneo che integrava nel data warehouse i dati mancanti.
La migrazione non deve essere il primo passo. Anche qui applichiamo l’ordine Remove, Simplify, Automate, Augment: prima eliminare, poi semplificare e solo dopo automatizzare ed estendere. Gli autori di Thoughtworks osservano che la maggior parte dei sistemi legacy, col tempo, si gonfia di funzionalità che nessuno usa, e citano un rapporto dello Standish Group del 2014 secondo cui si tratta del 50% delle funzionalità. Per un sistema specifico è solo un dato indicativo: la realtà la mostrano i log. Una funzionalità eliminata non va analizzata, né migrata, né testata, e i workaround per aggirare i limiti del vecchio sistema conviene semplificarli durante il trasferimento, non copiarli.
La prima parte da sostituire dovrebbe creare un disagio tangibile, ad esempio frenare l’attività commerciale, ed essere allo stesso tempo relativamente separata dal nucleo. Feathers consiglia di concentrarsi sulle parti che cresceranno e che nel contempo creano difficoltà e, per deviare le richieste, di individuare le «cuciture» (seam), come chiama i punti in cui un comportamento può essere sostituito da un altro.
La sostituzione graduale non elimina il rischio, lo suddivide in parti più piccole e misurabili. Il caso opposto emerge dalla decisione del regolatore britannico FCA del 20 dicembre 2022. Nel fine settimana dal 20 al 22 aprile 2018, la banca TSB ha trasferito la maggior parte dell’operatività e dei dati dei clienti su una piattaforma nuova, non ancora collaudata. Sono seguiti gravi problemi con l’internet banking e il mobile banking, oltre che con i pagamenti con carta, ed entro il 7 aprile 2019 la banca aveva ricevuto 225.492 reclami. La FCA ha riscontrato carenze nella pianificazione, nei test, nella gestione dei rischi e nella supervisione del fornitore esterno, ha sottolineato che dopo l’avvio la banca non aveva di fatto la possibilità di tornare alla piattaforma originaria e le ha irrogato una sanzione di 29,75 milioni di GBP.
Vicent Martí di GitHub ha descritto nel 2015 una strada più sicura. Il team stava sostituendo una delle parti più critiche del codice direttamente in produzione: il vecchio e il nuovo codice giravano in parallelo, i risultati venivano confrontati e l’utente riceveva sempre il risultato del vecchio. L’esperimento è partito dall’1% delle richieste e si è esteso gradualmente, fino a girare per 24 ore sul 100% del traffico senza discrepanze. Il confronto ha inoltre fatto emergere 2 bug gravi nella soluzione originale, che per anni nessuno aveva individuato.
Che cosa monitorare, quindi:
Riscrivere tutto da capo non è sempre un errore. Feathers lo descrive come una decisione di business legata al ritorno dell’investimento, ma lui stesso prova prima con il refactoring e ricorda che nella maggior parte dei casi non è necessario riscrivere l’intero sistema e che le riscritture mirate di singole parti sono spesso molto efficaci. Microsoft indica quando la sostituzione graduale non è adatta: il sistema è piccolo e si può sostituire facilmente per intero, non si ha accesso al codice sorgente oppure la soluzione originaria va dismessa in tempi rapidi. Gli autori di Thoughtworks ammettono la replica fedele delle vecchie funzionalità per i sistemi con una specifica ben nota, in cui a un dato input deve corrispondere un dato output, ma considerano questi casi eccezionali.
La nostra opinione: una riscrittura è difendibile anche quando il business è cambiato al punto che il vecchio sistema supporta un modo di lavorare che l’azienda sta abbandonando. In quel caso, però, si tratta di un nuovo prodotto con nuovi requisiti, non di una copia delle vecchie funzionalità.
Per questo la modernizzazione dei sistemi legacy non comincia dalla scelta della tecnologia, ma dal capire quale lavoro svolge il sistema per l’azienda, quali sue parti si usano davvero e dove nasce esattamente il problema. Chi salta questa diagnosi sceglie alla cieca tra riscrittura e refactoring.
Prototipo gratuito
Descriveteci il vostro progetto e in pochi giorni terrete in mano un prototipo funzionante costruito sui vostri dati reali. Lo costruiamo a spese nostre: a convincervi dev'essere il lavoro, non una presentazione.
Senza pagamento e senza impegno. Pagate solo quando decidete di proseguire.
Consulenza gratuita
Scegliete un orario e raccontateci come lavora oggi la vostra azienda. Vi mostreremo i tre punti in cui perdete più tempo e cosa possiamo prendere in carico per primo. Senza presentazioni e senza impegno.

Juro
jur0.com
Un sito, un'app, un sistema AI o un'automazione. Descrivete in due frasi cosa state affrontando e vi ricontatto entro 24 ore con una proposta concreta. Costruiamo qualsiasi cosa faccia risparmiare tempo alla vostra azienda.
Oppure direttamente: WhatsApp · juro@jur0.com