Qualità del software

misura in cui un prodotto software soddisfa un certo numero di aspettative

Caratteristiche

Si distinguono tra:

  • Qualità esterne: percepibili dagli utenti
  • Qualità interne: percepibili dagli sviluppatori

le seconde servono a raggiungere le prime.

Qualità esterne:

  • Correttezza
  • Affidabilità
  • Robustezza
  • Efficienza e Prestazioni
  • Facilità d’uso

Qualità interne:

  • Verificabilità
  • Manutenibilità
  • Riusabilità
  • Portabilità

Correttezza

Un software è funzionalmente corretto se si comporta come stabilito nei suoi requisiti funzionali (functional requirements specification). Ciò presuppone l’esistenza di un documento di specifica dei requisiti. Va sottolineato che il termine requisiti funzionali si abbrevia nella forma requisiti, anche se abbiamo altri tipi di requisiti come quelli di prestazioni e di scalabilità.

Comunque deve essere possibile il confronto con i requisiti per verificare la correttezza. La specifica deve essere sufficientemente chiara e non ambigua, cosa abbastanza difficile perché sarà scritta in un linguaggio naturale e, per questo, ambigua.

Affidabilità

Misura quanto l’utente può far affidamento sul software.

È frequente oggi rilasciare software con malfunzionamenti per le prime versioni (software bacato). Ciò mostra chiaramente come il software sia ben lontano da altri prodotti ingegneristici perché un’auto, ad esempio, non si rilascia con dei malfunzionamenti, mentre se ciò avviene nel software questi sono accettati con rassegnazione.

Quindi per il software si hanno:

  • aspettative minori
  • known bugs (falle note)

Solitamente l’affidabilità è definita in termini di mtbf (Mean Time Between Failures).

Correttezza Vs affidabilità

La correttezza è una qualità assoluta, mentre l’affidabilità è una qualità relativa.
Se un sistema presenta degli errori

  • non è corretto
  • potrebbe essere però affidabile

Se la specifica cattura tutti i requisiti un sistema corretto è affidabile. Se la specifica non cattura i requisiti un sistema corretto potrebbe non essere affidabile.

Robustezza

Un sistema è robusto se si comporta in modo ragionevole in situazioni impreviste. Ad esempio quando vengono inseriti dati di input non corretti. La robustezza può essere corretta andando a colmare quelle lacune dei requisiti che appunto non hanno descritto il comportamento nel caso di situazioni anomale. La robustezza è difficilmente definibile formalmente. Se si potesse definire il concetto di comportamento ragionevole si potrebbe dire che la robustezza è uguale alla correttezza. Infatti se un requisito è nelle specifiche allora fa parte della correttezza, se è fuori allora fa parte della robustezza.

La robustezza comunque dipende dal contesto e non è assoluta, in particolare dipende da:

  • chi usa il sistema
  • quali sono le sue capacità di adattamento
  • quanto è critico il buon funzionamento del software

Efficienza e Prestazioni

Un sistema è efficiente se usa le risorse (memoria, CPU,...) in modo efficiente, ossia senza sprechi. Si confonde spesso l’efficienza con le prestazioni, ma mentre la prima è una caratteristica interna che si riferisce al peso che un software ha sulle risorse del computer, la seconda è una caratteristica esterna, basata sui requisiti.

Spesso viene presa in considerazione solo a sistema realizzato, ma può essere molto difficile intervenire a posteriori.

Lo stesso accade anche per le prestazioni, che a volte possono anche rallentare la produttività, tuttavia esse sono relative perché possono cambiare con l’evoluzione della tecnologia. Esistono diversi modi per misurare queste qualità:

  • complessità algoritmica
  • misure sul campo delle caratteristiche (measurement)
  • modello matematico da analizzare (analysis)
  • modello di simulazione (simulation)

Usabilità

Un sistema è facile da usare se un essere umano lo reputa tale.
È una qualità soggettiva:

  • dipende dal contesto
  • dipende dall’esperienza

L’interfaccia utente interviene molto sull’amichevolezza di un’applicazione, ma anche in questo caso è la formazione e la cultura dell’utente a giudicare tale caratteristica.

Verificabilità

Un sistema è verificabile se le sua proprietà:

  • correttezza
  • affidabilità

sono facili da verificare.
Per aumentare il grado di verificabilità si fa uso di:

  • tecniche di progettazione modulare
  • opportuni linguaggi di programmazione
  • software monitor

In alcuni casi diventa una qualità esterna (Software safety critical)