Try, Catch, Finally. Logik (und Ethik?) von Fehlern

Ich bin heute morgen über zwei Dinge fast gleichzeitig „gestolpert“. Reuters meldete, dass in den USA nicht mehr generell gesetzlich ausgeschlossen werde, dass Autos von Maschinen gesteuert werden. Und fast gleichzeitig verdichteten sich die Meldungen, dass das schwere Zugunglück in Bad Aibling möglicherweise durch menschliches Versagen verursacht worden sein könnte. Konkret geht es hier darum, dass ein Mensch entschieden haben könnte, ein technisches Sicherungssystem außer Kraft zu setzen. Über den Tag mehrten sich die Indizien, dass keine technische Störung vorlag (und folglich steigt die Wahrscheinlichkeit, dass die korrekte Entscheidung einer technischen Sicherungslogik durch einen Menschen „überstimmt“ wurde. Das passt – angesichts der vielen Toten und Verletzten in Bad Aibling muss man das sehr bedauern – zum Umgang mit menschlicher und technisch-logischer Entscheidung.

Die „K.O.“-Frage für alle Systeme autonomen Fahrens ist üblicherweise das ethische Dilemma: Ein Unfall ist unabwendbar – das Fahrzeug überfährt ohne jeden Ausweg einen Menschen. Aber wen? Den übergewichtigen 83jährigen Mann, der gerade von einer Krebserkrankung erfahren hat und aufgrund seiner langen Raucher- und Trinkerkarriere bereits einen Herzschrittmacher trägt und einen Schlaganfall überlebt hat. Oder die 27jährige Frau, die gerade erfahren hat, dass sie zum dritten Mal schwanger ist und alleinerziehend für zwei 3 und 5 Jahre alten Kinder verantwortlich ist. Nach, wie wird das technische Wunderwerk wo dieses ethische Problem lösen?

Die Antwort ist erschütternd einfach: Autonome Systeme setzen alles daran, gar nicht erst in diese Situation zu gelangen. Ein Teil der Problemlösung ist so einfach, dass man sich fragt, warum nicht auch Menschen diese Strategie verfolgen: Regeln sind für technische Systeme Regeln. Gerade und insbesondere für Autofahrer hingegen sind Regeln im Normalfall „besserwisserische Belehrungen und Gängelei“. Ein autonomes Fahrzeug fährt so schnell, wie erlaubt ist, solange die Sensorik keine weiteren Einschränkungen erfasst. Ansonsten fährt das Fahrzeug so schnell, wie es der noch verfügbare freie Weg erlaubt oder reduziert im Schrittverkehr die Geschwindigkeit so lange, bis nur noch ein Minimalabstand eingehalten werden kann.

JAAAAAA, aber… sagt nun der Klugscheißer…, was ist denn mit Kindern, die plötzlich zwischen parkenden Autos hervorspringen. Die kann man mit Radar nicht frühzeitig sehen, mit Ultraschall nicht, mit Infrarot nicht. Stimmt. Der menschliche Autofahrer aber auch nicht. Und die Wahrscheinlichkeit, dass informationstechnische Sensorik ein Kind bereits erfasst hat, bevor es zwischen parkenden Fahrzeugen nicht mehr sichtbar war, und eine Projektion der Bahn vorgenommen hat, ist nicht auszuschließen. Jedenfalls weniger, als dass ein Mensch konzentriert Auto fährt und dabei permanent auch den Rand seines Gesichtsfeldes auswertet.

Man muss sich schlichtweg keine Mühe geben: Der Vergleich geht immer gegen den Menschen aus. Die technische Sensorik ist inzwischen besser als das menschliche Auge und kann mit und ohne Licht zig verschiedene Informationskanäle zeitgleich auswerten (Radar, Ultraschall, Infrarot als die drei typischen neben den „Lichtbildern“ aus CCDs, und auf allem kann man Pattern Recognition oder Tracking machen, um zu bestimmen, was innerhalb des Sichtfeldes los ist, sich bewegt, sich verändert etc. Das kann das Auge nicht, und es ist natürlich, dass zwischen dem typischen Alter des Führerscheinerwerbs und dem des ewigen und finalen Führerschein- und Löffel-Abgebens das Sehvermögen abnimmt, ohne dass jemals wieder ein Nachweis der Sehfähigkeit verlangt würde.

Wie ist es mit der Entscheidungsfindung? Der Mensch kann immerhin informiert und ethisch entscheiden. Ja, kann er. Das setzt voraus, dass er sich bei seiner Entscheidung an Werte gebunden fühlt. Und wir wissen nicht, an welche Werte. Eine bestimmte Gruppe Menschen würde ohne zu Zögern die schwangere Frau aus dem Entscheidungsdilemma überfahren. Weil sie nämlich ein Kopftuch trägt und das für die Person am Steuer des Fahrzeugs ein Indikator für einen Wert ist, den er nicht teilt. Abseits der Polemik: Entscheidungen von Menschen brauchen Zeit. Viel Zeit. In einer potenziellen Gefahrensituation kann ein Mensch bestenfalls eine Entscheidung treffen (falls überhaupt Zeit für eine Entscheidung bleibt). Trifft er die falsche, wird er in der Regel keine Chance mehr haben, überhaupt zu bemerken, dass die Entscheidung falsch war.

Das ist elementar anders, wenn man technisch Entscheidungen trifft. Da geht es allein darum, ob eine Entscheidung die erwartete Auswirkung zeigt oder nicht. Seit Jahrzehnten sind Systeme wie ABS, ESP, ASR und wie das Zeugs heißt und die Vorstellung, dass das Auto alleine entscheiden kann, weniger zu bremsen, falls der Mensch so stark bremst, dass der Bremsvorgang nicht zur Verzögerung des Fahrzeugs führt (Räder blockieren, technisch ausgedrückt), war für viele Menschen ein Graus. Wir mussten erst lernen zu akzeptieren, dass im Gegensatz zum panischen Menschen die Fahrzeugtechnik jederzeit Ist gegen Soll vergleichen und einfache Vergleiche in Entscheidungen überführen kann.

Es gibt in der gesamten Debatte einfach keine guten Argumente dagegen, sich nur noch autonom gesteuert zu bewegen, wenn man ein Kraftfahrzeug braucht. Autonome Fahrzeuge halten sich an Verkehrsregeln (Menschen in einem Maß nicht, dass wir nicht nur eigene Exekutivbehörden für die Überwachung des fließenden und ruhenden Verkehrs haben, sondern auch ein Amt, dass die Verkehrsverstöße verfolgt und speichert. Und trotzdem noch Millionen Menschen regelmäßig dort aktenkundig werden. UND Millionen von regelmäßigen Verstößen nicht entdeckt oder geahndet werden) – das ist ein ganz zentrales Thema. Fahrzeugtechnik hat die bessere Sensorik, die besseren Chancen, in kürzerer Zeit Entscheidungen zu treffen und seriell Entscheidungen auf ihre Wirksamkeit zu probieren.

Der eigentliche Punkt ist: Autofahren macht den meisten Mensch in irgendeiner Weise Spaß, und die Werbung vermittelt (ähnlich wie bei Zigaretten übrigens), dass es sich dabei um eine Art „Lebensgefühl“ handelt. Viel wichtiger ist sicherlich, dass es ungewohnt ist, bei der Personenbeförderung seine Autarkie aufzugeben und sich befördern zu lassen. Moment mal – im Zug, im Flugzeug, im Bus, mit Freunden – gibt man sich da nicht auch in die Hände eines möglicherweise fehleranfälligen Systems?

Der Maßstab, der immer herangezogen wird, ist, dass „der Computer mal spinnt“. Der Maßstab, der nie betrachtet wird, ist, dass der Mensch mal nicht zuverlässig funktioniert (wie wäre es mit diesem hier – der ist sehr bekannt). Bayerns Innenminister Hermann sprach über die Sicherungssysteme in den Zügen, die in Bad Aibling kollidierten, etwa so: „Wenn der Computer mal spinnt, müssen die Piloten doch die Oberhoheit behalten“. Heißt übersetzt: Der Zug bleibt stehen, wenn das Sicherungssystem anschlägt. Und deswegen (?) ist es wichtig, dass nicht nur der Zugführer (der woher genau weiß, dass ein entgegenkommender Zug im Gleis ist? Oder nicht, obwohl ein Signal auf Halt steht?), sondern auch die Fahrdienstleitung (die woher genau ein Bild der Lage vor Ort hat? Die woher genau und exakt weiß, wo welches Fahrzeug steht oder fährt?) ein solches System überstimmen und weiterfahren lassen können. Klugscheißer wird sagen: Fahrzeugsensorik, GPS, geht doch alles. Gerne, bitte. Mit GPS einparken, wie wird das so laufen? Mit 10-50m Fehler? Wie ist denn das mit zwei Fahrzeugen, die 11m auseinander stehen und wir mit 10-50m Exaktheit sagen können, wo sie stehen?

Mal zum Vergleich: Wenn im Flugzeug jemand verbotenerweise raucht und deswegen der Feueralarm losgeht, muss das Flugzeug landen und sichergestellt werden, dass es nicht brennt. Auch wenn bereits klar ist, dass es sich nur um Zigarettenrauch handelt. Da fragt man sich schon, ob es hier nicht ganz sinnvoll ist, dass weder der Pilot noch die Flugsicherung diese Regel überstimmen dürfen. Weil es eben scheiße ist, wenn es dann doch brennt.

Ganz ähnliche Dummheiten gab die Politik von sich, als der erwähnte Germanwings-Selbstmordflug traurige Gewissheit war. Da wurde gefordert, dass das Flugzeug zur Not ferngesteuert gelandet werden müsste. Und die Flugsicherung dem Piloten das Steuer aus der Hand nehmen muss. Wer sagt denn hier, dass die Fluglotsen die bessere Entscheidung treffen? Wer sagt denn, dass nicht irgendein Sadist, enttäuschter Liebhaber, Terrorist künftig nicht mal mehr sein Leben riskieren muss, weil er einfach per Fernsteuerung so ein Flugzeug crashen kann.

Der Mensch ist ein sehr sehr fehlbarer Maßstab, und wir sollten bei der Bewertung von Technik nicht der Versuchung nachgeben, den Grenzzustand des Versagens von Technik mit dem Idealzustand des bestmöglichen Funktionierens eines Menschen zu vergleichen.

Nun aber zum eigentlichen Titel: Wie fängt man denn technisch überhaupt Fehler auf? Was macht man denn, wenn der Computer spinnt? Hier muss ich eigentlich gleich wieder pöbeln – im seltensten Fall „spinnt“ der Computer, sondern der Anwender hat fahrlässig oder billigend in Kauf genommen, dass Fehlfunktionen auftreten, oder sie sogar mutwillig oder vorsätzlich herbeigeführt. Aber ok, das wollen wir mal vergessen…

Das oberste Prinzip ist, dass alles, was Scheitern kann, scheitert. Im Gegensatz zur Machbarkeitsstudie (Proof of Concept), die darstellt, wie etwas funktionieren könnte, muss die Produktivfassung für jeden erdenklichen Fehler eine Lösung vorherzusehen.

Dafür gibt es ein bewährtes Konzept abgestufter Fehler – beginnend mit der Information (gewissermaßen einer reinen Mitteilung) bis hin zur Exception (einem Zustand, bei dem die Ausführung des Programms nicht mehr möglich ist). Und jetzt nähere ich mich der Überschrift an: Wenn ich weiß oder ahne, dass eine Exception auftreten kann, kann ich Konstrukte bauen, mit denen ich solche schweren Fehler auffange und kanalisiere. In den meisten Programmiersprachen ist das ein Dreischritt aus „try“, „catch“ und „finally“. „Versuche …, fange auf … , und mache anderenfalls abschließend…“.

So bildet man nun ab, dass einerseits eine Exception die Fortsetzung des Programms nicht mehr erlaubt, gleichermaßen aber auch nicht erwünscht oder erlaubt ist, dass ein Programm abbricht oder gar ungefiltert Fehler bis zum Benutzer durchschlagen. Insofern „fängt“ man Fehlfunktionen auf (catch) und „wirft“ sie weiter, in der Hoffnung, dass auf einem höheren Level eine weitere Routine wartet, um diese Meldung aufzufangen. Das erlaubt, ganze Programmzweige zurück zu springen, Aktionen rückgängig zu machen und dies so lange zu wiederholen, bis alle Alternativen und möglichen Auswege durchgespielt sind. Geht nichts mehr, wirft man die Exception weiter nach oben – bis endgültig Stillstand eintritt oder eine Lösung auf höherer Ebene entsteht.

Ein zweites Konzept ist die Assertion – gewissermaßen eine Vergewisserung. Die meisten Programmiersprachen erlaubt jederzeit, zu vergleichen, ob bestimmte Bedingungen sich mit einem Erwartungswert decken – eine nicht bestandene Assertion ist eine Exception – also würde erneut die Kaskade der Fehlerbearbeitung einsetzen.

Drittens sind Datentypen und begrenzte Wertebereiche eine hervorragende Sicherheit, um zu gewährleisten, dass grob falsche Daten die Verarbeitung stören – auch hier ist ein Verstoß gleichbedeutend mit einer Exception.

Viertens lassen sich Programme und Programmteile kryptographisch prüfen – es ist also möglich, zu wissen, ob ein Programm exakt einem bekannten Zustand entspricht oder nicht.

Und schließlich setzen komplexe Systeme das Konzept von Transaktionen, Savepoints und Rollbacks ein, um zunächst zu prüfen, ob Vorgänge fehlerfrei bis zum Ende durchführbar sind und daraufhin zu entscheiden, ob der komplette Vorgang übernommen (commit) wird, oder komplett rückgängig gemacht wird (rollback).

So, und nun kommt der naturgegebene Fehler – Flaw – als versöhnlicher Abschluss: All das muss nämlich auch von Menschen konstruiert werden, und dann sind die Fehler von Menschen wieder eingebaut. Menschen verzichten gerne aus Kostengründen auf Redundanz, Replikation und Backups, um ihre Speichermedien zu schützen. Bequemlichkeit und Bedienkomfort führt dazu, Sidechannels zu öffnen (der USB-Stick als die Kopflaus der IT-Infrastruktur vorne weg, unzureichend gesicherte oder getrennte Netzwerke direkt auf den Fersen). Mangelhafte oder fehlende Validierung und Prüfung übergebener Werte ist besonders bei Webseiten ein typischer Angriffsvektor – und das wird immer schlimmer, je abgeschotteter und sicherer sich ein Programmierer auf seinem System fühlte. Und das reicht bis zum gänzlichen Verzicht auf Fehlerbehandlungen oder Transaktionen. Und die Spitze der Dummheit ist dann das, was Apple-User als Jailbreak kennen. Dahinter verbirgt sich eine Umgehung des „Code Signing“, d.h. der Berechenbarkeit, ob ein Programm einem geprüften Zustand entspricht. Zum Experimentieren ist das ein wunderbares Mittel. Für den Normaluser und für Systeme, deren Integrität essenziell wichtig ist, ist das eine Katastrophe.

Und ebenso schlimm ist, dass Menschen geneigt sind, umso fahrlässiger zu werden, je höher die Mauern um den Garten gezogen sind. Überall in den Maschinen steckt das Werk und der Geist von Menschen. Und das ist vielleicht das größte Problem, warum wir eigentlich weder Menschen noch Maschinen vertrauen sollten, sicher Auto zu fahren.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*