50 Punkte von GN⁺ 2025-03-26 | 5 Kommentare | Auf WhatsApp teilen
  • Leslie Lamport ist ein früher Entwickler von LaTeX und ein Pionier auf dem Gebiet verteilter Systeme. 2013 erhielt er den Turing Award
  • In seiner SCaLE-22x-Keynote betonte er die Bedeutung von Abstraktion und wies darauf hin, dass die meisten Programmierer sich auf Coden und Sprachen fixieren, obwohl abstraktes Denken und Entwurf vor dem Coden entscheidend sind

Zusammenfassung des Vortrags

  • Ihr erwartet vielleicht, dass ich über Concurrency spreche, aber dazu habe ich nichts Neues zu sagen
  • Die Einsichten zum „Schreiben concurrenter Programme“ lassen sich jedoch auf das allgemeine Programmieren insgesamt anwenden
  • Dieser Vortrag handelt vom Programmieren im Allgemeinen

Algorithmus vs. Programm

  • Algorithmus: eine sprachunabhängige abstrakte Idee; ein abstrakteres und höheres Konzept als ein Programm
  • Programm: die konkrete Form eines Algorithmus, umgesetzt in einer bestimmten Sprache. Programmiersprachen sind zu komplex, um Algorithmen auszudrücken
  • Algorithmen werden nicht ausgeführt und sind im Allgemeinen kurz und einfach
  • Gerade bei Concurrency-bezogenem Code muss man zuerst einen korrekten Algorithmus definieren und ihn dann implementieren

Abstraktion am Beispiel des Maximums eines Arrays

  • Selbst bei einem einfachen Problem muss man klar definieren, „was“ getan werden soll (What)
  • Beispiel: „Gib das Maximum eines Integer-Arrays zurück“ → „Gib die kleinste Zahl zurück, die größer oder gleich allen Elementen ist“
  • Auch die Behandlung leerer Arrays muss vorab definiert werden (z. B. mit -∞)
  • Durch eine solche klare Definition lässt sich ein einfacherer und robusterer Algorithmus (How) ableiten

Programmausführung ist ein Fluss von Zuständen

  • Die Ausführung eines Programms ist nicht bloß eine Reihenfolge von Befehlen, sondern eine Folge von Zuständen (state)
  • Jeder Zustandsübergang bedeutet die Ausführung eines Teils des Codes
  • Diese Sichtweise ist wichtig, um die Korrektheit eines Algorithmus zu beweisen (etwa mit Invarianten)

Werkzeug für komplexe Systeme: TLA+

  • Um Abstraktionen präzise auszudrücken, braucht man eine exakte Sprache
  • TLA+ ist ein für diesen Zweck entwickeltes Werkzeug
  • Amazon Web Services entdeckte mit TLA+ schwerwiegende Designfehler bereits im Vorfeld
  • Auch Virtuoso, das OS der Rosetta-Raumsonde, wurde auf Basis von TLA+ entworfen; der Code war kompakt und stabil

Die Rolle von Abstraktion auch bei unvollständigen Spezifikationen

  • Beispiel: Bei einem Pretty Printer können Ausrichtungskriterien subjektiv sein
  • Trotzdem ist es für Debugging und Wartung wichtig, einen abstrahierten Regelsatz festzulegen

Schreiben und Denken

  • Gedanken aufzuschreiben macht das Denken klarer
  • Abstraktion geschieht nicht nur im Kopf, sondern wird erst wirksam, wenn sie schriftlich ausgedrückt wird
  • Lamport erwähnte, dass sein mathematisches Training seine Fähigkeit zur Abstraktion geprägt habe
  • Mathematiker können Programmierern Abstraktion beibringen

Bibliotheken und Bugs

  • Im zweiten Teil des Vortrags „Warum Programme Bugs haben müssen“ ging es um das Problem der Komplexität
  • Moderne Software hängt von vielen Bibliotheken ab, doch ihnen fehlt oft eine präzise sprachunabhängige Beschreibung
  • Dadurch entstehen bei der Integration unerwartete Bugs
  • Beispiel: seine eigenen JavaScript-Debugging-Erfahrungen auf der Website seines TLA+-Kurses
  • Die zustandsbasierte Sichtweise hilft, diese Komplexität zu verstehen

