Wie viel Redundanz / Robustheit sollte komplexe Software implementieren?


12

Der Fokus dieser Frage: Manche Software führt "zusätzliche Arbeit" aus, um die Wahrscheinlichkeit eines "schließlich erfolgreichen / zufriedenstellenden" Ergebnisses trotz eines oder mehrerer interner Fehler in der Software zu erhöhen, die eine längere Ausführungszeit erfordern, wenn diese Fehler auftreten. All dies geschieht ohne Wissen des Benutzers, wenn das Ergebnis erfolgreich war.

Definition komplexer Software:

  • Enthält Code, der im Laufe seiner Lebensdauer von mehr als 10 Entwicklern geschrieben (beigesteuert) und nicht im selben Zeitrahmen geschrieben wurde
  • Hängt von mehr als 10 externen Bibliotheken ab, die jeweils Vorbehalte enthalten
  • Eine typische Softwareaufgabe (zum Erzeugen eines vom Benutzer gewünschten Ergebnisses) erfordert 10 oder mehr Eingabeparameter, von denen die meisten Standardwerte haben, die jedoch konfigurierbar sind, wenn der Benutzer die Steuerung benötigt.
  • Vor allem Software, die im Verhältnis zur auszuführenden Aufgabe die entsprechende Komplexität aufweist, dh nicht unnötig kompliziert ist .

Bearbeitet: Was ist komplex? Bitte beachten Sie Es gibt einen großen Unterschied zwischen komplex und kompliziert . (direkte Verbindung)

Definition von Redundanz / Robustheit in dieser Frage :
(Robustheit basierend auf Kommentaren hinzugefügt)

  • Wenn eine Softwaretask fehlgeschlagen ist, als der aktuelle Parametersatz verwendet wurde, versuchen Sie es mit anderen Parametern.
    • Offensichtlich muss bekannt sein, dass diese "unterschiedlichen" Parameter einen unterschiedlichen Codepfad verwenden, was möglicherweise zu einem anderen (hoffentlich besseren) Ergebnis führt.
    • Manchmal werden diese unterschiedlichen Codepfade basierend auf Beobachtungen der externen Bibliotheken ausgewählt.
  • Wenn die tatsächlich ausgeführte Aufgabe geringfügig von der Spezifikation des Benutzers abweicht, erhält der Benutzer am Ende einen Bericht, in dem die Diskrepanz aufgeführt ist.
  • Ebenso wie die über 10 konfigurierbaren Parameter können auch die Redundanz und das Berichtswesen konfiguriert werden.

Beispiel für eine solche Software:

  • Datenbankmigration
    • Geschäftsdatenbank
    • Quellcodeverwaltungsdatenbank usw.
  • Stapelkonvertierung zwischen einem Word-Dokument und einem OpenOffice-Dokument, PowerPoint und OpenOffice Draw usw.
  • Automatische Übersetzung einer gesamten Website
  • Automatische Analyse von Softwarepaketen wie Doxygen, bei denen die Analyse jedoch zuverlässiger sein muss (dh nicht nur ein Dokumentationswerkzeug)
  • Netzwerkkommunikation, bei der Pakete verloren gehen und eine Reihe von Wiederholungsversuchen erwartet werden

Diese Frage wurde ursprünglich inspiriert von Wie gehen Sie mit absichtlich schlechtem Code um?
aber jetzt konzentriert sich auf nur eine der Ursachen von Software-Bloat. Diese Frage befasst sich nicht mit anderen Ursachen für das Aufblähen von Software, z. B. dem Hinzufügen neuer Funktionen.

Möglicherweise verwandt:


5
Das ist keine Redundanz, das ist Robustheit ...

5
Ist die Antwort nicht einfach "so viel wie nötig"?
Dean Harding

@Dean - absolut eine Anforderung wie jede andere. Der Trick besteht darin, es und die Konsequenzen und Kosten für die Benutzer zu erklären, aber es kann getan werden.
Jon Hopkins

Danke @ Thorbjørn für das Feedback. Ich habe dem Titel und der Definition Robustheit hinzugefügt.
Rwong

Halten Sie sich von einer alten Codebasis fern, es sei denn, Sie müssen 5 Kinder füttern.
Job

Antworten:


7

Dies ist eine geschäftliche und keine technische Frage.

Manchmal programmiere ich mit Forschern oder mit einem Prototyp, also bauen wir etwas mit sehr geringer Robustheit. Wenn es kaputt geht, beheben wir es. Es macht keinen Sinn, in zusätzliche Magie zu investieren, wenn wir den Code bald wegwerfen.

Wenn die Benutzer Ihres Systems jedoch eine hohe Robustheit benötigen, sollten Sie diese so erstellen. Und Sie sollten es robust machen, insbesondere in der Art und Weise, wie Sie und Ihre Mitarbeiter den langfristigen Erfolg maximieren müssen, und dabei die Arten von Redundanz / Robustheit ignorieren, die sie nicht benötigen.

