Mokabyte

Dal 1996, architetture, metodologie, sviluppo software

  • Argomenti
    • Programmazione & Linguaggi
      • Java
      • DataBase & elaborazione dei dati
      • Frameworks & Tools
      • Processi di sviluppo
    • Architetture dei sistemi
      • Sicurezza informatica
      • DevOps
    • Project Management
      • Organizzazione aziendale
      • HR
      • Soft skills
    • Lean/Agile
      • Scrum
      • Teoria della complessità
      • Apprendimento & Serious Gaming
    • Internet & Digital
      • Cultura & Società
      • Conferenze & Reportage
      • Marketing & eCommerce
    • Hardware & Tecnologia
      • Intelligenza artificiale
      • UX design & Grafica
  • Ultimo numero
  • Archivio
    • Archivio dal 2006 ad oggi
    • Il primo sito web – 1996-2005
  • Chi siamo
  • Ventennale
  • Libri
  • Contatti
  • Argomenti
    • Programmazione & Linguaggi
      • Java
      • DataBase & elaborazione dei dati
      • Frameworks & Tools
      • Processi di sviluppo
    • Architetture dei sistemi
      • Sicurezza informatica
      • DevOps
    • Project Management
      • Organizzazione aziendale
      • HR
      • Soft skills
    • Lean/Agile
      • Scrum
      • Teoria della complessità
      • Apprendimento & Serious Gaming
    • Internet & Digital
      • Cultura & Società
      • Conferenze & Reportage
      • Marketing & eCommerce
    • Hardware & Tecnologia
      • Intelligenza artificiale
      • UX design & Grafica
  • Ultimo numero
  • Archivio
    • Archivio dal 2006 ad oggi
    • Il primo sito web – 1996-2005
  • Chi siamo
  • Ventennale
  • Libri
  • Contatti

Nel numero:

262 giugno
, anno 2020

Metriche Agili per “prevedere” il futuro

IV parte: Forecasting per prevedere e gestire progetti

Mattia Battiston

Mattia Battiston è un software developer con una grande passione per il miglioramento continuo. Attualmente lavora a Londra e utilizza Kanban, Lean e Agile per aiutare diversi team a migliorare.

metriche agili per prevedere il futuro

Metriche Agili per “prevedere” il futuro

IV parte: Forecasting per prevedere e gestire progetti

Picture of Mattia Battiston

Mattia Battiston

  • Questo articolo parla di: Lean/Agile, Processi di sviluppo

Introduzione

Negli scorsi articoli abbiamo parlato del modo in cui i tipici approcci alle stime (per esempio, story point) spesso falliscono nel darci la prevedibilità che cerchiamo. Abbiamo poi visto come utilizzare le metriche Lead Time e Throughput per rispondere rispettivamente alle domande “Quanto tempo impiegherà questa storia?” e “Quanto lavoro possiamo completare in uno sprint?”.

In questo articolo affrontiamo una domanda ancora più difficile: “Quanto tempo impiegherà questo progetto?”. Ci concentriamo non più sulla singola storia ma su un pezzo di lavoro più corposo, come un progetto o un’intera feature. Spieghiamo come utilizzare una tecnica chiamata Probabilistic Forecasting per fare queste previsioni, con esempi pratici di conversazioni che la maggior parte dei team si trova spesso ad affrontare.

 

Probabilistic Forecasting

Abbiamo già parlato di Probabilistic Forecasting in un paio di articoli [1] di qualche anno fa, ma ne scriviamo qui un riassunto per poi vedere come usare questa tecnica per rispondere a numerose domande di business.

Cominciamo con una definizione: probabilistic forecasting è una tecnica per prevedere il verificarsi di eventi incerti. Consiste nell’utilizzare dati storici per simulare cosa accadrà in futuro, utilizzando un metodo statistico chiamato metodo Monte Carlo [3]. Il risultato della previsione è espresso come una lista di possibili risultati accompagnati dalla probabilità che quel particolare risultato divenga realtà.

Vediamo passo passo come funziona questa tecnica. Per aiutarvi a mettere in pratica quanto stiamo descrivendo, potete usare degli spreadsheet di esempio [4].

Dati in input

