Tipps und Tricks fürs Programmieren

Bevor du mit dem Schreiben deines ersten Codes beginnst, müssen wir über die Kunst des Programmierens sprechen. Wie bereits erwähnt, geht es nicht darum, dass der Code funktioniert, sondern darum, dass er leicht zu verstehen ist. Ein funktionierender Code ist schön und gut, aber wenn ich zwischen einem unleserlichen, momentan funktionierenden Code, und einem nicht funktionierenden, dafür klar geschriebenen und dokumentierten Code, wählen müsste, würde ich mich jederzeit für den letzteren entscheiden. Dinge, die ich verstehe kann ich reparieren, aber bei Dingen, die ich nicht verstehe, kann ich nur raten.

Hier sind einige Tipps zum Schreiben und Lesen von Code. Einige davon mögen zunächst kryptisch klingen (sie werden klarer, sobald wir das entsprechende Material behandelt haben). Einige mögen übertrieben erscheinen für die einfachen Projekte, die wir umsetzen werden. Ich schlage vor, dass du diesen Abschnitt beim ersten Mal kurz durchliest, aber immer wieder zurückkommst zurückkommst, sobald wir richtig mit dem Programmieren beginnen. Leider funktionieren diese Tricks nicht, wenn du sie nicht anwendest! Also solltest du immer darauf achten und sie zu deinen guten Gewohnheiten machen, wie das Anschnallen. Der Gurt tut an den meisten (hoffentlich allen) Tagen nichts, trotzdem schnallst du dich natürlich an, weil er sehr plötzlich sehr nützlich sein kann und du nie wissen kannst wann das ist. Gleiches gilt für das Programmieren. Oft wirst du versucht sein, “quick-and-dirty” Code zu schreiben, weil es “nur” ein einfacher Test, eine temporäre Lösung, ein Prototyp, ein Pilotversuch usw. ist. Aber wie man so schön sagt: “Es gibt nichts Dauerhafteres als eine temporäre Lösung”. Meistens wirst du feststellen, dass dein Versuchs-Code zu einem echten Experiment herangewachsen ist und Chaos ist. Oder du möchtest zu dem Pilotversuch zurückkehren, den du vor ein paar Monaten durchgeführt hast, aber stellst fest, dass es einfacher ist, von vorne zu beginnen, als zu verstehen, wie dieses Monster funktioniert1. Also widerstehe der Versuchung! Entwickle direkt gute Gewohnheiten und dein zukünftiges Ich wird dir sehr dankbar sein!

Schreibe den Code

Nutze einen Linter

Ein Linter ist ein Programm, das deinen Code-Stil analysiert und alle Probleme hervorhebt, die es findet: Leerzeichen, wo keine sein sollten, keine Leerzeichen, wo welche sein sollten, falsche Namen, zu lange Zeilen usw. Das beeinflusst nicht, wie der Code ausgeführt wird, aber wenn du auf die Ratschläge des Linters hörst, ergibt sich ein konsistenter Standard, auch wenn er langweilig aussieht. [“Langweilig ist gut!”, siehe den Film “The Hitman’s Bodyguard”.] Versuche, alle Probleme zu beheben, die der Linter aufdeckt. Aber verwende deinen eigenen Verstand, denn manchmal sind Zeilen länger als der Linter es bevorzugt, aber dafür besser lesbar als zwei kürzere. Und ein “schlechter” Variablenname nach Linter-Standards kann für einen Psychologin ein bedeutungsvoller Name sein. Denk dran, dein Code ist für Menschen, nicht für den Linter.

Dokumentiere deinen Code

Jedes Mal, wenn du eine neue Datei erstellst: dokumentiere sie und aktualisiere die Dokumentation, wenn du neue Funktionen oder Klassen hinzufügst/änderst/löschst. Jedes Mal, wenn du eine neue Funktion erstellst: dokumentiere sie. Neue Klasse: dokumentiere sie. Neue Konstante: dokumentiere sie (außer, der Name ist aussagekräftig genug). In diesem Buch wirst du die NumPy-Art, zu dokumentieren lernen.

