webentwicklung-frage-antwort-db.com.de

Ergonomie des Computercodes

Früher habe ich bei StackOverflow eine ähnliche Frage gestellt und wurde rücksichtslos herabgestimmt. Dennoch halte ich es für absolut tragfähig und nützlich. Zumindest für mich als Softwareentwickler.

Es gibt viele heilige Kriegsdiskussionen über Codestil, Lesbarkeit und so weiter.
Das einzige Buch, das sich auf echte ergonomische Forschung bezieht, die ich bisher gelesen habe, ist Human Factors (6 Bände in russischer Übersetzung) von Salvendy. Das ist zu wenig Ich bezweifle, dass Überzeugungskraft auf der subjektiven Wahrnehmung der Lesbarkeit beruhen sollte.

Betrachten Sie diese Codeteile:

if (bla-bla) return;

if (very-long-bla-bla-bla) return;

if (bla-bla) 
    return;

if (bla-bla)
{
    return;
}

if (bla-bla){
    return;
}

Semantisch äquivalent, aber vom Standpunkt der Lesbarkeit ist ganz anders.
Wenn ich Code scanne, schaue ich normalerweise auf die linke Seite des Bildschirms und erwarte, dass dort Kontrollflussanweisungen angezeigt werden, sodass es in den ersten beiden Beispielen möglich ist, die Rückgabe zu verpassen. Und es passiert wirklich von Zeit zu Zeit, wenn ich anderen Entwicklercode lese.
Nun, die Forschung besagt, dass der vertikale Scan leistungsfähiger ist als der horizontale, wenn die Breite nicht zu klein ist. Aber wie vergleicht man eingerückte return und return umgeben von geschweiften Klammern?

Ein weiteres Anliegen ist das Kurzzeitgedächtnis und der sichtbare Teil der Routine. Wenn Code viele 'Dinge' einführt (erinnere mich an diese 7 + -2), sehe ich lieber alle auf einmal, ohne hin und her zu scrollen, um mich daran zu erinnern, wofür etwas verwendet wird.
Es ist daher vernünftig zu fragen, ob die Ausrichtung der Hochformatanzeige besser ist als die der Landschaft.

Jede Programmiersprache hat ihre Redewendungen und Code-Formatierungskonventionen, aber ich habe nie die Rechtfertigung dafür gesehen, eine zu übernehmen und der anderen vorzuziehen.
Ich schätze es, wenn jemand sein Wissen teilt und nützliche Links zu den Ergebnissen der wissenschaftlichen Forschung in diesem Bereich bereitstellt. Vielen Dank.

p.s. Ich bin sicher, dass es legal ist, die Entwickler, die meinen Code lesen, als Benutzer und das Ergebnis dieses Prozesses als ihre Erfahrung zu behandeln. ;)

Update:

Ich bin mit den Kommentaren nicht einverstanden, dass es bei dieser Frage nur um Lesbarkeit geht. Absolut nicht.
Ich kann mit Beispielen für Sprachdesign fortfahren:
Die berühmten C/C++ - Operatoren '==' und '=' und der spezielle Stil if (value == variable) zum Überprüfen der Eualität gegen konstante Werte. Beim Vergleichen von Variablen bleibt immer noch Platz für Fehler.
Es geht darum, wie leicht ein Tippfehler schwer zu erkennende Fehler einführen kann.

Ein weiteres Beispiel ist das API-Design im Allgemeinen.
In C # könnte List<T> Nur eine überladene Add -Methode enthalten, die entweder T oder IEnumerable<T> Akzeptiert, dann wäre der folgende Code möglich:

foreach (var item in items)
{
    list.Add(items); // may be item?!
}

aber List<T> hat Add() und AddRange().

Wir verwenden häufig die Hilfe der automatischen Vervollständigung - manchmal führt sie uns in die Irre und manchmal bleibt der Fehler auch von Entwicklern und Compilern unbemerkt.

Dynamische Sprachen.
Wenn Sie dynamic in C # verwenden, sollten Sie IntelliSense vergessen, es funktioniert einfach nicht. Es könnte wahrscheinlich bei einigen leistungsstarken Analysen hilfreich sein, tut es aber nicht.
Erfordert die dynamische Sprache eine höhere Speicherbelastung?

