Codieren als eine Art Schreiben

May 10 2023
Was Softwareentwickler von Prosaautoren lernen können
Es gibt eine Stelle, an der der Snake River in Wyoming eine Biegung nach Norden macht, breiter wird und langsamer wird. Elche stöbern in den Seerosen, Pelikane fangen Fische und Otter spielen.

Es gibt eine Stelle, an der der Snake River in Wyoming eine Biegung nach Norden macht, breiter wird und langsamer wird. Elche stöbern in den Seerosen, Pelikane fangen Fische und Otter spielen. Dann rollt sich der Fluss wieder zusammen und setzt seine Reise nach Westen in die Berge fort.

Wenn man sich meine bisherige Karriere anschaut, erkennt man die gleiche Schleife. Ich bin ein Softwareentwickler, der zum Lehrer für Geisteswissenschaften wurde und dann wieder zum Softwareentwickler wurde. Zwischen den Ingenieurwissenschaften und den Geisteswissenschaften liegt bekanntermaßen eine Distanz, aber ich habe sie oft genug bereist, um zu wissen, dass sie kürzer ist, als die Leute denken. Dabei ist mir aufgefallen, dass einige der Ratschläge, die Prosaautoren geben, auch für Softwareautoren wertvoll sein könnten – fast so, als ob das Schreiben von Code eine Form des Schreibens wäre.¹

Einmal musste ich eine kleine Funktion erstellen, die ein Element zu einem Array hinzufügt, das Element jedoch entfernt, wenn es bereits vorhanden ist. So was:

toggle([], 1) // should return [1]
toggle([1], 1) // should return []

import _ from "lodash";
const toggle = (arr, item) => _.xor(arr, [item]);

Doch schon bald fielen mir einige Ratschläge ein: „Lesen Sie Ihre Aufsätze noch einmal durch und streichen Sie jedes Mal, wenn Ihnen eine Passage auffällt, die Ihnen besonders gut gefällt, diese.“ Das ist ein Tipp von Samuel Johnson, einem Essayisten des 18. Jahrhunderts.³ Das Kribbeln der Klugheit, so wurde mir klar, war ein Hinweis darauf, dass ich meine Funktion vereinfachen sollte. Ich habe es geändert in:

const toggle = (arr, item) =>
   arr.includes(item) ?
   arr.filter((x) => item !== x) :
   [...arr, item];

Meiner Meinung nach: Nein.⁴ Auch wenn die neue Funktion in gewisser Hinsicht komplexer ist, dürfte sie dennoch für den durchschnittlichen Programmierer klarer und daher einfacher zu warten sein. Eine Codezeile kann syntaktisch einfach, aber unklar sein, oder klar, aber syntaktisch komplex. Genau wie eine Prosazeile. Denken Sie an den Satz: „Wofür haben Sie dieses Buch mitgebracht, weswegen ich nicht vorgelesen werden möchte?“⁵ Er hat eine komplizierte Syntax, ist aber viel verständlicher als beispielsweise der syntaktisch einfache Satz „ Der Myrmekobius asquatierte.“ Obwohl meine neue Funktion nicht mehr lakonisch war, war sie leichter zu lesen.

Wenn er JavaScript gekannt hätte, hätte der König der lakonischen Prosa selbst vielleicht die knappe Version von missbilligt toggle. „Hemingway“ – der betreffende König – „treibt einen nicht zum Wörterbuch“, sagte F. Scott Fitzgerald einmal anerkennend.⁶ Hätte es verwendet xor, hätte meine Funktion die meisten Leser zur Dokumentation geführt. Ohne sie ist die Funktion ausführlicher, expliziter und daher selbsterklärender.⁷

Der Begriff lakonisch stammt von den Spartanern der Antike, die in einer Region namens Lakonien lebten und keine Worte verschwendeten. Ein Feind schrieb ihnen einmal: „Wenn ich in Lakonien einmarschiere, werde ich euch aus dem Land vertreiben.“ Sie schrieben zurück: „Wenn.“⁸

Eine Schreibregel, die ich bewundere, stammt nicht von einem Schriftsteller oder Journalisten, sondern von einem Museumsgestalter. Gutes Schreiben schafft laut Edwin Schlossberg „einen Kontext, in dem andere Menschen denken können.“⁹ Es hilft ihnen, sich Bilder vorzustellen, nachzudenken und zu reagieren. Es gibt ihnen Raum dafür – wie eine Museumsausstellung. In ähnlicher Weise schafft guter Code sozusagen Platz für Leser. Es hilft ihnen, vernünftig zu denken.

