Ein Flugzeug, im Gegensatz zu beispielsweise einer Website, ist ein System, bei dem ein Ausfall in bestimmten Systemen völlig inakzeptabel ist, da Fehler in z. B. der Flugüberwachung zu einer Fehlfunktion des Autopiloten führen und einen Tauchgang durchführen können. Dies ist offensichtlich nicht der Fall, da die hervorragenden Ingenieure von Boeing und Airbus den Autopiloten überprüfen, um sicherzustellen, dass ein Tauchgang nicht plötzlich ein akzeptables und sicheres Manöver darstellt. Oder der Computer stürzt ab und die Piloten des neueren Fly-by-Wire-Flugzeugs können das Flugzeug nicht mehr fliegen. Natürlich sind in diese Systeme verschiedene Sicherheitsverfahren und Redundanzen eingebaut, um einen Absturz (sowohl der Software als auch des Flugzeugs) zu verhindern.
Andererseits ist es ziemlich offensichtlich, dass Software nicht perfekt ist - sowohl Open Source- als auch Closed Source-Software stürzen regelmäßig ab, und nur das einfachste "Hello World" -Programm schlägt nicht fehl. Wie können die Ingenieure, die die Softwaresysteme in der Luftfahrt-, Medizin- und anderen Lebens- und Todesbranchen entwickeln, ihre Software so testen, dass sie nicht ausfällt (und wenn doch, zumindest nicht ordnungsgemäß)?
Ich hoffe verzweifelt, dass Sie nicht alle gehen werden: "Oh, ich arbeite für Boeing / Airbus / (eine andere Firma) und es ist nicht so! Viel Spaß bei Ihrem nächsten Flug / Krankenhausbesuch."
Antworten:
Ich habe viel in der Industriesteuerung gearbeitet. Es muss nicht in einer ruhmreichen Branche wie der Luft- und Raumfahrt sein. Fast jede Industriemaschine verfügt über genügend Energie, um schwere oder tödliche Verletzungen zu verursachen. Ich war in der Nähe, als Menschen verletzt wurden. Wenn Sie die meiste Zeit an einem Schreibtisch in einem Büro verbringen, werden Sie wahrscheinlich überrascht sein, wie gefährlich die meisten Fabrikjobs sein können (und waren es sicherlich bis vor kurzem). Jetzt haben wir bessere Methoden zur Maschinensicherung. So funktioniert es in der Praxis (obwohl es von Gerichtsbarkeit zu Gerichtsbarkeit unterschiedlich ist):
In den USA gibt es OSHA-Standards und in der EU ähnliche (normalerweise strengere) Richtlinien. Diese beginnen in der Regel damit, dass Sie eine Risikoanalyse durchführen müssen. Dies bedeutet, dass Sie eine Liste aller Gefahren erstellen und diese Gefahren dann kategorisieren, wobei Sie berücksichtigen, wie oft eine Person dem Risiko ausgesetzt wäre, wie einfach es ist, das Risiko zu vermeiden (abhängig von der Geschwindigkeit usw.) und was ist die Schwere des Ergebnisses (Schnitt, Amputation, Tod usw.).
Ein Großteil der Analyse hat mit der Gefahrenabwehr zu tun. Wenn Sie einen großen Käfig um Ihre Maschine legen und festschrauben, gilt Ihre Maschine als sicher, wenn die Komponenten der Maschine die Schutzvorrichtung nicht durchbrechen können. Wenn Sie zum Einsteigen ein Werkzeug benötigen, wird dies als Wartungsaufgabe betrachtet, und Wartungspersonal muss geschult werden, wie man sicher an einer Maschine arbeitet. In der Realität müssen die meisten Maschinen jedoch regelmäßig mit den Bedienern in Kontakt treten, sodass wir Zugangstüren in die Schutzvorrichtung oder Lichtvorhänge usw. einbauen müssen. Diese Türen und Lichtvorhänge müssen überwacht werden und die Gefährdungskraft, der der Bediener ausgesetzt ist muss "steuersicher" abgeschaltet werden.
Basierend auf dieser Analyse werden die Risiken in verschiedene Kategorien eingeteilt. Eine übliche Klassifizierungsskala ist Kategorie 1 bis Kategorie 4 (basierend auf der Norm EN 954-1). Aufgrund dieser Kategorien sind Sie gesetzlich verpflichtet, ein bestimmtes Maß an Maschinenschutz und Sicherheit zu gewährleisten.
Für Kategorie 4 ist beispielsweise Folgendes erforderlich:
Dies kann in der Praxis schwierig zu erreichen sein, wird jedoch durch die Verfügbarkeit von Standardkomponenten, die nach Kategorie 4 zertifiziert sind, vereinfacht. Eine der häufigsten Komponenten in diesen Systemen ist beispielsweise ein Sicherheitsrelais. Dies sind mehr als nur mechanische Relais:
Wie Sie sehen, handelt es sich um komplizierte Geräte. Typische Kosten liegen zwischen 200 und 600 USD für jedes Sicherheitsrelais. Offensichtlich gibt es Software in diesen Geräten. Um Ihr Sicherheitsrelais zertifizieren zu lassen, müssen Sie normalerweise folgendermaßen vorgehen:
Sobald Sie Ihr Sicherheitssystem für Ihre Maschine unter Verwendung von sicherheitsrelevanten Komponenten entworfen haben, müssen Sie das Design von einem professionellen Ingenieur überprüfen und stempeln lassen. Dann baust du die Maschine. Dann wird der P.Eng. wird die Konstruktion der Maschine überprüfen, um sicherzustellen, dass sie nach dem Entwurf gebaut wurde. Sie werden es dokumentieren und einige Tests durchführen, um sicherzustellen, dass es wie erwartet funktioniert. Dies wird als Pre-Start-Review (PSR) bezeichnet und wird nicht in allen Ländern durchgeführt. Nach dem PSR darf ein Bediener die Maschine bedienen.
In den letzten Jahren gab es einige Revolutionen bei Sicherheitssystemen. Eine Zeit lang vertraute niemand der Übertragung von Sicherheitsdaten über ein Netzwerk, weshalb die so genannten "verteilten E / A-Systeme" wie DeviceNET und EtherCAT im Sicherheitsteil des Systems nicht zulässig waren. Neuere Protokolle ermöglichen es jedoch jetzt, dass Sicherheitsgeräte über diese industriellen Netzwerke laufen. Die Protokolle verwenden zeitgestempelte Nachrichten und doppelte redundante Verarbeitung an beiden Enden der Verbindung.
Sicherheitsrelais gehen langsam den Weg des Dodo Birds und werden durch kompliziertere Sicherheits-SPS ersetzt, mit denen die Sicherheitslogik in einer Funktionsblockdiagrammsprache aufgebaut werden kann. Auch diese Sicherheits-SPS verwenden alles redundant. Wenn das Programm genehmigt ist, muss vor der Inbetriebnahme der Maschine die P.Eng. stempelt das Programm und das Programm / die SPS wird mit einem Passwort gesperrt. Es braucht auch einen Hash des Programms und dieser Hash ist in der Dokumentation vermerkt (das ist es, was das P.Eng. Wirklich stempelt).
Sobald Sie Ihr Sicherheitssystem entworfen haben, kann die Logik, die Sie zur Steuerung der Maschine selbst schreiben, ein Kinderspiel sein. Programmierer stürzen häufig Maschinen ab, die Tausende von Dollar an Schaden verursachen, aber zumindest wird niemand verletzt.
quelle
Es gibt eher eine ernsthafte Tendenz zur formalen Verifizierung als zur zufälligen Funktionsprüfung.
Regierungsbehörden wie die NASA und einige Verteidigungsorganisationen geben immer mehr für diese Technologien aus.
Sie sind immer noch eine PITA für den durchschnittlichen Programmierer, aber beim Testen kritischer Systeme sind sie oft effektiver.
Es gibt auch die Tendenz, mehr Techniken aus der Wissenschaft auszuprobieren, um beispielsweise Multithread-Code zu validieren.
quelle
Es kommt darauf an, was die Software ist. Beispielsweise gibt es in Flugzeugen normalerweise eine doppelt redundante Verarbeitung für kritische Systeme. im extremfall können 2 verschiedene hardware-designs verwendet werden und zwei unabhängig voneinander entwickelte s / w-teile, von denen jeweils einer ausgeführt werden kann. Sie berechnen und überprüfen sich gegenseitig. Dies ist nicht kinderleicht und extrem teuer.
Wenn es um das Testen von Flugzeugsystemen geht, werden eine Reihe von Tests durchgeführt - das Testen von flugbezogenen Systemen dauert Monate, und wenn Sie Änderungen vornehmen, müssen eine ganze Reihe von erneuten Tests durchgeführt werden. Dies geschieht normalerweise in einem Simulator, der tatsächlich mit echten Flugzeugteilen (z. B. Cockpit) gefüllt sein kann, beispielsweise mit einem simulierten Motor oder ähnlichem. Wie Sie sich vielleicht vorstellen können, ist der Bau auch fürchterlich teuer. Änderungen werden anhand eines formellen Testprogramms bewertet und dann in einem realen Flugzeug in Testflügen ausgeführt. Während Dinge wie "gestörte Funktionstests" ausgeführt werden, darf das geänderte Objekt seine normalen Aufgaben ausführen und alles wird überprüft / getestet, um festzustellen, dass keine schädlichen Auswirkungen aufgetreten sind. Das kostet auch viel Geld und kann Wochen dauern.
Ich kenne ein Beispiel, in dem eine sehr einfache Änderung an einem Flugsystem erforderlich war - so einfach, dass Sie überrascht wären, wie gering diese Änderung ist. Allerdings hätte der erneute Test> 3 Monate gedauert und ungefähr 1 Million Dollar gekostet.
Wenn Sie in die Medizinbranche einsteigen, gibt es eine ganze Reihe regulatorischer Hürden, die sich nicht nur auf Tests, sondern auch auf Entwicklungsprozesse und Dokumentation beziehen.
All diese Felder sind ein großer Schritt weiter als Orte, die ein bisschen PHP-Code für eine Website ausgeben. Es ist langsam, mühsam, schwierig, langweilig, mühsam, genau und sehr teuer. Nehmen Sie Ihre normalen Entwicklungs- / Testkosten und multiplizieren Sie sie mit etwa 100, und Sie nähern sich der Marke.
quelle
Für die NASA Space Shuttle Software lesen Sie They Write the Right Stuff . Für FDA (US Food and Drug Administration) lesen Sie diese
quelle
Da Sie bereits genügend gute und informative Antworten erhalten haben, ist hier meine Meinung.
Es ist ganz einfach: Der erste Test wird immer von den Programmierern selbst durchgeführt. Es neigt dazu, die Anzahl der Fehler gering zu halten, und stellt sicher, dass nur die Qualitätsprogrammierer auf der Gehaltsliste bleiben.
quelle
Lebenskritische Software wird nicht nach einem anderen Standard als dem "es scheint zu funktionieren" getestet , da dies überall getan wird.
Alle Investitionen fließen entweder in das, was früher zu funktionieren schien, oder in Projekte, die es Nicht-Programmierern ermöglichen, bessere Software zu produzieren .
ps Keine Kommentare zum ersten
-1
, aber ich würde mich freuen,-1
für jede Referenz, die meiner Aussage widerspricht, zu nehmen .Kann ich für jede Referenz, die ich auf kritische Software stelle, die nicht gut entworfen oder getestet wurde, +1 vergeben? Simson Garfinkel dokumentiert zehn Fälle in einem Artikel über WIRED.
quelle
Es gibt nicht eine Antwort für alle Fälle. Es ist Sache des einzelnen Herstellers, zu entscheiden, wie er seine Software entwickelt und testet. Der gesamte Softwareentwicklungsprozess muss jedoch formalen Spezifikationen entsprechen.
Zum Beispiel , wenn die Software für medizinische Geräte zu schaffen , müssen Sie den folgen IEC 62304 Standard für Software für medizinische Geräte. (Leider kann ich nur auf Wikipedia verlinken, da es nicht kostenlos ist). So gut wie jedes Land der Welt verlangt, dass dieser Standard eingehalten wird.
Wie streng diese Anforderungen sind, hängt vom Schadensrisiko ab. Zum Beispiel hätte ein lebenserhaltendes Gerät das größte Risiko, Schaden zu nehmen (sicherer Tod, wenn das System ausfällt), wohingegen ein System, das mit Krankheitsdiagnose arbeitet, ein geringeres Risiko hat (möglicher Tod, wenn eine unheilbare Krankheit nicht richtig diagnostiziert wurde, wenn das System ausfällt).
Grundsätzlich heißt das aber, dass eine Rückverfolgbarkeit von den Anforderungen bis zur Software gegeben sein muss. Sie müssen Software-Unit-Überprüfungen durchführen. Das gibt nicht an, was die Überprüfung ist. Kann Unit-Tests sein, kann Code-Überprüfung sein. Bei Geräten mit höherem Risiko müssen Sie die Schnittstellen zwischen Softwareeinheiten manuell überprüfen (soweit ich weiß und weiß). Und natürlich viele andere Regeln. Oh, und Sie müssen eine Menge Dokumentation schreiben, um Ihre Arbeit zu dokumentieren.
Der Standard verbietet keine agile Entwicklung, obwohl es beim Lesen so aussieht, als wäre er mit Blick auf die Entwicklung von Wasserfällen geschrieben worden.
Ich kenne keine anderen Bereiche der Softwareentwicklung wie Luftfahrt, Züge, Autos usw. Aber ich gehe davon aus, dass andere ähnliche formale Richtlinien existieren.
quelle
Viele Techniken werden verwendet, einschließlich, aber nicht beschränkt auf:
Aber die Technik Nummer eins ist:
Die Software eines Raumfahrzeugs erfordert mehr Aufwand beim Testen als beim Entwerfen und Codieren.
Flugzeuge werden mehrjährigen Flugtests unterzogen, bei denen das Flugzeug in extreme Situationen gebracht wird. Dies testet nicht nur die physikalische Struktur, sondern auch die Software.
quelle
Es gibt einen Artikel "Perfect Software" von Jack Ganssle über EETimes vom 01.03.2009, 00:00 Uhr EST. Ein paar Punkte von dort:
Interessanterweise deuten die von Capers Jones gesammelten Daten in Bezug auf die kommerzielle Software darauf hin, dass "Software im Allgemeinen eine Effizienz bei der Beseitigung von Fehlern (der Prozentsatz der vor dem Versand entfernten Fehler) von 87% aufweist. Die Firmware erreicht bei weitem bessere 94%." Für mich ist keines davon nahezu perfekt. Der Artikel, den ein früherer Antworter erwähnte, besagt, dass das NASA-Space-Shuttle-Team eine Fehlerbehebungsrate von 99% erreicht hat, die Kosten liegen jedoch bei 35 Millionen pro Jahr für etwa 400.000 Codezeilen.
Ein interessanterer Artikel "Software für zuverlässige Systeme" desselben Autors vom 1.11.2009 scheint relevanter zu sein. Es kann wie folgt zusammengefasst werden:
Meiner Erinnerung nach hat HP vor fast einem Jahrzehnt das Vertragsdesign praktiziert. Mit einem kleinen Team, 500.000 Codezeilen, wurden nach der Auslieferung nur zwei Fehler gemeldet. Sehr beeindruckend.
Aus meiner Sicht kann zuverlässige oder perfekte Software nur erreicht werden, wenn die Kosten nicht unerschwinglich hoch sind. Frameworks oder Automatisierungen sind ein Muss.
quelle
Sie verfügen normalerweise über eine Hardware-Verriegelung , die als Ausfallsicherung verwendet wird.
ZB enthalten übliche böse Textfelder für Killerroboter immer einen Killschalter: P
quelle
Jede Branche hat ihre eigenen Regulierungsbehörden, die Test- und Dokumentationsanforderungen für sicherheitsrelevante Hard- und Software haben. Betrachten Sie dieses PDF des Underwriters Laboratory (UL), das den UL 1998-Standard einführt: http://www.ul.com/global/documents/offerings/industries/hightech/software/UL_softwareconformityassessment.pdf
Dieses Dokument enthält Verweise auf viele andere verwandte Dokumente von UL, CSA und IEC.
Sicherheitsbezogene Software verfügt normalerweise über redundante Hardwareschaltungen oder muss über andere redundante Steuerungsfunktionen verfügen, um einen sicheren Betrieb und sichere Fehlermodi zu gewährleisten.
quelle