Programmieren oder nicht programmieren?
Um ein Problem mit einem Softwareprodukt zu lösen, können Sie, nachdem Sie die Anforderungen verstanden haben, ENTWEDER ein Programm in Programmiersprachen schreiben ODER das Programm in einer formalen Sprache angeben und Tools zur Codegenerierung verwenden. Letzteres fügt nur eine Abstraktionsebene hinzu.
Die richtigen Dinge tun oder die richtigen Dinge tun?
Der formale Ansatz gibt Ihnen den Beweis, dass Ihre Software den Spezifikationen entspricht. So macht Ihr Produkt die Dinge richtig. Aber macht es die richtigen Dinge?
Die Anforderungen, an denen Sie arbeiten, sind möglicherweise unvollständig oder nicht eindeutig. Sie könnten sogar fehlerhaft sein. Im schlimmsten Fall werden die tatsächlichen Bedürfnisse nicht einmal zum Ausdruck gebracht. Aber ein Bild sagt mehr als tausend Worte, nur Google-Bilder für "Was der Kunde will", zum Beispiel aus diesem Artikel :
Die Kosten der Formalität
In einer perfekten Welt hätten Sie von Anfang an vollständige und perfekte Anforderungen. Sie können dann Ihre Software vollständig spezifizieren. Wenn Sie sich für eine formelle Methode entscheiden, wird Ihr Code automatisch generiert, damit Sie produktiver arbeiten können. Produktivitätsgewinne würden die Kosten der formalen Werkzeuge ausgleichen. Und alle würden jetzt formale Methoden anwenden. Warum ist es nicht so?
In der Praxis ist das selten die Realität! Dies ist der Grund, warum so viele Wasserfallprojekte gescheitert sind und warum iterative Entwicklungsmethoden (Agile, RAD usw.) die Führung übernommen haben: Sie können unvollständige und unvollständige Anforderungen, Entwürfe und Implementierungen verarbeiten und verfeinern, bis sie in Ordnung sind.
Und hier kommt der Punkt. Bei formalen Methoden muss für jede Iteration eine vollständig konsistente formale Spezifikation vorliegen. Dies erfordert sorgfältiges Denken und zusätzliche Arbeit, da formale Logik nicht verzeiht und unvollständige Gedanken nicht mag. Einfache Wegwerfversuche werden unter dieser Bedingung teuer. Und jede Iteration, die zum Zurückverfolgen führen würde (z. B. eine Idee, die nicht funktioniert hat, oder eine Anforderung, die falsch verstanden wurde).
In der Praxis
Wenn Sie aus rechtlichen oder vertraglichen Gründen nicht verpflichtet sind, formale Methoden anzuwenden, können Sie auch ohne formale Systeme eine sehr hohe Qualität erzielen, z. B. durch vertragliche Programmierung und andere bewährte Verfahren (z. B. Code Review, TDD usw.). Sie können nicht nachweisen, dass Ihre Software funktioniert, aber Ihre Benutzer werden früher Freude an der Arbeit mit Software haben.
Update: gemessener Aufwand
In der Oktoberausgabe 2018 von Communications of the ACM gibt es einen interessanten Artikel über formal verifizierte Software in der realen Welt mit einigen Schätzungen des Aufwands.
Interessanterweise (basierend auf der Entwicklung von Betriebssystemen für militärische Ausrüstungen) scheint es, dass die Herstellung formal erprobter Software 3,3-mal mehr Aufwand erfordert als mit herkömmlichen Ingenieurtechniken. Es ist also sehr teuer.
Auf der anderen Seite ist der Aufwand für das Abrufen von Hochsicherheitssoftware auf diese Weise 2,3-mal geringer als bei herkömmlich entwickelter Software, wenn Sie den Aufwand für das Zertifizieren solcher Software auf einem hohen Sicherheitsniveau (EAL 7) erhöhen. Wenn Sie also hohe Zuverlässigkeits- oder Sicherheitsanforderungen haben, gibt es definitiv ein Geschäftsmodell für die formelle Umsetzung.
seL4-Design und Code-Entwicklung dauerten zwei Personenjahre. Die Summe aller serospezifischen Nachweise über die Jahre ergibt insgesamt 18 Personenjahre für 8.700 Zeilen C-Code. Im Vergleich dazu dauerte die Entwicklung von L4Ka :: Pistachio, einem anderen Mikrokern der L4-Familie, der in seiner Größe mit seL4 vergleichbar ist, sechs Personenjahre und bietet kein nennenswertes Maß an Sicherheit. Dies bedeutet, dass zwischen verifizierter Software und herkömmlich entwickelter Software nur ein Faktor 3,3 besteht . Nach der Schätzmethode von Colbert und Boehm 8 würde eine traditionelle Common-Criteria-EAL7-Zertifizierung für 8.700 Zeilen C-Code mehr als 45,9 Personenjahre dauern. Das heißt, die formale Verifizierung der Implementierung auf Binärniveau ist bereits mehr als ein Faktor von 2,3 Dies ist kostengünstiger als die höchste Zertifizierungsstufe von Common Criteria, bietet jedoch eine deutlich höhere Sicherheit.