Ich kann gar nicht oft genug betonen, wie wichtig es ist, deinen Code zu dokumentieren. VS Code (ein Editor, den wir verwenden werden) ist clever genug, um NumPy-Dokstrings zu analysieren, also wird es dir immer dann diese Hilfe anzeigen, wenn du deine eigenen Funktionen verwendest (hilft dir, dir zu helfen!). Aber viel wichtiger ist, dass das Dokumentieren dich dazu zwingt, nachzudenken und (in Menschensprache!) zu formulieren, was die Funktion oder Klasse tut, welche Art die Argumente / Attribute / Methoden sind, welchen Bereich von gültigen Werten es gibt, welche Standardwerte es gibt, was eine Funktion zurückgeben sollte, usw. Meistens wirst du feststellen, dass du wichtige Details übersehen hast, die aus dem Code selbst nicht offensichtlich sind.

Den Code auflockern

Trenne Code-Blöcke mit einigen leeren Zeilen. Stell dir vor, es sind Absätze in einem normalen Text. Du willst auch nicht, dass dein Buch ein einziger Absatz-Albtraum wird! Setze vor jedem Block einen Kommentar, der erklärt, was er tut, aber nicht wie er es tut. Zum Beispiel gibt es in unserem typischen PsychoPy-basierten Spiel einen Punkt, an dem wir alle Stimuli anzeigen und das Fenster aktualisieren. Das ist ein in sich geschlossener Block, der als # alle Stimuli anzeigen beschrieben werden kann. Der Code liefert Details darüber, was genau gezeight wird, in welcher Reihenfolge, usw. Aber dieser eine Kommentar hilft dir zu verstehen, worum es in diesem Block geht und ob er für dich im Moment relevant ist. Gleiches gilt für # Tastendruck verarbeiten oder # Spielende Bedingungen überprüfen, usw. Aber sei vorsichtig und stelle sicher, dass der Kommentar den Code korrekt beschreibt. Zum Beispiel sollte, unter dem Kommentar # alle Stimuli anzeigen, kein Code vorkommen, der etwas anderes tut und es sollte nirgendwo sonst Code stehen, der Stimuli zeigt!

Schreib deinen Code in winzigen Schritten

Dein Motto sollte “langsam aber sicher” sein. So werde ich dich durch die Spiele führen. Fang immer mit etwas extrem Einfachem an, wie z.B. einem statischen Rechteck oder Bild. Stelle sicher, dass der Code funktioniert. Füge eine kleine Veränderung hinzu: Ändere die Farbe, Position, füge ein weiteres Rechteck hinzu, speichere es als Attribut, usw. Stelle sicher, dass dies funktioniert. Gehe nie zum nächsten Schritt über, solange du nicht genau verstehst, was dein aktueller Code tut und zu 100% sicher bist, dass er wie erwartet funktioniert. Und ich meine das ernst! Wenn du auch nur den Hauch eines Zweifels hast, überprüfe den Code nochmal. Sonst wird dieser Zweifel wachsen und dich immer unsichere machen. Diese Schnecken-Geschwindigkeit-Methode mag vielleicht albern und zu langsam erscheinen, aber es ist immer noch schneller, als viel Code auf einmal zu schreiben und dann zu versuchen, diesen zum Laufen zu bringen. Es ist viel einfacher, einfache Probleme nacheinander zu lösen, als viele gleichzeitig.

Es ist nichts falsch an StackOverflow

Ja, du kannst immer versuchen, eine Lösung für dein Problem auf StackOverflow zu finden2. Ich mache das die ganze Zeit! Aber du solltest die bereitgestellte Lösung nur verwenden, wenn du sie verstehst! Kopiere und füge den Code nicht ein, wenn er scheinbar, ein Problem wie deines löst. Wenn du das doch tust und Glück hast, funktioniert es. Oder es funktioniert offensichtlich nicht. Aber wenn du nicht so viel Glück hast, funktioniert es (manchmal) auf subtile Weise falsch. Und da du nicht wusstest, was der Code tat, als du ihn eingefügt hast, bist du jetzt noch verwirrter. Also verwende StackOverflow als Wissensquelle, nicht als Quelle für zu kopierenden Code!

Code lesen

Code zu lesen ist einfach, weil Computer dumm sind und du schlau bist. Das bedeutet, dass die Anweisungen, die du dem Computer gibst, notwendigerweise sehr einfach sein müssen und daher sehr einfach für einen Menschen zu verstehen sind. Code zu lesen ist aber auch gleichzeitig schwer, weil Computer dumm sind und du schlau bist. Du bist so schlau, dass du nicht den ganzen Code lesen musst, um zu verstehen, was er tut, du liest einfach die wichtigsten Teile und füllst die Lücken auf. Leider bedeutet das, dass du dazu neigst, Fehler zu überlesen. Das ist nicht einzigartig für das Programmieren, wenn du jemals einen Text korrigiert hast, weißt du, wie schwer es ist, Fehler zu finden. Dein Gehirn korrigiert sie auf der Stelle mithilfe des Kontexts und du liest das Wort so, wie es sein sollte, nicht so, wie es tatsächlich geschrieben ist3.