Abbiamo bisogno di due set di dati in input: il throughput passato e la quantità di lavoro da completare.

Figura 1 – Input per probabilistic forecasting: throughput passato e quantità di lavoro da completare.
Figura 1 – Input per probabilistic forecasting: throughput passato e quantità di lavoro da completare.

 

Il throughput passato rappresenta il numero di storie completate dal team per sprint in passato, come descritto nell’articolo precedente. Nella figura 1 in esempio, sulla destra, il team ha completato 2 storie nel primo sprint, 5 storie nel secondo sprint, e così via.

Sulla sinistra, diamo in input la quantità di lavoro da completare per questo progetto, con alcuni accorgimenti.

Per prima cosa, il team fa quanta analisi/design ritiene necessaria per arrivare al breakdown di epiche e storie, identificando così le storie che sono necessarie per questo progetto. Ricordiamo che, idealmente, il team usa tecniche di story slicing per suddividere le storie e ottenerne di più piccole possibili, come spiegato nel primo articolo di questa serie. Nella figura 1, il team ha identificato 25 storie da completare per questo progetto.

Occorre poi tenere conto di quello che David Anderson chiama Dark Matter [5]. Che cosa è questa “materia oscura” che non viene considerata nei tradizionali approcci basati su stime? È il fatto che, durante lo svolgimento del progetto, la quantità di lavoro inizialmente identificata aumenterà a causa di:

  • Bug o problemi che vanno sistemati. Nella figura 1, questa crescita è espressa come “Bugs Ratio”, ovvero “ci aspettiamo di trovare 1 bug ogni X storie”. Questo numero è basato su quanti bug il team ha trovato in passato.
  • Nuovo lavoro che viene scoperto — per esempio nuovi requisiti o, semplicemente, qualcosa a cui non avevamo pensato inizialmente — o lavoro esistente che viene suddiviso in storie più piccole, quando il team si accorge che una storia è troppo grande o richiede del lavoro preliminare. Nella figura 1, questa crescita è espressa come “Discovery/Split Ratio”, ovvero “ci aspettiamo di create 1 nuova storia ogni X storie”. Questo numero è basato su dati storici del team, per esempio osservando la frequenza con cui nuove storie vengono aggiunte al backlog.

Tutto questo significa che, se a inizio progetto abbiamo identificato 25 storie da completare, è probabile — e normale — che a fine progetto la quantità di lavoro sia diventata 30-35 storie, o anche di più in base al contesto e alla complessità del problema.

 

Monte Carlo simulation

Con questi dati in input, procediamo con la simulazione. Utilizziamo il metodo Monte Carlo, che consiste nell’estrarre in maniera random campioni dai nostri dati storici per simulare cosa accadrà in futuro, ripetendo la simulazione migliaia di volte per esplorare ogni possibile scenario e scoprire la probabilità di ogni risultato.

Sembra complicato, ma la pratica è molto più semplice della teoria. Vediamo come funziona con un esempio passo passo: il team ha suddiviso un nuovo progetto in 20 storie e vuole prevedere quanto tempo impiegherà per completarle.

Come primo passo, estraiamo in maniera random un campione dal throughput passato del team. In questo esempio abbiamo estratto il numero 3: stiamo simulando che nel primo sprint il team avrà completato 3 storie, perciò resteranno 17 storie da completare.

Figura 2 – Nel primo sprint il team completa 3 storie, con 17 storie rimanenti.
Figura 2 – Nel primo sprint il team completa 3 storie, con 17 storie rimanenti.

 

Ripetiamo per il secondo sprint, estraendo un altro campione random dal throughput passato. Nell’esempio abbiamo estratto il numero 5: stiamo simulando che nel secondo sprint il team avrà completato 5 ulteriori storie, perciò avrà completato 8 storie in totale con 12 storie rimanenti da completare.

Figura 3 – Nel secondo sprint il team completa 5 ulteriori storie. Rimangono 12 storie da completare.
Figura 3 – Nel secondo sprint il team completa 5 ulteriori storie. Rimangono 12 storie da completare.

 

Continuiamo a ripetere, estraendo campioni a random con reinserimento, finché tutte le 20 storie non sono completate. Nell’esempio, al termine del quinto sprint il team ha completato 21 storie, completando quindi il backlog del progetto. Diciamo quindi che nella prima simulazione il team ha impiegato 5 sprint per completare il progetto.

