Ist der Zweck des Codes "idiomatisch", um den kognitiven Aufwand zu reduzieren?

22

Ich versuche jemandem zu erklären, dass die Art und Weise, wie er den Code geschrieben hat, schwer zu verstehen ist. Wenn Sie ihn überarbeiten, ist es einfacher, ihn zu lesen. Diese Art von Code, mit dem ich fahre, wird im Allgemeinen als "idiomatischer" Code "bezeichnet.

Aber die Redewendung „ idiomatischer Code“ bringt eine Menge moralischer Korrektheit mit sich , was kein großer Anreiz ist, die Leute dazu zu bringen, ihren Codierungsstil zu ändern. Eine positivere Art, dies zu sagen, ist Code, der dem üblichen Stil folgt - aber für einen kritischen Denker, der als Herdenmentalitäts-Argumentation wirkt.

Ich habe diese Idee so erklärt, dass die Leute motiviert sind, ihren Code zu ändern:

  • Schreiben Sie den Code so, dass der kognitive Aufwand des Lesers verringert wird (z. B. kann ich mich nicht erinnern, ob dies die erste Art von Vektor ist - oder die fünfte Art von Vektor).
  • Code, der es einfacher macht, die Absicht zu verstehen (z. B. wofür ist dieser Vektor?)

(Abgesehen davon ist mir bekannt, dass das Buch "The Joy of Clojure" vor seiner ersten Veröffentlichung den Entwurfstitel "Idiomatic Clojure" hatte. Es scheint also ein Grund zu sein, Code "idiomatisch" zu machen, um dem Leser "Freude zu bereiten" ).

Meine Frage ist: Ist der Zweck des Codes "idiomatisch", um den kognitiven Aufwand zu reduzieren?

Falkenauge
quelle
Mein typischer Kommentar zum Lesen von Code ist, dass Sie Code für mindestens zwei Compiler schreiben: Die anderen Personen, einschließlich Sie, die den Code später lesen müssen. Und der Prozess, den Sie über Ant, Make oder eine IDE ausführen. Der erste ist wichtiger.

Antworten:

19

Erstens bin ich mir nicht sicher, ob der Begriff "idiomatisch" irgendeine Art von "moralischer Korrektheit" enthält. Die einfache Wörterbuchdefinition ist einfach

Besonderheit oder Kennzeichen einer bestimmten Sprache oder eines bestimmten Dialekts: idiomatisches Französisch.

Ja, idiomatischer Code reduziert im Allgemeinen den kognitiven Aufwand, insbesondere bei Schnittstellendefinitionen, bei denen die Standardbibliotheken und alle Bibliotheken von Drittanbietern, die das Projekt benötigt, (praktisch) alle idiomatisch sind.

Als Verkaufsargument möchte ich mich jedoch darauf konzentrieren, was das Reduzieren des kognitiven Overheads für Sie bedeutet. Es erleichtert Programmierern das Erkennen von Fehlern, da sie nicht versuchen, in einem einzigartigen Stil geschriebenen Code zu entwirren, um herauszufinden, wo es durch einen Fehler oder eine falsche Behandlung eines Randfalls auf subtile Weise zu einer Abweichung kommt. Dies erleichtert das Überprüfen des Codes anderer Personen, wodurch die Wahrscheinlichkeit steigt, dass das Team echte Überprüfungen durchführt, die echte Probleme identifizieren, anstatt sich über die Syntax zu streiten.

Neben der Reduzierung des kognitiven Overheads ist idiomatischer Code im Allgemeinen effizienter. Die meisten Redewendungen in einer bestimmten Sprache entwickeln sich, weil die Sprache so konzipiert ist, dass Probleme auf eine bestimmte Art und Weise angegangen werden. Die Compiler oder Interpreter, die Sie verwenden, werden ihre Optimierungen auf idiomatischen Code konzentrieren. Wenn Sie eine Sprache verwenden, in der Rekursion die idiomatische Methode zum Strukturieren eines Codeteils ist, können Sie fast sicher sein, dass Ihr Compiler die Endrekursion implementiert. Wenn Sie eine Sprache verwenden, in der die Rekursion nicht idiomatisch ist, ist dies viel weniger wahrscheinlich. Es ist unwahrscheinlich, dass die Schwanzrekursion nicht überall implementiert werden kann, aber die meisten Compiler-Autoren werden sich nicht auf Dinge konzentrieren, die nicht häufig vorkommen.