Eine andere Frage ist, ob sich Programmiersprache und natürliche Muttersprache/Kultur gegenseitig stören. Ausgehend von der Lese-/Schreibrichtung und endend mit der Wahrnehmung der Semantik.
In russischen Büchern werden 'Stream' und 'Thread' oft als dasselbe Wort übersetzt: ' поток'. In einigen Literaturstellen wurde 'I/O' ( ввода/вывода) dem 'Stream' hinzugefügt, um von 'Thread' zu unterscheiden. Ich weiß nicht, ob es das Verständnis beeinflusst, aber ich vermute, dass es sich zumindest im Stadium des Lernens befindet.

Update 2

Diese Videos adressieren teilweise meine Frage:

http://vimeo.com/97329157

http://vimeo.com/97471514

5
Pavel Voronin

Konvention (in welchem ​​Kontext auch immer Sie arbeiten) übertrumpft alle. Was auch immer Ihre Arbeitsgruppe beschlossen hat, sollte beachtet werden. Wenn Sie gerade dabei sind, Codierungskonventionen festzulegen, stehen im Internet zahlreiche gute anekdotische, sprachspezifische Ratschläge zur Verfügung.

Ich kenne keine Studien, die darauf hinweisen, dass ein bestimmter Codierungsstil leichter zu lesen ist als andere, aber wie erwähnt gibt es viele anekdotische Beweise/Meinungen zu diesem Thema, und es ist normalerweise sprachspezifisch.

Zum Beispiel sieht Javascript etwas wie C/Java aus, hat aber einige Semantiken, die C/Java-Programmierer nicht erwarten würden:

return {
    x : "x"
};
// in not semantically the same as
return
{
    x : "x"
};
// search for "semicolon insertion gotchas" for explanation

Ich vermute, dass in diesem Bereich der Bestimmung, welche Kodierungskonvention "am besten" ist, Expertenerfahrung tendenziell nützlichere Informationen liefert als empirische Studien. Warum genau ich so fühle, kann ich nicht sagen - es ist wirklich nur eine Vermutung. Vielleicht gibt es einfach zu viele Variablen, als dass eine Studie sie kontrollieren könnte.

Ich habe dieser Frage eine +1 gegeben, weil (obwohl die Frage vage ist) die Syntax der Programmiersprache (und natürlich die Semantik) ist ein UX-Problem und ein oft ignoriertes. Zu viele Computersprachen verwenden eine 40 Jahre alte Syntax. Die UX der Programmierung ist zu unterdrückt. Nicht immer unterdrückt (z. B. Python), aber die Trägheit (insbesondere Web-Sprachen) scheint in die falsche Richtung zu gehen.

4
obelia

Meine Antwort wird nicht vollständig sein - ich möchte nur auf zwei Aspekte hinweisen, die meiner Meinung nach nicht übersehen werden sollten.

(Wie ich in den Kommentaren bemerkt habe, habe ich zuvor einige Gedanken zu diesem Thema geteilt - hier ).

Wenn ich Code scanne, schaue ich normalerweise auf die linke Seite des Bildschirms und erwarte, dass dort Kontrollflussanweisungen angezeigt werden, sodass es möglich ist, in den ersten beiden Beispielen die Rückgabe zu verpassen. Und es passiert wirklich von Zeit zu Zeit, wenn ich anderen Entwicklercode lese. Nun, die Forschung besagt, dass der vertikale Scan leistungsfähiger ist als der horizontale, wenn die Breite nicht zu klein ist. Aber wie kann man eingerückte Rückkehr und Rückkehr mit geschweiften Klammern vergleichen?

Es mit Klammern zu umgeben, ist eine Gewohnheit, die hilft, sich vor der Einführung eines Fehlers zu schützen.

Angenommen, Sie müssen stream.Close(); aufrufen, bevor Sie die Methode verlassen. Hier ist unser Code:

if (bla-bla) 
    return;

Okay, fügen wir stream.Close Ein:

if (bla-bla) 
    stream.Close();
    return;

Und hoppla, ich habe es gerade kaputt gemacht. Nur das Aufrufen von stream.Close Hängt jetzt davon ab, ob bla-bla wahr war. return ist nicht mehr bedingt, daher springen wir auf jeden Fall aus der Methode heraus und der folgende Code wird niemals ausgeführt.

Hatte unser Code so ausgesehen:

if (bla-bla)
{
    return;
}

Es konnte nicht passieren.

Ich denke, es macht auf einen wichtigen Punkt aufmerksam. Bei Code, der häufig bearbeitet wird, geht es nicht nur um "statische" Lesbarkeit.