Figura 4 – In questa simulazione il team ha impiegato 5 sprint per completare le 20 storie.
Figura 4 – In questa simulazione il team ha impiegato 5 sprint per completare le 20 storie.

 

Ripetiamo la simulazione per migliaia di volte, seguendo il metodo Monte Carlo. Nel ripetere l’esercizio così tante volte, scopriamo ogni possibile scenario e osserviamo la probabilità che tale scenario accada. In alcune simulazioni, il team impiega 4 sprint, in altre 7, e così via.

Figura 5 – Ripetiamo la simulazione migliaia di volte per scoprire la probabilità di ogni possibile risultato.
Figura 5 – Ripetiamo la simulazione migliaia di volte per scoprire la probabilità di ogni possibile risultato.

 

Ci saranno anche simulazioni particolarmente fortunate dove il team impiega solo 3 sprint, o altre particolarmente sfortunate dove il team impiega fino ad 8 sprint, ma possiamo osservare che la probabilità di tali estremi è molto bassa.

 

Risultati

Esprimiamo i risultati come una lista di possibili scenari con la probabilità che tale scenario si verifichi.

Figura 6 – Risultati della simulazione.
Figura 6 – Risultati della simulazione.

 

Nella tabella sulla sinistra, la seconda colonna indica la probabilità che il team impieghi esattamente quel numero di sprint per completare il lavoro. Questi numeri ci dicono che nel 17% delle simulazioni il team ha impiegato 3 sprint, nel 37% delle simulazioni ha impiegato 4 sprint, e così via.

La terza colonna è la somma cumulativa delle singole probabilità, che interpretiamo come livelli di sicurezza. Ci dice che nel 55% delle simulazioni il team ha impiegato 4 sprint o meno, e nell’86% delle simulazioni ha impiegato 5 sprint o meno. Il colore verde indica un alto livello di sicurezza nella nostra previsione.

 

Fare forecasting per rispondere a domande di business

Ora che sappiamo come implementare probabilistic forecasting, vediamo come utilizzare i risultati delle nostre simulazioni per rispondere a domande di business.

“Quanto tempo impiegherà questo progetto?”

Torniamo alla domanda di apertura di questo articolo: “Quanto tempo impiegherà questo progetto?”. Per rispondere, seguiamo i passaggi descritti sopra per preparare la nostra forecast: analizziamo il lavoro e lo suddividiamo in storie, dopodichè eseguiamo la nostra simulazione. Con i risultati alla mano, rispondiamo nel modo seguente: “Abbiamo circa il 50% di sicurezza di completare il lavoro in 4 sprint, ma siamo sicuri all’85% che non ce ne vorranno più di 5”. Inoltre aggiungiamo: “Nel peggiore dei casi potrebbero volerci 6 sprint, ma c’è solo il 15% di probabilità che ciò accada. Se succedesse, quale sarebbe l’impatto?”.

Notate come questa conversazione sia diversa da una classica discussione su una stima? Normalmente diremmo “Ci vorranno X giorni”, mentre ora parliamo apertamente dei possibili scenari che si possono verificare e del loro impatto. “Se in effetti questo progetto finisse per impiegare 6 sprint, quale sarebbe l’impatto per il business? Possiamo permetterci di prenderci il rischio? Cosa possiamo fare per ridurlo? Qual è il valore del lavoro, per giustificare tale rischio?”. La conversazione si è spostata dal parlare di stime al discutere di valore e rischio.

Figura 7 – Esempio di conversazione per rispondere a “Quanto tempo impiegherà questo progetto?”.
Figura 7 – Esempio di conversazione per rispondere a “Quanto tempo impiegherà questo progetto?”.

 

Chiudiamo la conversazione con una promessa che racchiude uno degli enormi vantaggi di forecasting: “Comunque vada, ti forniremo una previsione aggiornata al termine di ogni sprint”. I comuni metodi di stima sono spesso laboriosi e perciò troppo costosi per essere ripetuti frequentemente, per esempio, richiedendo di dover rivedere la stima di ogni storia nel backlog.