Justin Cave
quelle
1
Ihre vernünftige Antwort inspiriert diese Reaktion: Idiomatisches Französisch aus Paris, Montreal, Côte d'Ivoire? Code ist nicht so anders. Ohne Gemeinschaft gibt es keine Redewendung. Wenn Sie wie aus Montreal klingen, können Sie damit rechnen, in Paris eine kleine „kognitive Überlastung“ zu verursachen. Wahrscheinlich wird die Welt immer geteilt sein zwischen denen, die glauben, dass es einen einzigen richtigen Weg gibt (Python?) Und denen, die Vive la différence sagen! (Javascript?). Wenn wir nun Javascript schreiben möchten, das die Compiler effizienter finden, schreiben wir alle wie ein Minifier / Uglifier!
Joshp
Zum Glück haben die Designer bei Erscheinen von V8 beschlossen, das Spiel mit künstlichen Mikrobenchmarks nicht mehr zu spielen, und Benchmarks erstellt, die realen, gut faktorisierten, gut gestalteten, idiomatischen Code simulieren, und die anderen Hersteller folgten diesem Beispiel. Dies führte zu einem Rollentausch im Performance-Spiel: Bevor es die Aufgabe des Programmierers war, seinen Code für die Performance zu schreiben, damit die Compiler-Autoren einen einfachen Job haben, ist es nun die Aufgabe der Compiler-Autoren, ihre Compiler für die Performance zu entwerfen. Damit der Programmierer einen leichten Job hat - so sollte es sein.
Jörg W Mittag
Schöner roter Hering, aber gesprochene Sprachen haben ein geografisches Limit, Computersprachen nicht. Ihr Standpunkt ist also ein wenig umstritten. Ganz zu schweigen vom Vergleich von Python und JavaScript mit den Dialekten von Paris und Montreal. (Ich bin nicht sicher, wer mehr Beleidigung nehmen würde, Python-Programmierer oder Montrealer?; D).
Marco
10

Ich bin mir nicht sicher, woher Sie die Idee haben, dass Redewendungen moralische Konnotationen haben. Redewendungen sind nur eine Möglichkeit, Dinge auszudrücken. Sie sind Muster in einem größeren Maßstab als einzelne Wörter oder Phrasen.

Wenn ich dir sagen müsste, dass man mit den Wölfen heulen muss, würdest du nicht wissen, was ich meinte, obwohl das eine bekannte deutsche Redewendung ist. Wenn, OTOH, ich Ihnen sagte, wenn Sie in Rom tun, was die Römer tun, dann wissen Sie sofort, wovon ich spreche, weil ich die richtige englische Sprache verwendet habe.

Computersprachen sind nicht anders.

Ein alternativer Name für "Idiom" in der Programmierwelt ist "Implementierungsmuster". Dies bezieht die Idee auf die Idee von Mustern, die vom Architekten Christopher Alexander stammt. Die meisten Programmierer kennen sich mit Entwurfsmustern aus, einige mit Architekturmustern, bei denen es sich um Muster handelt, die einen größeren Maßstab als Entwurfsmuster haben. Redewendungen sind Muster auf einer Skala, die kleiner ist als Designmuster.

Jörg W. Mittag
quelle
5

Die meisten Sprachen eignen sich absichtlich für einen bestimmten Stil. In diesem Stil geschriebener Code ist das, was idiomatisch ist. Wenn Sie über den Umstand hinausblicken, dass die Auswahl der Laufzeitumgebung die verfügbare Sprachauswahl einschränkt, sollten Sie Sprachen auswählen, da sich das vorliegende Problem leicht in den einzelnen Redewendungen einer Sprache ausdrücken lässt.

Die meisten Leute verstehen das allerdings nicht. Viele Java-Programmierer bemühen sich beispielsweise, den gleichen Stil beizubehalten, wenn sie JavaScript schreiben müssen (sie hätten Java schreiben und crosskompilieren können, wohlgemerkt) und bis zu einem gewissen Grad erfolgreich sind - Schreiben von Java-idiomatischem Code in JavaScript - Aber sie werden immer das Gefühl haben, gegen JavaScript zu kämpfen. Bestimmte Features fehlen oder es fällt schwer, sie zu emulieren.

Der Redewendungscode ist gut. Es ist schwer für den Außenstehenden, aber sie können lernen. Letztendlich muss Code jahrelang gepflegt werden. Wenn Sie also eine Sprache finden, in deren Redewendungen das zugrunde liegende Programm einfach ausgedrückt werden kann, sollten Sie dies tun.

Lassen Sie mich nur klarstellen, dass es definitiv so etwas wie einen übermäßigen Gebrauch von Redewendungen (oder den zugrunde liegenden Sprachmerkmalen) gibt. Wenn Sie C ++ - Vorlagen verwenden, um wichtige Teile der Anwendungslogik zur Kompilierungszeit auszuführen, oder wenn Ihr komplettes Lisp-Programm ein Aufruf eines Makros ist, das sich auf praktisch unvorhersehbare Weise zur eigentlichen Sache entfaltet, wenn sich Ihre Java-Lösung eines einfachen Problems aufbläht die Proportionen von FizzBuzzEnterpriseEdition ... du machst es falsch.

Die Leute sagen, Code muss einfach zu lesen sein. Das ist nur die halbe Wahrheit. Es muss leicht zu verstehen sein, was erfordert, dass es auch leicht zu überlegen ist. Das erfordert eine angemessene Verwendung von Abstraktionen. Wie bei den meisten Dingen geht es darum, die richtige Balance zu finden.

back2dos
quelle
Ich wünschte, ich könnte noch einmal +1 für diesen FizzBuzzEnterpriseEdition-Link geben ... :-D
cmaster