Es geht auch darum sicherzustellen, dass diese Lesbarkeit dauerhaft ist und weniger wahrscheinlich von zukünftigen Änderungen, Refactoring usw. Beeinträchtigt wird.

Ein weiteres Anliegen ist das Kurzzeitgedächtnis und der sichtbare Teil der Routine. Wenn Code viele 'Dinge' einführt (erinnere mich an diese 7 + -2), sehe ich lieber alle auf einmal, ohne hin und her zu scrollen, um mich daran zu erinnern, wofür etwas verwendet wird. Es ist daher sinnvoll zu fragen, ob die Ausrichtung der Hochformatanzeige besser ist als die Querformatausrichtung.

Ich denke dabei an einen weiteren wichtigen Aspekt: ​​die Quellcodeverwaltung.

Programmierer lesen nicht nur Code in Code-Editoren/IDEs. Die Arbeit mit der Quellcodeverwaltung ist unerlässlich. Je länger die Codezeilen sind, desto schwieriger wird es, Änderungen zu verfolgen, Code zu vergleichen und Änderungen automatisch zusammenzuführen.

Wenn Ihr Code so aussieht:

if (header instanceof TextView) ((TextView) header).setText(data.getTitle());

Es ist nur eine Zeile. Sie haben vertikalen Platz gespart. Aber jetzt stieg die Wahrscheinlichkeit, dass zwei Programmierer dieselbe Zeile ändern (einer wurde in header in mainHeader umbenannt, ein anderer musste getTitle in getDescription ändern) und Die Quellcodeverwaltung kann nicht erkennen, wie diese Änderungen automatisch kombiniert werden sollen, und der Entwickler - möglicherweise eine dritte Person - muss den Konflikt manuell lösen.

Wenn derselbe Code wie folgt in mehreren Zeilen angeordnet war:

if (header instanceof TextView) {
    String title = data.getTitle();
    ((TextView) header).setText(title);
}

Es wäre kein Problem gewesen. Ein Entwickler hat die Zeilen 1 und 3 geändert, der andere - nur die Zeile 2.

Dies ist also ein weiterer wichtiger Aspekt: ​​ Lesbarkeit im VCS/diff. Bei der Lösung von Konflikten ist es viel schwieriger, mit unordentlichem Code zu kämpfen: Es kann Dutzende von geben solche Fälle auf einmal (und Sie können nicht weitermachen, bis Sie alle gelöst haben), jeder in einer anderen Datei, so dass Sie den Kontext nicht kennen usw.

Dann gibt es auch Lesbarkeit beim Debuggen - z. Wenn vier Methodenaufrufe in einer Zeile zusammengefasst sind, ist es für mich weniger bequem, sie Schritt für Schritt zu debuggen ...

Zusammenfassend lässt sich sagen, dass es verschiedene Kontexte gibt, in denen man sich dem Code nähert, und dies sollte man beachten, wenn man versucht, seine Lesbarkeit zu bewerten.

2
Konrad Morawski

Ich kann nicht über irgendeinen Nutzen im Sinne von Code antworten, aber es kann sicherlich einige Methoden geben, um Code für die Wahrnehmung zu verbessern. Sie sollten sich den Code einfach als das geschriebene Produkt vorstellen, das vom menschlichen Benutzer (d. H. Einem anderen Programmierer oder einer anderen Person) gelesen wird. Beantworten Sie sich also unter anderem auf folgende Fragen:

  1. Wer liest Code? Bist du es, der Autor? Amateur-Programmierer oder Experte?
  2. Wie können Sie dem Leser helfen, den Code, seine Ziele, Aufgaben und Tricks besser zu verstehen?
  3. Gibt es in der obigen Antwort eine Art von Konventionen, die wahrscheinlich unter anderen Benutzern bekannt sind und einige Standards unterstützen - in Variablennamen, Codeformatierung usw.?
  4. Betten Sie in Ihren Code einen reibungslosen Abstieg von der allgemeinen Beschreibung der Codestruktur und -organisation aus der Vogelperspektive bis hin zu Erklärungen lokaler, konkreter Punkte ein (z. B. in Kommentaren oder allgemeinen Beschreibungen)?

Die Beantwortung dieser Fragen ist gut, um den Code als verwendetes Produkt zu fühlen und zu verstehen. Sie werden also sicherlich bessere Lösungen für Kommentare, Organisation, Lesbarkeit usw. finden, um ihn benutzerfreundlicher zu machen.

1