Sollten wir nach Lügencode Ausschau halten?

9

Dies bezieht sich auf eine Diskussion in einer Antwort und die Kommentare dieser Frage: Was ist mit der Abneigung gegen Dokumentation in der Branche? . In der Antwort wurde behauptet, dass "Code nicht lügen kann" und daher anstelle der Dokumentation der Anlaufpunkt sein sollte. In mehreren Kommentaren wurde darauf hingewiesen, dass "Code lügen kann". Es gibt auf beiden Seiten Wahrheit, zumindest teilweise, weil die Dokumentation schlecht und unangemessen gehandhabt wird.

Sollten wir nach Lügencode Ausschau halten und ihn mit einer vorhandenen Dokumentation vergleichen? Oder ist es normalerweise die beste Quelle für das, was es tun muss? Wenn es sich um agilen Code handelt, ist es weniger wahrscheinlich zu lügen, oder kann dieser Code überhaupt nicht lügen?

donnerstagsgeek
quelle
1
Könnten Sie bitte klarstellen, was Sie unter "Lüge" verstehen? Wir sollten uns nicht auf Kommentare in einer anderen Frage beziehen müssen, um Ihren Kontext zu erhalten.
user16764
@ user16764 Ohne auf den anderen Thread zu schauen, ist das erste, was in den Sinn kommt, der Underhanded C Contest
Izkata
Wenn in der Dokumentation angegeben ist, dass der Code foo und der Code bar ausführen soll, bedeutet dies, dass bar der Code sein sollte? Oder gehen wir davon aus, dass der Balken die richtige Aktion ist, weil wir die Dokumentation nie gelesen haben, weil der Code immer korrekt ist?
Donnerstaggeek
Wenn der Code als Balken akzeptiert wurde, ist die Dokumentation falsch und veraltet. Aber wenn foo und bar eng miteinander verbunden sind und die Benutzer nicht bemerkt haben, dass sie ihre Probleme nicht wie erwartet lösen, ist die Dokumentation zu foo vielleicht nicht falsch? Mit anderen Worten, ist der Code wirklich das A und O dessen, was der Code tun sollte?
Donnerstaggeek

Antworten:

9

In Laienwörtern:

Ja , Sie sollten nach Lügencode suchen und ihn die Wahrheit sagen lassen. Aber nicht durch Vergleich mit der Dokumentation. Das wäre eine Methode, um Lügen zu erkennen.

Es gibt verschiedene Möglichkeiten, wie Code lügen kann, von denen ich nur einige erwähnen werde:

  • Codeblöcke, die niemals ausgeführt werden, weil Bedingungen, die niemals erfüllt werden. Der Code lügt Sie darüber, wie viel es tut.
  • Code, der unnötige Komplexität hinzufügt, liegt darin, wie komplex das Problem wirklich ist.
  • Code ohne Namenskonventionen lügt, weil er Sie in die Irre führt, zu glauben, dass er etwas anderes tut als das, was er wirklich tut.

Je kürzer ist, desto weniger liegt es. Es ist selbstverständlich.

Je weniger kompliziert der Code ist, desto transparenter ist er. Es liegt also weniger.

Arkane Syntaxtricks lügen viel. Bevorzugen Sie klare, schrittweise Algorithmen. Sie lügen weniger.

Ein gutes statisches Code-Analyse-Tool kann Ihnen helfen, lügenden Code zu finden.

Auch eine gute automatisierte Testbatterie zwingt den Code dazu, die Wahrheit zu sagen.

