4 Punkte von GN⁺ 2024-11-17 | 1 Kommentare | Auf WhatsApp teilen
  • Ausgelöst dadurch, dass er einem Studenten das Buch als Sommerlektüre ausgeliehen hatte, stellte Simon Dobson erneut fest, dass SICP das Informatikbuch ist, das seine Karriere und Forschungsinteressen am stärksten geprägt hat
  • Anders als die Pascal-zentrierte Einführungsausbildung beginnt dieses Buch bei Werten, Namen, Bindung und Kontrolle und zeigt, was Programmierung sein kann
  • Es verbindet lambda-Abstraktion, Berechnungen höherer Ordnung, Streams, Lazy Evaluation, Interpreter und Compiler, Garbage Collection, virtuellen Speicher, Maschinensprache und sogar domänenspezifische Sprachen innerhalb von Scheme
  • Der größte Einfluss liegt in der geschichteten Gestaltung komplexer Systeme aus mehreren Sprachebenen und in der Sicht auf Informatik als Disziplin nicht des „Was ist etwas?“, sondern des „Wie macht man es?“
  • Ein 1988 gekauftes Buch war 2010 immer noch praktisch lesenswert, und SICP bleibt ein langlebiges Grundlagenwerk der Informatik

Die erste Begegnung mit SICP

  • Nachdem Simon Dobson einem Studenten Structure and Interpretation of Computer Programs als Sommerlektüre ausgeliehen hatte, erinnerte er sich daran, dass dieses Buch für ihn wohl das grundlegendste Werk der gesamten Informatik ist
  • Der offizielle Titel lautet Structure and Interpretation of Computer Programs von Hal Abelson und Jerry Sussman; es erschien 1984 bei MIT Press und ist auch als SICP bekannt
  • Das Buch ist weiterhin im Druck und vollständig online verfügbar
  • Dobson begegnete dem Buch als empfohlener Lektüre, nachdem er im zweiten Jahr seines ersten Studiums in Newcastle upon Tyne seinen ersten Programmierkurs abgeschlossen hatte
  • Für ihn, der damals noch seinen Weg in der Informatik suchte, zeigte SICP nicht die „Programmierung jener Zeit“, die durch Pascal geprägt war, sondern mögliche Formen von Programmierung

In Scheme aufgebaute Konzepte

  • SICP beginnt mit den grundlegenden Elementen der Programmierung – Werte, Namen, Bindung und Kontrolle – und erweitert sich dann zu einem breiten Spektrum von Themen
    • lambda-Abstraktion und Berechnungen höherer Ordnung
    • komplexe Datenstrukturen, die Berechnungsinhalte enthalten
    • Modularität, Veränderbarkeit
    • Streams
    • Lazy Evaluation
    • Aufbau von Interpretern und Compilern
    • Speicherverwaltung, Garbage Collection, virtueller Speicher
    • Maschinensprache
    • domänenspezifische Sprachen
  • Die behandelte Spannweite ist fast verblüffend groß, bleibt aber dank der Schreibweise und Struktur der Autoren konsistent
  • Besonders wichtig ist, dass alle Konzepte innerhalb eines einzigen sprachlichen Rahmens, nämlich Scheme, behandelt werden und jedes neue Konzept auf dem zuvor Gelernten aufbaut

Programmentwurf als Sprachentwurf

  • Ein zweites Merkmal von SICP mit großem Einfluss ist, dass Hal Abelson und Jerry Sussman alles als Übung im Sprachentwurf betrachten
  • Das Buch betont die geschichtete Gestaltung komplexer Systeme aus Sprachen auf mehreren Ebenen
    • Jede Ebene wird aus Bausteinen zusammengesetzt, die auf dieser Ebene als primitiv gelten
    • Die auf einer Ebene erzeugten Bausteine werden als primitive Elemente der nächsten Ebene verwendet
    • Die Sprache jeder Ebene besitzt primitive Elemente, Kombinationsmittel und Abstraktionsmittel, die zu ihrem jeweiligen Detailgrad passen
  • Hierarchische Abstraktion an sich ist Informatikern vertraut, doch der entscheidende Unterschied ist hier die Sichtweise, dass jede Schicht programmierbar sein muss
  • In dieser Perspektive sind Schichten nicht bloß ein Mittel zum Verbergen von Informationen, sondern ein Mittel zum Umgang mit Berechnung und Transformation
  • In Mainstream-Programmiersprachen führt eine solche Schichtung nur schwer zu einer Erweiterung der Sprache selbst
    • Java ist von oben bis unten Java; es gibt Klassen und Bibliotheken, aber keine neuen Kontrollstrukturen
    • Selbst wenn für eine bestimmte Domäne eigene Sprachkonstrukte nützlich wären, lassen sie sich innerhalb der Sprache nicht leicht hinzufügen
    • Umgekehrt ist es innerhalb der Sprache auch schwer, bestimmte Konstrukte für eine Domäne gezielt auszuschließen
    • Java-ME hat einige Funktionen entfernt, um auf kleinen Geräten zu laufen, aber nicht auf eine Weise, die ohne Neuschreiben des Compilers möglich wäre