Im Allgemeinen beginne ich rau und füge dann mit der Zeit Robustheit hinzu. Ich stelle häufig Fragen wie diese in den normalen Planungsprozess. Ich arbeite im Allgemeinen im Stil der extremen Programmierung, in dem wir eine lange Liste der gewünschten Funktionen erstellen, und ich füge dort auch Robustheitsfunktionen hinzu. Beispiel: "Das System überlebt den Ausfall einer einzelnen Box" wird mit Dingen wie "Benutzer kann mit Facebook-Anmeldeinformationen beitreten" verwechselt. Welches zuerst kommt, baue ich zuerst.


5

Typischerweise komplexe Software ist überflüssig wie Sie wahrscheinlich wissen, aber offensichtlich nicht , denn das ist der beste Weg , es zu tun , sondern weil die Entwickler zu „tack auf“ vorhandenen Code neigen eher als Versuch , sehr detailliert , wie die Software funktioniert zu verstehen.

Wenn Sie mich jedoch fragen, wie viel Redundanz akzeptabel sein soll, würde ich keines sagen. Redundanz ist einer von vielen Nebeneffekten der Komplexität, der Erzfeind der Einfachheit. Einfachheit sollte wohl in den Hintergrund treten, wenn Zeit von größerer Bedeutung ist, obwohl ich betone, dass diejenigen, die argumentieren, dass Zeit von entscheidender Bedeutung ist, selten diejenigen sind, die sich tatsächlich um die Entwicklung von Software kümmern. In der Regel ist es Ihr Projektmanager, der Sie dazu auffordert, die Arbeit so schnell wie möglich zu erledigen, damit Sie sich wieder mit dringlicheren Problemen befassen können. Als Programmierer müssen Sie jedoch wissen, wann die Arbeit erledigt ist. Ich denke, der Job ist erst erledigt, wenn Sie ihn erfolgreich in das Programm integriert haben, wie es sein sollte. Vielleicht ist das Programm kompliziert,

Es sollte jedoch darauf hingewiesen werden, dass dabei möglicherweise redundanter Code erzeugt werden muss. Wenn das Projekt bereits hochgradig redundant ist, ist es möglicherweise einfacher, das Muster fortzusetzen, vorausgesetzt, Ihr Vorgesetzter hat nicht ein paar Wochen Zeit, um es Ihnen zu ermöglichen, das gesamte Projekt neu zu strukturieren.

Bearbeiten: Angesichts der Neuformulierung der Frage werde ich ein wenig über Robustheit hinzufügen. Meiner Meinung nach sollte die Parameterprüfung nur durchgeführt werden, wenn A) Sie ein ganz bestimmtes Format akzeptieren, z. B. einen Datumswert als Zeichenfolge, oder B) verschiedene Parameter möglicherweise in Konflikt miteinander stehen oder sich gegenseitig ausschließen.

Bei A) ist die Anforderung, dass Parameter einem bestimmten Format entsprechen, in der Regel entscheidend für die Notwendigkeit der Methode (z. B. die Konvertierung in ein Datum aus einer Zeichenfolge). Technisch kann dies in Ihrem Programm immer noch vorkommen, ohne dass dies erforderlich ist. Ich empfehle Ihnen jedoch nachdrücklich, diese Möglichkeiten auszuschließen und nur Parameter zu akzeptieren, von denen Sie wissen, dass sie die Art der gesuchten Daten darstellen B. nicht konvertieren. Wenn die Konvertierung ebenfalls durchgeführt werden muss, konvertieren Sie die Zeichenfolge mit einer Dienstprogrammmethode, bevor Sie sie an die Methode übergeben.

Wie bei B) stellen sich gegenseitig ausschließende Parameter eine schlechte Struktur dar. Es sollte zwei Klassen geben, eine, die einen Fall behandelt, und eine, die ihn auf andere Weise behandelt. Alle gängigen Operationen können in einer einzigen Basisklasse ausgeführt werden, um Redundanz zu vermeiden.

In Situationen, in denen die Anzahl der Parameter für eine Methode 10+ beträgt, beginne ich, eine Eigenschaftendatei zu betrachten, die all diese Parameter enthält, die sich höchstwahrscheinlich nicht oft ändern werden. Wenn sie sich ändern, können Sie die Standardeinstellung in der Eigenschaftendatei speichern und eine "setPropertyName ()" - Methode hinzufügen, mit der Sie die Standardeinstellung zur Laufzeit überschreiben können.


4
Ich denke, Sie verstehen die Frage falsch. Er bedeutet "Redundanz" wie "nicht in Flammen sterben, wenn ein Fehler auftritt", nicht wie "doppelten Code schreiben". Robustheit ist ein besserer Begriff dafür, wie andere darauf hingewiesen haben.
Adam Lear

