Die Kraft der faulen Programmierung

Wer immer gesagt hat, hart zu arbeiten ist eine Tugend, hat noch nie einen Programmierer getroffen. Ja, Grabenbagger, die hart arbeiten, erzeugen längere Gräben als diejenigen, die träumen, und Bauern, die sich in den Pflug lehnen, pflanzen mehr Nahrung als diejenigen, die in den Himmel starren. Aber die Programmierung ist nicht dasselbe. Es gibt keine lineare Beziehung zwischen Schweiß auf der Stirn und zufriedenen Benutzern.

Manchmal hilft es, wenn Programmierer Nachtschwärmer ziehen, aber meistens ist es für Programmierer besser, klug und faul zu sein. Codierer, die diese inspirierenden Wandschilder „Arbeite hart, bleib bescheiden“ ignorieren, erzielen oft bemerkenswerte Ergebnisse, weil sie versuchen, nicht zu hart arbeiten zu müssen. Die wahren Genies finden Wege, das absolute Minimum zu erreichen, indem sie ihre Aufgaben auf den Computer verlagern. Schließlich ist es die eigentliche Aufgabe der Computerprogrammierer, den Computer dazu zu bringen, die Arbeit zu erledigen.

Hier sind 13 Techniken und Werkzeuge, die die Leistungsfähigkeit der verzögerten Programmierung beweisen. Wenn der Chef Ihnen das nächste Mal sagt, dass es Zeit ist, die Ärmel hochzukrempeln und sich in die Konsole zu lehnen, gehen Sie stattdessen in den Schlafraum.

Faule Bewertung

Irgendwann erkannten intelligente Programmierer, dass ihre Software schneller laufen würde, wenn sie nicht jeden einzelnen Teil eines Ausdrucks pflichtbewusst berechnen würde. Diese Funktion, die manchmal als "Call by Need" oder "Lazy Evaluation" bezeichnet wird, ist jetzt offiziell Teil von Programmiersprachen wie Haskell, F # und Python 3.0.

Das einfachste Beispiel ist die Verwendung der Strategie bei der Suche nach Nullzeigern. Das Objekt xwird auf Null geprüft, bevor die Berechnungsroutine in dieser Anweisung beginnt:

if (x && x.calculation()) then …

Das Testen der Existenz von xverhindert Abstürze. In ausführlicheren Beispielen spart die verzögerte Auswertung endlose Mengen an Berechnungen, die weggeworfen werden, wenn Sie nach vorne schauen, um zu sehen, wann der Berechnungsbaum beschnitten werden kann. Wenn der Schnelltest der erste ist, der ausgeführt wird, können später Millionen Zyklen eingespart werden. Wenn die Datenstrukturen möglicherweise unendlich sind, wie dies in einigen Beispielen der Zahlentheorie der Fall ist, kann das Programm durch verzögerte Auswertung tatsächlich beendet werden.

Die Technik ist nicht nur nützlich, um funktionale Sprachen wie Haskell zu beschleunigen. Intelligente Programmierer werden keine Stunden damit verbringen, Werte zu berechnen, wenn nur einige von ihnen verwendet werden. Sie werden faule Schalter einbetten, die die Berechnung nur dann auslösen, wenn jemand sie verwenden möchte. Hier ist es sinnvoll, möglichst wenig zu arbeiten.

Caching

Warum wiederholst du dich? Jeder, der für das Web programmiert ist, weiß, dass sich jeder, der auf Ihrer Website auftaucht, häufig wiederholt. Caching ist die Antwort - und das nicht nur für Websites. Jeder Code, der das gleiche Problem neu berechnet, kann beschleunigt werden, indem Kopien der Antwort aufbewahrt werden.

Es muss nicht die endgültige Antwort sein. Anspruchsvolle Caches können Teilantworten für verschiedene Teile des Problems enthalten. Wenn einige Teile neu berechnet werden müssen, können sie dennoch auf den Cache für die Teile tippen, die nicht erneut erstellt werden müssen. Websites, die beispielsweise Webseiten zusammenstellen, speichern häufig Blöcke für verschiedene Teile der Seite zwischen und stellen dann die vollständigen Seiten aus den Blöcken zusammen.

Extralazy Leute können sich beschweren, dass Caching mehr Arbeit für den Programmierer ist. Nachdem der Code zum Finden der Antwort fertig ist, ist es Zeit, eine weitere Ebene zu schreiben, die oben liegt, um einen Cache mit den Antworten zu führen. Sie haben vielleicht Recht mit dieser zusätzlichen Ebene, aber sie vermissen die andere Arbeit, die gespeichert wird. Gute Caches können uns die gesamte Arbeit der Skalierung der Serverfarm ersparen, um die zusätzliche Last zu bewältigen. Das Skalieren ist oft mehr Arbeit als das Schreiben von Caching-Code.

Geben Sie alles nur einmal an

Eine der wichtigsten Regeln, die ich über das Programmieren gelernt habe, ist, dass jede Konstante nur einmal in den Code geschrieben werden sollte. Wenn die Software einen Rand von einem Zoll um eine Seite legen soll, sollte der Wert von eins in der Definition einer Konstante nur einmal vorkommen. Dann wird die Konstante überall anders verwendet.