Facendo forecasting invece è molto facile aggiornare le nostre previsioni continuamente, usando continuous forecasting: al termine di ogni sprint aggiorniamo la quantità di lavoro rimanente e aggiungiamo un nuovo campione al throughput passato, per registrare quante storie abbiamo completato nello sprint appena concluso. La nostra forecast viene immediatamente ricalcolata e possiamo dare un aggiornamento ai nostri stakeholder.

“Quanto lavoro possiamo completare nei prossimi x sprint?”

Supponiamo che ci sia una scadenza da qui a 4 sprint: potrebbe essere una vera e propria deadline, oppure semplicemente il team vuole applicare una timebox. Il team si chiede “Quanto lavoro possiamo completare nei prossimi 4 sprint?”.

Per rispondere usiamo la stessa simulazione descritta sopra, generando migliaia di risultati con il Metodo Monte Carlo, ma aggreghiamo i risultati in modo leggermente diverso: in ogni simulazione, andiamo a osservare quante storie sono state completate dopo 4 sprint.

Figura 8 – Stessa simulazione, ma osserviamo quante storie sono completate dopo 4 sprint.
Figura 8 – Stessa simulazione, ma osserviamo quante storie sono completate dopo 4 sprint.

 

Seguendo poi i principi di forecasting, esprimiamo i risultati come lista di possibili scenari con la relativa probabilità: per ogni numero di storie, che probabilità abbiamo di completare tale quantità?

Figura 9 – Dati per rispondere a “Quanto lavoro possiamo completare nei prossimi x sprints?”
Figura 9 – Dati per rispondere a “Quanto lavoro possiamo completare nei prossimi x sprints?”

 

Come nell’esempio precedente, la terza colonna è interpretata come livello di sicurezza nella nostra previsione. L’unica differenza è che invece di essere una somma cumulativa, questa volta è una sottrazione cumulativa: più il numero di storie sale, meno ci sentiamo sicuri di poter completare tale quantità di lavoro.

Figura 10 – Esempio di conversazione per rispondere a “Quanto lavoro possiamo completare nei prossimi x sprints?”
Figura 10 – Esempio di conversazione per rispondere a “Quanto lavoro possiamo completare nei prossimi x sprints?”

 

In questi dati andiamo a leggere la nostra risposta: “Abbiamo oltre l’80% di sicurezza che possiamo completare almeno 12 storie. Su quali storie vogliamo lavorare?”. A questo punto il team può discutere di quali ritiene siano le 12 storie più importanti su cui concentrarsi.

“Questa feature sarà pronta in tempo?”

Prendiamo ad esempio uno scenario in cui il Product Owner presenti al team una nuova feature e chieda: “Questa feature è necessaria per l’integrazione con un altro team, che ne ha bisogno entro 2 sprint, o saranno bloccati. Sarà pronta in tempo?”. Per rispondere, usiamo una combinazione delle due simulazioni usate finora.

Per cominciare, il team suddivide la feature in 10 storie ed esegue una forecast, da cui osserva che la probabilità di completare tutte e 10 le storie in 2 sprint è molto bassa (14%).

Figura 11 – “Questa feature sarà pronta in 2 sprint?”. La probabilità è molto bassa.
Figura 11 – “Questa feature sarà pronta in 2 sprint?”. La probabilità è molto bassa.

 

Il team esegue quindi la seconda simulazione per capire quanto lavoro può realisticamente completare in 2 sprint, giungendo alla conclusione che si sente sicuro di poter consegnare 5-6 storie.

Figura 12 – “Questa feature sarà pronta in 2 sprint?”. Possiamo completare 5-6 storie.
Figura 12 – “Questa feature sarà pronta in 2 sprint?”. Possiamo completare 5-6 storie.

 

Rispondiamo quindi come segue: “Abbiamo suddiviso la feature in 10 storie. La probabilità di completarle tutte in 2 sprint è molto bassa. Ci sentiamo però sicuri di poter consegnare almeno 5-6 storie. Di queste 10 storie, quali sono le 5-6 più importanti? Possiamo consegnare un MVP che permetta all’altro team di non essere bloccato?”.