Nicht „was es ist“, sondern „wie man es macht“

  • Der dritte wichtige Einfluss ist die Sicht von SICP darauf, womit sich Informatik tatsächlich beschäftigt
  • SICP versteht die Computerrevolution als eine Revolution darin, wie wir denken und wie wir Gedanken ausdrücken
  • Das Buch beschreibt dies als prozedurale Epistemologie (procedural epistemology)
    • Während die klassische Mathematik einen Rahmen bietet, um „was etwas ist“ präzise zu behandeln
    • bietet die Berechnung einen Rahmen, um „wie man etwas macht“ präzise zu behandeln
  • Dobson hat die Sicht vertreten, dass Computer wie neue Mikroskope sind, die bestehende Ansätze unterstützen und zugleich neue Wissenschaften eröffnen
  • Dieser Aspekt des „Wie macht man es?“ in der Informatik taucht in vielen Bereichen erneut auf
    • die Beschreibung des Verhaltens von Sensornetzwerken, die sich anpassen können, während sie weiterhin verteilte Phänomene widerspiegeln
    • die Interpretation großer Datenmengen, die im gesamten Web gewonnen und kombiniert werden
    • die Erfassung zur Automatisierung wissenschaftlicher Methoden und Prozesse
  • Der Reichtum dieser Bereiche fördert eher die Integration über Programmiersprachen als über Paketsoftware und hält mit Sprachen wie R Schnittstellen und Strukturen flexibel und experimentierbar

Warum ein altes Buch noch immer gelesen wird

  • Auf der Innenseite von Dobsons Exemplar stand als Kaufdatum September 1988, und ein nach fast 22 Jahren immer noch relevantes Buch war 2010 bemerkenswert
  • Er betrachtet SICP nicht bloß aus historischem Interesse, sondern als fast das einzige Informatikbuch dieses Alters, das man noch sinnvoll erneut lesen kann
  • In Mathematikbüchern sind langlebige Inhalte nicht ungewöhnlich, in der Informatik mit ihren schnelllebigen Ideen und oft vorübergehenden Themen jedoch selten
  • Dass der Inhalt von SICP kaum veraltet ist, zeigt, wie gut das Buch die Kernkonzepte der Informatik erfasst
  • Deshalb ist SICP eines der wenigen Informatikbücher, die es wert sind, mehr als einmal gelesen zu werden; ähnlich wie Feynmans Lectures on Physics in der Physik wird es als ein Werk gesehen, das das Wesen seines Fachs zugänglich destilliert und die Zeit überdauert
  • In der Aktualisierung vom 27. Januar 2024 wird das Buch auch unter Structure and interpretation of computer programs in der annotated Lisp bibliography aufgeführt

