Welche psychologischen Faktoren bestimmen die Lesbarkeit von Code?

Lesbarkeit wird oft intuitiv synthetisiert. Wenn Sie ein Stück Code sehen, wissen Sie nur, ob es lesbar ist oder nicht. Aber was sind eigentlich psychologische , wissenschaftliche Erklärungen dafür?

Es gibt Lesbarkeitsmetriken für geschriebenen Text, aber gelten sie auch für Quellcode? Zum Beispiel: Ich glaube, dass das Wort Überlegenheitseffekt auf Quellcode anwendbar ist. Welche weiteren Effekte lassen sich beim Programmieren finden, die Code lesbar machen?

Ich suche nicht nach fundierten Meinungen oder Beispielen wie hier oder hier , sondern nach neuronalen Korrelaten oder einer Perspektive aus den Kognitionswissenschaften.

Eine Sache, die die Lesbarkeit häufig beeinträchtigt, ist die Abweichung von gängigen Mustern. Wenn jemand über eine Sammlung iteriert, aber mit dem zweiten Element beginnt, wird das leicht übersehen und kann dazu führen, dass sich der Code komplexer anfühlt, als er tatsächlich ist.
Beim Vergleich „meines“ Codes mit „ihrem“ Code spielt auch die Abweichung von gängigen Mustern eine Rolle – Sie sind an Ihre eigenen Muster gewöhnt.
Es gibt keine direkten Verweise in Code Complete unter 34.3 Write Programs for People First, Computers Second. Haben Sie die umfangreiche Bibliographie dieses Buches nach relevanten Quellen durchgesehen?
Es wird nach Metriken zur Lesbarkeit von Software-Quellcode geforscht, basierend auf Lesbarkeitsmetriken für natürliche Sprachen: Buse und Weimer , Buse und Weimer , Dorn . Diese gehen jedoch nicht auf die psychologischen Wurzeln ein, können aber helfen, Ihren zweiten Absatz über die Anwendung von Lesbarkeitsmetriken auf Quellcode, die Bestimmung der Lesbarkeit von Code und die Erstellung von lesbarem Code zu behandeln.
Ein verwandter Link zum Eye-Tracking beim Lesen von Code: blog.theincredibleholk.org/blog/2012/12/18/how-do-we-read-code
Ich verstehe den Begriff "neuronales Korrelat" in diesem Zusammenhang nicht. Für mich bedeutet Ihre Frage: Wie unterscheidet sich der Zustand des Gehirns, einen Code als lesbar zu erleben, von dem Zustand des Gehirns, einen Code als nicht lesbar zu erleben? Das ist eine bedeutungslose Frage, weil sie nichts darüber aussagt, was Code lesbar macht.

Antworten (3)

Was macht einen lesbarer als den anderen? Gewöhnlich Prägnanz unter Beibehaltung der Klarheit und Beseitigung von Mehrdeutigkeiten.

Genau die gleichen Dinge machen Code besser lesbar. Entfernen Sie alles, was nichts hinzufügt, aber entfernen Sie keine Dinge, die Informationen hinzufügen. Und vermeiden Sie Zweideutigkeiten.

Im Code haben wir den Vorteil, dass wir ähnliche Textteile wiederverwenden und bestimmte Werte darin ersetzen können. Wenn wir das nur mit Büchern machen könnten, könnten wir einen kleinen Regenwald retten.

Neben der Knappheit setzen wir Satzzeichen und Leerzeichen gut ein. Haben Sie schon einmal versucht, einen Blogbeitrag zu lesen, in dem es überhaupt keine Absätze gibt? So ist es, Code zu lesen, der nicht sauber verteilt ist.

Die Psychologie dahinter ist einfach. Ihr Gehirn erhält alle möglichen Hinweise darauf, was es liest. Versuchen Sie, ein langes Stück Text zu nehmen und ihn (mit einer Serifenschrift) ohne Absätze, dann ohne Punkte und Kommas auszudrucken, oder vielleicht Satzzeichen zu tauschen (? => ., ! => :, etc), dann in einer Sans- Serifenschrift.

