Was ist negativer Code?

Antworten:

501

Es bedeutet, Codezeilen zu reduzieren, indem Redundanzen beseitigt oder präzisere Konstrukte verwendet werden.

Sehen Sie sich zum Beispiel diese berühmte Anekdote des originalen Apple Lisa Entwicklerteams an:

Als das Lisa-Team 1982 darauf drängte, seine Software fertigzustellen, forderten die Projektmanager die Programmierer auf, wöchentlich Formulare einzureichen, in denen die Anzahl der von ihnen geschriebenen Codezeilen angegeben war. Bill Atkinson fand das albern. Für die Woche, in der er QuickDraws Routinen zur Berechnung von Regionen sechsmal schneller und 2000 Zeilen kürzer umgeschrieben hatte, gab er "-2000" in das Formular ein. Nach ein paar Wochen hörten die Manager auf, ihn zu bitten, das Formular auszufüllen, und er folgte ihm gerne.

Thilo
quelle
257
Perfektion ist erreicht, nicht wenn es nichts mehr hinzuzufügen gibt, sondern wenn es nichts mehr zu nehmen gibt - Antoine de Saint-Exupéry
systempuntoout
7
Ist #LOC ein gutes Maß für die Codequalität? Ich könnte jeden C- oder C ++ - Code "verkleinern" und die Zeilenanzahl erheblich reduzieren, aber es wäre ein Albtraum, dies beizubehalten.
JBRWilkinson
8
@systempuntout - und dann gab es Einstens "(Eine wissenschaftliche Theorie) sollte so einfach wie möglich sein, aber nicht einfacher"
Jonathan Day
32
Nichts läuft schneller oder ist zuverlässiger oder erfordert weniger Wartung als nicht vorhandener Code. "Wenn Sie Zweifel haben, sperren Sie es aus!"
TMN
4
@ JBRWilkinson: Ich würde sagen, dass es einen "Sweet Spot" in Bezug auf die Code-Kürze gibt. Im Allgemeinen ist kürzer besser, aber irgendwann kann Code zu knapp werden und für einen anderen Programmierer nicht mehr einfach zu entziffern sein.
GordonM
131

Es gibt ein Zitat von Bill Gates, in dem die Produktivität des Programmierers anhand von Codezeilen gemessen wird, als würde man den Fortschritt des Flugzeugbaus anhand des Gewichts messen.

Ich möchte hinzufügen, dass die LOC-Metrik die Verwendung übermäßig langwieriger Sprachen und die absichtliche Neuerfindung des Rads zur Einhaltung der Quote gefördert hat.

Kyralessa
quelle
30
Ja, das ist das Problem bei jeder Art von Metrik. Sobald Sie sie verwenden, um die Leistung der Leute zu beurteilen, fangen sie an, die Zahlen zu spielen.
5
Hat jemand jemals LOC als Leistungsmetrik verwendet? Ich habe es nur für Dinge wie "Über wie viele Fehler in einem Projekt reden wir hier?" Gesehen.
Michael Borgwardt
5
@Michael: ja. Leider ja.
Michael Petrotta
4
Sprechen wir über denselben Bill G., der eine Firma hat, die nach dieser Metapher 10000 GTON-Jets produziert? :)
Daniel Mošmondor
37
Ein Programmierer, der Code für die Bordcomputer des Space Shuttles schrieb, sagte mir, dass er das Gewicht der Software berücksichtigen müsse! Die Software war echt (Geld wurde dafür bezahlt); es war auf dem Shuttle; Das Gewicht von allem, was auf dem Shuttle geladen ist, muss berücksichtigt werden. Erstes Beispiel für die Messung der Programmiererproduktivität anhand des Gewichts des Codes. (Null war nicht erlaubt, also gab er 0,00001 Gramm an und alles war zufriedenstellend.)
Mark Lutton
118

Als ich in der High School war - und ja, wir hatten Computer in den 70ern, obwohl wir sie mit Steinmessern aus Tierfellen herstellen mussten -, führte einer der Mathematiklehrer einen Programmierwettbewerb durch. Die Regeln lauteten, dass das Gewinnerprogramm dasjenige ist, das die richtige Ausgabe erzeugt und das das kleinste Produkt der Laufzeit von Codezeilen aufweist. Das heißt, wenn Ihr Programm 100 Codezeilen nahm und 5 Sekunden lief, war Ihre Punktzahl 500. Wenn jemand anderes 90 Codezeilen schrieb und 6 Sekunden lief, war seine Punktzahl 540. Niedrige Punktzahl gewinnt, wie Golf.

Es schien mir ein brillantes Punktesystem zu sein, das sowohl Prägnanz als auch Leistung belohnte.

Der Beitrag, der die Gewinnkriterien technisch erfüllte, wurde jedoch disqualifiziert. Das Problem bestand darin, eine Liste aller Primzahlen unter 100 zu drucken. Der disqualifizierte Eintrag sah ungefähr so ​​aus (die meisten Schüler verwendeten damals BASIC):

100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"

Der Student, der diesen Eintrag schrieb, wies darauf hin, dass er nicht nur kurz und sehr effizient war, sondern dass der Algorithmus für jeden offensichtlich sein sollte, der auch nur über minimale Programmierkenntnisse verfügt, was das Programm hochgradig wartbar macht.