1 Kommentare

 
GN⁺ 2024-11-17
Hacker-News-Kommentare
  • „Klassiker“ wie SICP handeln zwar von Programmdesign, aber heute scheint Systemdesign eine viel wichtigere Fähigkeit zu sein.
    Ich weiß nicht, ob verteilte Systeme zur „Computer Science“ gehören, aber in der Praxis sind das die Probleme, die man häufiger lösen muss.
    Ich neige dazu, Systeme so einfach wie möglich zu bauen, mit Observability-Tools die Stellen zu finden, an denen das Design unzureichend ist, und dann bei Bedarf Datenstrukturen oder „computerwissenschaftliche“ Lösungen hervorzuholen.
    In den meisten Fällen sind Big-O-Notation und Laufzeitkomplexität nicht wichtig, und mit Arrays und schnellen CPUs lassen sich viele Probleme lösen.
    Selbst wenn Performance-Probleme auftreten, sollte man zuerst per Profiling die Bottlenecks finden.
    Computer Science vermittelt nicht besonders gut, wie der Speicher-Cache einer CPU funktioniert.
    Ein schicker Graphalgorithmus kann zwar eine gute Laufzeitkomplexität haben, aber den CPU-Cache ruinieren und dadurch langsamer sein als ein Array mit guter Cache-Nutzung.
    Die in der Praxis häufigeren Probleme sind Fehlertoleranz, die Korrektheit verteilter Locks und Queues sowie die Skalierbarkeit von Systemen.
    Da ich einen Hintergrund in Computer-/Elektrotechnik habe, bin ich vielleicht voreingenommen.

    • Um Systeme zu entwerfen, braucht man eine Implementierungsperspektive; selbst wenn man in der Wertschöpfungskette nach oben geht und Design macht, kann man die Erfahrung auf den unteren Ebenen nicht überspringen.
      CPU-Speicher-Caches habe ich vor 30 Jahren im ersten Semester des CS-Studiums mit dem Buch von Hennessy und Patterson gelernt, und meines Wissens wird das auch heute noch verwendet.
      Fehlertoleranz, die Korrektheit verteilter Locks und Queues sowie Systemskalierbarkeit wurden ebenfalls im CS-Grundstudium behandelt; dafür brauchte es keinen besonderen Hintergrund in Computer- oder Elektrotechnik.
    • CS und Softwareentwicklung in der Praxis haben sich etwas auseinanderentwickelt.
      Es gibt weiterhin Arbeit daran, Frameworks, Datenbank-Engines und Versionskontroll-Tools zu bauen, und solche Aufgaben erfordern täglich tiefes CS-Wissen wie Algorithmen und Datenstrukturen.
      Aber solche Stellen sind seltener geworden als früher, und oft nutzt man Postgres, statt für eine App eine eigene DB-Engine zu implementieren.
      Der Großteil der Arbeit besteht darin, Business-Logik zu implementieren; wenn man weiß, wie Datenbanken intern funktionieren, erzielt man bessere Ergebnisse, aber man kann viel funktionierende Software bauen, ohne zu wissen, wie Indizes auf der Festplatte gespeichert werden.
      Viele CS-Absolventen glauben fälschlicherweise, ihre Arbeit bestehe darin, Frameworks zu schreiben; tatsächlich nutzen sie bestehende Frameworks, implementieren Business-Logik und sollten dank ihres CS-Hintergrunds diese Frameworks tief verstehen.
    • Traditionell liegt der Fokus im Datenbankbereich stark darauf, Algorithmusprobleme zu lösen, wenn es um viel größere Datenmengen geht, die nicht vollständig in den Speicher passen.
      Daten liegen auf der Festplatte als „Pages“ vor, und im RAM gibt es eine feste Anzahl von „Page Slots“.
      Pages zwischen Festplatte und RAM zu verschieben ist langsam, also muss man das so weit wie möglich reduzieren.
      Dadurch werden auch scheinbar triviale Probleme interessant. In der klassischen Computer Science gibt es kein eigenes Konzept namens „Join“, weil es nicht komplex genug ist, um einen Namen zu rechtfertigen.
      Man neigt dazu, Algorithmusforschung als etwas rein Essenzielles zu betrachten, aber man kann Algorithmuseffizienz auch als etwas verstehen, das nur im Kontext bestimmter Daten und bestimmter Hardware Bedeutung hat.
      Genau dadurch wird die Arbeit interessant, und weil man nicht überall einfach Bibliotheken oder Kochbuchlösungen anwenden kann, bleibt algorithmische Expertise weiterhin nützlich.
    • Das stimmt, aber ich glaube, nicht nur Junioren, sondern auch erfahrene Programmierer tun sich oft mit Coding auf taktischer Ebene schwer.
      Ich kämpfe gerade mit einer Komponente, an der ich eine kleine Änderung vornehme; sie hat unnötig viel Zustand und behandelt gleichzeitig zwei Abstraktionen.
      Beim Verarbeiten von Dateien nutzt sie sowohl das Dateisystem als auch die Datenbank zur Zustandsspeicherung, und ich war überrascht, wie chaotisch das Design ist.
      Ich habe mehrere Tage damit verbracht, zu vermeiden, es wie bisher einfach weiter anzuflicken und noch schwerer verständlich zu machen.
      Die Pull-Request-Kultur scheint dazu geführt zu haben, dass beliebiger Müll freigegeben wird, ohne dass man sich wirklich tief mit dem konkreten Code beschäftigt.
      Ich wünschte, persönliche Code-Reviews kämen zurück.
    • Ich frage mich, ob du Software Design for Flexibility: How to Avoid Programming Yourself into a Corner von Chris Hanson und Gerald Jay Sussman gesehen hast.
      Ein Buch aus dem Jahr 2021
  • Der Link zur kostenlosen Kopie des Textes ist defekt
    https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
    https://web.mit.edu/6.001/6.037/sicp.pdf
    Bis heute hatte ich noch nie eine offizielle PDF-Version gesehen
    Um 2001 herum war nur die HTML-Version kostenlos, und jemand hatte sie nach TeXinfo konvertiert: https://www.neilvandyke.org/sicp-texi/
    Wenn man SICP heute durcharbeiten möchte, kann man den Code in MIT Scheme oder DrRacket ausführen: https://www.neilvandyke.org/racket/sicp/

    • Für alle, die MIT Scheme ausprobieren wollen: Die aktuellen Maintainer stellen keine .dmg mehr bereit, aber die x86_64-Version von MIT Scheme kann man herunterladen und bauen
      Das aktuelle Release (v12.1) läuft auf Macs mit Intel-CPU unter Sequoia oder auf Apple silicon über Rosetta
      Der Native-Code-Compiler ist allerdings etwas kaputt und für SICP vermutlich nicht nötig
      Vor Monterey schien es unter macOS zu funktionieren, also könnten sich von Apple bereitgestellte Abhängigkeiten geändert haben, aber ich bin dem nicht nachgegangen
      Wenn man MIT Scheme nicht unbedingt braucht und sich nicht mit dem Kompilieren herumschlagen will, ist Racket möglicherweise die bessere Wahl
    • Als Hinweis: Ich empfehle, mit Racket zu arbeiten
      Soweit ich weiß, gibt es einen expliziten SICP-Modus
      Ich habe es mit GNU Guile durchgearbeitet, aber wegen kleiner Syntaxunterschiede zwischen Guile und MIT Scheme war das ziemlich mühsam
    • Wenn man es im Browser lesen möchte: Ich erinnere mich, dass die TeXinfo-Version die Quelle für eine gut lesbare HTML5-Version war
      Die Formatierung ist besser als beim MIT-Original: https://sarabander.github.io/sicp/
    • Man sollte wissen, dass die „Bildsprache“ aus Kapitel 2 in MIT Scheme im Jahr 2024 nicht unterstützt wird
      Früher gab es dafür ein Paket, aber es wird seit fast 20 Jahren nicht mehr gepflegt
      DrRacket hat dagegen ein eigenes Paket, um diese Aufgaben zu lösen
    • DrRacket enthält SICP und HTDP als Lehrpakete
  • Man kann sich die aufgezeichneten Vorlesungen von 1986 ansehen, in denen Abelson und Sussman den Stoff dieses Buchs lehren
    Die Erklärung dazu, wie man Abstraktionen in mehreren Schichten erstellt und bündelt, ist für mich bis heute nützlich, sowohl persönlich als auch beim Mentoring
    Im Video ist das Lesson 3A, Stelle 1:07:55
    https://m.youtube.com/playlist?list=PLE18841CABEA24090

    • Der Kabbala-Witz bringt mich jedes Mal zum Lachen
    • Wenn man solche Videos sieht, ist es erstaunlich, dass diese Leute überhaupt nicht wussten, was in der Zukunft kommen würde
  • The Elements of Programming Style ist es wert, dreimal gelesen zu werden, und mir hat es bei noch viel häufigerem Wiederlesen geholfen
    Falls Interesse besteht, hier ist eine Rezension, die ich 2010 geschrieben habe: https://reprog.wordpress.com/2010/03/06/programming-books-pa...

    • Ich dachte, es ginge um Elements of Programming von Stepanov und McJones, und ehrlich gesagt würde ich auch für dieses Buch dieselbe Empfehlung und Einschätzung aussprechen
      https://elementsofprogramming.com/
  • Der Teil aus SICP, den ich am liebsten mag und der mir seit Jahren im Gedächtnis geblieben ist, ist die Idee des wunschorientierten Programmierens
    Dabei baut man etwas von oben nach unten, indem man sich wünscht, dass die Low-Level-Routinen bereits existieren
    Danach erstellt man diese Low-Level-Routinen tatsächlich und arbeitet sich bis zum Fundament vor
    Ich finde, diese Denkweise passt sehr gut zu testgetriebener Entwicklung
    Man schreibt zuerst Tests für die Funktionalität, die man gern hätte, und macht sich dann daran, diesen Wunsch zu erfüllen
    Die meisten Entwickler scheinen von unten nach oben zu bauen und am Ende etwas zu bekommen, das niemand wollte

    • Der Grund, warum man so vorgeht, ist der Wunsch nach Performance und Natürlichkeit
      Man kann sich versehentlich etwas wünschen, dessen wahre Natur man noch nicht kennt, und dann entsteht unten ein fragiles Durcheinander
      Meistens läuft es so, weil die algorithmische Natur der Dinge nur selten intuitiv ist
      Unten anzufangen ist so, als würde man mit den Quarks beginnen, die man tatsächlich hat, statt mit „wäre schön, wenn es Magie gäbe“
      Es gibt keine Magie, und wenn man unten ankommt, findet man statt magischer Teilchen Quarks; dabei verliert man auch noch die Kontext-Hinweise, die beim Übersetzen zwischen den beiden Physiken geholfen hätten
      Beide Ansätze sind nützlich. Um tiefe Probleme zu lösen, muss man sich manchmal kühn etwas wünschen
      Persönlich bevorzuge ich es allerdings, die Magie in die Schicht direkt unter der obersten Ebene zu legen
      Also: von unten nach oben bauen und kurz vor der Business-Logik eine komfortable Magieschicht schaffen, die in die Business-Sprache und zurück übersetzt
      So bleibt es anpassbar und man erzeugt kein bis nach unten verheddertes Chaos
    • Dr. Donald Knuth hat bei TeX fast genau diesen Ansatz verwendet
      Zuerst schrieb er eine passend wirkende Formatierungs-/Tagging-Methode auf, entwarf dann eine zur Markup-Sprache passende Programmierweise — also Makros — und ging anschließend an die Implementierung
      Ich versuche eine ähnliche Vorgehensweise auch bei meiner Arbeit an einer Library, die G-code in OpenSCAD modellieren soll
      Kürzlich habe ich sie in „reinem“ OpenPythonSCAD neu geschrieben, und ich hoffe, dass sie brauchbar wird
    • Die Smalltalk-Welt unterstützt diesen Ansatz gut, weil man dort im Debugger codiert
      Pharo ist einen Versuch wert
  • SICP ist das beste Buch, um es als erstes Buch beim Studium der Informatik zu lesen
    Nachdem ich viele Jahre hobbymäßig programmiert hatte, Bücher über strukturierte Programmierung gelesen und mehrere Sprachen von Pascal bis Common LISP kennengelernt hatte, verwendeten wir im Informatikstudium Abelson & Sussman – und mir gingen die Augen auf
    Es zeigt die Einfachheit, Schönheit und Interaktivität von Scheme und lehrt zugleich, dass Informatik darin besteht, verschiedene Arten von Abstraktionen schichtweise aufzubauen
    Es beginnt mit prozeduraler Abstraktion und Datenabstraktion, geht weiter dazu, eigene domänenspezifische Sprachen zu definieren und deren Compiler zu implementieren, und reicht bis dazu, neue Hardware in Software zu definieren
    Alles wirkt so natürlich, und nur echte Meister können es so aussehen lassen
    Allerdings sollte man die 2. Auflage kaufen, nicht die 1. oder eine neuere Ausgabe
    Die neuere Ausgabe verwendet Python statt Scheme, und das ist nicht so toll

  • Ich wollte SICP wirklich mögen, aber Lisp stand mir im Weg
    Haskell und Standard ML mag ich
    Mich würde interessieren, ob andere ähnliche Erfahrungen gemacht haben
    Ein Buch, das SICP im Geist ähnelt, aber eine andere Sprache als Medium nutzt, wäre interessant
    Ich möchte SICP nicht mit JavaScript machen

    • Der Artikel von 1987 A Critique of Abelson and Sussman or Why Calculating is Better than Scheming könnte interessant sein: https://dl.acm.org/doi/10.1145/24697.24706
      Der Autor schlägt vor, statt Scheme KRC oder Miranda zu verwenden
      KRC kenne ich nicht gut, aber Miranda ist eine statisch typisierte funktionale Programmiersprache, die Haskell beeinflusst hat
    • SICP ist kein Buch über Lisp, nutzt aber die besonderen Eigenschaften von Lisp, um wichtige Konzepte zu zeigen, die sich in anderen Sprachen nur schwer nachbilden lassen
      Ein SICP-ähnliches Buch ohne Scheme oder Lisp wäre entweder völlig anders als SICP oder könnte zumindest nicht dasselbe lehren
      Meiner Erfahrung nach waren Haskell und ML deutlich schwerer zu verstehen als Scheme, daher würde mich interessieren, was genau daran schwierig ist
    • Ich wollte SICP wirklich mögen, und wenn ich es vor 15 Jahren gelesen hätte, hätte ich es vermutlich gemocht
      Ich habe letzten Monat angefangen, es zu lesen, fand aber, dass es zu breit angelegt ist
      Es streift zu viele interessante mathematische Prinzipien, und gerade wenn es spannend wird, geht es zum nächsten Thema weiter
      Mit anderen Worten: Es ist zu oberflächlich
      Rückblickend half es auch nicht, dass ich schon viele Vorlesungen oder Texte gesehen hatte, die von SICP abgeleitet waren, sodass ich bei jedem neu eingeführten Thema dachte: „Schon wieder das“
    • Ich verstehe dieses Gefühl. Lisp hat mich abgestoßen, und das lag daran, dass ich nicht klug genug war
      Trotzdem habe ich mich gezwungen, es bis zum Ende durchzuarbeiten, und weil ich nicht klug genug war, Lisp gut zu beherrschen, habe ich am Ende enorm viel gelernt
      Weil ich so viel Zeit damit verbrachte, den Code zu lesen, habe ich das Gefühl, mehr gelernt zu haben, als ich mit einer vertrauten Sprache gelernt hätte
      Es gibt auch eine Python-Version von SICP
      Ich habe sie nicht selbst komplett durchgearbeitet, sondern nur grob überflogen, daher ist das keine Empfehlung; ich lasse den Link nur als Beleg da, dass sie existiert
      https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
    • Ich sehe Functional Programming in Scala, auch bekannt als Red Book of Scala, als ein Buch, das einen mit einer typisierten Sprache dennoch auf die gleiche Weise denken lehrt wie SICP
      In meinem Bücherregal stehen die beiden Bücher auch nebeneinander, und es ist definitiv lesenswert
  • Beim zweiten Lesen habe ich mich in die Fußnoten und Literaturverweise vertieft, und auch dort gab es eine große, schöne Welt
    Wenn ich mich richtig erinnere, gibt es ein Paper von Sussman und seinem Team, in dem sie einen maßgeschneiderten programmierbaren Prozessor entwarfen, um Eigenschaften von Himmelskörpern, also ihre Bahnen, zu berechnen
    Wie immer ist das ein gedankensprengender Inhalt

  • SICP hat mir früh verständlich gemacht, dass es mehrere Programmiermodelle gibt, zu einer Zeit, als ich im Bachelor nur eine begrenzte Zahl von Modellen gelernt hatte
    Es war eines der Bücher, die mir das Gefühl gaben, mich in der Dokumentation jeder Sprache, Library oder jedes Frameworks orientieren zu können

    • Einer der besten Programmierkurse, die ich an der Universität belegt habe, war ein Kurs zu vergleichenden Programmiersprachen, in dem wir jeweils etwa zwei Wochen lang verschiedene Sprachen behandelten
  • Neben SICP würde ich auch die gesamte The Little *-Reihe als Material einstufen, das man mehr als einmal lesen sollte
    Types and Programming Languages ist ebenfalls gut
    Für meine Arbeit ist das anwendbare Informatik, aber man darf es nicht nur lesen, man muss es auch implementieren
    Wenn man es nicht wiederholt, vergisst man Teile davon
    Vielleicht liegt es persönlich daran, dass ich ihn kannte und respektierte, aber ich lese Dijkstras Bücher und Paper ziemlich häufig erneut
    Heute lässt sich das nur schwer direkt anwenden, aber es ist gut fürs Gehirn, und ich halte ihn persönlich für einen hervorragenden Autor