Tulains Córdova
quelle
4
The shorter and terser the code is, the less it lies. It's self evident. Das würde ich kaum sagen. Nach meiner Erfahrung, je kürzer und knapper der Code ist, desto mehr Möglichkeiten hat er, unter dem Teppich zu kehren, indem er sie im Allgemeinen in irreführenden Funktionsaufrufen versteckt.
Mason Wheeler
@ MasonWheeler Du hast recht. Ich habe den "knappen" Teil bearbeitet.
Tulains Córdova
Ich bin nicht überzeugt von "Code ohne Namenskonventionen lügt". Es ist sicherlich schlecht, aber wie kann es lügen, wenn es dir nichts sagt? "Sag ich dir nicht!" ist hartnäckig obstruktiv und nicht informativ, aber nicht trügerisch. Sicherlich ist die "Lüge", wenn eine Namenskonvention existiert, aber auf eine Weise verwendet wird, die nicht mit dem übereinstimmt, was der Code tatsächlich tut - zum Beispiel, wenn Sie Ungarisch verwenden (yuck!), Aber gelegentlich das Präfix pfür eine Variable haben, die ist kein Zeiger.
Steve314
2
Eigentlich könnte das, was Sie vorschlagen, besser als "Sophistik" beschrieben werden als einfach als "Lüge". Sophistik ist in der Regel ausführlich und kompliziert, so dass es schwierig ist, die logischen Fehler zu erkennen, und sie ist oberflächlich klug und selbstbewusst, sodass die Leute Angst haben, sie in Frage zu stellen, falls sie dumm aussehen.
Steve314
Ein weiteres Beispiel: Code, der die zugrunde liegenden Sprach- oder Laufzeit-Eigenschaften ändert, z. B. das primitive Verhalten neu definiert oder maskiert.
JustinC
6

Code kann nicht lügen.

Was im Code enthalten ist, ist das, was Ihr Programm gerade tut - unabhängig davon, welche Dokumentation, Qualitätssicherung oder der Kunde dies sagt. Insbesondere wenn Ihr Code veröffentlicht wurde und eine Weile im Feld war, sollte dieses erwartete Verhalten nicht ignoriert werden.

Der Code kann sicherlich falsch sein . Es kann sicherlich in seiner Benennung oder Organisation irreführend sein. Es kann sicherlich unlesbar sein.

Aber wenn Sie die Quelle der Wahrheit für das wollen, was Ihr Code tut , nicht für das , was er tun soll, nicht für das, wofür er entwickelt wurde, nicht für das, was Sie dachten, dass er tut ... wenn Sie wissen müssen, was er tatsächlich tut, Gehe zum Code.

Telastyn
quelle
Es gibt eine Denkschule, dass man nicht lügt, wenn man absichtlich täuscht, aber pedantisch korrekt ist. Es ist nicht die einzige Denkschule. Zum Beispiel habe ich eine alte Ausgabe von Detecting Lies and Deceit von Aldert Vrij . Eines der ersten Dinge, die dies bewirkt, ist die Berücksichtigung verschiedener Definitionen von Lügen und Täuschung, wobei pedantisch korrekte, aber absichtlich irreführende Aussagen berücksichtigt werden, auch weil dies ohnehin ein allgemeines Verständnis ist.
Steve314
Tut mir leid, aber zu sagen "aber es war pedantisch korrekt" bedeutet nicht, dass man nicht als Lügner bezeichnet werden kann - auch wenn die Leute nicht zurück argumentieren, wissen sie es immer noch.
Steve314
@ steve314 - pssh. Die ursprüngliche Frage betraf Kommentare. Es ist absurd, einen Strohmann für diese seltenen Szenarien zu bauen, in denen Code irreführend benannt wird, um für das Kommentieren zu argumentieren (und das weit verbreitete Szenario zu ignorieren, dass Kommentare veraltet sind).
Telastyn
1
Ich stimme dem zu - ich streite nicht den Punkt, den Sie machen, sondern nur die offensichtliche Definition von "Lüge", die Sie dabei verwenden. Code kann lügen - nicht für den Compiler, sondern für menschliche Leser. In einigen Fällen ist es sogar ein beabsichtigtes Ziel - Dinge wie der verschleierte C-Wettbewerb wären ein relativ harmloses Beispiel. Sophistik, wie ich in meinem Kommentar zu user61852 vorschlage. Nur weil ein Compiler die Lüge durchschaut, heißt das nicht, dass es keine Lüge ist.
Steve314
@Telastyn Ich vermute, Sie hatten noch nie einen Filter, der eine Umleitung durchführte, wodurch tatsächlich ein Step-Through auf Leerzeichen durchgeführt wurde, und dann in Code überging, der nicht von dieser Methode aufgerufen wurde, um niemals zurückzukehren, oder? Gott, ich hasse die! @ # $ Java-Entwickler, die mit Java arbeiten.
Erik Reppen
0