Für einen Codeautor ist es daher in der Regel sinnvoll, Mustern zu folgen, die der durchschnittliche Leser bereits gut versteht. Obwohl die meisten JavaScript-Entwickler mit dem oben verwendeten Ternär (Fragezeichen und Doppelpunkt) vertraut sind, fühlen sich viele mit einem if-else-Block wie diesem noch wohler:

const toggle = (arr, item) => {
   if (arr.includes(item)) {
      return arr.filter((x) => item !== x);
   } else {
      return [...arr, item];
   }
}

Autoren müssen Einfühlungsvermögen für ihre Leser haben, und Sie müssen auch Einfühlungsvermögen für die Personen haben, die Ihren Code pflegen, debuggen oder anpassen. Da Sie jedoch der Autor sind, ist es normal, dass Sie Schwierigkeiten haben, in die Lage Ihrer Leser zu schlüpfen. Probieren Sie zwei Techniken aus, die von den besten Autoren übernommen wurden.

Erstens schlägt Helen Sword vor, dass Sie sich beim Schreiben „bestimmte Menschen vorstellen, die Ihnen über die Schulter schauen“. Denn „die engagiertesten Autoren sind fast immer diejenigen, die den realen Menschen – Spezialisten und Laien, Kollegen und Fremden – die größte Aufmerksamkeit schenken, in deren Ohren ihre eigenen Worte widerhallen.“¹¹ Kluger Rat auch für Programmierer.

Eine zweite Technik: Legen Sie Ihren Code, wenn möglich, ein oder zwei Tage beiseite und kehren Sie dann zu ihm zurück. „Beenden Sie die Kurzgeschichte, drucken Sie sie aus, legen Sie sie dann in eine Schublade und schreiben Sie andere Dinge“, sagte Neil Gaiman einmal zu einem aufstrebenden Schriftsteller. „Wenn Sie bereit sind, nehmen Sie es zur Hand und lesen Sie es, als hätten Sie es noch nie zuvor gelesen. Wenn es Dinge gibt, mit denen Sie als Leser nicht zufrieden sind, gehen Sie hinein und korrigieren Sie sie als Autor: Das ist Überarbeitung.“¹² Der antike Autor Quintilian empfahl uns auch, „das, was wir geschrieben haben, für eine gewisse Zeit beiseite zu legen“ –

so dass es, wenn wir nach einer Weile darauf zurückkommen, den Anschein von Neuheit und von fremdem Werk erweckt; Denn so können wir verhindern, dass wir unsere Schriften mit der ganzen Zuneigung betrachten, die wir einem neugeborenen Kind entgegenbringen. ¹³

Es ist nicht allzu überraschend, dass die schriftstellerische Anleitung für Symbole anderer Art angepasst werden kann. Wissensbereiche durchdringen sich oft gegenseitig, oder wie der Schriftsteller Charles Johnson es wunderbar ausdrückt:

Eine Form des künstlerischen und intellektuellen Ausdrucks nährt und nährt die anderen. Was auch immer wir Kreativität und Vorstellungskraft nennen – diese beiden großen Geheimnisse – können für manche Schöpfer in ihrem Leben als „global“ erlebt werden, nicht lokalisiert in einer einzigen Ausdrucksform, sondern sich von einem Genre auf ein anderes, ein künstlerisches oder ein künstlerisches Genre ausbreitend oder übergreifend intellektuelle Disziplin zu einer anderen, denn alle Geisteswissenschaften (zusammen mit den Naturwissenschaften) sind verwandt und miteinander verbunden. ¹⁴

Das Experimentieren in Ihrer eigenen Codierung mit den hier empfohlenen Ansätzen erfordert möglicherweise eine Änderung Ihrer Routine. Ein Umweg, um wie der Fluss zu entschleunigen und besinnlicher, großzügiger zu werden. Nehmen Sie also eine Seite vom Fluss. Es folgt keinem linearen Weg.

Die Analogie zwischen Programmieren und Schreiben hat natürlich ihre Grenzen. Beispielsweise sind Widersprüche im Quellcode so gut wie verboten, und erst in der Kunst, insbesondere in der Poesie, werden sie gerecht. Es gibt ein Gedicht von Fernando Pessoa, das ich gerne vorlese, obwohl ich kein Portugiesisch kann. Es beginnt:

Der Dichter ist ein Fingidor
Finge tão completamente
Que chega a fingir que é dor
A dor que deveras sente.

Ein Dichter ist derjenige, der vortäuscht.
Er täuscht so völlig die Realität vor,
dass er sogar die schrecklichen Schmerzen
und Leiden vortäuscht, die
er empfindet.¹⁵