Figura 13 – Esempio di conversazione per rispondere a “Questa feature sarà pronta in tempo?”.
Figura 13 – Esempio di conversazione per rispondere a “Questa feature sarà pronta in tempo?”.

 

Ancora una volta, sottolineiamo come in scenari tipo questi sia molto facile per il team sentirsi sotto pressione e finire per dire di sì, promettendo di completare in tempo per poi finire a lavorare di notte o al weekend, prendendo ogni tipo di scorciatoie che creano solo danni nel lungo termine. Con questa conversazione invece abbiamo spostato il focus dal parlare di stime al discutere di MVP e ordine di priorità del lavoro.

 

Forecasting: consigli pratici

Vediamo di seguito una serie di consigli pratici cui vale la pena dedicare qualche parola perché possono risultare davvero utili nel creare previsioni utili e attendibili.

Continuous Forecasting

Uno dei grandi vantaggi di questo approccio è che è molto facile fare continuous forecasting.  Regolarmente — per esempio, al termine di ogni sprint — aggiorniamo i dati in input alla nostra previsione: quanto lavoro rimane e i dati più recenti del team. Così facendo aggiorniamo continuamente le aspettative dei nostri stakeholder e identifichiamo i rischi il prima possibile.

Usa dati storici che sono rilevanti per il futuro

Quando usiamo dati storici per prevedere il futuro stiamo facendo l’assunzione che questi dati siano rappresentativi di quello che accadrà. Con team stabili questa assunzione è solitamente valida, ma cosa possiamo fare quando questa non è vera? Casi comuni sono quando il team deve lavorare su qualcosa di completamente diverso, o un cambio drastico nella composizione del team, con il caso limite di un team nuovo, quando non abbiamo alcun dato a disposizione.

In queste situazioni il mio approccio è di creare una serie di forecast usando diversi set di dati in input per esplorare diversi scenari:

  • Usando dati di team che hanno una composizione che sembra simile, o che lavorano su qualcosa che sembra simile.
  • Usando un range di throughput “ideale” basato su quello che personalmente mi aspetto che il team possa completare in uno sprint.
  • Usando un ulteriore range di throughput “ideale” basato sul chiedere al team cosa pensano di poter completare in uno sprint quando tutto va bene, quando tutto va male, e varie vie di mezzo.

So bene che questi risultati hanno un alto margine di errore e che vanno quindi presi con le pinze, ma mi danno un’idea di cosa posso aspettarmi. Poi, non appena il team comincia effettivamente a lavorare insieme, sostituisco i dati “ideali” con i dati reali del team.

Prevedere la quantità di lavoro

Un’altra assunzione che abbiamo fatto negli esempi di questo articolo è che sia possibile suddividere il lavoro in storie. Questa assunzione è valida in molti casi quando, previa sufficiente analisi e magari qualche spike, il lavoro è abbastanza chiaro. Ma cosa possiamo fare se il lavoro è troppo grosso, o la soluzione non è ancora ben definita? Non solo sarebbe impraticabile creare tutte le storie in anticipo, ma si tratterebbe anche di un approccio rischioso in quanto ci forza verso la scelta prematura di una particolare soluzione.

In questi casi, invece di creare le storie prematuramente, possiamo usare una simulazione per fare forecasting di quanto lavoro avremo da fare. Ad alto livello di astrazione, funziona così:

  • analizziamo il problema quanto basta per identificare l’elenco di epiche;
  • da questa lista scegliamo 5 epiche in maniera random e le suddividiamo in storie;
  • usiamo il numero di storie in queste 5 epiche per fare una simulazione e inferire quante storie otterremo dalle altre epiche.

Per maggiori dettagli, rimandiamo a un articolo [6] scritto qualche anno fa, dove abbiamo descritto questo approccio.

Non servono troppi dati

Ricordate poi che, come spiegato nel secondo articolo di questa serie (box in alto a destra), sono sufficienti tra 5 e 11 campioni per fare previsioni abbastanza attendibili.

Scoprire il motivo dietro la richiesta di una stima