Sie stellen mehrere Fragen.

Sollten wir nach Lügencode Ausschau halten?

Na sicher!

Sollten wir [Code] mit einer vorhandenen Dokumentation vergleichen?

Das könnte niemals schaden, obwohl dies, wie in anderen Antworten erwähnt, häufig dazu führt, dass Sie Probleme in der Dokumentation finden , nicht im Code .

Oder ist [Code] normalerweise die beste Quelle für das, was es tun muss?

Es ist immer die beste Quelle für das, was es ist , zu tun. Die beste Quelle für das, was Code tun sollte , können jedoch (eine Kombination von) verschiedenen Dingen sein, wobei die wichtigsten folgende sind:

  • Der Code selbst;
  • Der aufrufende Code;
  • Kommentare in diesem Code;
  • Dokumentation;
  • Unit Tests;
  • Integrations- und Regressionstests;
  • Der Programmierer;
  • Endverbraucher;

Welche "beste" Quelle (oder Kombination davon) ist, hängt von Ihrer Situation ab.

Wenn es sich um agilen Code handelt, ist es weniger wahrscheinlich zu lügen, oder kann dieser Code überhaupt nicht lügen?

Ich bin mir nicht sicher, was Sie unter "agilem Code" verstehen. AFAIK "agil" bezieht sich normalerweise auf den Codierungsprozess. Angenommen, Sie meinen "Code, der in einem agilen Programmierprozess erstellt wurde", dann kann ich mit Sicherheit sagen, dass er immer noch lügen kann. Wie wahrscheinlich es ist, zu lügen, im Vergleich zu Code, der beispielsweise in Projekten im Wasserfallstil erstellt wurde, ist eine subjektive Angelegenheit (ich persönlich glaube nicht, dass es einen großen Zusammenhang gibt).


Fußnote
Alle oben sind unter der Annahme , dass Code kann liegen, und dass dies ein Grund ist (wenn auch etwas gekünstelt) Beispiel:

public int DivideByTwo(int input) 
{
    return input / 3;
}

Dies ist nur ein Beispiel, in dem ich "Codelügen" sagen würde, @ user61852 hat einige andere (nicht erreichbarer Code, Komplexität des Codes stimmt nicht mit der Komplexität des Problems überein, schlechte Benennung), und ich denke, es gibt noch viel mehr. Wikipedia hat eine etwas anständige Zusammenfassung von Lügen , viele von ihnen können Code gefunden werden.

Beachten Sie, dass, wenn Sie sich mit jemandem streiten, Sie sehr sicher sein müssen, dass die andere Person nicht mit "Code kann nicht lügen" meint, dass "Code tut, was er tut". Im Wesentlichen definiert die andere Person hier eine Definition für "Lüge", die so eng ist, dass sie die Aussage "Code kann nicht lügen" als Axiom / Grundwahrheit deklarieren kann. In diesem Fall ist es wahrscheinlich am besten, seinem Axiom zuzustimmen.

Jeroen
quelle
0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

Sie können darüber streiten, ob das Wort "Lüge" technisch angemessen ist, aber dieser Code impliziert ganz klar, dass x manchmal größer als 5 ist und manchmal nicht. Wenn Sie sich das vollständige Programm ansehen und feststellen, dass diese Funktion immer nur an einer Stelle aufgerufen wird und x immer auf eine Konstante 6 gesetzt ist, dann ist das eine Lüge.

Darüber hinaus hat der Compiler dies möglicherweise bemerkt und diesen Codeblock durch einfach ersetzt

doSomething()

Wenn doADifferentThing an keiner anderen Stelle in Ihrem Programm aufgerufen wird, wird es möglicherweise vollständig aus dem Programm entfernt.

Wenn Ihre Sprache eine assertArt unterstützt, die in Produktions-Builds deaktiviert ist, ist jede assertAussage möglicherweise eine Lüge. Eine Typografie ist eine weitere Behauptung, die eine Lüge sein könnte.

MatrixFrog
quelle