Il costo totale di proprietà di un software (TCO)

Approcci a confronto
Robert Cecil Martin (classe 1952) opera come consulente a livello internazionale ed è autore di numerosi libri nei settori dell'ingegneria del software e della programmazione a oggetti. È uno dei padri delle metodologie agili, e ha introdotto fra l'altro i cinque principi SOLID della programmazione a oggetti.
Nel suo bestseller “Clean code” (ok, bestseller nella sezione “libri di informatica per nerd”), esprime una verità che ogni sviluppatore con almeno 2-3 anni di esperienza molto probabilmente ha già provato sul campo:
Nel corso di un anno o due, i team che inizialmente procedevano molto velocemente in un progetto possono trovarsi a muoversi a passo di lumaca. Ogni modifica che fanno al codice lo rompe in altre due o tre parti. Nessuna modifica è banale. Ogni aggiunta o modifica al sistema richiede che i grovigli, le torsioni e i nodi vengano "compresi" affinché possano essere aggiunti ulteriori grovigli, torsioni e nodi. Col tempo, il disordine diventa così grande, così profondo e così alto che non possono ripulirlo. Non c'è proprio modo.
Quello che Robert C. Martin descrive è quello che viene comunemente chiamato debito tecnico. Man mano che il debito tecnico si accumula diventa sempre più difficile e costoso apportare modifiche al codice.
Questo problema in parte è fisiologico: un software che nel tempo diventa più complesso e ricco di funzionalità, spesso in relazione tra loro diventa anche più “delicato” ed è necessaria più attenzione nel modificarlo.
In gran parte però il problema è mitigabile e ci sono diverse strategie che i team di sviluppo possono adottare per farlo. Prima di entrare nel dettaglio delle strategie bisogna però chiarire subito che queste hanno un costo, perché richiedono delle procedure e un impegno diversi rispetto allo scrivere codice per risolvere il problema attuale nel minor tempo possibile (ma creando debito tecnico).
Possiamo quindi identificare due diversi approcci:
- Approccio Agile o basato sulla qualità: questo approccio enfatizza la flessibilità, la manutenibilità, e la qualità del codice fin dall'inizio. Si basa sui principi di "codice pulito", pratiche agili, integrazione continua, e rifattorizzazione regolare per adattarsi rapidamente ai cambiamenti mantenendo allo stesso tempo un alto standard di qualità del software. Questo metodo riconosce l'importanza del debito tecnico e lo gestisce attivamente per evitare che diventi ingombrante;
- Approccio basato sul debito tecnico: questo approccio tende a favorire la velocità di sviluppo nel breve termine a discapito della qualità e della manutenibilità del codice a lungo termine. In questo contesto, i principi di buona ingegneria del software possono essere trascurati o completamente ignorati, portando a un accumulo di debito tecnico. Sebbene possa sembrare vantaggioso per raggiungere rapidamente obiettivi a breve termine, questo approccio può portare a problemi significativi di manutenibilità e scalabilità nel tempo.
Il grafico sopra, seppur in termini generici, mostra come sviluppare software con debito tecnico sia nel breve periodo molto più economico che applicare processi e procedure Agili. Questo vantaggio economico però svanisce presto nel tempo e, a un certo punto, il software sviluppato secondo i principi Agile diventa più economico da sviluppare e può avere una fase di sviluppo attivo (il periodo in cui un software è ancora in fase di evoluzione attiva, con l'aggiunta regolare di nuove funzionalità, miglioramenti e correzioni di bug) molto più lungo e raggiungere quindi la sua End-of-Life (EOL) molto dopo rispetto a un software sviluppato con debito tecnico.
Le attività messe in atto da Overflo per mantenere basso il debito tecnico dei propri progetti sono:
In Overflo ci distinguiamo per la nostra capacità di interpretare e trasformare le necessità operative in soluzioni tecnologiche efficienti e innovative. La nostra metodologia per lo sviluppo di un software customizzato può essere descritta come un approccio olistico e iterativo, ispirato ai principi SCRUM, basato sulla trasparenza e focalizzato sulla creazione di soluzioni tecnologiche efficienti e innovative che si adattano dinamicamente alle esigenze del cliente.
- Rifattorizzazione: questa è la pratica di ristrutturare il codice esistente senza cambiarne il comportamento esterno, per migliorarne la leggibilità, la manutenibilità e la flessibilità. La rifattorizzazione ci aiuta a eliminare i grovigli, le torsioni e i nodi nel codice;
- Codice pulito: adottare principi e pratiche di “codice pulito” fin dall'inizio del progetto ci aiuta a prevenire l'accumulo di debito tecnico. Ciò include la scrittura di codice semplice, chiaro e conciso, l'uso di nomi significativi per variabili e metodi, e la suddivisione di compiti complessi in funzioni più piccole e gestibili;
- Revisione del codice: le revisioni regolari del codice tra i membri del team ci aiutano a identificare i problemi prima che diventino ingovernabili. Questo include la verifica della qualità del codice, la coerenza con gli standard interni e la rilevazione precoce di potenziali bug;
- Test automatizzati: implementare un framework di test automatizzati ci aiuta a ridurre il rischio di introduzione di errori durante le modifiche e che le modifiche stesse non rompano le funzionalità esistenti.
- Gestione del debito tecnico: riconoscere e tracciare il debito tecnico come parte del processo di gestione del progetto. Ciò include la pianificazione di tempo per la rifattorizzazione e la correzione dei debiti tecnici nelle iterazioni di sviluppo. Questo comprende anche l’aggiornamento delle tecnologie e delle dipendenze software;
- Formazione continua: mantenere il team aggiornato sulle migliori pratiche, gli strumenti e i linguaggi di programmazione ci aiuta a prevenire l'adozione di pratiche obsolete o inefficienti;
- Limitare le funzionalità: a volte, i committenti possono cadere nella trappola di aggiungere troppi "orpelli" che non sono strettamente necessari. Valutare attentamente il valore aggiunto di ogni nuova funzionalità può aiutare a mantenere il codice più pulito e gestibile.
Come abbiamo visto, pur essendo allettante per i guadagni immediati in termini di velocità, l'approccio basato sul debito tecnico può rivelarsi meno vantaggioso nel lungo periodo. Le pratiche Agili, al contrario, garantiscono una manutenzione più efficiente e un'estensione della vita operativa del software, contribuendo significativamente al ritorno sull'investimento.