Pessoa lädt uns ein, die konventionellen Vorstellungen von wahr und falsch für einen Moment beiseite zu legen. Er weist schonungslos auf einen Widerspruch hin: Dichter verbergen sich hinter ihren Gedichten und werden dadurch durch sie sichtbar. Pessoa lässt die Boolesche Logik hinter sich und erfindet eine eigene Logik. „Ein Dichter ist derjenige, der vortäuscht“: Was bedeutet das, wenn nicht: „Ich erfinde alles, was ich sage – es ist alles falsch, auch diese Worte“? Dies ist eine sich selbst widerlegende Aussage, eine logische Unwahrheit. Aber wenn man die Worte auf ihre etymologischen Wurzeln untersucht, bedeutet „O poeta é um fingidor“ „Ein Schöpfer ist ein Schöpfer.“ Eine logische Wahrheit. Wie der simulierte Schmerz, den er erwähnt, ist auch die Behauptung des Dichters oberflächlich betrachtet falsch, darunter jedoch wahr. Code und Poesie bieten komplementäre Strategien zur Bewältigung einer oft unlogischen Welt: Man bietet Zuflucht vor Widersprüchen,

Fußnoten

[1]: Die Coding-Writing-Analogie wurde, wenn auch anders, unter anderem von Brian Kernighan und PJ Plauger , Donald Knuth , Richard Gabriel , James Devlin , Jeff Atwood und Rebecca Sutton Koeser gezogen . Steve McConnell kritisiert die Analogie.

[2]: Hier ist ein Beispiel für die Funktion lodashder Bibliothek xorin Aktion. In Boggle suchen Sie nach Wörtern in einem Buchstabenraster. Wenn Sie ein Wort finden, das sonst niemand gefunden hat, erhalten Sie Punkte dafür. Angenommen, Sie erstellen eine Version des Spiels in JavaScript. Sie haben diese Daten:

const wordsFoundByPlayerOne = ["apple", "peel"];
const wordsFoundByPlayerTwo = ["apple", "leap"];
const wordsFoundByPlayerThree = ["apple", "able"];

_.xor(
   wordsFoundByPlayerOne,
   wordsFoundByPlayerTwo,
   wordsFoundByPlayerThree
); // Output: ["peel", "leap", "able"]

[4]: Wir können auch eine gut lesbare Alternative erstellen mit Hilfe von Set:

const toggle = (arr, item) => {
  const set = new Set(arr);
  if (set.has(item)) set.delete(item);
  else set.add(item);
  return Array.from(set);
}

[6]: Zitiert von Schreibtrainer Gary Gilson in einem Artikel aus dem Jahr 2019 .

[7]: Im Gegensatz dazu hat der Blogger Jeff Atwood für „ Spartan Programming “ geworben .

[8]: Plutarch, Über Gesprächsbereitschaft .

[9]: Zitiert vom Physiker Konstantin Likharev in einem Buch aus dem Jahr 2021 .

[10]: In seinem Vortrag „Simplicity Matters“ aus dem Jahr 2012 argumentiert Rich Hickey, dass Programmierer keine Angst vor Schwierigkeiten haben sollten , auch weil sie unsere Arbeit interessant machen. Aber unsere Arbeit wird am interessantesten sein, wenn sie in der Goldlöckchen-Zone zwischen langweilig und anstrengend liegt – wie es beim Schulunterricht der Fall ist .

[11]: Helen Sword, Stylish Academic Writing (2012), S. 44. Um ihre Klarheit zu verbessern, lesen viele Autoren ihre Werke laut vor und hören sich dabei selbst zu. Der Philosoph Jonathan Bennett schreibt : „Gilbert Ryle hat mir einmal gesagt: ‚Was sich nicht gut für das Ohr lesen lässt, liest sich auch nicht gut für das Auge‘, und das hat mein Leben verändert.“ Mehr als alles andere hat mir diese Einsicht gezeigt, wie ich aus der Müllgrube auf die Ebene anständiger Prosa klettern kann.“ Kernighan und Plauger bieten einen ähnlichen Einblick in die Programmierung: „Eine nützliche Methode, um zu entscheiden, ob ein Codeabschnitt klar ist oder nicht, ist der ‚Telefontest‘.“ Wenn jemand Ihren Code verstehen könnte, wenn er ihn am Telefon vorliest, ist er klar genug. Wenn nicht, muss es neu geschrieben werden“ ( Elements of Programming Style , S. 21).

[12]: Neil Gaiman, „ Ratschläge für Autoren “.

[13]: Quintilian, Institutes of Oratory .

[14]: Charles Johnson, The Way of the Writer (2016), S. 23.

[15]: Pessoa, „Autopsychographie“. Übersetzt in Ryan Wilson, Proteus Bound: Selected Translations 2008–2020 (2021).

Vielen Dank an Shashank Khandelwal und Asheesh Laroia für viele hilfreiche Vorschläge.