Quali sono gli ostacoli che impediscono l'adozione diffusa di metodi formali? [chiuso]


14

È possibile utilizzare metodi formali per specificare, provare e generare codice per un'applicazione. Questo è meno soggetto a errori - quindi utilizzato principalmente nei programmi di sicurezza / critici.

Perché non lo usiamo più spesso per la programmazione di tutti i giorni, o nelle applicazioni web, ecc ...?

Riferimenti :


3
Potremmo costruire case con pareti spesse 5 piedi - come castelli medievali. Il più delle volte, sarebbe più un problema di quanto valga la pena.
Baldrickk,

5
Puoi provare ad applicare metodi formali a un progetto di sviluppo web e vedere come va. Molto probabilmente noterai che stai impegnando molto in un'attività di basso valore. Contrastalo con un rapido test del fumo, che catturerà già molti bug. È interessante notare che i sistemi di tipo statico sono un semplice tipo di sistema di prova, ma soprattutto lo sviluppo web evita quelle lingue (preferendo invece linguaggi altamente dinamici come Ruby, PHP o JavaScript). La correlazione non implica una causalità, ma mette in pausa il pensiero.
amon,

1
Preferiresti specificare in un linguaggio di specifica invece di programmare in un linguaggio di programmazione? Ok, sarai in grado di dimostrare che funziona secondo le specifiche. Ma come dimostrerai che le specifiche riflettono il vero problema?
Christophe,

3
@toto la domanda è: fare le cose giuste (lavorare secondo le specifiche) o fare le cose giuste (avere le buone specifiche). Mentre in teoria le specifiche sono ciò che vogliamo, in pratica raramente sappiamo con certezza cosa è veramente necessario: beyssonmanagement.com/2012/10/29/…
Christophe,

3
Per coloro che sono delusi dal fatto che questo sia chiuso, ora c'è un ottimo post sul blog: Perché le persone non usano i metodi formali?
icc97,

Risposte:


19

Un ingegnere è una persona che può fare con un dollaro ciò che qualsiasi idiota può fare con 10.

Vincoli di risorse, vincoli di bilancio, vincoli di tempo, sono tutti importanti.

Lo sviluppo di software con metodi formali è generalmente molto più costoso e richiede molto più tempo che senza. Inoltre, per molti progetti, la parte più difficile è comprendere i requisiti aziendali. Tutto ciò che l'utilizzo di metodi formali ti acquista in quel caso è la prova che il tuo codice corrisponde al 100% alla tua comprensione incompleta e errata dei requisiti aziendali.

Per questo motivo, l'uso di metodi formali, prove, verifica del programma e tecniche simili è in genere limitato a "cose ​​che contano", ovvero software avionici, sistemi di controllo per apparecchiature mediche, centrali elettriche, ecc.


1
Aggiungo anche che inserire metodi formali nel linguaggio di programmazione è un'area di ricerca attiva attualmente non è ancora pronta per il mainstream
jk.

1
Accetto questa risposta, ma volevo anche un approccio sul perché i metodi formali siano ancora considerati "costosi" e "dispendiosi in termini di tempo", soprattutto quando sappiamo quanto costano la manutenzione e il monitoraggio / debug del codice su grandi progetti.
toto

1
TDD e BDD sono approcci basati sui principi della logica Hoare, una base di approcci formali. Migliorano l'efficienza non togliendola.
Martin Spamer,

1
@toto Le prove sono davvero, DAVVERO difficili. Molte cose che i matematici danno per scontate nelle prove non si applicano ai programmi. Ad esempio, in C ++, inoltre non è associativa: (-1 + 1) + INT_MAX = INT_MAX, -1 + (1 + INT_MAX)è un comportamento indefinito.
Hovercouch,

1
@toto: il motivo per cui sono considerati "costosi" e "dispendiosi in termini di tempo" è perché possiamo esaminare i progetti sviluppati utilizzando metodi formali e verificare empiricamente che tali progetti impiegano molto più tempo a svilupparsi. Guarda i tempi di sviluppo di seL4 / L4.verified, ad esempio, rispetto a qualsiasi altra implementazione di L4.
Jörg W Mittag,

12

Programmare o non programmare?

Per risolvere un problema con un prodotto software, dopo aver compreso i requisiti, è POSSIBILE scrivere un programma utilizzando i linguaggi di programmazione o specificare il programma utilizzando un linguaggio formale e utilizzare gli strumenti di generazione del codice. Quest'ultimo aggiunge solo un livello di astrazione.

Fare le cose giuste o fare le cose giuste?

L'approccio formale fornisce una prova del funzionamento del software in base alle specifiche. Quindi il tuo prodotto fa le cose bene. Ma fa le cose giuste?

I requisiti su cui stai lavorando potrebbero essere incompleti o ambigui. Potrebbero anche essere buggy. Nel peggiore dei casi, i bisogni reali non sono nemmeno espressi. Ma un'immagine vale più di mille parole, solo immagini di Google per "Ciò che il cliente desidera", ad esempio da questo articolo :

inserisci qui la descrizione dell'immagine

Il costo della formalità

