Ciclo di vita del software
Da Wikipedia, l'enciclopedia libera.
L'espressione ciclo di vita del software si riferisce al modo in cui una metodologia di sviluppo o
un modello di processo scompongono l'attività di realizzazione di prodotti software in sottoattività
fra loro coordinate, il cui risultato finale è il prodotto stesso e tutta la documentazione a esso
associato.
La comparsa in letteratura e nella pratica dello sviluppo del software dei concetti di ciclo di vita e
di processo software si può far coincidere con la nascita dell'ingegneria del software, in quanto
rappresenta un passaggio storico dallo sviluppo del software inteso come attività "artigianale"
(ovvero affidata alla libera creatività dei singoli individui) a un approccio più industriale, in cui la
creazione di programmi e sistemi software viene considerata come un processo complesso che
richiede pianificazione, controllo, e documentazione appropriati (così come avviene
tradizionalmente nei settori più maturi dell'ingegneria). Questa transizione si può ricondurre, in
ultima analisi, all'aumentata complessità dei sistemi, all'avvento di un vero e proprio mercato del
software, nonché a nuovi e più stringenti requisiti di qualità, legati per esempio all'uso di sistemi
informatici in contesti critici (centrali energetiche, sistemi aerospaziali, armamenti e così via).
Questo mutamento di prospettiva iniziò a verificarsi, storicamente, fra la fine degli anni sessanta e
l'inizio della decade successiva. Da allora, la ricerca su questi temi è stata estremamente prolifica
sia in ambito industriale che accademico.
Storicamente, il primo ciclo di vita del software di larga diffusione è stato il modello a cascata.
Esso suddivideva il processo software in un insieme di fasi che si ritrovano quasi puntualmente nei
modelli moderni (che spesso si discostano dal modello a cascata su altri aspetti, quali l'ordine in
cui devono essere svolte le attività corrispondenti alle varie fasi, o l'enfasi relativa che va
assegnata a ciascuna di esse).Ogni fase produce un output che è usato come input per la fase
successiva. In linea di massima vengono individuate 5 fasi:
1. Analisi e Specifica dei requisiti di che cosa fa il sistema
2. Progettazione che permette di specificare come è fatto il sistema
3. Codifica, la fase classifica di scrittura del codice
4. Integrazione e verifica, controllo del buon funzionamento
5. Consegna e manutenzione, tutto ciò che accade a sistema funzionante
Se originariamente i modelli di ciclo di vita del software erano strumenti di natura esclusivamente
concettuale, i moderni ambienti di sviluppo CASE (Computer aided software engineering) spesso
automatizzano l'applicazione di un particolare ciclo di vita così come di altri aspetti di un processo
software.
Esistono altri modelli di cicli di vita del software:
1. Evolutivo
2. Trasformativo
3. A spirale (è un metaprocesso)
Modello a cascata
La maggior parte dei modelli di ciclo di vita del software comprendono un insieme comune di
attività, elencate di seguito. Dev'essere tuttavia chiaro che il fatto che tali fasi debbano essere
eseguite in sequenza (come l'impaginazione necessariamente suggerisce) non è vero per tutti i
modelli. Ci si è inoltre limitati alle "macro-fasi", suggerendo di alcune di esse alcune ulteriori
scomposizioni tipiche e comuni a molti modelli di ciclo di vita del software.
la fase di analisi, ovvero l'indagine preliminare sul contesto in cui il prodotto software deve
inserirsi, sulle caratteristiche che deve esibire, ed eventualmente su costi e aspetti logistici
della sua realizzazione; questa fase può essere scomposta in sottoattività quali analisi di
fattibilità, analisi e modellazione del dominio applicativo, analisi dei requisiti e così via. In
senso ampio si può dire che l'analisi ha lo scopo di definire (il più precisamente possibile)
il problema da risolvere. Questa fase è costituita anche da raccolta dei dati tramite
colloqui tra Cliente/Committente e relativi Sviluppatori. Al termine della fase verrà creato
un documento che descrive le caratteristiche del sistema;
la fase di progetto, in cui si definiscono le linee essenziali della struttura del sistema da
realizzare, in funzione dei requisiti evidenziati dall'analisi e dal documento finale da essa
creato. Anche questa fase può essere scomposta in sottoattività, dal progetto architetturale
al progetto dettagliato. Si può dire che il progetto ha lo scopo di definire (a un certo livello
di dettaglio) la soluzione del problema. In questa fase verrà sviluppando un documento
che permetterà di avere una definizione della struttura di massima (architettura di alto
livello) e una definizione delle caratteristiche dei singoli componenti (moduli);
la fase di implementazione o codifica del sistema, ovvero la sua realizzazione concreta;
questa tipicamente consiste nella realizzazione di uno o più programmi in un determinato
linguaggio di programmazione, benché possano essere coinvolte anche tecnologie diverse
(database, linguaggi di scripting e via dicendo). Nella maggior parte dei casi è possibile
distinguere almeno una sottoattività di implementazione dei singoli moduli che
costituiscono il sistema e la sottoattività dell'integrazione di tali moduli a formare il sistema
complessivo. Complessivamente, l'implementazione ha lo scopo di realizzare la
soluzione.
la fase di testing, volta a misurare in che misura il sistema realizzato soddisfa i requisiti
stabiliti nella fase di analisi, ovvero a valutarne la correttezza rispetto alle specifiche.
Anche il testing è normalmente scomponibile almeno nelle due attività del testing dei
singoli moduli e testing del sistema integrato. Le tipologie specifiche di test (prove) si
possono inoltre distinguere in funzione dei particolari aspetti dei moduli o del sistema che
vengono valutati; si parla per esempio di test funzionali, test di performance, test di
accettazione, test d'istallazione;
la fase di manutenzione, che comprende tutte le attività di modifica del software successive
al suo rilascio presso il cliente o la sua immissione sul mercato. Queste attività possono
essere volte a correggere errori del software, adattarlo a nuovi ambienti operativi, o
estenderne le funzionalità. La manutenzione incide sui costi, si stima che il 60% dei costi
dipende dalla manutenzione. Ogni modifica al software comporta necessariamente la
necessità di nuovi test, sia relativi alle nuove funzionalità eventualmente introdotte, sia
mirati a verificare che le modifiche apportate non abbiano compresso funzionalità
preesistenti (test di regressione). Una linea standard di verifica prevede dei test sui moduli
più precisamente si occupa di controllare che i moduli presi singolarmente funzionino e che
una volta assemblati assieme i moduli continuino a funzionare.
Modello evolutivo
Questo modello si propone di superare i limiti principali del modello a cascata, come la mancanza
di incrementalità e l'inadeguatezza a supportare l’evoluzione dell'applicazione. E’ costituito da
poche fasi che si ripetono e che prevendo questa sequenza:
1. Costruisci qualcosa
2. Consegnalo all’utente
3. Ottieni delle valutazioni
4. Modifica il manufatto in funzione delle valutazioni
Il rischio nell'attuazione di questo modello, è di essere indisciplinati, e si renderà necessario far
uso di standard di processo. Gli strumenti moderni sono adatti a supportare questo tipo di modello
accompagnati da certificazioni di qualità di processo.
Analisi dei requisiti
In ingegneria del software, l'analisi dei requisiti (talvolta detta semplicemente analisi)
rappresenta una delle prime fasi nel ciclo di vita di un prodotto software; scopo generale
dell'analisi è stabilire cosa il sistema in questione deve fare (mentre le decisioni sul come sono
rimandate alla successiva fase di progetto).
L'analisi dei requisiti avviene normalmente come negoziazione fra individui legati allo sviluppo
(analisti) e i clienti, oppure (nel caso di pacchetti software pensati per la grande distribuzione) fra
analisti e responsabili del marketing. Tale dialogo è tutt'altro che semplice: gli analisti possono
avere difficoltà a comprendere il linguaggio e il contesto culturale del cliente, e viceversa; e lo
stesso cliente potrebbe aver difficoltà a mettere a fuoco i propri reali bisogni e di conseguenza le
richieste o le proposte da mettere sul tavolo della discussione. Proprio a causa di queste difficoltà,
i modelli di ciclo di vita del software moderni hanno abbandonato l'assunzione che sia possibile
identificare i requisiti di un sistema software a priori, e tendono a privilegiare approcci iterativi in i
requisiti vengono esplicitati gradualmente, per esempio coinvolgendo l'utente nella prova di
prototipi e rilasci parziali del sistema in corso di sviluppo.
Il documento principale prodotto dall'analisi dei requisiti è la specifica dei requisiti; se la
metodologia e il modello di ciclo di vita del software utilizzati lo prevedono, essa può addirittura
portare già alla stesura del manuale d'uso del prodotto da sviluppare.
L'analisi dei requisiti è spesso accompagnata da altre attività di analisi come l'analisi del dominio o
l'analisi dei costi e benefici.
Analisi delle funzioni con i data flow diagram
La definizione delle funzionalità che il sistema deve offrire è importante e critica. Per un verso, costituisce la
base dell'accordo tra i committenti ed il gruppo di progetto, sulla cui base vengono concordati costi e tempi
di realizzazione; allo stesso tempo rappresenta l'input primario per le fasi di progettazione tecnica e di
realizzazione e test del sistema. La definizione deve risultare quindi chiara, non ambigua, completa,
sufficientemente dettagliata.
Esistono tecniche di analisi strutturata, che da oltre vent'anni forniscono una guida per la scoperta e la
definizione delle caratteristiche funzionali dei sistemi. Vengono utilizzati dei data flow diagram, che
permettono di partire dalla definizione del contesto del sistema, per poi arrivare alle tecniche utilizzabili per
la scomposizione in sottoprocessi, fino alla definizione dei processi elementari ed alla loro specifica.
Il Data Flow Diagram è un tipo di diagramma definito nel 1978 da Tom Demarco nel testo Structured
Analysis and Systems Specification per aiutare nella definizione delle specifiche.
É una notazione grafica molto usata per i sistemi informativi e per la descrizione del flusso di dati in quanto
permette di descrivere un sistema per livelli di astrazione decrescenti con una notazione di specifica molto
"intuitiva".
Attraverso i Data Flow Diagram si definiscono soprattutto come fluiscono (e vengono elaborate) le
informazioni all’interno del sistema, quindi l'oggetto principale è il flusso delle informazioni o, per meglio
dire, dei dati. Motivo per il quale diventa fondamentale capire dove sono immagazzinati i dati, da che fonte
provengono, su quale fonte arrivano, quali componenti del sistema li elaborano.
Componenti
Le componenti di questo tipo di diagramma sono:
Funzioni, rappresentate da bolle;
Flussi di dati, rappresentati da frecce;
Archivi di dati, rappresentati da scatole aperte;
Agenti esterni o Input/Output di dati, rappresentati da scatole chiuse.
Funzioni
Le funzioni rappresentano unità di elaborazione dei dati: trasformano i dati in ingresso in quelli in uscita
Flusso di dati
Le frecce collegano i diversi componenti di un diagramma tra loro:
Rappresentano i dati gestiti dal sistema;
Gli archivi e gli agenti esterni NON possono essere collegati tra loro;
Agente esterno
Gli Agenti Esterni rappresentano delle entità esterne al sistema:
Non sono soggette ad ulteriore modellazione;
Sono le sorgenti e le destinazioni dei dati del sistema;
Archivi
Gli archivi sono dei depositi permanenti di informazione:
Possono essere basati su qualunque tecnologia;
I dati che entrano in un archivio vengono scritti;
I dati che escono dall’archivio sono letti (ma non cancellati);
Modellazione
Un generico sistema è sempre rappresentabile nel seguente modo:
Se gli ingressi e/o le uscite sono molteplici si introducono nuovi flussi.
Questo tipo di rappresentazione ha un livello di astrazione molto alto e individua solo l’interfaccia tra il
sistema e il mondo esterno per cui vanno inseriti altri dettagli raffinando le funzioni. Ogni funzione, infatti, è
a sua volta specificabile mediante un Data Flow Diagram per cui è possibile ottenere diversi livelli con sempre
maggiore definizione.
Criteri di stesura
Nella stesura si ignora l’inizializzazione del sistema, la gestione degli errori e la terminazione, il sistema si
immagina come "up & running". Si ignorano anche le sincronizzazioni ed il flusso di controllo tra processi.
Individuare sempre le entrate e le uscite di un diagramma
Qualora i dati gestiti fossero particolarmente strutturati si complementa il Data Flow Diagram con un sistema
complementare.
Limiti
Questa notazione, quindi, presenta dei limiti consistenti:
Semantica: i simboli non sono sufficientemente chiari e i nomi vengono scelti dall’utente;
Controllo: gli aspetti di controllo non sono definiti dal modello e, quindi, anche la sequenza temporale
è poco chiara.
Quindi il Data Flow Diagram è adatto ad una descrizione rapida e intuitiva per cui non è una notazione
operazionale proprio perché alcuni aspetti non sono chiariti. Per questo motivo si parla di notazione
semiformale perché la sintassi è precisa, ma la semantica non lo è.
Si sono progettati diversi metodi per rimediare a queste difficoltà che possono essere classificati nel seguente
modo:
Usare una notazione complementare per colmare le lacune del data flow diagram;
Migliorare il modello in modo da completare la versione tradizionale
L'analista programmatore
Il lavoro dell'analista programmatore consiste nell’analizzare ed interpretare le esigenze degli utenti, nonché
nell’incaricarsi della progettazione, codifica e documentazione, collaudo e manutenzione dei programmi
(software) creati in risposta a tali esigenze. L'analista programmatore è perciò colui che sviluppa l'analisi di
un problema in termini informatici, e partecipa anche alla stesura dei programmi.
In alcune realtà, la figura dell'analista programmatore si può suddividere in due figure distinte: quella
dell'analista e quella del programmatore. L'analista si occupa della prima delle due fasi accennate
precedentemente: l'analisi delle esigenze del cliente e la traduzione di queste ultime in un progetto
funzionante attraverso il coordinamento di un gruppo di programmatori. Il programmatore, si occupa della
seconda fase: lo sviluppo del software nei vari linguaggi partendo dal progetto di un analista. L'analista
programmatore opera in genere all'interno di grandi imprese dotate di propri centri di elaborazione, nelle
software house (società che creano i software), in società di servizi, studi di consulenza, centri di ricerca
nonché in ambito universitario. I tempi medi di un progetto cui un analista programmatore prende parte sono
intorno ai sei mesi, ma su un caso particolarmente complesso o di grandi dimensioni il suo lavoro può
protrarsi anche uno-due anni. Il lavoro dell'analista programmatore si svolge a ritmi serrati, spesso si lavora
"a scadenza" per cui i suoi orari risultano piuttosto flessibili. L'analista programmatore può essere un
lavoratore dipendente o un libero professionista.
L'insieme delle attività dell'Analista programmatore può essere suddiviso in quattro fasi, una conseguente
all'altra:
dopo aver individuato le esigenze del cliente, egli elabora un documento con: i requisiti che il
software dovrà soddisfare; lo studio di fattibilità; l'analisi dei costi;
partendo da questo documento, l'analista programmatore elabora il progetto, realizza il software e
documenta l'intero procedimento;
effettua il collaudo, prima della consegna al cliente;
provvede alla manutenzione del programma, vale a dire ad apportare tutte le modifiche necessarie
per il suo buon funzionamento.
COMPETENZE
Per svolgere il suo lavoro, l'Analista programmatore deve:
instaurare un rapporto produttivo con il cliente, comprenderne i problemi e le richieste;
conoscere la logica e un certo numero di linguaggi di programmazione
essere in grado di sviluppare adeguate metodologie per i test;
saper documentare, con sintesi e chiarezza, i procedimenti tecnici.
In termini più generali, tra le competenze richieste spiccano:
conoscenza della lingua inglese tecnica;
flessibilità;
capacità di analisi;
capacità di operare in team.
Fondamentale è, inoltre, il continuo aggiornamento (learning).