Cognitive Complexity

Wie unser Gehirn Informationen verarbeitet

Quellen

  • Prof. Dr. Andreas Heil (HS Heilbronn / DHBW Karlsuhe)
  • Stefan Mandel (andrena objects)

Informationstheorie von Shannon

Sensorisches Gedächnis

  • hohe Kapazität
  • speichert sensorische Informationen
  • verliert Inhalt sehr schnell
    • visuelle Inhalte (ca. 0,2 Sekunden)
    • auditive Inhalte (ca 1,5 Sekunden)
  • Auffrischen nur durch Wiederholung möglich

Arbeitsgedächnis

  • stark begrenzte Kapazität
  • speichert überwiegend symbolische Daten
  • Begrenzte Vorhaltezeit
  • Aktuelle Untersuchungen widerlegen die Existenz eins Kurzzeitgedächtnisses
  • Arbeitsgedächtnis vermutlich ein Teil des Langzeitgedächtnisses

Langzeitgedächtnis

  • nahezu unbegrenzter Speicher
  • enthält episodische und semantische Informationen
  • Zugriffszeit langsam (>0,1 Sekunden, meist deutlich länger)

Recognize-Act-Zyklen

  • Informationen werden wahrgenommen und kurzzeitig im sensorischen Speicher vorgehalten
  • Die Musterkennung vergleicht Merkmale der wahrgenommenen Reize mit Informationen im Langzeitgedächtnis (to recognize)
  • Handlung erfolgt durch Interaktion zwischen Arbeitsgedächtnis und Langzeitgedächtnis (to act)
  • Arbeitsgedächtnis repräsentiert die Ziele und Erwartung des Benutzers
  • Im Erkennungsprozess nimmt man vorrangig wahr, wonach man aktuell sucht

Arbeitsgedächnis

  • kann nur wenige Einheiten halten (früher 7, heute 3-4)
  • Deshalb Superzeichenbildung (Abstrahierung)
  • ca. 15 Sekunden vorhaltezeit
  • Funktionsweise ähnlich wie Stack
  • Geschickte Gruppierung ist wichtig
  • Superzeichenbildung unterstützten, die dem Benutzer bekannt sind
  • Wenig, keine Ablenkung von der eigentlichen Aufgabe
  • Keine Verschachtelungen in Aufgaben (Stack nicht überfrachten)
  • Interferenzeffekte vermeiden

Chunking

  • Das Gehirn behilft sich indem es Informationen gruppiert.
  • Das nennt man Chunking oder Superzeichenbildung.
  • Superzeichen sind hierarchisch organisiert

Beispiel Memory

  • Erwachsene nutzen Strategien (dritte Reihe von oben, zweite Karte von links)
  • Kinder merken sich vermutlich die Konstellation
  • Ergebnis: Kinder gewinnen in den meisten Fällen

Beispiele für Superzeichenbildung

  • Wörter anstelle Einzelbuchstaben
  • Bilder (Eindrücke) anstelle des Wortes
  • Sätze anstelle Einzelworte

Funktioniert jedoch nur wenn die Informationseinheiten bekannt sind

  • Symbolische Namen
    • 6A B7 anstelle 0110 1010 1011 0111
    • bluehands.de anstelle 109.109.201.186

Chunks im Code

  • Schlüsselwörter (class, struct, function) vermitteln den Anfang eines Programmelements
  • Trennzeichen (Semikolon, Komma) trennen Programmelemente
  • Gruppierungszeichen (Klammern) gruppieren Programmelemente
  • Operatoren vermitteln eine Operation auf Argumenten
  • Literale werden je nach Kontext als Wert oder Variable interpretiert
  • Namen vermitteln eine Semantik
  • Argumentpositionen vermitteln eine Rolle

Kombinieren von Chunks

  1. Struktur erkennen: Klasse, Feld, Methode
  2. Fachliche Bedeutung erfassen: Konto (Account), Guthaben (balance), Überweisung (Transfer)
  3. Ablauf verstehen: Prüfung -> Abbuchung -> Gutschrift
  4. Gesamtbild: eine Bankkontoabstraktion

Was überfordert unser Gehirn

  • Eine Operation verarbeitet zu viele Input-Chunks
  • Unser Gedächtnis kann die Output-Chunks nicht mehr halten
  • Unser Gedächtnis muss Chunks von früheren Berechnungen (Zwischenergebnisse) vorhalten

Unverständlicher Code analysieren

  • Wie viele Chunks muss ich gleichzeitig verarbeiten?
  • Kann ich mir unter den Variablen, Methoden, Klassen etwas vorstellen?
  • Habe ich echte Abstraktionen oder nur Zusammenfassungen?
  • Gibt es Widersprüche zwischen der niedergeschriebenen Logik und den Namen?
  • Passt der Datenfluss oder Kontrollfluss zu den Abstraktionen?

Maßnahmen

  • zu viele Chunks gleichzeitig:
    • Zerlegung der Logik in kleinere Schritte
    • (Teil-)Operationen abstrahieren
    • Zwischenergebnisse möglichst früh konsumieren
    • multiple Ergebnisse abstrahieren oder aggregieren
    • falsche Namen korrigieren
    • ungenaue Namen präzisieren
    • Namenskonventionen einhalten
  • falsche Abstraktionen
    • Suche nach passenderen Abstraktionen
    • falsche Abstraktionen auflösen und neu gruppieren
  • Widersprüche in Logik und/oder Namen
    • Klärung, ob Logik oder Namen das Problem sind

Möglichkeiten Code Komplexität klein zu halten

  • Pair programming
  • Code-Reviews
  • "Selbstdokumentierender Code"
  • Mob Programming, Quality Meetings im Team

Diskussion "synchronisiert" chunks

Cognitive Complexity

    Increments
  • if, else if, else, ternary operator
  • switch
  • for, foreach
  • while, do while
  • catch
  • sequences of binary logical operators
  • each method in a recursion cycle
    Erhöhen nesting level
  • if, else if, else, ternary operator
  • switch
  • for, foreach
  • while, do while
  • catch
  • nested methods and method-like structures such as lambdas

Nesting increments

    Diese Strukturen erhalten einen zusätzlichen increment anhand des nesting levels
  • if, ternary operator
  • switch
  • for, foreach
  • while, do while
  • catch

						@Nullable
						private MethodJavaSymbol overriddenSymbolFrom(ClassJavaType classType) {
							if (classType.isUnknown()) { // +1
								return Symbols.unknownMethodSymbol;
							}

							boolean unknownFound = false;
							List symbols = classType.getSymbol().members().lookup(name);
							for (JavaSymbol overrideSymbol : symbols) { // +1
								if (overrideSymbol.isKind(JavaSymbol.MTH) // +2 (nesting = 1)
									&& !overrideSymbol.isStatic()) { // +1
									MethodJavaSymbol methodJavaSymbol = (MethodJavaSymbol)overrideSymbol;
									if (canOverride(methodJavaSymbol)) { // +3 (nesting = 2)
										Boolean overriding = checkOverridingParameters(methodJavaSymbol, classType);
										if (overriding == null) {
											if (!unknownFound) { // +4 (nesting = 3)
												unknownFound = true; // +5 (nesting = 4)
											}
										} else if (overriding) { // +1
											return methodJavaSymbol;
										}
									}	
								}
							}
							if (unknownFound) { // +1
								return Symbols.unknownMethodSymbol;
							}
							return null;
						} // summe = 19
						

Cognitive Complexity - Plugin

https://plugins.jetbrains.com/plugin/2024-cognitivecomplexity