“L’ingegneria è una scienza applicata alla risoluzione di problematiche che concorrono alla soddisfazione dei bisogni umani; più in generale l’ingegneria è Scienza delle soluzioni.”
“L’ingegneria, applicando le norme tecniche, fornisce metodi, progetti e specifiche per la produzione (costruzione) di un bene fisico, di un prodotto o di un servizio, e più in generale per lo sviluppo e il controllo di un processo industriale.”
L’ingegneria propone metodologie di sviluppo, che riassumono e formalizzano esperienze e conoscenze pregresse.
Da Wikipedia
Molti fattori hanno storicamente limitato l’utilizzo di approcci ingegneristici nella produzione di software:
Si può continuare su questa strada?
Definizione PCWebopedia:
“The computer science discipline concerned with developing large applications. Software engineering covers not only the technical aspects of building software systems, but also management issues, such as directing programming teams, scheduling, and budgeting.”
Definizione IEEE (2007):
“L’ingegneria del software è la disciplina tecnologica e manageriale che riguarda la produzione sistematica e la manutenzione dei prodotti software entro tempi e costi preventivati“.
Informalmente: sviluppo cost-effective di software di qualità.
Le economie di tutti i paesi sviluppati dipendono dal software, e la maggior parte dei sistemi sono controllati da software.
Differenze con prodotti industriali classici:
Il software ha costi elevati.
Sono i costi delle risorse usate: ore lavoro (manpower), hardware, software e risorse di supporto. Il manpower è dominante!
Il costo è espresso in mesi/uomo.
La manutenzione costa più dello sviluppo.
Per sistemi che rimangono a lungo in esercizio i costi di manutenzione possono essere svariate volte il costo di produzione.
Arte: applicazioni sviluppate da singole persone e utilizzate dagli stessi sviluppatori.
Artigianato: applicazioni sviluppate da piccoli gruppi specializzati per un cliente.
Industria: diffusione del software in diversi settori; crescita di dimensioni, complessità e criticità delle applicazioni; mercato e concorrenza; necessità di migliorare la produttività e la qualità; gestione dei progetti; evoluzione del software.
L’informatica è una scienza: il “cuore” sono i fondamenti teorici: linguaggi – algoritmi – complessità – formalismi ecc. L’ingegneria del software ha a che fare con aspetti più “pratici”: come pianificare e sviluppare la produzione di software di qualità. Ad un ingegnere del software le conoscenze di base dell’informatica servono per avere la visione d’insieme necessaria a gestire con successo un progetto software. L’Ingegneria del Software quindi:
Rigore e formalità
Rigore: concetto primitivo (precisione, accuratezza).
Formalità: oltre il rigore. Fondamento matematico.
In ogni fase del processo di produzione del SW bisogna definire il livello di rigore/ formalità necessario. Separazione di aspetti diversi: affrontare separatamente i vari lati di un problema complesso.
Esempio:
Modularità: suddividere un sistema complesso in parti più semplici.
Bottom-up vs. top-down
Obiettivi:
Astrazione: si identificano gli aspetti cruciali in un certo istante ignorando gli altri.
Anticipazione del cambiamento: la progettazione deve favorire l’evoluzione del SW.
Qualcosa di più di un insieme di linee di codice…
Un insieme di:
Programma: l’autore è anche l’utente (e.g., non è documentato, quasi mai è testato, non c’è progetto) non serve approccio formale.
Prodotto software: usato da persone diverse da chi lo ha sviluppato è software industriale il cui costo è circa 10 volte il costo del corrispondente programma dobbiamo avere approccio formale allo sviluppo.
Prodotti generici (general purpose): sistemi stand-alone prodotti da una organizzazione e venduti a un mercato di massa.
Prodotti specifici (specific purpose): sistemi commissionati da uno specifico utente e sviluppati specificatamente per questo da un qualche contraente.
La fetta maggiore della spesa è nei prodotti generici ma il maggior sforzo di sviluppo è nei prodotti specifici.
La differenza principale?
Chi dà le specifiche del prodotto (il produttore o il consumatore).
Come si “misura” la qualità di un artefatto intangibile?
“Per qualità del software si intende la misura in cui un prodotto software soddisfa un certo numero di aspettative rispetto sia al suo funzionamento sia alla sua struttura interna. [...] Gran parte della ricerca nel campo dell’ingegneria del software è dedicata, direttamente o indirettamente, al tema della qualità“. (Wikipedia)
Esistono varie classificazioni e metriche per la Qualità del Software:
I fattori rispetto a cui si può misurare la qualità del software vengono classificati in:
Correttezza
Affidabilità
Usabilità
Scalabilità
Robustezza
Efficienza
Riparabilità
Riusabilità
Portabilità
Verificabilità
Manutenibilità
1. Introduzione all'Ingegneria del Software – La qualità del Software
2. Il Ciclo di vita del Software: i modelli di Processo
3. Concetti e strumenti di base per il Project Management
5. Introduzione ad UML: Gli Use Case Diagrams
6. Il documento dei Requisiti Software
7. UML: I Sequence Diagrams ed i Class Diagrams