Luca Morelli
Analista programmatore
Team lead

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

  1. Analisi a priori

    Inventario di dipendenze, librerie, licenze e integrazioni. Per ognuna si decide se aggiornarla, sostituirla o riscriverla, e quali ristrutturazioni servono.

  2. Prodotto minimo

    Le funzionalità necessarie a verificare che la nuova architettura regga, in esecuzione il prima possibile.

  3. Migrazione per funzionalità

    Un piano passo per passo, con test di regressione a ogni passaggio.

  4. Stakeholder coinvolti presto

    Chi usa il sistema comincia a provare le parti migrate man mano che sono pronte.

  5. 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.

Come uso i coding agent nelle migrazioni

Casi collegati

I casi pubblicati sono una selezione: le altre migrazioni descritte in questa pagina vengono da progetti non riportati sul sito.

Avete un'applicazione da portare su .NET o Angular attuali?

Curriculum dettagliato e referenze su richiesta.