L’evoluzione di un software è inevitabile. Nessuna applicazione è perfetta al primo rilascio e di conseguenza capita spesso che i team di sviluppo debbano riscrivere analisi, riprendere il codice in mano, testarlo e collaudarlo prima della nuova release. Quindi, mai come oggi, la manutenzione del software può essere considerata un’operazione di ordinaria amministrazione. Una voce di costo da mettere necessariamente a budget.
Ma quanto pesano i costi di manutenzione nel ciclo di vita di un software? E soprattutto, è possibile stimarli in maniera attendibile? Dai primi anni 2000 ad oggi, non sono mancate ricerche e indagini che hanno provato a rispondere al cruccio periodico di ogni Project Manager.
L’incidenza dei costi di manutenzione sul Total Cost of Ownership (TCO) di un progetto software è quasi raddoppiata negli ultimi 50 anni: siamo passati dal 50% degli anni ’70 al 90% dell’ultimo decennio, secondo una ricerca condotta da Floris e Harald. Altri studi, seppur con percentuali differenti, confermano questa tendenza. Nella ricerca Critical Success Factors and Cost Drivers, IEEE Transactions on Software Engineering, l’ingegnere del software Barry Boehm assegna a sforzi e costi sostenuti per la manutenzione del software il 67% del budget complessivo. In entrambi i casi, il riscontro quantitativo lascia pochi spazi a dubbi sul peso delle attività di manutenzione sul TCO.
Benché sia oggi possibile inquadrare in una casistica ben definita i diversi tipi di interventi manutentivi – correttiva, adattativa, perfettiva, preventiva e di emergenza – risulta ancora ardua un’analisi preventiva su come e quanto la manutenzione inciderà sui costi finali di produzione software. Troppi elementi disomogenei concorrono a definire gli sforzi e i tempi necessari per portare a termine release definitive. Il team di sviluppo non può prevedere quali modifiche dovrà effettuare su un software già sviluppato. È pur vero però che il metodo, gli strumenti e le condizioni di lavoro di sviluppatori e analisti influiscono sugli effort necessari al nuovo rilascio, con conseguenti ripercussioni sui costi da sostenere.
Perché effettuare la manutenzione di un software: cause e tipologie di interventi
In uno scenario idilliaco il codice rilasciato è privo di bug al primissimo colpo, le esigenze del cliente non mutano nel tempo e il mercato di device e sistemi operativi è completamente immobile. Quasi idilliaco, perché abbiamo tralasciato altre variabili di contesto che possono indurre l’owner di un’applicazione a valutare un intervento manutentivo: novità o variazioni legislative, vulnerabilità del sistema o canoni di esperienze utente evolute nel tempo possono spingere anche l’applicazione più performante sul baratro dell’obsolescenza.
A seconda delle cause scatenanti, possiamo individuare 5 diverse tipologie di interventi di manutenzione.
Manutenzione correttiva
Bug fixing puro. È l’attività di manutenzione che interviene su malfunzionamenti e comportamenti inattesi, frutto di errori di logica o di scrittura del codice.
Manutenzione adattativa
Modifiche necessarie per adattare il software ad eventuali cambiamenti sia del contesto operativo (hardware, software di base, interfacce) che ambientale (organizzazione e legislazione). Si rendono imprescindibili tutte le volte in cui le architetture di base diventano obsolete e bisogna obbligatoriamente aggiornarle.
Manutenzione perfettiva
Le classiche Change Request (CR): interventi anche profondi di riprogettazione e riscrittura del software necessari per venire incontro a nuovi requisiti, funzionali e non, come per esempio nuove esigenze del cliente.
Manutenzione preventiva
Correzioni, adattamenti e migliorie per snellire e affinare il progetto, semplificare il codice e rendere più agevoli ulteriori interventi manutentivi.
Manutenzione di emergenza
Manutenzione correttiva non programmata, necessaria in seguito a gravi bug o vulnerabilità che compromettono funzionalità e sicurezza del sistema.
Cosa influisce sui costi di manutenzione del software
Ogni sviluppatore, al di là della canonica pianificazione di evolutive e rilasci, dovrebbe avere a propria disposizione una sfera di cristallo che lo supporti costantemente nella gestione delle imprevedibilità che influenzano il ciclo di vita di un’applicazione. In attesa della pubblicazione di un tool Nostradamus, la soluzione più efficace, per non trasformare ogni intervento manutentivo in un salasso di risorse, è quella di perfezionare il processo di produzione.
Sono 6 le categorie di fattori che possono influire sui costi di manutenzione del software. Vediamole nel dettaglio.
Costi derivanti dalle caratteristiche intrinseche dell’applicazione
I costi di manutenzione di un software sono direttamente proporzionali alla sua complessità. Più classi, funzioni e script sono interconnessi fra loro, più la logica di business si discosta dalle funzionalità CRUD di base, maggiore è lo sforzo richiesto al team per attività di manutenzione. Il rischio di scrivere righe di codice che impattano negativamente sulle parti già collaudate e rilasciate, è dietro l’angolo.
Costi derivanti dalle caratteristiche delle macchine di sviluppo
Disporre di computer meno performanti rallenta le attività di sviluppo e di manutenzione del software. Dover attendere più di 30 secondi per un deploy o un debug fa lievitare il tempo medio per task e, nei casi più gravi, influisce negativamente sulla concentrazione e sulla performance degli sviluppatori.
Costi derivanti dai requisiti del team di sviluppo
L’analisi è un nodo importante di ogni attività di manutenzione. Fotografare perfettamente l’as is e indicare agli sviluppatori la strada più semplice per raggiungere il to be è un buon punto di partenza. Viceversa, si corre il rischio di procedere per tentativi, sprecando energie e tempo. La seniority e la buona conoscenza dell’applicazione da parte degli sviluppatori possono rivelarsi un vantaggio per contenere i costi di manutenzione.
D’altro canto, basta osservare cosa succede quando nuovi sviluppatori entrano in azienda. L’avvicendamento dei programmatori fa sì che i nuovi arrivati si ritrovino spesso a dover lavorare su progetti già esistenti e a dover mettere mano su tanto codice a loro sconosciuto: in questo caso i costi di manutenzione rischiano di aumentare in modo considerevole. A meno che, ovviamente, non si disponga di strumenti e piattaforme di sviluppo in grado di ridurre drasticamente la porzione di codice da andare a manutenere.
Costi derivanti dalle caratteristiche del progetto
L’uso di approcci di programmazione moderni e di tool di sviluppo in grado di sostenere la comunicazione interna al team può ridurre drasticamente tempi e costi di manutenzione. Viceversa, ogni incomprensione, così come ogni porzione di codice non opportunamente commentato, non ottimizzato o ripetuto un certo numero di volte all’interno del progetto causa rallentamenti potenzialmente onerosi.
Costi derivanti dalla gestione del progetto
Tutto ciò che gira intorno al codice può trasformarsi in un buco nero che divora tempo e risorse. Gestione del gruppo, cura della documentazione tecnica e passaggio di conoscenze – o Knowledge Transfer (KT) – fra team e sviluppatori sulle caratteristiche del software hanno ripercussioni importanti sulla conduzione del progetto, soprattutto nelle delicate fasi di manutenzione.
Costi derivanti dall’infrastruttura di rete
Backup e sicurezza possono salvare progetti da errori critici o gravi vulnerabilità dei sistemi. La perdita di dati o l’attacco di un virus sono minacce in grado di compromettere pesantemente la gestione di un progetto software.
Come tenere sotto controllo i costi di manutenzione del software
Le Software Factory, per tenere sotto controllo i costi di manutenzione del software ed essere competitive sul mercato, dovrebbero concentrarsi su alcuni fattori in particolare:
- utilizzare delle tecniche adeguate per lo sviluppo del software;
- poter contare su un team preparato e competente che sappia gestire al meglio ogni fase del progetto;
- avere buone capacità di visione futura.
Ancora più importante sarà disporre di piattaforme di sviluppo in grado di ridurre drasticamente i costi di manutenzione, con particolare riguardo a quelli adattativi.
Le nostre piattaforme di sviluppo (Instant Developer Foundation e Instant Developer Cloud) riescono a farlo efficacemente poiché sono costruite intorno a ciò che definiamo programmazione relazionale: una nostra declinazione della programmazione model driven grazie alla quale l’intero progetto software viene memorizzato in un grafo di relazioni e dipendenze invece che in file di testo.
Sei pronto a fornire al tuo team uno strumento che esalti le sue capacità di analisi e sviluppo? Dai un’occhiata ai vantaggi di Instant Developer per gli imprenditori, per i Project Manager e per gli sviluppatori nella pagina dedicata sul nostro sito.
C’mon, let’s code.