Quando ci viene chiesta una stima, è importante chiedere “Quali decisioni verranno prese in base a questa stima?” per capire il motivo per cui ci viene fatta questa richiesta. In diversi casi esistono strumenti migliori che una stima (o previsione) per prendere decisioni. Vediamo di seguito un paio di esempi.

  • Per decidere budget e priorità, meglio chiederci “Qual è il valore di questo lavoro? Quanto siamo disposti a investire?”. Il budget diventa poi una timebox entro cui lavorare in iterazioni rapide.
  • Quando siamo ancora in fase di product discovery e dobbiamo validare le nostre ipotesi, è meglio lavorare in cicli rapidi di sperimentazione e raccogliere feedback velocemente, accettando il fatto che è impossibile prevedere quanto impiegheremo a risolvere un problema che non sappiamo ancora formulare.

Ascoltare le persone, non seguire ciecamente i numeri

Non fate l’errore di fidarvi ciecamente del risultato delle previsioni. Se la nostra forecast dice una cosa ma le persone nel team ne dicono chiaramente un’altra, è possibile che ci sia un problema nei dati o nella simulazione. Occorre ricontrollare e ascoltare il team. In fondo, queste sono le persone che fanno il lavoro giorno dopo giorno: nessuno lo conosce meglio di loro.

 

Come iniziare

Per iniziare ad applicare queste idee, il mio consiglio è sempre di cominciare in parallelo:

  • Non cambiate il vostro processo all’improvviso, ma cominciate intanto a raccogliere i dati descritti in questa serie di articoli.
  • La prossima volta che vi verrà chiesta una stima, rispondete nel modo abituale ma, allo stesso tempo, usate i vostri dati che avete raccolto per fare anche una previsione (forecast) e non la solita stima (estimate).
  • Durante il corso del progetto, continuate ad aggiornare la forecast.
  • Alla fine del progetto, confrontate i risultati della stima e della previsione.

Probabilmente scoprirete che la forecast è stata più accurata della estimate: sarà allora possibile usarla come esempio pratico per introdurre l’idea nel vostro team o nell’intera azienda.

 

Conclusione

In questo articolo abbiamo discusso di come usare probabilistic forecasting per fare previsioni di progetti o feature.

Concludiamo con questo numero la serie sulle metriche per prevedere il futuro, in cui abbiamo spiegato come usare dati e metriche per rispondere a domande di business e migliorare le nostre conversazioni.

 

Mattia Battiston

Mattia Battiston è un software developer con una grande passione per il miglioramento continuo. Attualmente lavora a Londra e utilizza Kanban, Lean e Agile per aiutare diversi team a migliorare.

Facebook
Twitter
LinkedIn
Picture of Mattia Battiston

Mattia Battiston

Mattia Battiston è un software developer con una grande passione per il miglioramento continuo. Attualmente lavora a Londra e utilizza Kanban, Lean e Agile per aiutare diversi team a migliorare.
Tutti gli articoli
Nello stesso numero
Loading...

Business Model in quattro atti

II parte: Innovazione nei modelli di business e Value Proposition Design

Come monitorare l’avanzamento dei lavori in Agile

I parte: Misurare lo stato di avanzamento di un progetto in Agile

Non si vive di solo Python

IIII parte: DataView in ML.NET

Nella stessa serie
Loading...

Metriche Agili per “prevedere” il futuro

III parte: Prendere decisioni di business con Throughput e Story Health

Metriche Agili per “prevedere” il futuro

II parte: Prendere decisioni di business con il Lead Time

Metriche Agili per “prevedere” il futuro

I parte: Imprevedibilità dei terremoti e… sviluppo software

Mokabyte

MokaByte è una rivista online nata nel 1996, dedicata alla comunità degli sviluppatori java.
La rivista tratta di vari argomenti, tra cui architetture enterprise e integrazione, metodologie di sviluppo lean/agile e aspetti sociali e culturali del web.

Imola Informatica

MokaByte è un marchio registrato da:
Imola Informatica S.P.A.
Via Selice 66/a 40026 Imola (BO)
C.F. e Iscriz. Registro imprese BO 03351570373
P.I. 00614381200
Cap. Soc. euro 100.000,00 i.v.

Privacy | Cookie Policy

Contatti

Contattaci tramite la nostra pagina contatti, oppure scrivendo a redazione@mokabyte.it

Seguici sui social

Facebook Linkedin Rss
Imola Informatica
Mokabyte