## Plan-driven development *Il **plan-driven development** cerca di pianificare e anticipare in anticipo tutte le funzionalità che un utente potrebbe desiderare e di determinare il modo migliore per realizzarle.* Il modello principale è quello **a cascata**: si esegue, in sequenza, un'analisi completa dei requisiti seguita da una analisi dei requisiti, seguita da una progettazione completa, seguita a sua volta da codifica/costruzione e collaudo. *Il **plan-driven development** funziona bene per problemi ben definiti, prevedibili e che difficilmente subiranno cambiamenti significativi. Se non funziona, l'atteggiamento prevalente è quello di pensare che si sia sbagliato qualcosa.* Il problema è nelle ipotesi di base: presuppone una variabilità di output minima o nulla, segue un insieme ben definito di fasi ed utilizza solo piccole quantità di feedback in fase avanzata del processo. Il motto di questo approccio può essere: *"anticipare e pianificare in anticipo per ridurre lo sforzo, come in un processo di produzione"*. ## Approccio SCRUM SCRUM si adatta a problemi che presentano un'incertezza tale da rendere rendere difficili alti livelli di prevedibilità. I principi di questo approccio sono: - **variabilità e incertezza**; - **previsione e adattamento**; - **Validated Learning**; - **Work in progress (WIP)**; - **progresso**; - **performance**. ### Variabilità e incertezza SCRUM sfrutta la variabilità e l'incertezza incertezza nello sviluppo del prodotto per creare soluzioni innovative. Abbiamo quattro principi: - *accogliere la variabilità utile:* una certa variabilità è necessaria per produrre un prodotto ogni volta un prodotto diverso; - *impiegare uno sviluppo iterativo e incrementale sviluppo:* SCRUM si basa su uno sviluppo iterativo e incrementale. Con iterativo si intende utilizzare più passaggi per migliorare in modo da convergere su una buona soluzione. Con incrementale si intende imparare come ogni pezzo deve sopravvivere nell'ambiente e imparare dall'esperienza. SCRUM sfrutta i vantaggi dello sviluppo iterativo e di quello incrementale, annullando gli svantaggi del loro utilizzo individuale. SCRUM utilizza entrambe le idee in una serie adattativa di iterazioni temporali chiamate "sprint"; - *sfruttare la variabilità attraverso adattamento all'ispezione e trasparenza:* SCRUM accetta il fatto che è necessario un certo livello di variabilità per costruire qualcosa di nuovo e presuppone che la creazione del prodotto sia complessa. - *ridurre tutte le forme di incertezza contemporaneamente:* seguendo un approccio olistico SCRUM, bisogna ridurre simultaneamente tutte le incertezze e sondare ed esplorare il nostro ambiente per identificare e conoscere le incognite sconosciute. ### Previsione e adattamento Bilanciare costantemente il desiderio di previsione con la necessità di adattamento, seguendo i principi di seguito: - *mantenere aperte le opzioni:* acquisire una migliore comprensione della decisione prima di impegnarsi. Non prendere mai una decisione prematura solo perché un processo generico suggerirebbe che è il momento giusto per prenderla; - *accettare l'impossibilità di fare le cose per bene in anticipo:* cercate di ottenere tutto ciò che è corretto in anticipo perchè i requisiti cambiano, è probabile che manchi una conoscenza importante ed si ottiene una grande quantità di requisiti di bassa qualità. L'approccio SCRUM produce alcuni requisiti e piani in anticipo, ma solo in misura sufficiente, ed impareremo dove abbiamo sbagliato non appena consegneremo; - *favorire un approccio adattivo ed esplorativo:* storicamente lo sviluppo di prodotti software è sempre stato costoso. Il feedback della nostra azione ci aiuterà a determinare se e quando è necessario approfondire l'esplorazione; - *accogliere il cambiamento in modo economicamente ragionevole:* nello sviluppo sequenziale, apportare una modifica è sostanzialmente più costoso in ritardo che nelle fasi iniziali. Bisogna concentrarsi sul miglioramento dell'accuratezza delle previsioni per ridurre i rischi e la quantità di lavoro ma spesso ha l'effetto opposto. Una piccola modifica dei requisiti dovrebbe comportare una proporzionale di implementazione e quindi di costi; - *bilanciare il lavoro predittivo in anticipo con il lavoro adattivo just-in-time:* non è possibile ottenere requisiti e piani precisi fin dall'inizio. L'adattabilità è controbilanciata da una sufficiente capacità di previsione per non scivolare nel caos. ### Validated Learning Organizzare il lavoro per creare rapidamente un **apprendimento convalidato** cioè ottenere conoscenze che confermino o confutino un'ipotesi che abbiamo fatto. I principi agili relativi a questo argomento sono: - *convalidare velocemente le ipotesi importanti:* non lasciare che le ipotesi importanti rimangano a lungo senza essere convalidate e fare un'ipotesi fondamentalmente sbagliata, ma è probabile che si abbia la possibilità di rimediare; - *sfruttare più cicli di apprendimento simultanei:* in SCRUM l'apprendimento costante è una chiave di successo per identificare e sfruttare diversi cicli di feedback e scrum quotidiani, sprint review ma anche pair programming e test-driven development.; - *organizzare il flusso di lavoro per un rapido feedback:* in SCRUM si arriva al feedback il più rapidamente possibile. Le attività che generano feedback si svolgono in stretta prossimità del lavoro originale. ### Work in progress (WIP) WIP è il lavoro che è stato iniziato ma non ancora finito e deve essere riconosciuto e gestito correttamente. I principi relativi a questo argomento: - *utilizzare dimensioni dei lotti economicamente ragionevoli:* riducendo il tempo dei cicli e variabilità del flusso, feedback accellerato; - *riconoscere l'inventario e gestirlo per un buon flusso:* nessun produttore competente si trova in un grande inventario. Lo sviluppo tradizionale favorisce la creazione di grandi quantità di inventario. SCRUM trova un equilibrio tra inventario abbastanza e troppo grande; - *concentrati sul lavoro inattivo, non sui lavoratori inattivi*; - *considerare il costo del ritardo:* cioè il costo finanziario associato al ritardo del lavoro o al ritardo del raggiungimento di un traguardo. Possiamo calcolare quali soggetti sono più dannosi dal punto di vista economico. ### Progressi Misurare i progressi in base a ciò che viene consegnato e convalidato, non in base al modo in cui stiamo procedendo con il piano predefinito. I principi relativi a questo argomento: - *adattarsi alle informazioni in tempo reale e ripianificare:* in SCRUM non ci si conforma al piano predefinito perché si crede che il piano possa essere sbagliato e si faccia qualche previsione in anticipo su come pensare che le cose sarebbero potute andare. Quindi, bisogna ripianificare rapidamente e adattarsi alle informazioni che arrivano durante lo sviluppo; - *misurare i progressi attraverso la convalida degli asset di lavoro:* in SCRUM si misurano i progressi costruendo asset funzionanti e validati che forniscono valore e possono essere valutati. È importante il lavoro di valore per il cliente che portiamo a termine; - *concentrarsi sulla consegna centrata sul valore:* in SCRUM, il valore è generato dalla consegna di risorse funzionanti ai clienti, dalla convalida di ipotesi importanti o dall'acquisizione di conoscenze preziose. ### Performance Caratteristiche specifiche legate alle prestazioni quando si utilizza SCRUM: - *andare veloci, ma senza fretta:* la velocità estrema viola il principio del ritmo sostenibile. Le persone dovrebbero essere in grado di lavorare a un ritmo che possono sostenere per un periodo di tempo prolungato. La fretta arriverà probabilmente a scapito della qualità; - *costruire con qualità:* in SCRUM la qualità è mantenuta e verificata ad ogni sprint. Ogni incremento viene completato ad un alto livello di fiducia e può essere messo in produzione o spedito ai clienti. I test tardivi per attaccare la qualità sono sostanzialmente ridotti; - *impiegare una cerimonia minimamente sufficiente:* si cerca di mantenere una forma informale, riducendo eventuali formalità facoltative e non necessarie (cerimonia significa formalità in questo contesto). ## Conclusioni **SCRUM** è ideale per progettare nuovi prodotti in un contesto complesso in evoluzione, sfrutta e abbraccia il cambiamento, il processo adattivo timebox è iterativo e presenta molti loop di feedback. **Sequenza plan-based** è buono in ambienti prevedibili, dove è possibile pianificare e non c'è spazio per il cambiamento ma abbiamo problemi ben compresi.