Jay
quelle
10
Ein weiterer Beweis dafür, dass das Zählen von Codezeilen eine sehr spielbare Metrik ist :-)
44
Das BASIC-Programm ist genial! Es ist ziemlich ärgerlich, dass der Lehrer das Programm disqualifiziert hat. Schließlich sind Nachschlagetabellen (denen das Programm etwas ähnelt) in der realen Programmierung auf jeden Fall zu finden.
Noctis Skytower
6
Möglicherweise hat ein weiser Lehrer dieses BASIC-Programm akzeptiert und es verwendet, um die Wichtigkeit eines richtigen SRS hervorzuheben. Erinnert mich an einen Baseballtrainer, der so frustriert von seiner Mannschaft war, dass er, um ihnen zu zeigen, wie man spielt, den Schläger nahm, drei Schläge hintereinander bekam und nicht übertroffen werden wollte, schrie er zu seiner Mannschaft: "Sieh mal! So hast du geschrien ***** spielen. Jetzt nimm den Schläger und spiele richtig! " Erinnert mich auch an die Person, die schrieb "Schöpfung sah den Schöpfer und errötete" und gewann den Essay-Wettbewerb über "Wein".
Nav
3
@Nav: Erinnert mich an eine ähnliche Geschichte, die auf die gleiche Weise beginnt. Dann wirft der Trainer einen Ball in die Luft, schwingt und verfehlt. Er wirft es wieder in die Luft, schwingt und verfehlt. Er wirft es ein drittes Mal in die Luft, schwingt und verfehlt. Dann sagt er zum Team: "Sieh mal, so solltest du pitchen!" (Ich habe keine Ahnung, was diese Geschichte mit Softwareentwicklung zu tun haben könnte.)
Jay
13
Ich wäre ziemlich sauer, wenn ich dafür disqualifiziert würde. Ein deterministisches Problem verdient eine deterministische Lösung, oder? Wenn ich eine 'Hallo Welt'-App schreibe, codiere ich sie nicht, um zu überprüfen, ob ich' Hallo 'richtig schreibe.
Kirk Broadhurst
34

Es ist ironisch. Wenn es Sie $ N pro durchschnittlich codierte Zeile kostet, ist die Codierung "negativer Zeilen" mit Sicherheit ein Gewinner.

Dies bedeutet, dass kleiner Code, der die Aufgabe erledigt, als praktischer Ratschlag viel besser ist als großer Code, der das Gleiche tut, wobei alle anderen Dinge gleich sind.

Ira Baxter
quelle
2
Ich sehe, woher Sie kommen, aber ein präziser, leicht verständlicher Code mit geringem Platzbedarf wird selten auf einmal erreicht. Es wird normalerweise so geschrieben, dass es funktioniert (viele Zeilen), die Geschwindigkeit optimiert (etwas weniger Zeilen) und die Wartung / Lesbarkeit optimiert (immer noch weniger Zeilen). Die tatsächlichen Kosten mit der langen Investitionsrendite sind der zweite und dritte Schritt, weshalb sie oftmals gänzlich übersprungen werden. Es ist wie "es ist billig, schnell und gut - Sie können zwei wählen".
2
Tatsächlich kann IME, das auf Wartung / Lesbarkeit optimiert ist, den LOC tatsächlich erhöhen , da das Umschreiben von Code, um ihn selbstdokumentierender zu machen, dazu neigt, ihn auch ausführlicher zu machen.
1
@Visage: "... alle anderen Dinge sind gleich".
Ira Baxter
Der Punkt ist, denke ich, dass alle anderen Dinge zwischen prägnantem Code und ausführlichem Code nicht gleich sein können.
Tomas Narros
Der Grund, warum die durchschnittliche Codezeile $ N kostet, ist, dass Sie zuerst Ihre Zeit damit verbringen, XZeilen zu schreiben . Anschließend wird über mehrere Iterationen das Endprodukt zeilenweise reduziert Y. Die (X-Y)restlichen Linien scheinen also sehr kostspielig zu sein, da das Gemetzel der Umgestaltung die gesamte Kruft weggeschnitten hat.
27

Das gleiche Programm in weniger Code zu schreiben, ist ein Ziel für alle.

Wenn ein Programm 200 LOC für den Code benötigt und ich es in 150 schreibe, habe ich -50 LOC geschrieben. Also habe ich negativen Code geschrieben.

LucaB
quelle
3
Wenn Sie weniger LOC schreiben, können Sie auch weniger Fehler machen und diese leicht erkennen.
LucaB
3
Nicht zutreffend für Haskell und andere Sprachen, die zu zufälligem Rauschen komprimiert werden können. :)
Macke
1
Klar, mein Punkt war nicht, "Code zu komprimieren", sondern effiziente Algorithmen zu schreiben, die in weniger LOC ausdünnen :) +1 für Sie zu kommentieren.
LucaB
9

Die Antwort von Thilo ist wahrscheinlich historisch am genauesten, aber die Metapher "negativer Code" kann auch Leistung und Speichernutzung umfassen - eine Belohnung für die Bemühungen, die Ausführung oder Zuweisung von etwas aufzuschieben, bis es tatsächlich benötigt wird.

Diese "Verschleppung zahlt sich aus" -Mentalität erzeugte solche ironischen Axiome wie "Nichts zu tun ist immer schneller als etwas zu tun", "Der schnellste Code ist der Code, der niemals ausgeführt wird" und "Wenn Sie ihn lange genug aufschieben können". Möglicherweise müssen Sie dies nicht immer tun. "

Eine Technik zum Realisieren von negativem Code besteht darin, anfängliche Annahmen und Definitionen des Problems in Frage zu stellen. Wenn Sie das Problem / die Eingabedomäne so neu definieren können, dass "Sticky Issue 3" kategorisch unmöglich ist, müssen Sie keine Zeit und keinen Code für das Sticky Issue 3 aufwenden. Sie haben Code eliminiert, indem Sie das Design optimiert haben.

dthorpe
quelle