Redundanz ist eine positive Sache bei entscheidenden Aufgaben. Der menschliche Körper ist hier das perfekte Beispiel.
Claudiu Creanga

3

Software sollte Benutzerfehler verzeihen und Programmiererfehler nicht tolerieren.

Das heißt, Software sollte sehr robust sein und eine reibungslose Wiederherstellung ermöglichen, beispielsweise bei Fehlern bei der Benutzereingabe und bei der Systemkonfiguration. Zumindest eine freundliche Fehlermeldung, in der angegeben wird, wo der Fehler aufgetreten ist (Eingabefeld, Konfigurationsdatei, Befehlszeilenargument usw.) und welche Einschränkung verletzt wurde ("muss kleiner als X Zeichen sein", gültige Optionen sind [X , Y, Z] ", etc ...) Für zusätzliche Robustheit kann die Software eine Alternative vorschlagen oder einen angemessenen Standard verwenden (es sollte jedoch immer angegeben werden, dass nicht genau das verwendet wird, was der Benutzer angegeben hat).

Ich kann mir nicht viele Situationen vorstellen, in denen ein automatischer Wiederholungsversuch mit unterschiedlichen Standardeinstellungen gerechtfertigt ist, aber es gibt einige (ein automatischer Wiederholungsversuch zum Herstellen einer Kommunikationsverbindung erscheint sinnvoll). Ich stimme @William zu, dass dieses Maß an "Redundanz" eine Geschäftsentscheidung ist.

Auf der anderen Seite sollte es keine Robustheit zur Laufzeit gegenüber Programmierfehlern geben. Wenn Vorbedingungen für die Parameter einer Funktion vorliegen, sollten diese mit Asserts und nicht mit Laufzeitprüfungen überprüft werden. Es ist eine große Herausforderung von mir, zu sehen, dass redundante Fehlerüberprüfungen und Berichte zu denselben Parametern auf drei oder vier Ebenen im Aufrufstapel gespeichert werden:

 int A(int x)
 {
   if (x==0) return -1
   ...
 }
 int B(int x)
 {
   if (x==0) return -1
   err = A(x)
   if (err) return err;
   ...
 }
 // and so on and so on....

Dies ist nur eine zusätzliche unnötige Komplexität. Sie sollten sich nicht die Zeit nehmen, um herauszufinden, wie eine Funktion mit einem Fehler umgehen soll, der durch den Missbrauch einer anderen verursacht wurde. Wenn dies die Art von "Robustheit" ist, auf die Sie sich beziehen, brauchen Sie sie nicht. Ersetzen Sie es durch Asserts und gründliche Integrationstests.


3

Es ist eine Anforderungssache.

Gibt es eine Anforderung an die Robustheit?

"Wenn die Kommunikationsverbindung ausfällt, werden fehlerhafte Pakete verworfen." "Wenn die Verbindung den Betrieb wieder aufnimmt, wird keine Transaktion zweimal verarbeitet."

Es sollte Anwendungsfälle für die Fehlerbehebung geben (ansonsten woher wissen Sie, wie es passieren wird?)

Überlassen Sie es den Programmierern, Robustheit zu erfinden (falls erforderlich), um "magische" Systeme zu erhalten.

Alle magischen Systeme werden mit der Zeit zu beschissener Magie. Durch die Fehlerkorrektur im Hintergrund wird das Auftreten von Fehlern ausgeblendet, sodass diese nicht korrigiert werden und das System schließlich in einen Zustand größerer Entropie versetzt wird. und laufen wie Quatsch, wie es die ganze Zeit für Fehler korrigiert. Sie müssen über ein Limit verfügen, um zu verhindern, dass das System dauerhaft in einen beeinträchtigten Zustand versetzt wird.


2

Einige Vorgänge erfordern wahrscheinlich einen erneuten Versuch, insbesondere wenn sie von externen Ressourcen wie einer Datenbank abhängen. Wenn zum Beispiel keine Verbindung zu einer Datenbank hergestellt werden kann oder eine Abfrage fehlschlägt, kann der Vorgang einige Male wiederholt werden, bevor ein Fehler auf eine höhere Ebene verschoben wird. In mancher Logik ist es jedoch oft ein Symptom für schlechten Code und magisches Denken, wenn man dasselbe mehrmals versucht, wodurch sich echte Probleme verbergen.


Wenn ein erneuter Versuch durchgeführt wird, ohne dass er gezählt und gemeldet / angezeigt wird, werden Ihre Systeme aufgrund ihrer magischen Selbstkorrektur schlechter und laufen schlecht. Verwenden Sie immer Leaky-Bucket-Zähler (PLOPD4), um Wiederholungen und Fehler zu melden. Auf diese Weise wird eine niedrige Stufe ignoriert, aber Probleme werden für Benutzer sichtbar.
Tim Williscroft
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.