Themen aus der Fragerunde

  • Der Einfluss von AI auf Abstraktion
  • Die Kluft zwischen Open Source und Wissenschaft
  • Die Realität, dass Entwickler formale Definitionen oft vernachlässigen
  • Am wichtigsten bleibt weiterhin: „Vor dem Coden nachdenken“

Fazit: Das Wesen des Programmierens ist Denken

  • Lamport argumentiert, dass man abstraktes Denken und formale Spezifikationen gegenüber reinem Coden priorisieren sollte
  • Der anfängliche Aufwand ist hoch, führt aber letztlich zu robusterer und leichter wartbarer Software
  • Coden ist nur ein Teil des Programmierens; echtes Programmieren beginnt mit präzisen Algorithmen und Abstraktion
  • In einer Zeit wachsender Systemkomplexität und zunehmender Concurrency ist Abstraktion eine unverzichtbare Fähigkeit, und Programmierer müssen das Denken und Abstrahieren gezielt trainieren

5 Kommentare

 
softer 2025-03-27

Ich stimme diesem Beitrag ebenfalls zu.
Ich halte es für nützlich, Probleme über abstrahierte Zustandswerte zu definieren, um Probleme zu entdecken, und versuche, Tools für ein klares Zustandsmanagement zu entwickeln, die Zustände visuell und explizit darstellen, etwa durch Diagramme, Unreal Blueprint oder Workflows.

Dann sollte ich mir wohl zuerst die Sprache ansehen.

 
felizgeek 2025-03-27

Das ist ein Text, der mich an einen Kurs in Berechenbarkeitstheorie erinnert! Ich empfehle allen, die programmieren, sich damit zu beschäftigen.

 
aer0700 2025-03-26

