Migrazione verso stack attuali: prima l'analisi dei rischi, poi passi verificabili.
Non seguo più la manutenzione di progetti tecnicamente obsoleti, ma mi capita spesso di portarli su tecnologie attuali. È un lavoro che richiede una cura particolare: dietro un cambio di versione si nascondono spesso librerie da sostituire, architetture da ristrutturare e configurazioni da ripensare.
Analisi prima del codiceDipendenze, licenze e rischi valutati prima di decidere il percorso.
Un prodotto minimo, subitoPoche funzionalità, ma eseguibili, per verificare la nuova architettura.
Perché adesso
In ambienti con controlli di sicurezza stretti, una versione senza aggiornamenti diventa presto un problema.
Quando il supporto finisce non arrivano più correzioni di sicurezza. Dove ci sono vincoli di sicurezza e privacy, questo può bloccare un rilascio o emergere in un audit.
.NET 8 e .NET 9: fine del supporto il 10 novembre 2026. Microsoft indica come destinazione .NET 10, supportato fino a novembre 2028.
Angular 20: fine del supporto a lungo termine (LTS) il 28 novembre 2026. Ogni versione principale di Angular è supportata circa 18 mesi.
AngularJS: senza supporto dalla fine del 2021.
Cosa si migra davvero
01
La versione
Il caso più lineare: lo stesso prodotto, in una versione più recente.
Anche qui il salto può essere grande. Da AngularJS ad Angular si tratta in pratica di riscrivere l'interfaccia; tra versioni di Angular si procede una versione principale alla volta, verificando a ogni passo le modifiche incompatibili.
Percorsi tipici
AngularJS → Angular
Angular datato → Angular attuale
.NET Framework → .NET attuale
Versioni di .NET fuori supporto → .NET 10
02
Le librerie
Spesso vanno riscritte parti basate su librerie obsolete, soprattutto lato client ma anche lato server.
Molte librerie JavaScript nascondono dietro un cambio di versione un pesante re-engineering. Lato server, alcune hanno cambiato licenza: è il caso delle applicazioni che usano iTextSharp 4.1.6, l'ultima versione con licenza LGPL. Le versioni successive sono disponibili solo con licenza AGPL o commerciale, e per .NET attuale esiste solo un porting non ufficiale della 4.1.6.
Per ogni componente
Come si integra nel resto dell'architettura
Licenza della versione compatibile
Aggiornarlo, sostituirlo o riscrivere la parte che lo usa
03
L'architettura
Adeguarsi agli standard attuali significa ristrutturare, non solo ricompilare.
Molte applicazioni .NET Framework usano pattern superati, come classi statiche e dipendenze create a mano, mentre il .NET attuale si basa sulla dependency injection. Alcune tecnologie, poi, non hanno un equivalente diretto.
Ho migrato applicazioni Web Forms verso web app moderne, convertendo il code-behind in Web API, e in un caso verso Blazor, per restare su uno stack interamente Microsoft. Allo stesso modo ho portato servizi WCF su API REST: qui la parte delicata è spesso il formato dei dati, perché i client davano per scontata la serializzazione di WCF.
Dalla mia esperienza
Web Forms → web app con Web API
Web Forms → Blazor
WCF → API REST, compatibili con i client esistenti
Codice statico → dependency injection
04
Il passaggio al cloud
Da un server tradizionale al cloud, la migrazione non è solo applicativa.
Configurazioni, architettura, permessi e accesso ai dati vanno analizzati e ripensati per arrivare a una soluzione pronta per il cloud. Sono gli elementi che ho incontrato nelle migrazioni di questo tipo.
Cosa va ripensato
Configurazioni e segreti, dai file locali a servizi dedicati come Key Vault
Permessi, dagli account Windows alle identità gestite
Stored procedure e funzionalità del database non disponibili nel servizio gestito, come job pianificati, query tra database e assembly CLR
File su disco, sessioni in memoria e attività pianificate, da spostare su storage, cache distribuita e servizi come Azure Functions
Il metodo: rischi prima, poi passi graduali
01
Analisi a priori
Inventario di dipendenze, librerie, licenze e integrazioni. Per ognuna si decide se aggiornarla, sostituirla o riscriverla, e quali ristrutturazioni servono.
02
Prodotto minimo
Le funzionalità necessarie a verificare che la nuova architettura regga, in esecuzione il prima possibile.
03
Migrazione per funzionalità
Un piano passo per passo, con test di regressione a ogni passaggio.
04
Stakeholder coinvolti presto
Chi usa il sistema comincia a provare le parti migrate man mano che sono pronte.
05
Vecchio e nuovo in parallelo
Quando possibile, i due applicativi lavorano affiancati. Da AngularJS ad Angular gli utenti li hanno usati insieme, per confrontarli e per le funzioni non ancora migrate.
Ogni migrazione è un percorso unico: dipende da dove si parte, da dove si vuole arrivare e da tutti questi fattori. Quello che non cambia è il metodo: rischi analizzati prima, passi graduali e verificabili.
L'analisi iniziale può essere anche una prestazione a sé. Più spesso, con i clienti diretti, è il primo passo di un percorso che arriva fino all'applicazione migrata e in produzione, senza che il cliente debba portarsi lo sviluppo in casa.
Coding agent e migrazioni
Nelle migrazioni uso i coding agent con il metodo spec-driven: partendo dal codice esistente stabilisco la sequenza dei passi, e alterno i test eseguiti dall'agente con prove dirette.
L'agente è meno affidabile proprio sul codice legacy, ed è lì che l'analisi a priori serve di più. Anche Microsoft ha sostituito il suo strumento di aggiornamento, Upgrade Assistant, con un agente basato sull'IA.