Sie werden schnell merken, wie sehr Sie sich beim Lesen auf die Instinkte Ihres Gehirns verlassen. Code ist genau der gleiche. Und hierin liegt ein Problem, denn manche Dinge sind sicherlich subjektiv. Oder besser gesagt, sie sind eine Sache der Gewohnheit.

Wenn Sie daran gewöhnt sind, Unterstriche vor Elementvariablen zu sehen, dann wechseln Sie zu einem Unternehmen, wo dies nicht der Fall ist, Ihr Gehirn wird immer noch dieselben Hinweise erwarten und es wird schwieriger sein, sie zu lesen. Aber es zu ändern, würde alle anderen im Team durcheinanderbringen. Es wäre, als würde man nach Spanien ziehen und ihnen sagen, dass sie das vorangehende umgekehrte Fragezeichen nicht mehr verwenden sollen, weil es Sie aus der Bahn wirft.

Designmuster sind eine ähnliche Sache. Wenn jeder weiß, was ein Builder-Muster tut, dann gibt das Hinzufügen von Builder zu einem Klassennamen jedem viele Informationen. Aber wenn ich mein eigenes Bracksfort-Muster habe, helfen mir diese Informationen nur, zumindest bis andere Leute anfangen, mich zu fragen, oder ich es dokumentiere und die Community dazu bringe, es zu glauben.

Diese. Ich hasse es, wenn Leute sagen, dass die Ausführlichkeit des Codes keine Rolle spielt, weil IDE ihn schreibt, oder eine andere Ausrede. Was ist mit dem Leser, der durch all diese Zeilen waten muss, während er versucht, ein Signal aus dem Rauschen zu finden?
Tolle Antwort, die die zugrunde liegende Schwierigkeit umreißt, was "Lesbarkeit" ist.
Ein wesentlicher Faktor, der Code für mich lesbar macht, sind Variablennamen, zB $fversus $first_names.
@was: Nun ja. Wenn ich ein Stück englischen Text nehmen und alle Substantive und Adjektive auf einen Buchstaben reduzieren würde, könnten Sie auch Schwierigkeiten haben, das zu lesen.
Das Reduzieren von Code ist eine gängige Praxis, insbesondere auf stark frequentierten Websites. Sehen Sie sich den JavaScript-Code auf einer Google-Seite an: Alle Variablen bestehen aus einem oder zwei Buchstaben, und es gibt fast keine Leerzeichen (keine Zeilenumbrüche, keine Leerzeichen, keine Tabulatoren). Das ist unlesbarer Code. Das Erstellen von lesbarem Code kann also das Erstellen von lesbarem Code und das anschließende Reduzieren seines Volumens durch Suchen und Ersetzen beinhalten, bevor Sie ihn online stellen.
@what Das wollte ich! Ich gehe davon aus, dass nicht nur die Länge für die "Lesbarkeit" wichtig ist, sondern auch, was der Bezeichner aussagt, also seine Semantik (Vergleiche den alten "#define TRUE FALSE // Happy Debugging" Joke). Ich habe festgestellt, dass sich beispielsweise F#-Code oft wie Mathematik liest und völlig unlesbar, aber dennoch sehr vernünftig ist. Dies liegt vor allem an seiner Abstraktheit und den sehr prägnanten Identifikatoren.

Dies ist mein aktuelles Forschungsgebiet (ich bin ein Doktorand in Informatik und Kognitionswissenschaft). Wie Sie sagten, gibt es eine große Anzahl von Messwerten zur Lesbarkeit/Komplexität, aber nur sehr wenig Forschung, die versucht zu quantifizieren, was einen Codeabschnitt psychologisch komplex macht. Für weitere Informationen zu qualitativen Studien und Modellen empfehle ich das 2001 erschienene Buch Software Design: Cognitive Aspects .