In un mondo perfetto, avresti requisiti dettagliati e perfetti fin dall'inizio. È quindi possibile specificare completamente il software. Se dovessi scegliere formale, il tuo codice verrebbe generato automaticamente in modo da essere più produttivo. L'aumento della produttività compenserebbe il costo degli strumenti formali. E ora tutti avrebbero usato metodi formali. Allora perché no?

In pratica, questa è raramente la realtà! Questo è il motivo per cui così tanti progetti a cascata fallirono e perché iterativi metodi di sviluppo (agile, RAD, ecc.) Presero il comando: possono gestire requisiti, progetti e implementazioni incompleti e imperfetti e perfezionarli fino a quando non vanno bene.

E qui arriva il punto. Con i metodi formali, ogni iterazione richiede una specifica formale completamente coerente. Ciò richiede un pensiero attento e un lavoro aggiuntivo, perché la logica formale non è perdonante e non ama i pensieri incompleti. Semplici esperimenti usa e getta diventano costosi sotto questo vincolo. E così fa ogni iterazione che porterebbe a backtracking (ad esempio un'idea che non ha funzionato o un requisito che è stato frainteso).

In pratica

Quando non sei obbligato a utilizzare metodi formali per motivi legali o contrattuali, puoi anche ottenere una qualità molto elevata senza sistemi formali, ad esempio utilizzando la programmazione basata su contratto e altre buone pratiche (ad esempio revisione del codice, TDD , ecc ...). Non sarai in grado di dimostrare che il tuo software funziona, ma i tuoi utenti apprezzeranno prima di tutto il funzionamento del software.

Aggiornamento: sforzo misurato

Nel numero di ottobre 2018 di Communications of the ACM c'è un articolo interessante sul software ufficialmente verificato nel mondo reale con alcune stime dello sforzo.

È interessante notare che (basato sullo sviluppo del sistema operativo per apparecchiature militari), sembra che produrre software provato formalmente richieda uno sforzo 3,3 volte maggiore rispetto alle tecniche di ingegneria tradizionali. Quindi è davvero costoso.

D'altra parte, per ottenere software ad alta sicurezza in questo modo è necessario un impegno 2,3 volte inferiore rispetto a un software progettato in modo tradizionale se si aggiunge lo sforzo per rendere tale software certificato ad alto livello di sicurezza (EAL 7). Quindi, se hai requisiti di alta affidabilità o sicurezza, c'è sicuramente un business case per andare formale.

la progettazione e lo sviluppo del codice seL4 sono durati due anni-persona. Sommare tutte le prove sierospecifiche nel corso degli anni arriva a un totale di 18 anni-persona per 8.700 righe di codice C. In confronto, L4Ka :: Pistachio, un altro microkernel della famiglia L4, di dimensioni paragonabili a seL4, ha richiesto sei anni-persona per svilupparsi e non fornisce un livello significativo di affidabilità. Ciò significa che esiste solo un fattore 3,3 in tra software verificato e software di ingegneria tradizionale. Secondo il metodo di stima di Colbert e Boehm, 8 una tradizionale certificazione EAL7 Common Criteria per 8.700 righe di codice C richiederebbe più di 45,9 anni-persona. Ciò significa che la verifica formale dell'implementazione a livello binario è già più di un fattore 2.3 meno costoso del più alto livello di certificazione dei criteri comuni, ma fornisce una garanzia significativamente più forte.


La programmazione basata su contratto utilizza prove almeno informali.
Frank Hileman,

@FrankHileman yes! E il semplice fatto di chiarire precondizioni, postcondizioni e invarianti aiuta notevolmente a rivedere il codice in modo efficiente, ridurre gli errori e sistematizzare i test.
Christophe,

Questa dovrebbe essere di gran lunga la risposta migliore.
Hashim,

0

Ogni programma in qualsiasi lingua può essere pensato come una specifica formale (equivalente ad un tornio). Qualsiasi "specifica formale" di livello superiore da utilizzare per dimostrare la correttezza formale è anche solo un altro programma. Ma è (tipicamente) un programma cattivo, incompleto, vago, scarsamente pensato. E non a caso, in genere scritto da persone che non sanno programmare (di solito sono esperti di dominio).

E così dimostrando che un programma è compatibile (produce le stesse risposte o comunque tu lo caratterizzi) con i suoi requisiti formali di livello superiore, invariabile si riduce al modo in cui risolvi le ambiguità nella specifica formale di livello superiore. Non esiste un buon modo generale per farlo.

La mappatura dei requisiti di alto livello con dettagli di livello inferiore è l'essenza di ciò che riguarda la vera programmazione. Non dovrebbe sorprendere il fatto che il lavoro di base svolto da un programmatore che legge e interpreta le specifiche non può essere sostituito da agitando la mano e dicendo: "Ora basta vedere se questa specifica formalità di alto livello è rispettata da questo programma di esempio".

Anche ai primi tempi della programmazione logica, in cui questo concetto sembrava inizialmente così promettente (poiché sia ​​la specifica di alto livello che i programmi reali sottostanti potevano essere scritti nella stessa lingua), questo problema fondamentale si rivelò irrisolvibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.