Resumos
Apontamentos universitários em formato Markdown do Obsidian.
Technical Debt
download Descarregar MDCon questo termine ci riferiamo all'insieme di scorciatoie o agli aspetti negativi che infettano il nostro codice, come ad esempio:
- design inadatto (cattivo): un design che una volta aveva senso ma non ha più;
- difetti: problemi noti nel software per i quali non abbiamo ancora investito tempo nella rimozione;
- copertura dei test insufficiente: aree in cui sappiamo che dovremmo eseguire più test, ma non lo facciamo;
- test manuali eccessivi: test manuali quando dovremmo davvero avere test automatizzati;
- scarsa integrazione e gestione dei rilasci: esecuzione di queste attività in modo dispendioso in termini di tempo e soggetto a errori;
- mancanza di esperienza con la piattaforma: ad esempio applicazioni scritte in COBOL ma non abbiamo molti programmatori esperti;
e molti altri, perché il termine debito tecnico oggi è davvero usato come segnaposto per un problema multidimensionale.
Talvolta, contrarre questi debiti è inevitabile: inevitabili debiti tecnici maturano indipendentemente dalle misure preventive che adottiamo. Il debito tecnico ingenuo deriva dall'immaturità dei membri del team, dell'organizzazione e/o dei processi. Il debito strategico è qualcosa che potremmo scegliere di assumere quando i benefici derivanti dall'accumulo del debito superano sostanzialmente il costo del debito. Ci sono numerosi punti:
- pressione per rispettare una scadenza: provoca debito tecnico sia strategico che ingenuo;
- tentativo di accelerare la velocità: al team che esegue il lavoro viene detto di accelerare la propria velocità per raggiungere la data di rilascio desiderata;
- mito, meno test possono accelerare la velocità: il mito è che il test sia un sovraccarico aggiuntivo. Ridurre i test aumenterà il debito e ci farà rallentare;
- il debito si accumula rapidamente in aggiunta al debito tecnico esistente: il debito tecnico inizia a crescere, iniziano a manifestarsi conseguenze economicamente dannose.
Non sempre contrarre un debito gioca a nostro svantaggio, anzi questo può avere un utilizzo strategico. Basti pensare all'esigenza di accelerare determinate parti dello sviluppo per raggiungere degli obiettivi immediati.
Ciononostante ci sono alcune ripercussioni:
- il debito cresce in maniera imprevedibile e non lineare. Si arriva ad un punto, comunemente chiamato "tipping point", in cui anche la modifica più insignificante potrebbe compromettere tutto. Questo comporta un innalzamento del rischio di business;
- aumento dei tempi di consegna, naturalmente è necessario "ripagare" questi debiti e automaticamente si va ad intaccare lo scheduling previsto;
- aumento dei bug e di difetti del codice con conseguenti problemi di manutenibilità;
- aumento dei costi di sviluppo e di supporto;
- atrofizzazione del prodotto e diminuzione della prevedibilità: per risolvere i problemi è necessario diminuire il numero di nuove feature rilasciate. Oltreché avere numerosi debiti aumenta il margine di incertezza;
- diminuzione dell'interesse del customer, diminuzione delle performance, e frustrazione universale: andando a rallentare l'intera catena di lavoro gli stessi componenti del team oltre che il customer risultano scontenti e non motivati a portare avanti il progetto.
Far fronte al debito
Per far fronte al debito contratto ci sono un insieme di strategie, tra cui:
- utilizzare le good-practice: sfruttare il test driven development, refactoring (regola del boy-scout, cioè miglioro il codice ogni volta che ci metto mano). Migliorare la definizione di completato;
- cercare di darne una rappresentazione tangibile: generalmente si realizza andando a realizzare un Tecnical Debt Backlog associato al product backlog.
Inoltre non tutto il debito contratto deve essere necessariamente ripagato. Per esempio, nello sviluppo dei prototipi o di prodotti che hanno vita breve, è inutile andare a pagarne i debiti poiché sono stati concepiti per essere "usa e getta".
Sarebbe opportuno inoltre:
- limitare il numero di grandi investimenti e quindi andare a pagare il debito in maniera incrementale;
- cercare di focalizzarsi sui debiti che comportano un alto rischio o un alto interesse;
- ripagare il debito durante lo sviluppo di feature di valore per il customer.
I vantaggi del rimborso durante l'esecuzione del lavoro prezioso del cliente sono:
- allinea il lavoro di riduzione del debito con il lavoro prezioso per il cliente a cui il proprietario del prodotto può dare la giusta priorità;
- rende chiaro a tutti i membri del team di sviluppo che la riduzione del debito tecnico è una responsabilità condivisa e non qualcosa da rinviare e delegare a qualcuno o qualche altro team per ripulire;
- rafforza le capacità tecniche di prevenzione e rimozione dei debiti perché tutti possono esercitarle in ogni momento;
- ci aiuta a identificare le aree ad alto interesse su cui concentrare il servizio tecnico del debito;
- evita lo spreco di ripagare il debito tecnico in aree in cui davvero non è necessario.