Dieses einfache Stück organisierter Faulheit zahlt sich später aus. Wenn Sie den Wert ändern möchten, indem Sie beispielsweise den Rand auf 1,5 Zoll erhöhen, müssen Sie nur eine Änderung am Code vornehmen.

Sie können auch ein wenig Selbstdokumentation in den Namen Ihrer Konstanten einarbeiten und Ihrem Randwert einen Namen wie MarginSizeInInches geben. Das kann Ihnen die Mühe ersparen, einen separaten Kommentar zu schreiben, und diese Konstante als Kommentar folgt der Konstante im gesamten Code.

Sicher, längere konstante Namen könnten mehr Eingabe bedeuten, aber dann bieten die meisten Programmiereditoren die automatische Vervollständigung an, um Sie noch mehr zu sparen.

Frameworks: Die ultimativen Verknüpfungen

Bei einem Projekt wollte ein Anzug eine neue Website, also habe ich eine erstellt und den Fehler gemacht, ihm zu sagen, dass ich WordPress verwende. Das war nicht gut Einer seiner Freunde unten auf dem Golfplatz sagte ihm, dass WordPress für Blogs gedacht sei und dies eine Broschüre sein würde. War ich ein Idiot?

Also schikanierte er den CFO, 5.000 US-Dollar für eine professionelle Website bereitzustellen. Die Ergebnisse sahen großartig aus und es funktionierte sehr reibungslos, wie es sollte, weil die Eingeweide alle WordPress waren. Die Firma, die ihm 5.000 Dollar in Rechnung stellte, war klug genug, nicht zu erwähnen, was sie für eine Stiftung verwendeten.

Einige Leute mögen benutzerdefinierten Code aus dem gleichen Grund, aus dem andere den Mount Everest besteigen: Sie machen es gerne selbst, egal was es kostet. Intelligente Programmierer laden ein gutes Open-Source-Framework wie WordPress oder Drupal herunter und stehen Riesen auf den Schultern. Wenn neuer Code geschrieben wird, sind es nicht mehr als ein paar Zeilen.

Es ist oft ein großer Fehler, ins Schwitzen zu geraten, um eigenen Code zu schreiben. Der Open Source Code für die Frameworks wurde bereits von Hunderten, wenn nicht Tausenden von Menschen getestet. Es ist nicht immer ideal, aber es ist, als würde man mit einem 100-Meter-Strich an der 99-Meter-Linie beginnen. Wenn Sie den Code testen und Fehlerberichte oder -korrekturen hochladen, profitieren Sie außerdem von den Installationsvorteilen aller anderen.

Automatisierung: Besser als je zuvor

Einige C-Jockeys lieben es immer noch, ihr eigenes Gedächtnis zu mallocieren und es freizugeben, wenn sie wissen, dass es fertig ist. Aus ihrer Sicht sind Referenzzählung und Speicherbereinigung für Weicheier. Natürlich könnte es auch einige Bergleute geben, die immer noch eine Spitzhacke benutzen, genau wie John Henry.

Ein guter Teil der Entwicklung von Programmiersprachen ist die Automatisierung, und die Tools waren noch nie besser. Speicherverwaltung, Typprüfung und Parallelverarbeitung werden als automatische Tools neu erfunden und ersetzen alle grungy Hintergrundarbeitsprogrammierer, die für sich selbst verwendet wurden.

Faule Programmierer widersetzen sich diesen Tools nicht. Sie wissen, dass sie trotz all ihrer Mängel an einem durchschnittlichen Tag immer noch besser sind als der durchschnittliche Mensch. Sicher, ein sehr kluger Hacker kann zusätzliche Zeit verbringen und ein wahnsinnig schnelles Kunstwerk produzieren, aber das macht nur für die inneren Schleifen der wichtigsten Teile des Systems Sinn. Der Rest von uns produziert besser durchschnittlichen Code und lässt sich von den automatisierten Tools davon abhalten, einige der schlimmsten Fehler zu machen.

Devops: Faulheit in Person

Einige Leute verhöhnen die Drehbuchautoren, die die Anweisungen erstellen, um den Code auf dem neuesten Stand zu halten und die Server laufen zu lassen. Was ist so schwer daran, einige Dateien zu entpacken oder über einige Verzeichnisse zu kopieren?

Natürlich ist der Großteil der Haushaltsführung nicht so schwierig, und die meisten gängigen Unix-Befehle bestehen nur aus zwei Zeichen, aber das geht am eigentlichen Punkt vorbei. Wenn Sie faul sind und die Bereitstellung und Wartung automatisieren, wird sichergestellt, dass dies schnell und - was am wichtigsten ist - konsistent erfolgt. Die Mitternachtsschicht wird genau wie das 8-Uhr-Team arbeiten - und es spielt keine Rolle, ob Kaffee getrunken wird oder nicht.

Automatisierung bringt Genauigkeit und Stabilität. Sicher, das Entwicklerteam sieht fett und faul aus, wenn es nicht einmal einen Knopf drückt, weil die Crontab es auslöst, aber alles läuft reibungsloser. Es gibt nicht so viele Fehler, wenn die Menschen nicht auf dem Laufenden sind.