Meine Erfahrung mit Programmieren im Allgemeinen und auf diesem Seminar im Besonderen ist, dass die meisten Probleme, bei denen du stecken bleibst, simpel sind und im Nachhinhin offensichtlich4. Mach dir keine Sorgen! Das liegt nicht an dir, sondern einfach daran, wie gut dein Gehirn für die Mustererkennung verdrahtet ist. Hier sind einige Vorschläge, die dir helfen können, das Lesen von Code zuverlässiger zu gestalten.

Denk wie ein Computer

Lies den Code Zeile für Zeile und “führe” ihn aus, wie der Computer es tun würde. Verwende Stift und Papier, um die Variablen im Auge zu behalten. Verfolge, welche Code-Blöcke erreicht werden können und wann. Sei langsam und stell sicher, dass du jede Zeile verstehst und in der Lage bist, die Variablen im Auge zu behalten. Sobald du das gemacht hast, wird es einfach sein, einen Fehler zu erkennen.

Stell dir vor, du hast diesen Code noch nie gesehen

Geh davon aus, dass du keine Ahnung hast, was der Code macht. Wie ich schon sagte, sieht man oft buchstäblich einen Fehler nicht, weil das Gehirn Details einfügt und die Realität so zurechtbiegt, dass sie den eigenen Erwartungen entspricht5. Du weißt, was dieser Code tun sollte, also liest du ihn nicht, sondern überfliegst ihn und gehst davon aus, dass er das tut, was er tun sollte, es sei denn, er sieht offensichtlich furchtbar falsch aus. Es ist schwer, die eigenen Erwartungen auszuschalten, aber es hilft ungemein.

Suche nicht nur unter der Straßenlaterne

Wann immer du einen neuen Code verwendest oder etwas implementieren musst, das sich kompliziert anfühlt, und dein Code nicht so funktioniert, wie er sollte, wirst du dazu neigen, anzunehmen, dass das Problem an dem neuen, komplizierten Code liegt. Einfach weil er neu und kompliziert ist. Meiner Erfahrung nach verbirgt sich der Fehler jedoch in der Regel im einfacheren, „trivialen“ Code, den man sich nie richtig beachtet, weil er einfach und trivial ist. Überprüfe alles, nicht nur die Stellen, an denen du einen Fehler erwarten würdest.

Verwende den Debugger

In diesem Buch lernst du, wie du die Ausführung deines Codes unterbrechen kannst, um den Zustand des Codes zu untersuchen. Nutze dieses Wissen! Setz Haltepunkte und führe den Code Schritt für Schritt aus. Überprüfe die Werte von Variablen in der “Beobachten”-Leiste. Verwende die Debug-Konsole, um zu überprüfen, ob die Funktionen die gewünschten Ergebnisse liefern. Teile komplexe Bedingungen oder mathematische Formeln in kleine Teile auf, kopiere diese Teile und führe sie in der Debug-Konsole aus, um zu prüfen, ob die Zahlen zusammenpassen. Überprüfe, ob ein Code-Abschnitt in Ordnung ist, und fahre dann mit der Analyse des nächsten fort. Das Debugging ist besonders hilfreich, um Code zu identifizieren, der gar nicht oder zum falschen Zeitpunkt erreicht wird.

Zen of Python

Zen of Python finde ich eine gute Inspiration dafür, wie man Programmieren angehen sollte.


  1. Ist mir öfter passiert, als ich zugeben möchte.↩︎

  2. Wenn du das Seminar machst, frag erst mich!↩︎

  3. Tipp: Lies deinen Text einen Satz nach dem anderen von hinten oder lies einen zufälligen Satz. Das unterbricht den Fluss des Textes und hilft dir, dich auf Wörter statt auf die Bedeutung und die Geschichte zu konzentrieren.↩︎

  4. Hinterher ist man immer schlauer!↩︎

  5. Kürzlich habe ich eine halbe Stunde damit verbracht, herauszufinden, warum zwei identische Code-Blöcke unterschiedliche Ergebnisse liefern. Mein Sohn hat fast sofort einen Unterschied gefunden (ein fehlendes Komma in einem von ihnen), weil für ihn das alles nur Buchstaben und Zahlen waren.↩︎