Ich frage mich, was TLA ist.
Ich werde es nachschlagen.

 
GN⁺ 2025-03-26
Hacker-News-Kommentare
  • Die „Coder“ der Demoszene nennen sich so und sind stolz darauf, und sie sind oft auch hervorragende „Programmierer“ und „Softwareingenieure“. Ob man nun Coder, Programmierer, Softwareingenieur oder einen anderen Namen verwendet, wichtig ist, den Computer dazu zu bringen, das zu tun, was man will

  • Die Keynote im nächsten Jahr wird wohl lauten: „Vibing ist kein Coding und kein Programmieren …; manchmal ist es eine Pyramide aus halb funktionierendem Müll.“ Gut, dass Dijkstra das nicht mehr sehen muss. Er war schon in den 80ern im Wohnzimmer meiner Eltern wütend. Ich kann mir nicht vorstellen, wie er auf „Vibe Coding“ reagiert hätte

  • Leslie Lamports SCaLE-22x-Keynote: erst denken, abstrahieren und dann coden. Lamport plädierte für einen grundlegenden Wandel im Programmieransatz, bei dem Denken und Abstraktion vor dem Coding betont werden, und das gilt für jeden nichttrivialen Code

    • Abstraktion zuerst: Vor dem Schreiben von Code wird eine abstrakte Sicht auf das Programm definiert. Dieses High-Level-Design macht die Logik klarer und entdeckt Fehler frühzeitig. Der Fokus liegt auf Ideen, nicht auf einer bestimmten Sprache
    • Algorithmus != Programm: Ein Algorithmus ist ein abstraktes Konzept, ein Programm ist eine konkrete Implementierung
    • Ausführung als Zustände: Die Programmausführung wird als Folge von Zuständen modelliert, und die Zukunft jedes Zustands hängt nur von der Gegenwart ab. Das vereinfacht insbesondere das Denken über Nebenläufigkeit
    • Die Bedeutung von Invarianten: Es werden Invarianten identifiziert, also Eigenschaften, die für jeden Ausführungszustand gelten. Sie zu verstehen ist für Korrektheit essenziell
    • Die Bedeutung klarer Spezifikationen: Vielen Bibliotheksprogrammen fehlen klare Spezifikationen, was ihre korrekte Nutzung erschwert. Besonders bei Nebenläufigkeit ist eine klare und sprachunabhängige Beschreibung der Funktionalität nötig
    • Schreiben ist Denken: Schreiben erzwingt Klarheit und legt nachlässiges Denken offen. Denken verbessert das Schreiben. Das ist ein positiver Kreislauf
    • Abstrahieren lernen: Abstraktion ist eine Kernkompetenz der Mathematik, und Programmierer sollten diese Fähigkeit entwickeln
    • Abstraktion durch AI? Es wird die Frage aufgeworfen, ob AI-Modelle für den Prozess abstrakten Denkens beim Programmieren genutzt werden können
  • Programmierung sollte ein bewusster Prozess sein, bei dem auf sorgfältiges Design (Abstraktion) die Implementierung (Coding) folgt, mit Fokus auf klare Spezifikationen und auf das Verständnis des Programmverhaltens über Zustandsfolgen und Invarianten. Denken ist immer besser

  • Ein Mathematikprofessor bezeichnet jede Handlung, die Konzepte in eine präzisere und maschinenlesbare Form überführt, als Coding. Dazu gehört nicht nur, in einer Programmiersprache zu schreiben, was der Computer tun soll, sondern auch das Kodieren von Daten. Das Wort „encode“ macht das deutlich. Er gab Aufgaben auf, bei denen eine Kodierungsweise definiert werden sollte, die Binärbäume in natürliche Zahlen umwandelt. Das Wort Coding ist zu mehrdeutig, deshalb verwendet er es nicht oft

  • Lamport argumentiert, dass man „was“ und „wie“ trennen sollte. Ich frage mich aber, ob bei den meisten Problemen das „Was“ und das „Wie“ eines Programms nicht bis zu einem gewissen Grad zusammenfallen. Sind zum Beispiel Performance-Überlegungen Teil des „Was“ oder des „Wie“?

  • Interessante Zusammenfassung: Ein Algorithmus ist kein Programm, sollte nicht in einer Programmiersprache geschrieben sein und sollte einfach sein. Ein Programm hingegen muss komplex sein, weil es auf potenziell großen Datensätzen schnell laufen muss. Das wird besonders bei nebenläufigen Programmen diskutiert, weil deren Ausführungsreihenfolge auf mehreren CPUs unterschiedlich ist

  • Als Programm wird Code definiert, der Denken vor dem Coding erfordert und von Leuten verwendet wird, die den Code nicht lesen wollen. Dieser Vortrag wird schon seit langer Zeit gehalten. Das Beispiel zur Vereinfachung der Suche nach dem kleinsten Element stimmt exakt mit „Define Errors Out of Existence“ aus John Ousterhouts Buch überein

  • Ich genieße die Ironie, dass der Kommentarbereich größtenteils mit Leuten gefüllt ist, die die Botschaft nicht verstanden haben. Leslie Lamports Kernpunkt ist, dass die Entwicklung der Fähigkeit zu abstraktem Denken zu besseren Programmen führt. Abstraktion im mathematischen und logischen Sinn erlaubt es, alle irrelevanten Details zu entfernen. Dasselbe gilt für AI-gestützte Softwareentwicklung

  • Wie man es bei allem erwarten kann, was mit Strenge zu tun hat, haben viele Leute nur die Überschrift gelesen und negativ reagiert. Ein Hacker bei Hacker News kann ein fähiger Programmierer sein, der Probleme lösen kann. Inzwischen kann es aber auch im Sinne von „You're a Hack“ heißen: jemand, der unfähig ist und Ergebnisse von niedriger Qualität produziert

  • Dieser Vortrag und die Diskussion sind übermäßig detailverliebt

  • Derzeit gibt es in der ACM einen guten Artikel darüber, dass man sich zwar nicht darüber einig ist, was Abstraktion ist, sie aber trotzdem sehr nützlich ist. Ich stimme weitgehend zu, wo der wichtige Punkt liegt. Ich stimme nicht darin überein, was er genau ist und warum er wichtig ist. Man kann viel Inspiration daraus ziehen, und das ist für sich genommen schon wertvoll

  • Hacking ist kein Coding, kein Programmieren, keine Softwareentwicklung und kein Software Engineering. Am Ende verwenden jedoch viele Leute diese Begriffe fast austauschbar, und die Unterschiede in den jeweils persönlich verwendeten Definitionen zu betonen, ist kaum eine produktive Nutzung der Zeit