Affidabilità e Sicurezza dei Sistemi e del Software
Capitolo 2° - I concetti base di affidabilità e sicurezza
di A. Autino e V. de Val
Introduzione
In questa seconda puntata getteremo le basi dei concetti di affidabilità e sicurezza.
Studieremo inoltre perché la progettazione software deve essere considerata una cosa a se stante, rispetto alle altre discipline dell'ingegneria, per quanto riguarda le problematiche di affidabilità.
Particolare attenzione sarà posta, e riteniamo essere questo un aspetto particolarmente innovativo della nostra ricerca, agli aspetti umani che intervengono in tutte le fasi del ciclo di vita di un sistema, dalla fase negoziale fino alla fase di utilizzo. Le osservazione inerenti questo filone di indagine compariranno, nel testo, in colore rosso.
Definizione di Affidabilità e Sicurezza
Tra le varie definizioni di affidabilità (in inglese Reliability) forse la più chiara è la seguente:
Dicesi affidabilità di un qualsiasi dispositivo (sistema o componente) la probabilità che esso funzioni correttamente, per un dato tempo, in certe condizioni.
Questa definizione contiene alcuni punti importanti:
Un aspetto molto importante nello studio dellaffidabilità è proprio il calcolo dell'affidabilità di un sistema a partire dall'affidabilità dei suoi componenti.
L'affidabilità del sistema dipenderà dall'affidabilità dei singoli componenti (incluso ovviamente il software) e da come essi interagiscono tra di loro. Inoltre l'applicazione software, che fino ad ora abbiamo visto come componente del sistema di controllo, è a sua volta analizzabile come sistema composto da un certo numero di componenti (moduli) software. Anche per l'affidabilità si applica quindi la regola generale di decomposizione gerarchica di un sistema in sotto-sistemi.
La definizione data sopra può portarci ad una ulteriore analisi del concetto di affidabilità nel momento in cui cerchiamo di definire con maggior precisione la frase "funzioni correttamente". E' infatti evidente che non tutti i tipi di malfunzionamento sono ugualmente importanti. Tornando al nostro sistema di controllo industriale, possiamo ipotizzare che se si rompe la stampante su cui il computer stampava periodicamente i dati dell'impianto, probabilmente il guasto non è molto grave (bisognerà certamente ripararla, e questo ha degli impatti sulla manutenzione, ma il guasto non riduce le reali funzionalità del sistema, né crea dei rischi per la sicurezza). Al contrario, se si guasta il microprocessore del computer (supponendo che non ci siano ridondanze), il nostro sistema è completamente perso!
Pertanto, date le considerazioni fatte sopra, possiamo sostituire la nostra precedente definizione di affidabilità con la seguente:
Dicesi affidabilità di un qualsiasi dispositivo (sistema o componente) la probabilità che esso non abbia guasti di un certo tipo durante una certa missione.
I vari tipi di affidabilità vengono quindi classificati in base al tipo di guasto che considerano. Una classificazione abbastanza comune è la seguente:
Vi è, inoltre, un altro tipo di affidabilità, meno quantificabile a priori: la probabilità che il sistema funzioni e possa venire usato, in modo sicuro, secondo le esigenze dell'utente, anche e soprattutto in situazioni critiche per l'utente stesso e/o per gli impianti controllati. La probabilità che le funzioni del sistema siano disponibili a svolgere il loro compito quando se ne manifesta la necessità, anche dopo lunghi periodi di inutilizzo. Definiamo per ora questo tipo di affidabilità, in mancanza di termini migliori, affidabilità di utilizzo. Essa ingloba tutte le categorie affidabilistiche inerenti aspetti umani, di utilizzo, di definizione dei requisiti e delle modalità di utilizzo del sistema, delle competenze necessarie, dell'interazione uomo-macchina, aspetti manageriali, sia di gestione del progetto, sia negoziali e di gestione del contratto.
In fase di progettazione di un sistema, si può definire che livello di affidabilità si vuole raggiungere. Dato che l'affidabilità è una probabilità, il requisito può essere espresso come un semplice numero. Chiaramente quando si progetta un sistema si pongono dei requisiti quantitativi diversi per i vari tipi di affidabilità. La tabella che segue fornisce un esempio:
In inglese, la protezione da guasti con possibili conseguenze catastrofiche viene chiamata safety, mentre con il termine security si individua la protezione da accessi non autorizzati e da possibili danneggiamenti volontari. Purtroppo entrambi i termini si traducono in italiano con il termine sicurezza, e questo a volte può generare confusione. Nel nostro caso, la parola sicurezza sarà sempre associato al concetto di affidabilità e quindi di safety.
Criteri di progettazione affidabilistica
Vediamo ora brevemente come si progetta laffidabilità nel caso di un sistema generico, composto cioè sia da hardware che da software.
- Scelta di materiali costruttivi di maggior qualità.
- Scelta di componenti più affidabili (o sovradimensionati, che risentono cioè meno delle sollecitazioni richieste).
- Introduzione di ridondanze.
- Revisioni di progetto.
- Revisioni dei criteri e delle modalità di utilizzo.
Lo strumento utilizzato per tenere sotto controllo lo sviluppo dellaffidabilità e per decidere se effettuare interventi migliorativi e quali tra quelli possibili, è la procedura nota come FMECA (Failure Mode Effect and Criticality Analysis): si tratta di unanalisi sistematica di come ogni componente possa venire meno al suo corretto funzionamento (considerando le differenti modalità di guasto) e di quali conseguenze questo abbia sullintero sistema:
- Vengono listati tutti i componenti del sistema (che possono essere componenti fisici, se la progettazione è già arrivata alle ultime fasi di dettaglio, oppure blocchi funzionali, se la progettazione è ancora in corso).
- Per ogni componente vengono listati tutti i possibili modi di guasto.
- Per ognuno di essi si valuta:
- La gravità del guasto sul funzionamento dellintero sistema. Questa classificazione riflette le varie classi di affidabilità del sistema: logistica, di missione e sicurezza. Pertanto un guasto potrà essere minore se impatta solo sullaffidabilità logistica, significativo se ha impatti sulla missione, critico se ha impatti sulla sicurezza.
- La probabilità che il guasto accada. Questa misura quantitativa è possibile per componenti fisici (meccanici od elettronici), mentre lo è molto meno per il software. A titolo di esempio, nel campo della componentistica elettronica, esiste lo standard MIL (originato dal Ministero della Difesa Americano, ed attualmente lo standard più seguito) che per ogni tipo e classe dimensionale di componente elettronico fornisce direttamente o con formule il tasso di guasto in funzione di:
- Livello di qualità del componente.
- Tasso di utilizzo.
- Condizioni ambientali.
- Una volta eseguita questa analisi per tutti i componenti, è possibile calcolare i valori di affidabilità (logistica, di missione, di sicurezza e di utilizzo) per tutto il sistema (o per i vari sotto-sistemi).
Le peculiarità dei Sistemi Software
Molte delle tecniche affidabilistiche sviluppate per il progetto di sistemi elettro-meccanici (brevemente introdotte nel capitolo precedente) non sono direttamente applicabili al software. Questo a causa della sostanziale differenza tra la progettazione software e le altre discipline ingegneristiche. Vediamo in dettaglio queste differenze:
La situazione del software è esattamente speculare: non esistono guasti casuali o di usura (il software non si deteriora con il tempo), ma esistono sempre errori di disegno. Per capirne il motivo, vediamo perché negli altri tipi di progettazione si può ragionevolmente assumere che gli errori di disegno siano stati rimossi e come queste ipotesi non siano valide nel caso del software:
Questo era il caso, ad esempio, dei sistemi elettromeccanici usati per il controllo di processo prima dellavvento dei microprocessori.
Nel caso delle applicazioni software attuali, il grado di complessità è cresciuto in modo impressionante, causando una crescita non lineare degli errori introdotti nella fase di progettazione. E proprio a causa di tale enorme aumento della complessità che risulta impossibile dimostrare lassenza di errori di disegno.
Un approccio più rigoroso di questa indimostrabilità di correttezza si trova in [Parnas 1985]. In questo articolo, lautore sostiene che i sistemi analogici sono costruiti con componenti che hanno, allinterno dellintervallo operativo dellimpianto, un numero infinito di stati stabili, che permettono di descrivere il loro comportamento con funzioni continue e di costruire un modello matematico del sistema. Tale modello può essere studiato analiticamente e le caratteristiche del sistema (nel nostro caso, laffidabilità) possono essere determinate in modo rigoroso. Nel caso di sistemi elettromeccanici digitali, essi sono generalmente costituiti con componenti aventi un insieme finito di stati stabili, ed il sistema risultante ha un numero relativamente piccolo di stati discreti, che può essere studiato e testato in modo esaustivo. Unapplicazione software, al contrario, è un sistema discreto con un numero estremamente elevato di stati (senza, tra laltro, alcuna regolarità e ripetitività, quale si trova ad esempio nella componentisitica elettronica). Questa complessità fa si che sia oltremodo difficile analizzare matematicamente un sistema software, come pure testarlo in modo esaustivo.
Il problema della complessità è tale che la maggior parte dei malfunzionamenti di unapplicazione software è da imputare non ad errori di realizzazione, quanto a mancanze nelle specifiche dei requisiti dellapplicazione [Levenson 1995]. Torneremo più avanti su questo punto, che è molto importante nella progettazione di software affidabile.
Lhardware (inteso in senso generale) viene sempre prodotto in serie, ed i componenti standard sono utilizzati in molte applicazioni. Questo permette di accogliere dati sul suo funzionamento (e naturalmente di correggere i difetti riscontrati).
Unapplicazione software, al contrario, viene quasi sempre costruita specificamente per il sistema da controllare. Risulta pertanto un esemplare unico, la cui affidabilità non può essere valutata in fase di disegno.
Risposte parziali a questo problema possono essere:
- Riusabilità del software (concetto su cui contano molto tutte le tecniche Object Oriented).
- Utilizzo di piattaforme standard per le applicazioni di controllo di processo (SCADA), che vengono solo personalizzate per lapplicazione specifica.
Si assume sempre che durante la fase di collaudo si possa esercitare il sistema realizzato e verificarne le caratteristiche, ed in particolare la sua affidabilità.
Nel caso di unapplicazione software, sempre a causa della sua elevata complessità, un test esaustivo del suo comportamento è praticamente impossibile. Infatti abbiamo detto che da un punto di vista matematico unapplicazione software è un sistema discreto con moltissimi stati e moltissime transizioni da uno stato allaltro. Verificarne il corretto funzionamento equivale ad esplorare tutti i suoi stati e le sue possibili transizioni. Tuttavia tale automa oltre ad essere enormemente complesso, non presenta alcuna struttura regolare (un circuito elettronico ha anchesso moltissimi stati, ma possiede anche una struttura regolare che ne permette sia unanalisi teorica che un testing sistematico), che ne possa semplificare o automatizzare lanalisi, e pertanto una sua verifica esaustiva è sempre irrealizzabile dal punto di vista pratico.
Un altro limite della fase di test riguarda gli errori fatti a livello di definizione delle specifiche. Infatti un test serve a verificare che il sistema si comporti come descritto nelle sue specifiche. Se però le specifiche sono scorrette, il test non potrà certo risolvere il problema!
Per finire, bisogna notare che, per sistemi "safety critical", il test in condizioni realistiche è impossibile (pensate al software che controlla lassetto di un aereo da combattimento). E necessario ricorrere a dei simulatori, la cui "fedeltà" allambiente operativo reale non può essere garantita completamente.
Da quanto esposto in questo capitolo, si può capire come le tecniche affidabilistiche per il software siano alquanto specifiche e debbano far fronte a problemi solitamente secondari in altre discipline.
Occorre inoltre tenere in considerazione quanto segue. Lavvento dellelettronica e dellinformatica ha portato i sistemi automatici ad un grado di flessibilità molto elevato, inimmaginabile nella precedente era meccanica. Tale evoluzione ha determinato un notevole aumento del grado di libertà dei progettisti: poiché gli errori progettuali sono molto più correggibili, la mente del progettista è molto più libera di indirizzarsi agli aspetti concettuali, e ci si può permettere sempre di più il lusso di progettare il sistema in astratto, prescindendo dai tecnicismi e dai dettagli, che si confida possano essere poi risolti a livello procedurale, applicando sistematicamente le metodologie di progettazione affidabilistica e di qualità. Ora, il fatto che, grazie alle tecnologie informatiche, gli errori siano divenuti correggibili, non significa che siano certamente corretti. Sta ancora a noi umani correggerli, prendendo in considerazione tutto ciò che nessuna intelligenza elettronica, per quanto evoluta, non è (e non sarà mai) in grado di considerare. Per quanto potente e veloce, la macchina esegue infatti nulla più, e (se il sistema ha una buona affidabilità di utilizzo) anche nulla meno di quanto la nostra fantasia è stata capace di programmare in essa. Sul piano metodologico, il fatto che esistano ormai procedure standard e check list per ogni fase progettuale, non significa che tali procedure siano complete e corrette, né che siano sempre e certamente applicate per intero. E' un tragico errore, già pagato in molti casi con un inaccettabile prezzo di vite umane, riporre eccessiva fiducia nella tecnologia informatica e nelle procedure, tendere ad affidarsi di un'intelligenza "altra" rispetto a quella umana. L'altra intelligenza (quella elettronica), per essere affidabile deve essere comunque programmata e controllata, e gli errori effettivamente corretti, dall'intelligenza umana. Inoltre le procedure devono essere applicate sistematicamente e completamente, e continuamente controllate, riverificate ed aggiornate, dai progettisti, dai tecnologi processisti e dagli utenti, in una lavoro di riesame continuo che non può in alcun modo essere omesso.
Per riassumere, un sistema deve essere progettato nel modo più affidabile possibile, ma non dobbiamo mai affidarci completamente al sistema.
Bibliografia
[Levenson 1995] N. G. Levenson "Safeware: System safety and computers", Addison-Wesley, 1995
[Parnas 1985] Parnas, "Software aspects of strategic defence systems", Communication of ACM, 1985