Progettazione del Software

Transcript

Progettazione del Software
Progettazione del Software
appunti dalle lezioni
Marco Gasparini
Carlo Pane
Francesco Solera
59853
59202
59326
Università degli Studi di Modena e Reggio Emilia
Progettazione del Software, appunti dalle lezioni
This report was prepared by
Marco Gasparini, Carlo Pane, Francesco Solera
Professor
Flavio Bonfatti
Release date:
Course:
2011
Progettazione del Software
Department:
Ingegneria Informatica
Comments:
Questo breve documento vuole essere un supporto didattico alle
lezioni del corso di Progettazione del Software. È stato scritto
a partire dagli appunti presi a lezione ed integrato, qualora
ritenuto necessario, con materiale dai libri di testo indicati dal
docente e riportati nella bibliografia.
Department of Information Engineering
Information Technologies and Computer Science
University of Modena e Reggio Emilia
www.dii.unimo.it
Introduzione
Il corso è indirizzato agli studenti della Laurea Magistrale in Ingegneria Informatica ai quali intende fornire le conoscenze e gli strumenti metodologici fondamentali
per l’impostazione, l’organizzazione e la gestione di progetti software complessi e
di grandi dimensioni. Gli argomenti trattati sono: :
Economia di un progetto software. Fattibilità di un progetto software, metodo
PERT-CPM. Classificazione delle tecniche di stima dei costi e dei tempi di un progetto. Metodo CoCoMo di Boehm (modello base, modello intermedio, cenni al
modello dettagliato). Funzione costo di Norden e metodo analitico di Putnam. Le
principali variabili di un progetto software. Progetto di piccole, medie e grandi
dimensioni secondo Putnam. Curva di sviluppo e curva di progetto. Equazione del
software. Software sizing per progetti nuovi e per rifacimenti. Studio del progetto
tramite planning zone e punto di lavoro.
Metodi avanzati di progettazione del software. Il Processo Unificato (UP).
Metodi agili di sviluppo del software e loro principali caratteristiche. Il metodo
Agile UP. Il metodo SCRUM. Il metodo Feature Driven Development (FDD). Il
metodo Dynamic Systems Development (DSDM). Il metodo Extreme Programming (XP). Tecniche agili di sviluppo del software. Cross-functional team, time
boxing, pair programming, test-driven development, code re-factoring. Confronto
critico dei diversi approcci. Software Process Improvement (SPI) e Capability Maturity Method integration (CMMi).
Linguaggi formali e tecniche di compilazione. Alfabeto, stringa, linguaggio
e relativi operatori. Espressioni e linguaggi regolari. Grammatiche generative,
definizione formale e classificazione di Chomsky. Grammatiche non contestuali.
Alberi sintattici, ambiguit‡ della grammatica. Grammatiche strettamente lineari
sinistre, equivalenza con espressioni regolari. Automi a stati finiti, equivalenza con
grammatiche strettamente lineari sinistre. Automi non deterministici. Derivazione
degli automi deterministici equivalenti, automi minimi. Notazione polacca postfissa
e forma a quadruple, generazione del codice oggetto.
Contents
II
Metodi avanzati di progettazione del software
1 Il Processo Unificato
3
1.1
Caratteristiche dello Unified Process . . . . . . . . . . . . . . . . . .
4
1.2
Ciclo di vita del progetto . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3
Rational Unified Process . . . . . . . . . . . . . . . . . . . . . . . . .
6
2 Modelli agili di progettazione e sviluppo del software
11
2.1
Agile UP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.2
Scrum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.3
FDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.4
Dynamic System Development Method . . . . . . . . . . . . . . . . .
26
2.5
XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3 Sistemi di qualità
III
1
37
3.1
ISO 9001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
3.2
Capability Maturity Model integration . . . . . . . . . . . . . . . . .
37
Linguaggi formali e tecniche di compilazione
43
Part II
Metodi avanzati di
progettazione del software
1
Chapter
1
Il Processo Unificato
Fino ad ora abbiamo sempre avuto a che fare con un metodo di progettazione
del software chiamato a cascata. Il modello a cascata o ciclo di vita a cascata
(waterfall model o waterfall lifecycle in inglese) è un modello di ciclo di vita del
software (ovvero di processo software) secondo cui la realizzazione di un prodotto
software consta di una sequenza di fasi strutturata in analisi dei requisiti, progetto,
sviluppo, collaudo, integrazione e manutenzione. Ciascuna di queste fasi produce
un ben preciso output che viene utilizzato come input per la fase successiva.
Purtroppo questo modello viene definito rigido, poiché una volta terminata una fase,
questa viene bloccata e diventa insensibile a nuovi requisiti che il cliente potrebbe
chiedere o modifiche che il team di sviluppo riconosce come necessarie. Quando
si sviluppano software medio-grandi con un modello a cascata occorre mettersi
nell’ottica che:
• Il 25%-50% dei requisiti probabilmente cambieranno durante la durata del
progetto
• Almeno il 45% dei requisiti implementati non saranno utilizzati dal cliente
• Il cliente finanziatore non vedrà niente fino alla fine del processo di sviluppo
del software
Spesso questi vincoli non risultano essere apprezzati nè dal cliente, che inizia a
vedere i risultati dopo lunghi mesi dal momento del finanziamento, nè per il team
di sviluppo che è costretto a fare i conti con la rigidità e la linearità di questo approccio. Da queste necessità è nato un nuovo paradigma di progettazione, chiamato
Unified Process. Lo UP non è un semplice processo ma piuttosto un framework,
un ambiente di lavoro, che dovrebbe essere personalizzato per particolari aziende e
progetti. Anche lo Unified Process divide il tempo di sviluppo del software in fasi:
Inception, Elaboration, Construction e Transition; per ognuna di queste fasi sono
definiti obiettivi ben chiari, ma nessun particolare vincolo è imposto sulle differenti
discipline necessarie allo sviluppo (come ad esempio i requisiti). Questa caratteristica permette di riprendere in mano il lavoro già svolto anche in fasi successive e di
3
1.1. Caratteristiche dello Unified Process
procedere in maniera parallela verso il momento di rilascio del prodotto. Lo UP è
particolarmente gradito anche al cliente che può toccare con mano l’evoluzione del
suo software in una sempre maggiore implementazione dei requisiti.
1.1
Caratteristiche dello Unified Process
Iterativo ed incrementale
Lo UP è un processo di sviluppo iterativo ed incrementale. Le fasi di Elaboration, Construction and Transition sono divise in una serie di iterazioni di durata
definita. Ogni iterazione risulta in un incremento, ovvero in un rilascio del prodotto
che contiene funzionalità aggiunte o migliorate rispetto alla release precedente.
Nonostante la maggior parte delle iterazioni includeranno contributi da una buona
parte delle discipline (requisiti, analisi, progettazione, implementazione e testing),
l’importanza di questi contributi cambierà nel corso del progetto.
Basato sugli Use Case
Nello UP, i casi d’uso sono usati per catturare i requisiti funzionali e per definire
il contenuto di ogni iterazione. Ogni iterazione si occupa di gestire un certo sottoinsieme di casi d’uso o di scenari dai requisiti fino all’implementazione, test e
rilascio.
Incentrato sull’architettura
Per lo UP è importante che l’architettura del software sia alla base della preoccupazione e degli sforzi del team di sviluppo. In quanto nessun modello da solo
è sufficiente per catturare tutti gli aspetti del sistema, lo UP supporta vari modelli architetturali. Uno degli impegni più importanti del processo di sviluppo è
l’architettura della baseline eseguibile che viene creata durante la fase di Elaboration. Questa implementazione parziale, dovrebbe rispondere ai requisiti critici e caratteristici individuati in fase di analisi dei requisiti e serve per validare
l’architettura globale del progetto. Inoltre diventerà, se ritenuta valida, la base per
il resto dello sviluppo del software.
Pilotato dai fattori di rischio
Lo UP richiede che il team di sviluppo sia preoccupato di risolvere i rischi più critici
nelle prime fasi del progetto.
1.2
Ciclo di vita del progetto
Come già accennato anche lo UP prevede che il ciclo di vita del progetto sia suddiviso in quattro fasi.
4
1.2. Ciclo di vita del progetto
Il grafo RAPIT
Il grafo RAPIT (Requisiti, Analisi, Progettazione, Implementazione, Test) permette
di caratterizzare dinamicamente per ogni progetto quando e con quale importanza
le varie discipline della progettazione del software entreranno in gioco nelle varie
fasi di sviluppo del prodotto.
Figure 1.1: Il grafo RAPIT, mette in relazione le discipline della progettazione
del software con le fasi di sviluppo del prodotto.
Inception
L’inception è la fase più breve nella progettazione, e così deve essere: una fase
di inception prolungata indica un eccessivo lavoro di specificazione a priori, che è
contrario allo spirito dello UP. Obiettivo: definire a grandi linee ciò che il software
dovrà fare. Artefatti: requisiti principali, valutazione dei rischi, glossario del
progetto, una prima documentazione dell’architettura, una prima pianificazione
dello sviluppo e i prototipi.
Elaboration
Durante la fase di Elaboration, il team di sviluppo dovrebbe catturare la maggior parte (si può stimare un 80%) dei requisiti del software finale. Comunque lo
scopo principale di questa fase è quella di produrre una prima baseline eseguibile
che verifichi l’appropriatezza del modello architetturale adottato. Una baseline è
un’implementazione parziale del sistema che include il cuore e le specifiche caratterizzanti del progetto. È costruito e migliorato ciclicamente in una serie di iterazioni
e per la fine della fase di elaborazione il modello architetturale deve essere fissato e rimanere stabile fino alla fine dello sviluppo, inoltre la baseline eseguibile
deve dimostrare che la scelta dell’architettura si rivela appropriata per supportare
le funzionalità chiave del prodotto in termini di performance, scalabilità e costi.
Obiettivi: creare una baseline eseguibile, perfezionare la valutazione dei rischi,
creazione dei casi d’uso di circa l’%80 dei requisiti fornendo alla fase di costruzione
5
1.3. Rational Unified Process
una solido piano (di costi e di scadenze) su cui lavorare. Artefatti: baseline, disegno architetturale, documento di valutazione dei rischi, diagrammi dei casi d’uso,
pianificazione dettagliata.
Construction
La Construction è la fase più lunga della progettazione. In questa fase quello
che rimane del sistema è costruito a partire dalla baseline prodotta dalla fase di
Elaboration. Le caratteristiche del software sono sviluppate durante una serie di
iterazioni di piccola durata alla fine delle quali deve essere prodotto una nuova
baseline eseguibile. Durante questa fase vengono spesso impiegate tecniche di progettazione UML(Activity, Sequence, Collaboration, State (Transition) and Interaction Overview diagrams). Obiettivo: capacitò operativa basilare, ovvero la release
prodotta da questa fase deve permettere già l’utilizzo delle funzioni caratteristiche
del software. Artefatti: prodotto software, modellazione UML, una prima versione
del manuale utente ed un piano di testing.
Transition
La fase finale del progetto è la Transition. In questa fase il sistema è consegnato
all’utente finale. Con il feedback ricevuto da una release iniziale uscente dalla
prima iterazione è possibile apportare modifiche e ridefinire scelte implementative.
Obiettivi: rilascio del prodotto, correzione dei difetti, formazione degli utenti
utilizzatori. Artefatti: prodotto software testato, risultato del test d’accettazione,
manuali d’uso aggiornati alla release definitiva e accordo di mantenimento.
1.3
Rational Unified Process
Il Rational Unified Process (RUP) (che è una estensione dello Unified Process) è
un modello di processo software iterativo ed incrementale sviluppato da Rational
Software (oggi parte di IBM). Fornisce un approccio disciplinato per l’assegnazione
dei compiti e delle responsabilità all’interno dello sviluppo di un progetto. Il suo
obiettivo è assicurare la produzione di un software di alta qualità che incontra
i bisogni dei clienti, pur rimanendo all’interno di un budget e di una tempistica
predefiniti.
Caratteristico di questa metodologia è occuparsi di descrivere chi sta facendo cosa,
come e quando. Il Rational Unified Process è rappresentato usando quattro elementi
primari di modellazione:
• Workers, the "who": definisce il comportamento e le responsabilità di un
individuo, o un gruppo di individui che lavorano insieme come team
• Activities, the "how": sono unità di lavoro che un individuo in quel ruolo può
svolgere, la granularità di un attività è tipicamente dell’ordine di poche ore o
pochi giorni
6
1.3. Rational Unified Process
• Artifacts, the "what": è un pezzo di informazione che è prodotto, modificato
o usato da un processo, gli artefatti sono prodotti tangibili del processo
• Workflows, the "when": è una sequenza di attività che produce un risultato
di valore osservabile
Ci sono nove core process workflows o fasi specificate dal modello RUP, le quali
rappresentano una partizione di tutti i lavoratori e attività in gruppi logici. Le fasi
del ciclo di sviluppo del software sono divise in sei “engineering” workflows:
1. Business modeling workflow
2. Requirements workflow
3. Analysis & Design workflow
4. Implementation workflow
5. Test workflow
6. Deployment workflow
E tre workflows “di supporto”:
1. Environment workflow
2. Configuration and Change Management workflow
3. Project Management workflow
Anche se i nomi delle sei discipline ingegneristiche possono richiamare un idea di
processo a cascata, dobbiamo tenere in mente che sono fasi di un processo iterativo
e differiscono da queste in quanto sono riviste e riviste per tutta la durata del ciclo
di sviluppo del software.
Business modeling Uno dei problemi principali nella fase iniziale di progettazione di un software è che il team di software engineering ed il team di business
engineering non comunicano in modo appropriato. Questo comporta che il risultato prodotto dal business engineering non è usato in modo appropriato dal team di
software engineering e vice versa. Il RUP fornisce un linguaggio ed una metodologia
comune per tenere sincronizzati i modelli business e software.
Requirements. L’obiettivo di questo workflow è di descrivere cosa il sistema
dovrebbe fare e permettere agli sviluppatori ed ai clienti di concordare su tale
descrizione. Per ottenere questo esplicitiamo, organizziamo e documentiamo le
funzionalità, i vincoli e le decisioni prese in fase di analisi.
Analysis & Design Il goal principale qui è di far vedere come il sistema sarà
realizzato nella successiva fase d’implementazione. In breve realizza un astrazione
del codice che realizzerà i requisiti individuati.
7
1.3. Rational Unified Process
Test Gli scopi della fase di testing sono: verificare l’interazione fra gli oggetti,
verificare l’integrazione di tutti i componenti del software, verificare che i requisiti siano tutti correttamente soddisfatti, individuare eventuali problemi prima del
rilascio del software.
Deployment Lo scopo di questa fase è quello di produrre con successo il rilascio del software e distribuirlo all’utente finale. Questa fase comprende anche
l’assistenza e l’aiuto all’utente.
Environment L’obiettivo del workflow di environment è quello di fornire al team
di sviluppo un ambiente, che comprende sia metodologie che strumenti, necessari
per la progettazione del prodotto, in particolare è importante chiarire le attività
volte all’inquadramento del processo all’interno di un progetto.
Configuration and Change Management In questo workflow è descritto come
controllare i numerosi artefatti prodotti dalle tante persone che lavorano su un
progetto comune. Avere controllo su questo piano significa evitare confusione e
assicurare che gli artefatti risultanti non siano in conflitto con altri a causa di
accessi multiplo, aggiornamenti simultanei o limitate notifiche.
Project Management Software Project Management è l’arte di bilanciare gli
obiettivi paralleli di un software, gestire i rischi e superare i vincoli, al fine di
rilasciare un prodotto che incontra i bisogni del cliente e degli utilizzatori finali.
Sviluppo efficace e buone pratiche
Il RUP descrive alcune pratiche che sono state osservate in progetti di successo
e che si ritiene possano essere d’aiuto nello sviluppare in modo efficace software
commerciale.
• Develop software iteratively: data la complessità dei software di oggi è impossibile delineare prima l’intero problema, disegnare una soluzione e poi
costruire il software e testarlo; è necessario un approccio iterativo che permetta di inserire nella progettazione la comprensione sempre maggiore che il
team di sviluppo ha sul problema e sulle funzionalità.
• Manage requirements: gestire in modo efficiente i requisiti funzionali è fondamentale per la buona riusciuta del software; è importante fin da subito
esplicitare, organizzare e documentare le funzionalità richieste ed i vincoli
imposti al fine di poter trarre decisioni e valutare compromessi, l’importanza
di questa pratica è data dal fatto che l’implementazione parte proprio da
queste considerazioni.
• Use component-based architectures: il processo si focalizza sull’inizio della
fase implementativa, si tratta di buttare delle fondamenta che siano robuste e
flessibili al tempo stesso, prima di arrivare ad avere una quantità di codice che
8
1.3. Rational Unified Process
risulta mal strutturata ed ingestibile; a tale scopo sono importanti i concetti
di riusabilità e modularità.
• Visually model software: si tratta di accompagnare alla documentazione
scritta anche una modellazione visuale del comportamento dell’architettura e
dei componenti; questo permette di nascondere inutili dettagli e facilitare la
comunicazione di aspetti critici del software.
• Verify software quality: scarse prestazione e poca affidabilità sono fattori
che incidono pesantemente sull’accettabilità dei software moderni, quindi
la qualità dovrebbe essere valutata tenendo in considerazione fattori come
l’affidabilità, il rispetto dei requisiti e le performance dell’applicazione e del
sistema.
• Control changes to software: l’abilità di gestire modifiche - essere sicuri che
ogni modifica sia accettabile e rintracciabile - è essenziale in un ambiente in
cui le modifiche sono inevitabili.
9
1.3. Rational Unified Process
10
Chapter
2
Modelli agili di progettazione e
sviluppo del software
Nell’ingegneria del software, per metodologia agile (o leggera) o metodo agile si
intende un particolare metodo per lo sviluppo del software che coinvolge quanto
più possibile il committente, ottenendo in tal modo una elevata reattività alle sue
richieste.
La gran parte dei metodi agili tentano di ridurre il rischio di fallimento sviluppando
il software in finestre di tempo limitate chiamate iterazioni che, in genere, durano
qualche settimana. Ogni iterazione è un piccolo progetto a sé stante e deve contenere
tutto ciò che è necessario per rilasciare un piccolo incremento nelle funzionalità
del software. Anche se il risultato di ogni singola iterazione non ha sufficienti
funzionalità da essere considerato completo deve essere rilasciato e, nel susseguirsi
delle iterazioni, deve avvicinarsi sempre di più alle richieste del cliente. Alla fine di
ogni iterazione il team deve rivalutare le priorità di progetto.
I metodi agili preferiscono la comunicazione in tempo reale, preferibilmente faccia
a faccia, a quella scritta (documentazione). Il team agile è composto da tutte le
persone necessarie per terminare il progetto software. Come minimo il team deve
includere i programmatori ed i loro clienti (con clienti si intendono le persone che
definiscono come il prodotto dovrà essere fatto: possono essere dei product manager,
dei business analysts, o veramente dei clienti).
L’agile manifesto
La formalizzazione dei principi su cui si basano le metodologie leggere è stata
oggetto del lavoro di un gruppo di progettisti software e guru dell’informatica che
si sono spontaneamente riuniti nell’Agile Alliance. Il documento finale di questo
lavoro è stato poi sottoscritto da un nutrito gruppo di questi professionisti, molti
dei quali hanno anche sviluppato alcune delle metodologie leggere più famose.
L’obiettivo è la piena soddisfazione del cliente e non solo l’adempimento di un
contratto. L’uso di queste metodologie, inoltre, serve ad abbattere i costi di sviluppo
11
Modelli agili di progettazione e sviluppo del software
del software.
Principi I principi su cui si basa una metodologia leggera che segua i punti indicati dall’Agile Manifesto, sono solo quattro:
• le persone e le interazioni sono più importanti dei processi e degli strumenti
(ossia le relazioni e la comunicazione tra gli attori di un progetto software
sono la miglior risorsa del progetto)
• è più importante avere software funzionante che documentazione (bisogna rilasciare nuove versioni del software ad intervalli frequenti, e bisogna mantenere
il codice semplice e avanzato tecnicamente, riducendo la documentazione al
minimo indispensabile)
• bisogna collaborare con i clienti al di là del contratto (la collaborazione diretta
offre risultati migliori dei rapporti contrattuali)
• bisogna essere pronti a rispondere ai cambiamenti più che aderire al progetto
(quindi il team di sviluppo dovrebbe essere autorizzato a suggerire modifiche
al progetto in ogni momento)
Considerazioni e buone pratiche La metodologia leggera non nasce per caso,
ma come presa di consapevolezza che alcune cose nel mondo della progettazione non
andavano. Essa, proprio perché nasce da alcune considerazioni fondanti fornisce
e suggerisce alcune pratiche che è bene avere in mente. Risulta particolarmente
importante, ad esempio, rilasciare frequentemente software con nuove funzionalità
mantenendo in questo modo alta la soddisfazione del cliente. Infatti un software
che funziona è molto più apprezzato di un mucchio di documentazione e di fogli
di progettazione in corso d’opera. Proprio per come è strutturata la metodologia,
anche il development team deve essere disposto ad accettare nuovi requisiti, nuove
funzionalità da inserire all’interno del software anche in fase di implementazione.
Questo forse è uno dei frutti principali della stretta collaborazione fra sviluppatori
e clienti, il rapporto faccia a faccia impedisce che ci siano periodi di inutile lavoro
sprecato poiché cambiato all’ultimo. Se il contatto con il cliente è continuo, allora la
progettazione risulterà più fluida. Infine il rischio di utilizzare queste metodologie
agili, è quello di credere che la progettazione formale sia in secondo piano, il che
non è assolutamente vero: è infatti importantissimo tenere in mente che obiettivo
principale è sempre quello dell’eccellenza tecnica e della qualità.
L’approccio agile contrappone un approccio adattativo (perché consente di rivedere
di continuo le specifiche e di cambiarle durante lo sviluppo mediante un forte scambio di informazioni e di pareri con il committente) rispetto ad uno predittivo (basato
su una precisa pianificazione iniziale). È comunque necessario precisare che le
metodologie agili non eliminano il concetto di progettazione, semplicemente è una
fase trasversale a tutto il ciclo di sviluppo del software.
I metodi agili hanno anche altri limiti oltre all’inevitabile abbassamento della qualità, riguardante la motivazione. Ossia, per portare avanti un progetto secondo
questa metodologia sono necessarie persone disponibili e con particolare esperienza;
12
Modelli agili di progettazione e sviluppo del software
inoltre le tecniche agili non si comportano bene con progetti enormi, con team distribuiti geograficamente, in aziende che sono particolarmente strutturate e gerarchiche, proprio perché queste situazioni intaccano i principi fondamentali dell’Agile
Manifesto.
Principi comuni dei modelli agili
Sin dall’inizio deve essere chiaro che questi approcci agili non sono la soluzione a
tutti i problemi, non hanno nessuna intenzione di abolire i metodi tradizionali, ma
possono introdurre un nuovo modo di affrontare particolari problemi. L’approccio
agile funziona molto bene in progetti a bassa criticità, se guidati da sviluppatori
senior, per software nuovi con requisiti ancora in fase di analisi. Di questi metodi
ce ne sono vari, i più famosi sono probabilmente Agile UP, Scrum, FDD, DSDM ed
XP. Anche se agili, questi metodi si fondano su un insieme di tecniche, pratiche che
permettono di disciplinare la progettazione (Cross-functional team, Time-boxing,
Pair programming, Test-driven development, Code refactoring). Le singole pratiche
applicabili all’interno di una metodologia leggera sono decine e dipendono essenzialmente dalle necessità dell’azienda e dall’approccio del project manager, tuttavia
alcune sono comuni.
Cross-functional team È l’idea di creare team di sviluppo capace di portare
avanti simultaneamente tutte le discipline della progettazione del software, quindi
dall’analisi dei requisiti, implementazione, test, etc. Ha la caratteristica di essere
self-directed, riceverà direttive ampie e generali da parte del managment, ma è il
team stesso che decide come organizzarsi e come procedere con la progettazione.
Questa tecnica porta con sè vari benefici, a partire dal modo di raggiungere gli
obiettivi, che passa da uni-directional ad una dinamica interna più ampia; non è
prestabilito chi fa che cosa, giorno per giorno. Le informazioni usate dal team per
svolgere le proprie azioni è più ampia, più ricca rispetto a quelle di un gruppo monofunzionali (greater scope of information). Non solo, oltre la vastità di informazioni,
anche la profondità di queste è notevolmente migliore (greater depth of information): supponiamo di essere in un gruppo di sola implementazione, allora tutto il
team potrebbe lavorare esclusivamente su quello che è già stato deciso e congelato
dagli analisti precedentemente; al contrario, in un cross-functional team possono
essere considerati e rivalutati molti più aspetti, anche in fase di implementazione.
Anche le persone coinvolte nel team ne traggono beneficio, non è più possibile utilizzare un gergo specifico o approssimativo nello svolgimento del proprio lavoro; ora
che si lavora in un gruppo interfunzionale è necessario essere comprensibili anche
ai membri specifici di altre discipline.
Time-boxing Questa pratica impone di dividere la progettazione in una serie
definita di intervalli di tempo prestabiliti, all’interno dei quali il lavoro deve essere
portato a termine. Se prima la logica era più incentrata sugli obiettivi (ed il tempo
si allungava fino all’esaurimento dell’obiettivo), ora con il time-boxing è il tempo
disponibile ad essere definito (ed eventualmente gli obiettivi vengono ridotti). È
importante quindi, che gli obiettivi vengano fin da subito commisurati con più real-
13
Modelli agili di progettazione e sviluppo del software
ismo al tempo necessario per portarli a termine. All’esaurire del tempo predefinito,
se l’obiettivo è ancora in fase di compimento, posso decidere se cancellare o rischedulare il lavoro in time-boxes successive. Se il vero vincolo del progetto è il tempo di
sviluppo, questa tecnica risulta particolarmente benefica. Il time-boxing può essere
utilizzata in piccola scala anche da una singola persona che voglia ottimizzare il
proprio tempo.
Pair programming Questa tecnica agile impiegata in vari metodi consiste nel
realizzare lo sviluppo del codice in due persone che se ne stanno insieme davanti
al display, uno con il ruolo di driver ed uno con il ruolo di navigator e con lo
scambio di questi ruoli particolarmente frequente (30 minuti). Il driver scrive il
codice, mentre il navigator anche non volendo svolge un ruolo particolarmente importante: ragiona sull’analisi, cioè mentalmente verifica in modo continuativo se il
codice scritto rispecchia la sua idea di implementazione dei requisiti, poi inizia a
progettare ciò che segue al codice scritto dal driver; infine evidentemente assume
un ruolo da debugger in real time, individuando gli errori compiuti dal compagno.
È un modo di lavorare molto interessante, che presenta vari benefici ma anche vari
limiti di applicazione. Fra i benefici attesi c’è la qualità del risultato che risulta essere perfettamente leggibile da due persone, e la cui chiarezza può essere apprezzata
anche al di fuori del tipico programmatore, probabilmente il codice risulta essere
particolarmente semplice anche se ugualmente efficace. Inoltre, in modo paradossale, il costo del progetto si riduce notevolmente (studi riconoscono l’incremento
del tempo di programmazione del 15%, ma il 50% in meno degli errori risultante in
un 20%-40% riduzione del tempo nella fase di debugging e testing).
Questa tecnica può essere utilizzata anche per la formazione di nuovi programmatori, che risultano essere autonomi molto più velocemente che con metodi di
apprendimento tradizionali. Risulta didattica anche la scelta di accostare due principianti, che possono aiutarsi nell’analisi e nel superamento delle difficoltà. Infine,
se per qualche ragione, un dipendente abbandona l’azienda, rimane la sicurezza di
conoscere il codice.
D’altra parte, non tutti hanno l’attitudine a collaborare e per alcuni l’esperienza
del pair-programming potrebbe non essere piacevole. Anche un principiante rischia
di sentirsi inappropriato ed intimidido se di supporto ad un senior programmer,
il quale fra l’altro rischia di annoiarsi. Possono inoltre nascere potenziali conflitti
dovuti alle differenti metodologie di programmazione utilizzati o dovuti al senso di
competizione che può scaturire fra i due.
Test-driven development Nello sviluppare il codice, per prima cosa, viene
scritto un test sul codice ancora inesistente. Successivamente scrivo il codice che
deve superare il test progettato. Se il codice supera il test, allora penso un altro
test, altrimenti devo tornare sul codice e cambiarlo. Questo procedimento richiede
un ambiente adeguato per scrivere test e sottoporre ai test frammenti di codice.
Una seconda osservazione è sulla scrittura dei test: essi sono scritti in modo lineare
rispetto allo sviluppo del codice, quindi può risultare particolarmente utile lavorare
in coppia, in modo che se uno ha pensato il test, l’altro scrive il codice senza sapere
come è stato strutturato e quindi viene evitato il rischio di scrivere codici con il solo
scopo di passare il test. Nonostante questo l’approccio è completamente diverso dal
14
2.1. Agile UP
pair programming, qui ottengo un codice pessimo, volto solo al superaramento del
test.
Avendo scritto un codice che soddisfa tutti i test, se i test sono scritti in modo
adeguato, probabilmente ho già fatto una buona parte del debugging (riducendo
quindi i tempi di sviluppo complessivi). Un secondo beneficio è che il lavoro è
guidato direttamente dai requisiti (che posso scegliere di tradurre in test). L’attenzione
è inoltre concentrata su un frammento di codice, portando ad un software più modulare ed estendibile. Anche questo metodo porta con se alcuni svantaggi fra cui la
richiesta sincronizzazione manuale fra codice del prodotto e codice dei test.
Code refactoring Questa tecnica risulta indispensabile nel caso di utilizzo del
TDD o nel caso di codice più volte maneggiato in tempi e da persone diverse.
Gli obiettivi del code refactoring sono la leggibilità del codice, la semplicità, la
mantenibilità, l’estendibile. Tutto questo risulta in un miglioramento interno del
software che spesso si riflettono in prestazioni migliorate e diminuzione dei costi
di mantenimento. Il code refactoring utilizza varie tecniche per migliorare alcuni
aspetti della progettazione:
• Astrazione. Incapsulare campi e dati in oggetti complessi, raggiungibili
tramite getter e setter. Generalizzare i tipi di dato che utilizzano informazioni
condivise. Sostituire condizioni con polimorfismo.
• Ristrutturazione. Estrarre e scomporre metodi in pezzi più piccoli. Estrarre classi con il loro codice associato.
• Leggibilità. Muovere metodi e campi su classi semanticamente coerenti.
Rinominare campi e metodi. Gerarchizzare le classi.
2.1
Agile UP
Questo metodo segue lo stesso approccio dell’UP originale, ma con la peculiare
differenza che le iterazioni non durano più 2/3 mesi, ma 4/5 settimane producendo
un incremento lineare del numero di iterazioni. Le discipline e le fasi individuate
dall’UP sono ritenute fondamentali e significative e non vengono abbandonate. Un
progetto di medie dimensioni può ad esempio essere composto da 20-25 iterazioni
della durata di circa 3 settimane l’una.
Iterazione #1
Primo workshop dei requisiti [2 giorni] (team, chief architect). La prima mattina
può essere chiesto di individuare i requisiti ad alto livello, magari indicando i nomi dei casi
d’uso, ed stabilire un 10% dei requisiti più critici (per l’architettura, per core-business o
per rischio). Il resto del tempo può essere speso per un analisi dettagliata di quel 10%.
Prima riunione di pianificazione [2 giorni]. Viene scelto un sottoinsieme dei requisiti analizzati da sviluppare durante la prossima iterazione. Il resto di questa iterazione può essere
impiegata per analizzare le condizioni di ben funzionamento dell’iterazione successiva.
Iterazione #2
UML [2 giorni] (team a coppie, chief architect). In questa prima parte dell’iterazione
gli sviluppatori si dividono in coppie e coordinati dal chief architect iniziano a pianificare
15
2.2. Scrum
l’implementazione dei requisiti ritenuti critici scelti nella prima iterazione.
Sviluppo e test [2 settimane]. Sviluppo e test dei requisiti modellati.
Controllo [1 settimana] Una settimana dalla fine dell’iterazione viene chiesto al team
se l’obiettivo originario dell’iterazione è stato raggiunto. In caso negativo, non si allunga
l’iterazione, ma si riducono gli obiettivi. Prima della fine della settimana il codice viene
congelato come prima baseline, ne viene data una dimostrazione al cliente e si iniziano
a raccogliere i primi feedback. L’ultimo paio di giorni si esegue il secondo workshop dei
requisiti, c’è una revisione del materiale e dei requisiti, si sceglie un altro 10% dei requisiti
da trattare e si conclude con una nuova riunione di pianificazione.
Dopo la seconda iterazione, la fase di inception si ritiene conclusa ed è realistico
pensare che dopo la quinta/sesta iterazione sia conclusa anche la fase di elaborazione, avendo raggiunto l’implementazione del circa 20% dei requisiti ed avendo
quindi a disposizione una baseline eseguibile affidabile.
2.2
Scrum
Lo scrum è una metodologia agile di sviluppo del software, ideata e sviluppata da
Ken Schwaber e Mike Beedle. Si basa su tre semplici punti: Sprint, Backlog e
Scrum Meeting e prevede di dividere il progetto in blocchi rapidi di lavoro (Sprint)
alla fine dei quali consegnare una versione al cliente, indica come definire i dettagli
del lavoro da fare nell’immediato futuro (Backlog) per averne una definizione estesa,
organizza riunioni giornaliere del team di sviluppo (Scrum Meeting) per verificare
cosa si è fatto e cosa si farà.
Ruoli dello Scrum process
Il termine Scrum è mutuato dal termine del Rugby che indica il pacchetto di mischia
ed è evidentemente una metafora del team di sviluppo che deve lavorare insieme
in modo che tutti gli attori del progetto spingano nella stessa direzione, agendo
come un’unica entità coordinata. I team consistono di tre ruoli principali e tre
ruoli ausiliari: ci si riferisce ai ruoli principali come pigs ed ai ruoli secondari come
chickens secondo la storia “La gallina ed il maiale”.
Storiella:
un maiale e una gallina si incontrano per creare un azienda agricola... Il maiale
dice: “come la chiamiamo?” e la gallina: “chiamiamola Hams & Eggs!!!” ed il
maiale contrariato risponde: “eh no: io ci devo mettere tutto mentre tu ci metti
solo una parte!!!”
Pigs: core Scrum roles I ruoli principali all’interno dei team Scrum sono quelli
che si occupano dello sviluppo vero e proprio del progetto, sono quelli che lo producono.
• Product Owner: rappresenta la voce del cliente ed è prezioso in quanto assicura (poiché è suo principale beneficio) che il team realizzi un prodotto valido
e di qualità
16
2.2. Scrum
• Team: è responsabile della consegna del progetto, tipicamente composto da
5-9 persone effettua il vero lavoro (analisi, design, sviluppo, test, documentazione, ...)
• Scrum Master: è colui incaricato di coordinare il team e di impedire che ci
siano ostacoli alla produzione di un buon software, non è il team-leader, ma
agisce come un buffer fra il resto del team ed eventuali problemi interni o
esterni che possono sorgere
Chickens: ancilliary Scrum roles I ruoli ausiliari o di supporto sono quegli
individui che non hanno un ruolo formale o frequente all’interno del processo di
progettazione, ma non per questo non devono essere considerati.
• Stakeholder: sono quelle persone (clienti o venditori) che hanno interesse nella
buona riuscita del progetto e pertanto lo finanziano, hanno quindi titolo per
influire sul progetto ma non sono responsabili della conduzione o della buona
riuscita del processo
• Manager: sono quelle persone che non lavorano direttamente alla progettazione del software ma curano l’ambiente ed il contesto di lavoro
Le fasi dello Scrum process
Un processo di progettazione che segue la metodologia Scrum, è caratterizzato da
tre fasi che prendono il nome di Sprint, come mostrato in Fig. 2.1.
Figure 2.1: Lo Scrum process che trasforma le specifiche di alto livello in un
incremento del prodotto potenzialmente rilasciabile.
• Product Backlog: insieme delle specifiche di alto livello ordinate per priorità, che sarebbe importante implementare ma ancora non lo sono state. Il
responsabile di questa parte è il Product Owner.
• Sprint Backlog: è una lista del lavoro che il team dovrà fare durante il
prossimo Sprint. Le funzionalità descritte nel Product Backlog sono suddivise
17
2.2. Scrum
in compiti (tasks) i quali dovrebbero avere la durata massima di due giorni.
A queto livello di dettaglio l’intero team capisce esattamente cosa deve fare e
potenzialmente, chiunque può scegliere un task dalla lista da implementare.
Questa iterazione ha durata tipica di un mese.
• Working Increment: è il rilascio del software funzionante a cui vengono
aggiunte le parti sviluppate nello Sprint appena concluso.
Figure 2.2: Dettaglio dello Scrum process. All’inizio il Product Owner crea il
Product Backlog (il quale viene mantenuto ed aggiornato per tutta
la durata del processo), a seguire iniziano le iterazioni di Sprint
che portano al rilascio incrementale del prodotto funzionante. Ogni
Sprint è caratterizzato da iterazioni giornaliere nelle quali vengono
sviluppati i singoli tasks.
Organizzazione del lavoro a Sprint Uno sprint ha durata tipica di un mese,
ma è importante all’inzio ed alla fine di uno sprint capire cosa si vuole realizzare
e cosa si è realizzato, come in ogni metodologia time-boxed. A tale scopo esistono
due fasi che racchiudono ogni Sprint:
• Sprint Planning Meeting: consiste nella fase di preparazione ed è una
riunione di 8 ore suddivisa in 2 sessioni da 4. Alla prima sessione sono presenti
tutti i ruoli principali e l’obiettivo è quello di estrarre i tasks che si andranno a
svolgere nel corso dello Sprint, ovvero si crea lo Sprint Backlog. Nella seconda
sessione sono presenti solo i membri del team e vengono definiti i tempi e le
strategie per lo svolgimento dei tasks scelti.
• Sprint Review Meeting e Sprint Retrospective: consiste nella fase di
conclusione. Nella prima riunione, della durata di 4 ore circa, si analizza
il lavoro svolto e quello che invece non è stato completato e si presentano
gli incrementi del prodotto agli Stakeholders sotto forma di demo. Nella
seconda riunione invece tutti i membri del team riflettono sullo Sprint appena
terminato, ci si chiede cosa è andato bene e cosa può essere migliorato nel
prossimo Sprint, questo incontro è presupposto durare circa 3 ore.
Meeting
Per la natura stessa della metodologia Scrum, è fondamentale che tutti gli individui
si comportino in conformità alla direzione del team, pertanto ogni giorno sono
organizzati due incontri: il Daily Scrum e lo Scrum of Scrums. Il Daily Scrum è
un incontro dove tutti possono partecipare, ma solo i pigs possono parlare, ha una
durata specifica di 15 minuti e durante il meeting si cerca di rispondere a domande
come “cosa hai fatto rispetto a ieri?”, “cosa intendi fare oggi?”, “hai incontrato
particolari problemi?”. Lo Scrum Master ha il compito di facilitatore: deve prendere
in considerazione questi problemi e stabilire come possono essere affrontati. Lo
18
2.3. FDD
Scrum of Scrums invece è un incontro sempre time-boxed, che ha luogo sono
per progetti che coinvolgono più team di sviluppo, ed al quale partecipano solo i
rappresentanti di ogni team che si aggiornano sullo stato attuale del lavoro e su
direzioni future. Nel caso ci fossero pezzi di software da trasferire da un team
all’altro, questo è il luogo per discuterne.
Artefatti
Durante la fase di progettazione di tutte le metodologie agili il team e gli altri core
roles producono dei documenti necessari per avanzare alle iterazioni successive; gli
Artefatti di Scrum includono il Product Backlog, il Release Burndown, lo Sprint
Backlog e lo Sprint Burndown.
Gli artefatti di Burndown sono grafici che visualizzano pubblicamente il lavoro che
rimane da fare in una determinata fase, in particolare lo Sprint Burndown misura
la quantità di elementi residui di uno Sprint Backlog nel corso di uno Sprint e viene
aggiornato ogni giorno, mentre il Release Burndown misura la quantità residua di
Product Backlog rispetto al piano di rilascio (Release Plan) e viene aggiornato solo
alla fine di ogni Sprint.
Considerazioni finali sul metodo Scrum
1. Il cliente partecipa attivamente (Product Owner) alla progettazione del software.
2. Si producono frequenti rilasci (demo) che il cliente stesso può apprezzare
durante lo Sprint Review Meeting alla fine di ogni sprint.
3. La stretta e frequente collaborazione di tutti gli individui fa si che eventuali
rischi emergano appena rilevati; questo permette di affrontare con prontezza
i problemi che si incontrano risparmiando tempo.
4. Non solo è un metodo agile, ma richiede anche poco tempo e pochi sforzi per
essere adottato.
5. Fra le tecniche agili adottate nello Scrum emergono il Cross-functional Team
e il Time Boxing.
2.3
FDD
Il feature driven development è una metodologia agile, ideata da Jeff De Luca e
Peter Coad, che propone una robusta fase di analisi e progettazione integrata con
un modello di sviluppo agile, è particolarmente indicato per lo sviluppo di progetti
di dimensioni medio-grandi. Come s’intuisce dal nome è una forma di sviluppo
guidata dalle funzionalità richieste e necessarie del programma e si prefigge come
scopo principale di rilasciare software tangibile e funzionante in maniera sistematica.
19
2.3. FDD
Fasi dell’FDD
L’FDD è un processo model-driven basato su iterazioni corte che consiste di 5 fasi
principali.
• Fasi sequenziali, stile waterfall
1. Develop Overall Model
2. Build Feature List
3. Plan by Feature
• Fasi iterative di durata massima di tre settimane
4. Design by Feature
5. Build by Feature
Develop Overall Model Il progetto inizia con una stesura ad alto livello degli
obiettivi del sistema software ed il suo campo di applicazione. A seguire viene
fatto uno studio approfondito dei domini, dei campi con i quali il software avrà
a che fare e diversi gruppetti giungono separatamente ad una prima modellazione
di questi domini. Questi gruppi si confrontano e viene scelto una o un in’insieme
delle modellazioni prodotte dai gruppi per ogni dominio; l’insieme di questi modelli
produce l’overall model che sta alla base di tutte le fasi successive, come descritto
in Tab. 2.1.
Sub-activity
Form Modeling
Team
Conduct
Domain Walkthrough
Study
Documents
Develop Small
Group Models
Develop Team
Model
Refine Overall
Object Model
Write
Notes
Model
Description
The MODELING TEAM comprises permanent members from the domain and development areas, specifically the domain experts and the chief programmers. Other
project staff members are then rotated through the modeling sessions so that everyone
gets a chance to participate and to see the process in action.
A domain expert gives a DOMAIN OVERVIEW of the domain area to be modeled.
This should also include information that is related to this DOMAIN AREA but not
necessarily a part of its implementation.
Optionally the team studies available REFERENCE or REFERENCED REQUIREMENTS documents such as object models, functional requirements (traditional or
use-case format), data models, and user guides.
Forming groups of no more than three, each SMALL GROUP will compose a SMALL
GROUP MODEL in support of the domain area. The Chief Architect may propose
a ´strawman´ model to facilitate the progress of the teams. A member from each
small group presents that groups proposed model for the domain area. The Chief
Architect may also propose further model alternatives.
The MODELING TEAM selects a proposed TEAM MODEL or composes a model
by merging ideas from the proposed models.
Every so often, the OVERALL MODEL, consisting of an overall SEQUENCE DIAGRAM and a CLASS DIAGRAM, is REFINED with the new model shapes produced
by iterations of the ‘Develop Team Model’ task above.
EXPLANATORY NOTES on detailed or complex model shapes and on significant
model alternatives are made for future reference by the project.
Table 2.1: Sub-activities caratteristiche della fase di Develop Overall Model.
Build Feature List La conoscenza acquisita durante la fase iniziale di modellazione è usata per identificare una lista di funzionalità. Questo è fatto decomponendo il dominio di applicazione del software in aree per argomenti comuni. Le
funzionalità all’interno di queste aree sono formalizzate a partire dalle richieste del
20
2.3. FDD
cliente tipicamente espresse nella forma azione-risultato-oggetto (calcola il totale dei
costi, valida la password dell’utente). Le funzionalità così elencate non dovrebbero
richiedere più di 2/3 settimane di lavoro per essere completate, oppure dovrebbero
essere separate in diversi pezzi. Questa fase è descritta in dettaglio in Tab. 2.2.
Sub-activity
Form Features
List Team
Build Features
List
Description
The FEATURE LIST TEAM comprises the chief programmers from the MODELING
TEAM in the process ‘Develop Overall Model’.
The FEATURE LIST TEAM shall identify the FEATURE LIST using the knowledge
obtained from the process ‘Develop Overall Model’. This is a simple functional decomposition into SUBJECT AREAS that come from the partitioning of the domain
by the domain experts for their domain area walkthroughs in the process ‘Develop
Overall Model’. It is decomposed into SUBJECT AREAS that comprise BUSINESS
ACTIVITIES that comprise BUSINESS ACTIVITY steps (FEATURES).
Table 2.2: Sub-activities caratteristiche della fase di Build Feature List.
Plan by Feature Ora la lista delle funzionalità è completa, il passo successivo è produrre un piano di sviluppo, questa procedura è dettagliata in Tab. 2.3.
L’assegnazione delle responsabilità è fatto ordinando ed assegnando funzioni, o insiemi di funzioni, come classi ai chief programmers.
Sub-activity
Form Planning
Team
Determine Development Sequence
Description
The PLANNING TEAM comprises the development manager plus the chief programmers.
The main tasks in the process ‘Plan By Feature’ are not a strict sequence. Like many
PLANNING activities they are considered together, with REFINEMENTS made
from one or more tasks and then considering the others again. The PLANNING
TEAM shall assign a DATE (month and year only) for completion of each BUSINESS
ACTIVITY. The identification of the BUSINESS ACTIVITY and the completion
DATE (and thus the DEVELOPMENT SEQUENCE) is based on:
•
•
•
•
•
Dependencies between FEATURES in terms of CLASSES involved;
Balancing load across CLASS OWNERS;
The complexity of the FEATURES to be implemented;
Bringing forward high-risk or complex BUSINESS ACTIVITIES;
Consideration of any external (visible) milestones such as betas, previews,
feedback checkpoints and the "whole products" that satisfy such milestones.
Assign
Business Activities
to Chief Programmers
The PLANNING TEAM shall assign chief programmers as owners of BUSINESS
ACTIVITIES. The assignment is based on:
Assign Classes
to Developers
The PLANNING TEAM shall assign developers as CLASS OWNERS. Developers
own multiple CLASSES. The assignment of CLASSES to developers is based on:
• The DEVELOPMENT SEQUENCE;
• Dependencies between FEATURES in terms of CLASSES involved;
• Balancing load across CLASS OWNERS (remember that chief programmers
are also CLASS OWNERS);
• The complexity of the FEATURES to be implemented.
•
•
•
•
Balancing load across developers;
The complexity of the CLASSES;
The usage (e.g. high-use) of the CLASSES;
The DEVELOPMENT SEQUENCE.
Table 2.3: Sub-activities caratteristiche della fase di Plan by Feature.
21
2.3. FDD
Design by Feature Per ogni funzione è prodotto un design package. Un chief
programmer seleziona un gruppo ristretto di funzionalità che devono essere sviluppate nella prossima iterazione (tipicamente 2/3 settimane). Insieme ai corrispettivi
responsabili per quella classe, il chief programmer produce una sequenza dettagliata
di diagrammi per ogni funzionalità e affina la qualità dell’overall model. A questo
punto i prologhi delle classi e dei metodi sono scritti ed alla fine viene effettuato una
verifica su tutta la procedura di design. Dettagli a riguardo di questa fase possono
essere trovati in Tab. 2.4.
Sub-activity
Form Feature
Team
Conduct
Domain Walkthrough
Study
enced
ments
Develop
quence
gram(s)
Refine
Model
ReferDocuSeDia-
Object
Write
Class
and
Method
Prologue
Design Inspection
Description
The Chief Programmer identifies the CLASSES likely to be involved in the design
of this set of FEATURES and updates the FEATURE database accordingly. From
the CLASS OWNER LIST, the Chief Programmer identifies the developers needed
to form the FEATURE TEAM. As part of this step, the Chief Programmer creates
a new DESIGN PACKAGE for the FEATURES(S) as part of the work package.
The domain expert gives a DOMAIN OVERVIEW of the domain area for the FEATURE to be designed. This should also include domain information that is related to
the FEATURE but not necessarily a part of its implementation. This is an optional
task based on the complexity of the FEATURE and/or its interactions.
The FEATURE TEAM studies the REFERENCED REQUIREMENT(S) for the
feature to be designed, all COVERING MEMOS, screen designs, external system
interface specifications and any other supporting documentation. This is an optional
task based on the complexity of the FEATURE and/or its interactions.
Develop the SEQUENCE DIAGRAM(S) required for the FEATURE to be designed.
The diagram files should be checked into the version control system. Any ALTERNATIVE DESIGNS, design decisions, requirements clarifications and EXPLANATORY
NOTES are also recorded and written up in the DESIGN ALTERNATIVES section
of the DESIGN PACKAGE.
The Chief Programmer creates a FEATURE TEAM Area for the FEATURE(S). This
area is either a directory on the file server or a directory on their PC that is backed
up to the server by the Chief Programmer as required or utilizes work area support
in your version control system. The purpose of the FEATURE TEAM Area is that
work in progress by the FEATURE TEAM can be shared and is visible amongst the
FEATURE TEAM but is not visible to the rest of the project. The Chief Programmer
makes some REFINEMENTS on the model to add new / updated CLASSES, methods, attributes and/or to make changes to existing CLASSES, methods or attributes
based on the SEQUENCE DIAGRAM(S) defined for the FEATURE(S). This results
in the implementation language source files being updated in the FEATURE TEAM
Area. The Chief Programmer creates model diagrams in a publishable format. These
files should be checked into the version control system and submitted for publishing
on the project intranet.
Using the updated implementation language source files from the ‘Refine Object
Model’ task in the shared FEATURE TEAM Area, the development owner of each
CLASS writes the CLASS AND METHOD PROLOGUE for each item defined by the
FEATURE and SEQUENCE DIAGRAM(S). This includes parameter types, return
types, exceptions and messages. Once each developer has completed this task, the
Chief Programmer generates the API documentation using <your tool> and submits
it for publication on the project intranet.
A design inspection with the FEATURE TEAM members or with other project members is held. The decision to inspect within the FEATURE TEAM or with other
project team members is that of the Chief Programmer. On acceptance a TODO
TASK LIST is generated per affected CLASS, and each team member adds their
tasks to their calendar task list. The Chief Programmer must also merge changes
from the shared FEATURE TEAM Area into the change control system.
Table 2.4: Sub-activities caratteristiche della fase di Design by Feature.
Build by Feature Dopo che la fase di design è avvenuta con successo si passa
ad un’attività più rivolta a produrre una funzione completa e che il cliente possa
valutare. I responsabili per la classe sviluppano il vero codice ed un unità di testing
ispeziona il codice. Se si ritiene l’iterazione valida, la funzionalità appena com-
22
2.3. FDD
pletata viene promossa ed integrata nella versione aggiornata del software, come
mostrato in Tab. 2.5.
Sub-activity
Implement
Classes
and
Methods
Inspect Code
Conduct
Test
Unit
Promote
Build
to
Description
The development CLASS owners will perform the IMPLEMENTATION of the items
necessary to satisfy the requirements of their CLASS for this FEATURE.
A CODE INSPECTION with the FEATURE TEAM members or with other project
members is held either before or after the unit test task. The decision to inspect
within the FEATURE TEAM or with other project team members is that of the
Chief Programmer. The decision to inspect before or after unit test is that of the
Chief Programmer.
The development CLASS owner tests their code to ensure all requirements of their
CLASS are satisfied. The Chief Programmer determines what FEATURE TEAMlevel unit testing is required (if any). That is, if any testing across the CLASSES
developed for this FEATURE is required.
PROMOTION to the BUILD of CLASSES is only possible after a successful CODE
INSPECTION. The Chief Programmer tracks the individual CLASSES being promoted, through feedback from the developers, and is the integration point for the
entire FEATURE.
Table 2.5: Sub-activities caratteristiche della fase di Build by Feature.
È riportato in Fig. 2.3 l’activity diagram complessivo delle fasi sopra descritte.
Milestones
In quanto le funzionalità sono piccole, completarne una è un compito relativamente
veloce. Per un report accurato dello stato dello sviluppo è comunque importante
segnare il progresso fatto per ogni feature. FDD definisce quindi sei milestone per
ogni funzionalità che devono essere completati consequenzialmente. Le prime tre
milestones sono compltate durante la fase di Design By Feature, mentre le ultime
tre sono completate nella fase di Build by Feature. Per aiutare a tenere traccia
del progresso viene assegnata una percentuale ad ognuna di queste milestones. In
Tab. 2.6 sono riportate le milestones e le relative percentuali di completamento.
Domain Walkthrough
1%
Design
40%
Design Inspection
3%
Code
45%
Code Inspection
10%
Promote To Build
1%
Table 2.6: Percentuali di progressione assegnate a ciascuna milestone.
Best practices
Feature-Driven Development è costruito attorno ad un insieme di best practices
riconosciute anche a livello industriale derivanti dall’ingegneria del software. Queste
pratiche sono tutte guidate dal punto di vista dell’utente ed è la combinazioni di
tutte queste pratiche che rende l’FDD così potente.
Domain Object Modeling Domain Object Modeling consists of exploring and
explaining the domain of the problem to be solved. The resulting domain
object model provides an overall framework in which to add features.
23
2.3. FDD
Figure 2.3: Activity Diagram complessivo del processo FDD.
24
2.3. FDD
Developing by Feature Any function that is too complex to be implemented
within two weeks is further decomposed into smaller functions until each subproblem is small enough to be called a feature. This makes it easier to deliver
correct functions and to extend or modify the system.
Individual Class (Code) Ownership Individual class ownership means that distinct pieces or grouping of code are assigned to a single owner. The owner is
responsible for the consistency, performance, and conceptual integrity of the
class.
Feature Teams A feature team is a small, dynamically formed team that develops
a small activity. By doing so, multiple minds are always applied to each design
decision and also multiple design options are always evaluated before one is
chosen.
Inspections Inspections are carried out to ensure good quality design and code,
primarily by detection of defects.
Configuration Management Configuration management helps with identifying
the source code for all features that have been completed to date and to
maintain a history of changes to classes as feature teams enhance them.
Regular Builds Regular builds ensure there is always an up to date system that
can be demonstrated to the client and helps highlighting integration errors of
source code for the features early.
Visibility of progress and results By frequent, appropriate, and accurate progress
reporting at all levels inside and outside the project, based on completed work,
managers are helped at steering a project correctly.
Parking Lot Diagram
Esiste uno strumento che serve a visualizzare il progresso del progetto in fase di
implementazione: il Parking Lot Diagram. Seconda questa tecnica ad ogni feature
set è assegnata una scheda che raccoglie le informazioni principali sul suo stato di
avanzamento: il nome, il chief programmer, il numero di features che contiene, la
percentuale di completamento. Un esempio di tale scheda è mostrata in Fig. 2.4.
Figure 2.4: Una singola PLD card, associata ad un set di features.
25
2.4. Dynamic System Development Method
Ma la vera forza di questa tecnica è messa in evidenza quando queste feature sets
sono combinati in feature areas dando un’idea globale dello stato di avanzamento
del progetto, come mostrato in Fig. 2.5.
Figure 2.5: Una lavagna divisa in aree ed in features sets che mostra il livello
globale di avanzamento del progetto.
2.4
Dynamic System Development Method
Questo metodo può essere presentato come un’evoluzione del concetto di RAD
(Rapid Application Development), ma rispetto ad esso rivela una struttura molto
più organizzata. Gli obiettivi rimangono comunque molto chiari: tight schedule e
tight budget. Tutte le volte che un progetto software deve rispettare rigorosamente
i tempi di consegna ed i soldi a disposizione, questo metodo pare essere il più
indicato e pare essere quello che più di altri cerca di garantire il rispetto dei vincoli.
Chiaramente questo approccio non si ritiene adatto a tutti i tipi di progetto: infatti
non sempre è vantaggioso scegliere di rinunciare alla qualità a vantaggio dei tempi
e dei costi, ad esempio in applicazioni con pesanti implicazioni nel campo della
sicurezza. L’idea alla base di questa tecnica è una legge di Pareto: l’80% delle
esigenze del cliente sono tipicamente soddisfatte dal 20% delle funzionalità; occorre
puntare quindi a sviluppare il 20% in modo ottimale e veloce, lasciando al restante
80% delle funzionalità il tempo ed il budget rimanente.
Principi fondanti
I principi fondanti di questa metodologia sono il coinvolgimento dell’utente nel
ciclo di sviluppo, esso infatti è la chiave principale per svolgere un progetto in
modo efficiente ed efficace, dove sia gli utenti che gli sviluppatori si trovano nello
stesso posto in modo che le decisioni possano essere prese in modo tempestivo,
l’indipendenza del team di progetto ovvero il team di progetto deve essere
26
2.4. Dynamic System Development Method
messo nelle condizioni di prendere decisioni importanti senza dover attendere autorizzazioni di livello più alto, l’individuazione delle funzionalità più critiche
secondo il principio che rilasciare un software buono presto è più apprezzabile che
qualcosa di perfetto in tempi inaccettabili per il cliente ed infine uno sguardo attento alle esigenze correnti del clliente: il software deve innanzittuto coprire
i bisogni reali attuali, le generalizzazioni e le astrazioni potranno essere fatte se ci
sarà tempo e denaro.
Principi operativi
Ci sono inoltre cinque punti operativi: lo sviluppo deve essere iterativo ed incrementale guidato dagli user-feedback., tutti i cambiamenti durante lo sviluppo devono
essere reversibili, i requisiti e gli obiettivi di alto livello (generici) devono essere
baselined (consolidati, costituire un punto di partenza) prima che inizi il progetto,
il collaudo deve essere condotto durante l’intero ciclo di vita del progetto, infine
la comunicazione e la coperazione fra tutti i responsabili del progetto deve essere
efficace.
Oltre questi principi vengono fatte anche alcune assunzioni, nelle quali si rispecchia
la validità del modello DSDM: è innanzittutto necessario essere consapevoli che
nessun sistema è perfetto al primo tentativo, ma non è neanche necessario che lo
sia, infatti si suppone vero che l’80% delle esigenze del cliente possano essere soddisfatte nel 20% delle funzionalità. Siccome il prezzo da pagare, in termini di qualità, è
elevato, è necessario che il rilascio del software sia on-time ed on-budget, altrimenti
non ne sarà valsa la pena. Il processo di sviluppo deve essere ben strutturato, solido
ma agile: ogni fase ha come unico requisito quello di essere abbastanza completo
per permettere l’avviamento dello step successivo; parte della strutturazione del
processo si deve al fatto che anche il project managment deve essere considerato,
lo stesso deve premiare il rilascio del software piuttosto che il completamento dei
task. La valutazione del rischio riguarda le funzionalità da rilasciare (tralasciando
tutti gli altri tipi di rischi). Le stime devono basarsi sulle funzionalità realizzate,
non sulle linee di codice.
Fasi principali del processo DSDM
Fatte queste premesse il metodo si articola in 3 fasi:
1. Pre-project
2. Project life-cycle
(a)
(b)
(c)
(d)
(e)
Feasibility study
Business study
Functional model iteration
Design and build iteration
Implementation
3. Post-project
27
2.4. Dynamic System Development Method
Pre-project e Post-project Nella fase di Pre-project viene stabilito a grandi
linee cosa il progetto dovrà fare, vengono acquisiti i fondi: è un’attività preparatoria, non meglio precisata o strutturata. Una volta stabilito che il manager crede nel
progetto e ci finanzierà, possiamo iniziare il progetto. Nel Post-project invece finiscono tutte quelle attività che non vogliamo far rientrare nel project life-cycle (anche
se altri metodi agili li considererebbero tali): deve garantire il funzionamento del
software, vengono eventualmente corretti alcuni errori, viene eseguita una fase di
manutenzione, ed eventualmente possono venire estese le funzionalità del software.
Feasibility study In questo primo stage occorre decidere se il metodo DSDM è
adatto al tipo di progetto ed alle esigenze del cliente. Viene prodotto un feasibility
report, un documento in cui si spiegano le ragioni per la scelta di questo metodo
e viene rilasciato un global outline plan, una prima indicazione approssimativa
delle fasi e dei tempi dello sviluppo. Può essere allegato anche un risk-log, ovvero
uno strumento per conoscere a priori quali potranno essere i rischi ai quali questo
progetto è esposto.
Business study Questo secondo stage viene spesso considerato insieme al feasability study, ed insieme al pre-project formano la fase di preparazione all’implementazione
effettiva delle funzionalità, proprio perché anche il DSDM è comunque un metodo
agile, queste fasi non dovrebbero durare in tutto più di 2/3 settimane. In particolare
il business study deve raccogliere i primi requisiti generali, definire le priorità dello
sviluppo (quel 20% delle funzionalità di Pareto) ovvero produrre la prioritized requirement list ed una business area definition (focalizzare il contesto in cui questo
sistema si innesta, quindi uno studio sui bisogni che un software di questo tipo
dovrebbe coprire). Altri obiettivi di questo stage sono la produzione di una system
architecture (in termini di sottosistemi) ed un prototyping plan (suddivisione in
moduli software).
Figure 2.6: Cicli iterativi all’interno di un processo DSDM.
28
2.4. Dynamic System Development Method
Functional Model Iteration I requisiti che sono stati individuati nelle fasi
precedenti sono ora convertiti in un modello funzionale. Questo modello consiste di
entrambi un prototipo funzionante ed alcuni modelli. La prototipazione è una delle
tecniche chiave all’interno di questa fase poiché aiuta ad integrare il contributo degli
utenti e del cliente all’interno del progetto. Il prototipo così sviluppato è sottoposto
alla visione di diversi utenti; in favore di garantire qualità, la fase di testing è implementata ad ongi iterazione DSDM anche se la maggior parte è svolta all’interno
del Functional Model Iteration, che può essere suddiviso in quattro sottofasi:
1. Identify Functional Prototype: determinare quali funzionalità implementare
nel prototipo che risulterà da questa iterazione.
2. Agree Schedule: mettersi d’accordo su come e quando sviluppare queste funzionalità.
3. Create Functional Prototype: sviluppo effettivo del prototipo, con annesso
un confronto dettagliato con i prototipi funzionali di iterazioni precedenti ed
applicazioni di eventuali modifiche.
4. Review Prototype: controllo della correttezza del prototipo realizzato. Questo
può essere fatto lasciandolo testare all’utente finale, utilizzando poi i test logs
e il feedback da parte dello user per generare il functional prototyping review
document.
Il risultato di queste fasi sono un modello funzionale ed un prototipo funzionale
che insieme rappresentano tutte le funzionalità che potrebbero essere utilizzate alla
fine di questa iterazione, pronte per essere testate dall’utente. Successivamente
a questo, viene aggiornata la lista dei requisiti, eliminando i task che sono stati
realizzati e ripensando eventuali priorità che necessitano di essere modificate.
Design and Model Iteration Lo scopo principale di questa iterazione è di
integrare i componenti funzionali della fase precedente all’interno di un sistema che
soddisfa i bisogni dell’utente. Ancora una volta il testing è fondamentale in questa
fase. Questo stage pul essere suddiviso in quattro sottofasi:
1. Identify Design Prototype: identificare requisiti funzionali e non-funzionali
che devono essere testati nel sistema.
2. Agree Schedule: mettersi d’accordo su come e quando sviluppare queste funzionalità.
3. Create Design Prototype: creazione di un sistema che può essere gestito in
modo sicuro dall’utilizzatore tramite un accesso quotidiano. È qui che si
realizza il nuovo prototipo per questa iterazione partendo dall’ultima release
rilasciata.
4. Review Design Prototype: controllo della correttezza del sistema progettato.
I risultati per questo livello sono un Design Prototype (che l’utente testerà e che
verrà poi rilasciato all’iterazione successiva) ed una documentazione utente.
29
2.5. XP
Implemetation Nella fase di implementazione, il sistema testato (con tanto di
utilizzatori e documentazione) è rilasciato al cliente così come suggerita un’attività
di formazione priore all’utilizzo del software. Il sistema che deve essere rilasciato
è stato controllato per includere i requisiti che sono stati fissati nelle fasi iniziali
del progetto. Anche la fase di implementazione può essere suddivisa in quattro
sottoparti:
1. User Approval and Guidelines: l’utente finale approva il sistema testato per
la sua implementazione e le sue linee guida.
2. Train Users: formare futuri utilizzatori del software.
3. Implement: installazione del software sulle macchine messe a disposizione
dall’utente finale.
4. Review Business: osserva l’impatto del software sviluppato nel contesto del
business, un problema centrare sarà quello di capire se il sistema incontra gli
obiettivi economici che erano stati stabiliti all’inizio del progetto.
Gli artefatti di questa fase sono un sistema distribuito on-location, utenti formati
e specializzati ed un documento di project revew del sistema.
MoSCoW
MoSCoW è una tecnica di prioritazzazione usata nello sviluppo di software per arrivare ad una comune comprensione con gli stakeholders sull’importanza dei singoli
requisiti. Le lettere maiuscole stanno per:
• M: MUST have this.
• S: SHOULD have this.
• C: COULD have this.
• W: WON’T have this.
2.5
XP
L’Extreme Programming (XP) è una metodologia agile di sviluppo del software che
si propone di migliorare la qualità del software a la sua reattività ai cambiamenti
frequenti dei requisiti descritti dal cliente. Come tutte le metodologie agili è caratterizzato da frequenti release in corte iterazioni, con le quali si cerca di aumentare
la produttività. La metodologia prende nome dall’idea che elementi comuni anche
alle altre metodologie agili sono presi e portato all’estremo secondo la teoria che se
qualcosa è buono, di più è meglio.
In realtà l’approccio XP è soggetto a parecchie critiche, anche da parte dei creatori stessi, che spaziano dalla possibile instabilità delle releases alla mancanza di
specifiche di un overall design e scarsa documentazione.
30
2.5. XP
Goals
La metodologia XP è descritta come una disciplina del software development che
organizza le persone allo scopo di produrre software di più alta qualità e più produttivamente. L’XP cerca di ridurre il costo delle modifiche che inevitabilmente
il cliente porta ad introdurre in fasi avanzate dello sviluppo tramite un numero
elevato di corte iterazioni. L’XP inoltre introduce un numero elevato di valori base,
principi e pratiche oltre quelle descritte nell’Agile Manifesto.
Principles
I principi che formano le basi della metodologia XP hanno lo scopo di velocizzare
il processo di sviluppo.
Feedback L’XP vede il feedback come il suo strumento più utile se utilizzato di
frequente in modo che il tempo che intercorre fre il completamento di task ed
il suo feedback siano critici per la comprensione e la modifica del task stesso.
Di conseguenza il cliente ha una visione chiara di come il sistema sta venendo
sviluppato ed ha la possibilità di cambiare in ogni momento direzione di alcune
decisioni. Anche il frequente uso di test partecipa all’idea di feedback.
Assuming simplicity Consiste nel trattare ogni problema come se la soluzione
fosse “estremamente” semplice. Tradizionalmente i metodi di sviluppo chiedono
di progettare il codice per la riusabilità, l’XP rifiuta questa idea; i sostenitori
dell’XP ritengono che fare grandi modifiche non sia efficiente, ma che tante
piccole modifice iterative ed incrementali siano di facile realizzazione.
Embracing change È il principio di accettare la filosofia delle modifiche continue. Tutto il ciclo di vita del progetto deve rimanere perennemente aperto
e disponibile ad eventuali modifiche che il cliente può richiedere.
Activities
L’XP descrive quattro attività base che sono compiute all’interno del processo di
sviluppo del software: coding, testing, listening and designing.
Coding I difensori di questa metodologia argomentano che l’unica vera parte importante del processo di sviluppo è la parte di coding. Senza il codice, non c’è
prodotto funzionante. Durante questa fase inoltre si acquisisce una conoscenza
più approfondita delle possibili problematiche e le soluzioni migliori vengono adottate: non solo, tramite l’utilizzo del codice anche problemi difficili da spiegare a
parole vengono formalizzati (perché la sintassi di un linguaggio di programmazione
è formale) nel codice e possono essere utilizzati come supporto nell’evidenziare un
problema od una soluzione. Il codice è sempre chiaro, conciso e la sua interpretazione è univoca, inoltre gli altri programmatori possono aggiungere i loro feedback
codificando anch’essi i loro pensieri a riguardo.
31
2.5. XP
Testing L’idea che l’XP ha riguardo questa fase è chiara: se un po’ di testing
può eliminare alcuni problemi, alcune falle, un bel po’ di testing ne può eliminare
un sacco. Il programmatore scrive tutti i test automatici che pensa siano necessari
per scoprire possibili incongruenze nel codice, se tutti i test finiscono con successo,
allora il codice è completo - ogni pezzo di codice scritto è testato prima di passare
alla fase successiva. Ci sono inoltre dei test di accettazione che devono verificare
che la comprensione dei requisiti dei programmatori fosse compatibile con quanto
intendeva il cliente.
Listening I programmatori devono ascoltare quali sono esattamente i bisogni del
cliente, quale business logic è necessaria. Devono capire questi bisogni abbastanza
bene da poter dare al cliente pareri tecnici riguardo i problemi che potrebbero o
meno essere risolti dal software. La comunicazione fra il cliente ed il programmatore
sarà poi approfondita nel Planning Game.
Designing Dal punto di vista della semplicità, uno potrebbe sostenere che lo
sviluppo di software non necessità niente di più che coding, testing e listening. In
effetti, se queste attività sono svolte bene il risultato è un sistema che funziona. In
pratica, questo non è mail il caso. Il sistema tende a diventare troppo complesso e
le dipendenze all’interno del progetto diventano sempre meno chiare: tutto questo
può essere evitato creando una design structure che organizza la logica del sistema.
Un buon design può evitare molte complicazioni ed il crearsi di inutili dipendenze,
ovvero cambiare una parte del sistema non richiede modifiche a valanga su altre
parti del sistema.
Values
L’XP riconosce come fondamentali cinque valori affinché la fase di progettazione e
sviluppo del software possa avvenire con successo:
1. Communication È consuetudine che il passaggio di conoscenza da un’attività
all’altra avvenga tramite documentazione nello sviluppo di grandi progetti,
al contrario l’XP incoraggia a confrontarsi spesso e verbalmente, poiché considerato più rapido ed efficiente. Il risultato è che tutto il team ha in ogni
momento la stessa visione sull’intero progetto che è, fra l’altro, la stessa visione che ha l’utente sul progetto. A tale scopo l’XP favorisce l’uso di design
semplici, metafore comuni, collaborazione fra utenti e programmatpri, comunicazione verbale frequente e feedback.
2. Simplicity L’XP suggerisce di partire con la soluzione più semplice, funzionalità extra possono essere aggiunte successivamente. Il focus più importante
è sui requisiti che devono essere sviluppati oggi, non quelli di domani, la settimana prossima o il mese prossimo (YAGNIN - “you ain’t gonna nedd it
now”). Per rendere il codice modificabile è però necessario tenerlo semplice e
ben strutturato.
3. Feedback Nell’XP ci sono diversi tipi di feedback: i feedback che vengono
dal sistema, tramite test specifici o test d’integrazione oppure i feedback
32
2.5. XP
dall’utente detti anche acceptance tests che misura se le funzionalità sviluppate erano veramente quelle che il cliente desiderava. È inoltre possibile che
anche il team di sviluppo produca dei feedback, quando ad esempio i clienti
propongono aggiunte di nuove funzionalità, un parere tecnico ed uno studio
di fattibilità è apprezzato.
4. Courage Questa metodologia chiede coraggio, soprattutto per i palesi rischi
ai quali apre, a partire dal fatto di programmare per oggi e non per domani.
Questo atteggiamento serve per evitare di perdersi in pianificazione e progettazioni che richiederebbero un sacco di tempo. Il coraggio permette agli
sviluppatori di sentirsi a proprio agio nel rimettere mano al proprio codice
quando sarà necessario. Un’altro esempio di coraggio è capire quando è il
momento di buttare via il codice e ripartire da capo: a volte è più veloce
che cercare di riorganizzarlo. Infine coraggio significa persistenza: per un
programmatore trovarsi bloccato su un problema complesso è all’ordine del
giorno, e magari il giorno dopo risolverlo velocemente, se si è stati persistenti.
5. Respect Il valore del rispetto include rispetto per gli altri e per se stessi. I
programmatori non dovrebbero mai fare modifiche che non permettono più di
compilare, che gravano su test già passati o che ritardano o vanificano il lavoro
di altri. Allo stesso tempo gli sviluppatori hanno rispetto per se stessi quando
cercano di lavorare dando il massimo di loro stessi nel realizzare un software
di alta qualità, implementando sempre la soluzione migliore. Inoltre adottare
i quattro valori precedenti porta a guadagnare il rispetto degli altri. Nessuno
nel team dovrebbe sentirsi ignorato o poco apprezzato. Questo garantisce un
alto livello di motivazione ed incoraggia alla lealtà verso il proprio team e
verso gli obiettivi del progetto. Questo valore dipende molto dagli altri.
Rules
Mentre tutte le altre metodologie introducono i concetti di fasi e specificano le
iterazioni necessarie durante il ciclo di sviluppo del progetto, i sostenitori dell’XP
giudicano che l’unico modo per poter apprezzare una metodologia è seguire alcune
chiare regole. Esistono due categorie di regole nell’XP: rules of engagement e rules
of play.
Rules of engagement Nel baseball, le rules of engagement potrebbero essere
pensate come quelle che definiscono la dimensione del campo, il numero di giocatori
di ogni squadra, il metodo di segnare punti, ... Il gioco non può iniziare senza
queste. Queste regole sono prominenti quando è definito un contesto ed il progetto
deve iniziare, ma sono anche presenti durante tutta la durata dell’attività anche
se a causa dell’intensità delle rules of play durante il gioco queste diventano meno
evidenti. Senza di esse, non si ha un gioco identificabile ma non sono loro che
definiscono le attività minuto per minuto, definiscono solo l’ambiente e le condizioni
di lavoro.
E1. Un team consiste di un gruppo di persone dedicate alla produzione del software.
Il prodotto può o meno essere parte di un prodotto più grande. Ci possono
33
2.5. XP
essere tanti ruoil all’interno del team, ma ci devono per forza essere almeno
un cliente ed uno sviluppatore.
E2. Il cliente deve definire e continuamente affinare gli obiettivi e le priorità basandosi su stime ed altre informazioni fornite dagli sviluppatori ed altri membri
del team. Gli obiettivi devono essere definiti in termini di cosa e non di come.
E3. Il cliente deve essere sempre reperibile e disponibile a fornire informazioni su
richiesta per assistere gli sviluppatori. Il cliente è parte integrante del team.
E4. In un qualsiasi momento, qualsiasi membro del team deve essere in grado
di misurare lo stato di avanzamento del team nella direzione degli obiettivi
definiti dal cliente.
E5. Il team deve agire come un efficace rete sociale, ovvero:
• Comunicazioni oneste che portano a migliorare la conoscenza condivisa.
• Minima distanza fra ciò che serve al team per fare progressi e le persone/risorse che possono colmare questi bisogni.
• Appiattimento (condivisione) di autorità e responsabilità.
E6. Il Timeboxing è usato per identificare i segmenti di sviluppo ed ogni segmento
non deve durare più di un mese.
Rules of play Le rules of play entrano in gioco all’interno delle rules of engagement ed insieme definiscono le attività minuto per minuto. Le regole del gioco nel
baseball definiscono i fondamentali, i falli, le strategie consuetudinali, ... Se un
battitore si vede arrivare contro una palla a 90 miglia orarie, non pensa a quanti
giocatori devono essere in campo in quel momento, penserà piuttosto a batterla il
più lontano possibile, così come il giocatore che cercherà di recuperare quella palla,
prima penserà a prenderla al volo e solo dopo cercherà di capire se tutti si sono
mossi secondo le regole di contorno.
P1. Il lavoro prodotto deve essere continuamente validato tramite testing.
P2. Scrivi i test prima di codificare, applica il pair-programming ed il code refactoring.
P3. Tutto il codice scritto che potenzialmente andrà a finire nella versione finale
deve:
• Passare tutti i test.
• Esprimere in modo chiaro gli obiettivi nel codice
• Non contenere duplicazioni.
• Non contenere parti superflue.
P4. Proprietà comune, non ci sono classi, metodi od insieme di funzionalità riconducibili a singole responsabilità. Tutti devono avere autorità sul codice ed
almeno due persone nel team devono avere tutte le conoscenze necessarie per
svolgere ogni compito.
34
2.5. XP
Practices
L’XP accetta ed addirittura propone una lista di pratiche, di tecniche che ritiene
importante seguire per lavorare a buoni livelli di progettazione e sviluppo:
• Planning the game. È il principale processo di pianificazione dell’XP ed è
un incontro che avviene una volta per iterazione.
• Small releases.
• Shared metaphor. È importante avere un’idea comune del progetto, una
metafora è un po’ come una storiella che tutto il team deve saper raccontare.
• Simple design. Significa che “simple is best”, si ritiene necessario rappresentare solo gli aspetti utili e dove possibile graficamente.
• Code refactoring.
• Automatic testing.
• Pair programming.
• Collective code ownership.
• Design improvement. Quando si formano troppe dipendenze ed il codice
non è più facilmente scalabile, il sistema necessità di essere rivisto a partire
dal code refactoring ed eventualmente cambiare archietettura, rendendola più
semplice e generica.
• Continuos integration. Tutto il team deve lavorare constantemente sull’ultima
versione del software, si tratta di tenere sincronizzato il proprio lavoro con
quello del gruppo.
• Sustainable pace. Si tratta di mantenere costante la produttività, è consigliato a tale scopo non eccedere le quaranta ore settimanali.
• Coding standards. È un accordo sull’insieme di regole che verranno utilizzate nel corso del progetto.
Criticisms
• A methodology is only as effective as the people involved, Agile does not solve
this
• Often used as a means to bleed money from customers through lack of defining
a deliverable
• Lack of structure and necessary documentation
• Only works with senior-level developers
• Incorporates insufficient software design
• Requires meetings at frequent intervals at enormous expense to customers
• Requires too much cultural change to adopt
• Can lead to more difficult contractual negotiations
• Can be very inefficient—if the requirements for one area of code change
through various iterations, the same programming may need to be done several times over. Whereas if a plan were there to be followed, a single area of
code is expected to be written once.
• Impossible to develop realistic estimates of work effort needed to provide
a quote, because at the beginning of the project no one knows the entire
scope/requirements
35
2.5. XP
36
Chapter
3
Sistemi di qualità
3.1
ISO 9001
3.2
Capability Maturity Model integration
Il Capability Maturity Model Integration nell’ingegneria del software è uno standard
dei requisti di processo aziendali, sviluppato dal Carnegie Mellon University.
Rispetto alla certificazione ISO sussistono due principali differenze: prima di tutto
è una valutazione della qualità pensata per aziende che lavorano esclusivamente nel
mondo del software, si pone come obiettivo il miglioramento continuo dei processi di
progettazione, implementazione e supporto. La seconda differenza è che il CMMi
non è una vera e propria certificazione che può essere ottenuta tramite aziende
competenti, ma è una valutazione che spetta al SEI (Software Engineering Institute)
della CMU il quale rilascierà un appraisal.
Questo resoconto, non ha valore di certificazione della qualità sul mercato o all’esterno
dell’azienda, ma serve come documento interno per raccogliere informazioni, rilevare la qualità e suggerire metodologie per migliorare tutti i processi aziendali di
una tipica software house.
Lo standard è composto da tre modelli, ognuno di questi modelli si pone nelle
condizioni di valutare determinati aspetti dei processi aziendali:
• Model for Development (2006), si preoccupa di analizzare il processo di progettazione ed implementazione del software
• Model for Acquisition (2007), regolamenta l’approvigionamento di parti di
software o hardware non prodotti internamente
• Model for Services (2009), si occupa di valutare i servizi rivolti al cliente nella
fase di post-produzione
Noi prendiamo in considerazione solo il Development Model, il quale tratta essen-
37
3.2. Capability Maturity Model integration
Sistemi di qualità
zialmente di metodologie di valutazione per lo sviluppo di software.
Process areas
L’analisi della qualità dell’azienda che si sottopone alla valutazione passa per 22
process areas le quali indicano gli aspetti di sviluppo del prodotto e dei servizi che
devono essere implementati dai processi organizzativi. Dentro queste aree vengono
sviscerati tutti gli aspetti e tutti i processi che possono caratterizzare il core business di una software house. Queste 22 aree sono a loro volta suddivise in quattro
settori: Process Management, Project Management, Engineering e Support, come
mostrato in Tab. 3.1.
Process Managment
Organizational Process Definition (OPD)
Project Monitoring and Control (PMC)
Project Planning (PP)
Quantitative Project Management (QPM)
Requirements Management (REQM)
Risk Management (RSKM)
Supplier Agreement Management (SAM)
Engineering
Product Integration (PI)
Requirements Development (RD)
Technical Solution (TS)
Validation (VAL)
Verification (VER)
Project Managment
Integrated Project Management (IPM)
Organizational Process Focus (OPF)
Organizational Performance Management (OPM)
Organizational Process Performance (OPP)
Organizational Training (OT)
Support
Causal Analysis and Resolution (CAR)
Configuration Management (CM)
Decision Analysis and Resolution (DAR)
Measurement and Analysis (MA)
Process and Product Quality Assurance (PPQA)
Table 3.1: Le 22 process areas divise nei quattro settori.
Ogni process area è rappresentata a partire dai suoi componenti obbligatori, dai
suoi componenti auspicati e da informazioni aggiuntive, come mostrato in Fig. 3.1.
Figure 3.1: Paradigma di descrizione dei componenti di un generico process area.
38
Sistemi di qualità
3.2. Capability Maturity Model integration
Vediamo un esempio semplificato di descrizione di una process area, il Configuration
Management.
Purpose Statement: The purpose of Configuration Management (CM) is to establish and maintain the integrity of work products using configuration identification, configuration control, configuration status accounting, and configuration
audits.
Related Process Areas: Refer to the Project Monitoring and Control process
area for more information about monitoring the project against the plan and managing corrective action to closure. Refer to the Project Planning process area for
more information about developing a project plan.
Specific goals and practices:
SG 1 Establish Baselines
SP 1.1 Identify Configuration Items
SP 1.2 Establish a Configuration Management System
SP 1.3 Create or Release Baselines
SG 2 Track and Control Changes
SP 2.1 Track Change Requests
SP 2.2 Control Configuration Items
SG 3 Establish Integrity
SP 3.1 Establish Configuration Management Records
SP 3.2 Perform Configuration Audits
Generic goals and practices:
GG 1 Achieve Specific Goals
GP 1.1 Perform Specific Practices
GG 2 Institutionalize a Managed Process
GP 2.1 Establish an Organizational Policy
GP 2.2 Plan the Process
..
.
GP 2.10 Review Status with Higher Level Management
È importante notare che mentre i goal e le pratiche specifiche sono appunto “specifiche” di ogni area, quelle generiche sono trasversali a tutte.
Valutazione della qualità
Una volta specificati gli obiettivi ideali e le metodologie necessarie per raggiungerli,
ci occorre un criterio per valutare lo stato attuale rispetto a quanto è stato prefissato. Lo standard presenta due diverse rappresentazioni della qualità, due misure
complementary, la capability e la maturity.
La capability esprime un giudizio specifico per ogni area, lavora pertanto al livello
di obiettivi e pratiche specifiche come mostrato in Fig. 3.2. Questo tipo di analisi
permette di concentrare l’attenzione su singoli processi e pertanto dividere anche la
complessità della valutazione, la diretta conseguenza è che questo tipo di valutazione
39
3.2. Capability Maturity Model integration
Sistemi di qualità
può essere effettuato molto frequentemente: da questa considerazione questo tipo
di valutazione prende il nome di continuous representation.
La maturity fa invece riferimento agli obiettivi ed alle pratiche generali, esso lavora
sul complesso delle process areas come mostrato in Fig. 3.3. Chiaramente questa
rappresentazione è più complicata perché più vasta, siccome non può essere fatta
frequentemente si parla di staged rapresentation.
Figure 3.2: Esempio di descrizione dei componenti di un generico Process Area.
Figure 3.3: Esempio di descrizione dei componenti di un generico Process Area.
La continuous representation è pensata per permettere all’azienda di focalizzarsi sui
processi specifici che sono considerati importanti per gli obiettivi di breve termine
o per le quali l’azienda ha assegnato un alto gradi di rischio; infatti non tutte
40
Sistemi di qualità
Level
Level
Level
Level
Level
Level
Level
3.2. Capability Maturity Model integration
0
1
2
3
4
5
CR Capability Levels
Incomplete
Performed
Managed
Defined
SR Maturity Levels
Initial
Managed
Defined
Quatitatively Managed
Optimizing
Table 3.2: Livelli di valutazione per le rappresentazioni del CMMi.
le aree hanno la stessa importanza, alcune sono fondamentali, ma altre sono solo
ottimizzazioni. La staged representation invece serve ad indicare una sequenza
standard di miglioramenti che l’azienda è chiamata a fare e può essere usata come
livello di comparazione fra diversi progetti o diverse aziende.
Questi due tipi di rappresentazioni si concretizzano comunque su una scala di livelli,
mostrata in Tab. 3.2.
Incomplete: an incomplete process is a process that either is not performed or
is partially performed. One or more of the specific goals of the process area are
not satisfied and no generic goals exist for this level since there is no reason to
institutionalize a partially performed process.
Performed: a performed process is a process that accomplishes the needed work
to produce work products; the specific goals of the process area are satisfied. Although capability level 1 results in important improvements, those improvements
can be lost over time if they are not institutionalized. The application of institutionalization helps to ensure that improvements are maintained.
Manged: a managed process is a performed process that is planned and executed
in accordance with policy; employs skilled people having adequate resources to
produce controlled outputs; involves relevant stakeholders; is monitored, controlled,
and reviewed; and is evaluated for adherence to its process description. The process
discipline reflected by capability level 2 helps to ensure that existing practices are
retained during times of stress.
Defined: a defined process is a managed process typically described more rigorously than at capability level 2. A defined process clearly states the purpose,
inputs, entry criteria, activities, roles, measures, verification steps, outputs, and
exit criteria. At capability level 3, processes are managed more proactively using
an understanding of the interrelationships of the process activities and detailed
measures of the process and its work products.
Quantitatively Managed: at maturity level 4, the organization and projects
establish quantitative objectives for quality and process performance and use them
as criteria in managing projects. A critical distinction between maturity levels 3
and 4 is the predictability of process performance.
Optimizing: at maturity level 5, an organization continually improves its processes
based on a quantitative understanding of its business objectives and performance
needs. The organization uses a quantitative approach to understand the variation
inherent in the process and the causes of process outcomes.
41
3.2. Capability Maturity Model integration
Sistemi di qualità
Avanzare fra i livelli di maturità di un progetto. Mentre è semplice ed
immediato esprimere una valutazione da 0 a 3 per le singole aree, non è altrettando
intuitivo dare una valutazione globale. Affinché il metodo sia rigoroso ed oggettivo,
sono stati fissati dei paletti: ad ogni area è stato assegnato un valore di criticità
da 1 a 5, più il livello di criticità è basso più l’area è critica. Ora diremo che il
nostro maturity level è passato al punto due se e solo se tutte le aree con criticità 2
o inferiore hanno un capability level almeno di due. Diremo che il nostro maturity
level è passato al punto tre se e solo se tutte le aree con criticità 3 o inferiore hanno
un capability level almeno di tre. Lo stesso vale chiaramente per un maturity level
pari a 4 e a 5. Questa suddivisione permette di identificare quali siano i processi
chiave per lo sviluppo del prodotto e quali invece siano dei miglioramenti auspicabili
ma non fondamentali.
Infatti, secondo un resoconto del SEI della CMU, il 70% delle aziende piccole (meno
di 25 dipendenti) raggiunge al massimo il livello 2, mentre il 52% delle aziende
medio-grandi (fra 1000 e 2000 dipendenti) raggiunge anche il livello 5. Questo
evidenzia che ad una compagnia piccola non trae particolare guadagno dall’investire
risorse dall’analisi CMMi e di come non sia necessario raggiungere un livello di
maturità alto, poiché questo non significa che le aree critiche non abbiamo capability
levels alti.
42
Part III
Linguaggi formali e tecniche di
compilazione
43