Summaries

University notes in Markdown format from Obsidian.

Technical Debt

download Download MD

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