Ich habe kürzlich einige Experimente mit dem Ziel durchgeführt, ein kognitives Modell zu entwickeln, das Code wie ein Mensch „lesen“ kann. Die Inspiration für mein Modell stammt größtenteils aus einer 1995 erschienenen Arbeit von Simon Cant et. Al. . In dem Papier legen sie eine (unvollständige) Grundlage für ein mathematisches Modell, das kleine Codeblöcke in den Speicher „chunkt“ und zu anderen Teilen des Programms „verfolgt“, um Abhängigkeiten aufzulösen. Ich habe ein Workshop-Papier mit dem Titel „Kognitive Architekturen: ein Weg nach vorne für die Psychologie des Programmierens“, das darauf hindeutet, dass wir möglicherweise in der Lage sein könnten, ein solches Modell auf einer kognitiven Architektur wie ACT-R aufzubauen.

Ich schreibe gerade die Ergebnisse eines meiner Experimente auf. Sobald es fertig ist, werde ich darüber in meinem Blog (synästhem.com) berichten. Kurz gesagt, wir ließen Programmierer aller Erfahrungsstufen die Ausgabe von 10 Python-Programmen vorhersagen (jedes Programm hatte 2 oder 3 Versionen). Einige von ihnen haben das Experiment vor einem Eyetracker durchgeführt, was eines Tages (hoffentlich) bald eine weitere Arbeit sein wird. Der Rest stammte von Mechanical Turk, und wir stellten interessante Geschwindigkeits-/Genauigkeitsunterschiede fest, die nicht immer zu Gunsten der erfahreneren Programmierer ausfielen.

Willkommen auf der Seite. Vielen Dank für das Teilen Ihres Fachwissens.
Hallo user2925, danke für deine Antwort. Auch ich plane gerade ein Experiment und ich habe mich gefragt, ob Sie noch mehr von Ihren Erfahrungen mit uns teilen könnten?
Hallo @cessor. Gerne teile ich meine Erfahrungen. Was für ein Experiment planst du?
@MichaelHansen Ich denke, es wäre am besten, dies privat zu besprechen! Können Sie mir eine E-Mail an die Adresse in meinem Profil senden? :)
Update : Ich habe ein Papier über das in meiner Antwort erwähnte Experiment auf arXiv gepostet .
Ich denke, dies erfordert eine Nachbereitung, die Sprachkonventionen und die Auswirkungen der Lesbarkeit von einem Konventionsstandpunkt aus berücksichtigt. Noch interessanter wäre es, sich auf C-Syntax-Sprachen wie Java, C# und JavaScript zu konzentrieren, die mehr Syntax haben, um Blöcke abzugrenzen, was beim Chunking hilft. Was passiert, wenn Sie anfangen, diese Syntax zu entfernen oder sie auf unkonventionelle Weise zu verwenden? Zum Beispiel durch das Jagen von „Weniger Linien ist besser“.

Was bedeutet „Lesbarkeit“ im Kontext der Kognitionswissenschaften? Messbare Effekte der "Lesbarkeit" wären:

  • Geschwindigkeit der kognitiven Verarbeitung (wie lange braucht ein Leser, um zu verstehen, was der Code tut)
  • Vollständigkeit des Verständnisses (wie viel von dem, was der Code tut, kann ein Leser erklären, nachdem er ihn gelesen hat?)
  • Verständnisaufwand (wie erschöpft sind die kognitiven Ressourcen des Lesers, messbar durch einen nachgeschalteten Rechenleistungstest)

Es wäre einfach, verschiedene "lesbare" Varianten desselben Codes zu testen. Beispielrecherchen können über eine Google Scholar-Abfrage gefunden werden . Ich bin zu faul, diese Papiere für Sie zu lesen und zusammenzufassen ;-)

Vielen Dank für Ihre Antwort! Ich glaube, dass „Cognitive Processing“ zu abstrakt ist. Die Geschwindigkeit des lexikalischen Zugriffs zum Beispiel (das Abrufen der Bedeutung eines Wortes aus Ihrem mentalen Lexikon) ist ein gut untersuchtes Konstrukt, das Ihre Antwort ( $fvs. $first_name) mit dem Wortüberlegenheitseffekt erklärt. Ich suche solche Konstrukte!