Ich las den Wikipedia-Artikel über Douglas McIlroy und fand ein Zitat, das erwähnt
"Der wahre Held der Programmierung ist derjenige, der negativen Code schreibt."
Was bedeutet das?
Ich las den Wikipedia-Artikel über Douglas McIlroy und fand ein Zitat, das erwähnt
"Der wahre Held der Programmierung ist derjenige, der negativen Code schreibt."
Was bedeutet das?
Antworten:
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.
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.
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.
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.
X
Zeilen 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.
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.
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.