Software - Problemi e prospettive
La disciplina denominata Software Engineering è circa i metodi, tools e tecniche utilizzati per sviluppare software.
Tipi di software:
software di sistema;
software applicativo;
All'interno del software applicativo, può essere utile identificare le seguenti categorie di software:
giochi;
sistemi informativi;
sistemi real-time;
sistemi embedded;
software di office automation;
software scientifico;
La costruzione del software è un compito impegnativo, essenzialmente perché il software è complesso.
I problemi percepiti (criticità ) e gli scopi da raggiungere nello sviluppo software sono:
raggiungimento delle necessità degli utenti;
basso costo di produzione;
alte performance;
portabilità ;
basso costo di mantenimento;
alta affidabilità ;
rilascio nei tempi previsti;
Ogni scopo è anche considerato un problema perché il software engineering ha avuto generalmente poco successo nel raggiungere questi scopi:
Vedremo in seguito come questi scopi sono tra loro collegati.
Raggiungimento delle necessità dell'utente
Costi della produzione del software
Da cosa è dovuto il costo?
E' interessante vedere quali parti dello sviluppo software di un progetto costano di più.
Costi relativi delle varie fasi dello sviluppo software:
Si vede che il costo del testing è enorme, mentre il coding costituisce solo una piccola parte del software development.
Se gli errori sono il problema maggiore, quando sono fatti?
I numeri relativi di errori fatti durante le differenti fasi di sviluppo del software:
Tuttavia questo dato può essere fuorviante. A noi interessa il costo per correggere l'errore. E più a lungo l'errore rimane scoperto, di più costa correggerlo. Errori fatti durante le prime fasi del progetto tendono essere più costosi, a meno che non siano scoperti quasi subito.
Vediamo quindi i costi relativi per correggere i differenti tipi di errore:
Un errore di design può non essere scoperto, ipoteticamente, fino alla fase dei test e tutto ciò comporterebbe molto lavoro per correggerlo. Viceversa un errore di sintassi nello sviluppo del codice, può essere subito rivelato dal compilatore e corretto dallo sviluppatore.
Maintenance
La maintenance è la parola che indica lo sforzo messo in un componente software dopo che è stato scritto e messo in produzione. E' due tipi principalmente:
remedial maintenance, che è il tempo speso per correggere i fault nel codice (attività di bug-fixing)
adaptive maintenance, che significa le modifiche fatte perché sono cambiati i requisiti del cliente
Remedial maintenance, è conseguenza di insufficiente testing. Come vedremo un testing efficace è difficile da eseguire e richiede tempo, così è accettato come normale nel software engineering un'attività di maintenance è inevitabile.
E' spesso difficile predirre i futuri utilizzi del software, così la adaptive maintenance è pratica comune.
Si parla spesso del 'fardello della maintenance'.
AffidabilitÃ
Un pezzo di software è detto essere affidabile se esso funziona e continua a funzionare senza crash e senza fare qualcosa di indesiderato. Noi diciamo che il software ha un bug o un fault se non si comporta correttamente. Si presume che lo sviluppatore sappia cosa era richiesto e così il comportamento non aspettato non è intenzionale. E' comune parlare di bug nel software, ma è inoltre opportuno definire alcuni altri termini più chiaramente:
errori - decisioni sbagliate fatte durante lo sviluppo del software;
fault - un problema che può causare nel software uno scostamento rispetto al comportamento atteso;
failure - un evento generato (conseguenza) di quando il software si discosta dal comportamento desiderato;
In questa terminologia, un fault è sinonimo di un bug. Le failure accadono mentre il sistema è testato o quando, poi, è in utilizzo. Le failure sono i sintomi che l'utente sperimenta, mentre i fault sono i problemi con cui lo sviluppatore ha a che fare.
La crisi del software
Abbiamo discusso alcuni problemi percepiti con il software:
non fa quello che l'utente si aspetta;
è costoso;
non è sempre sufficientemente veloce;
non può essere trasferito su un altra architettura facilmente;
è costoso da mantenere;
è inaffidabile;
è spesso in ritardo;
non è sempre facile da utilizzare;
Di questi, soddisfare le aspettative dell'utente (validazione), la riduzione del costo del software, migliorare l'affidabilità (verification) e rilascio in tempo, sono probabilmente i quattro problemi al momento più importanti.
Uno degli ostacoli per cercare di risolvere i problemi sul software e che questi ultimi molto spesso sono in conflitto tra loro. Per esempio, il prezzo basso per l'opera e l'alta affidabilità confliggono. Ancora, alte prestazioni e portabilità sono in conflitto.
Un rimedio - l'ingegneria del software?
Come abbiamo visto, è riconosciuto che c'è un grande problema nello sviluppo del software in modo da avere successo. Un certo numero di idee è stato suggerito per migliorare questa situazione. Questi metodi e tool (strumenti) sono conosciuti come software engineering (ingegneria del software).
Alcune delle principali idee sono:
maggiore sforzo nel portare avanti tutte le fasi dello sviluppo in modo sistematico;
assistenza di strumenti nello sviluppo software - tools;
un'enfasi a trovare cosa esattamente l'utente del sistema realmente vuole (requirements engineering - validation - validazione);
dimostrazione al cliente di prime versioni del prodotto (prototyping - creazione di prototipi);
utilizzo di nuovi e moderni linguaggi di programmazione;
grande sforzo nel tentativo di garantire che il software è immune da errori (verification - verifica);
sviluppo incrementale, dove il progetto procede in piccoli gestibili step;
Last updated