4 Punkte von GN⁺ 2024-04-29 | 1 Kommentare | Auf WhatsApp teilen

Ein 640-seitiges Buch in 15 Monaten fertiggestellt

  • Am 29. Juli 2021 wurde das Buch "Crafting Interpreters" über Programmiersprachen fertiggestellt. Vor 15 Monaten hieß es schon, es sei fertig, aber jetzt ist es wirklich abgeschlossen. Die gedruckte Ausgabe, das E-Book und die PDF-Version sind nun alle verfügbar und können gekauft werden.
  • Mit 640 Seiten und einem Format von 8 Zoll Breite und 10 Zoll Höhe ist das Buch deutlich größer geworden als erwartet.

Entwicklung eines neuen Build-Systems

  • Nach etwa einem Monat Pause wurde die Arbeit wieder aufgenommen. Tippfehler und Fehler, die Leser gemeldet hatten, wurden korrigiert.
  • Ohne besonderen Grund wurde das Build-System des Buchs neu in Dart geschrieben. Die bisherige Python-Version war zu langsam und schwer wartbar.
  • Das neue Build-System erzeugt nun exakt das gewünschte HTML und syntaxhervorgehobenen Code und ist im Vergleich zur bisherigen Python-Version zehnmal schneller.
  • Dadurch ließ sich die Markdown-Verarbeitung viel besser steuern, auch wenn das damals eher aus Spaß an der Sache entstand.

Buchdesign

  • Große Grafikdesign-Projekte laufen ähnlich ab wie Web- oder Spieleprogrammierung: Zuerst wird das "Framework" oder die "Engine" eingerichtet, dann werden die Inhalte in diese Struktur eingefügt.
  • In Adobe InDesign werden dafür Stile und Masterseiten definiert. Masterseiten legen Seitenränder und Rasterlinien fest, und Stile weisen wie CSS bestimmten Texten oder Objekten Schriftarten, Stil und Farben zu.
  • Buchdesign ist im wörtlichen Sinn Arbeit in einem zweidimensionalen Raum. Sowohl horizontal als auch vertikal ist das keine einfache Aufgabe.

Breite und Höhe festlegen

  • Die Haupttextspalte musste breit genug sein, um die längsten Codezeilen aufzunehmen. Asides mussten neben bestimmten Sätzen platziert werden und benötigten daher zusätzlichen Raum.
  • Letztlich fiel die Entscheidung auf ein Seitenformat mit 8 Zoll Breite. Die Höhe von 10 Zoll wurde wegen der Größenbeschränkungen des POD-Anbieters (Print on Demand) gewählt.
  • Insgesamt ist das Buch groß, soll sich aber nicht zu groß anfühlen. Falls noch einmal ein Buch geschrieben wird, soll es kleiner werden.

XML-Verarbeitung

  • InDesign unterstützt den XML-Import. Bestimmten Tags können automatisch Stile zugewiesen werden.
  • Da die Markdown-Verarbeitung vollständig kontrolliert werden konnte, ließ sich direkt auf InDesign optimiertes XML erzeugen.

JavaScript in InDesign

  • Allein mit dem XML-Import gibt es Grenzen. Asides und Positionsmarkierungen für Code mussten aus dem Fließtext herausgelöst und seitlich platziert werden.
  • InDesign lässt sich mit JavaScript skripten. Allerdings gibt es weder einen Debugger noch Stack-Traces, sondern nur alert().
  • Irgendwie wurde ein Skript geschrieben, das Asides und Positions-Tags extrahiert und in separate Textrahmen umwandelt, aber eine exakte Positionierung gelang nicht. Das ließ sich teilweise mit der Ankerfunktion von InDesign lösen.

Lektorat

  • Das gesamte Buch wurde noch einmal gelesen und überarbeitet. Dabei fiel auf, wie oft dieselben Wortspiele wiederholt wurden. Das dauerte fünf Monate.
  • Ein professioneller Korrektor wurde engagiert. Anders als in der Editor-Welt, die mit Word arbeitet, wurde hier an Plain Text und Git festgehalten. Der Korrektor kam damit gut zurecht.

Satzarbeiten

  • Der Ablauf des Satzes sah wie folgt aus:
    1. Eine neue InDesign-Datei für das nächste Kapitel erstellen
    2. Als XML exportieren
    3. XML in InDesign importieren
    4. Mit einem JS-Skript Asides und Positions-Tags extrahieren
    5. Den Sidebar-Elementen Anker zuweisen
    6. Leerraum am Seitenende anpassen
  • Die Schritte 1 bis 5 waren einfach, aber Schritt 6 war am schwierigsten.
  • Bilder durften nicht abgeschnitten werden, Asides durften nicht auf die nächste Seite rutschen, und nach Möglichkeit sollte auch Code nicht über Seitenumbrüche getrennt werden. Außerdem sollte eine Seite nicht direkt unter einer Überschrift enden, und auch Widow/Orphan-Situationen mussten vermieden werden.
  • All diese Regeln auf 630 Seiten anzuwenden, war alles andere als einfach.

Illustrationen

  • Die Illustrationen waren vergleichsweise einfach. Sie wurden schwarzweiß mit der Feder gezeichnet und eigneten sich daher gut für den Druck.
  • Ihre Platzierung auf den Seiten war jedoch wieder ein anderes Problem. Da der Text die Illustrationen direkt referenziert, mussten sie in der Nähe der jeweiligen Erwähnung stehen. Deshalb mussten auf 630 Seiten Illustrationen, Code und Fließtext manuell so angepasst werden, dass alles gut platziert ist.

Arbeit an Vorder- und Endmatter

  • Erst dabei wurde klar, dass es sogar professionelle Indexer gibt. Der Index wurde stattdessen selbst in zwei Wochen erstellt.
  • Im vorderen Teil wurden Titel, Copyright, Widmung und Danksagung eingefügt, und InDesign erzeugte automatisch das Inhaltsverzeichnis. Damit war der eigentliche Buchinhalt endlich fertig.

Cover-Design

  • Das Cover eines Buchs ist wichtig. Da dieses Buch sich durch Illustrationen im Federzeichnungsstil auszeichnet, sollte genau das genutzt werden.
  • Die Bergillustration, die als Klettermetapher verwendet wurde, wurde größer und detailreicher neu gezeichnet. Auch der Titel wurde von Hand neu geschrieben.
  • Verwendet wurden Farben mit einem Flair wie aus einem Pfadfinderhandbuch der 1950er Jahre.

Prüfung des Korrekturabzugs

  • Mit einem als POD bestellten Korrekturabzug wurde zum ersten Mal die tatsächliche Größe des Buchs greifbar. Auch das Ausmaß der langen Arbeit wurde deutlich.
  • Aber selbst da war noch nicht alles vorbei. Da beim Satz vieles manuell erledigt wurde, konnten sich Fehler eingeschlichen haben, weshalb alles noch einmal gelesen und überprüft werden musste.
  • Die InDesign-Dateien wurden in Git eingecheckt, aber da es Binärdateien sind, lassen sich Änderungen nur schwer nachvollziehen.
  • Für den Vergleich von Korrekturabzug und Änderungen wurde mit einem Dart-Skript jede PDF-Seite in ein Bild umgewandelt, und eine Photoshop-Aktion zeichnete rote Rahmen um Pixelbereiche mit Unterschieden.
  • So ließ sich programmatisch verifizieren, dass genau die beabsichtigten Änderungen vorgenommen worden waren, was beruhigend war.

Erstellung des E-Books

  • Mithilfe des Build-Systems wurden das gesamte für EPUB benötigte XHTML und die Metadaten erzeugt. Anschließend wurde das CSS durch Tests auf verschiedenen Readern angepasst.

Meinung von GN⁺

  • Die Fertigstellung eines 640 Seiten starken Buchs nach einer sechsjährigen Mammutaufgabe ist eine beeindruckende Leistung. Besonders interessant ist, dass beim Schreibprozess die Programmierkenntnisse voll eingesetzt wurden, etwa durch die Eigenentwicklung eines Build-Systems in Dart und durch Skripte für InDesign zur Unterstützung des Satzes.

  • Vor allem der Teil, in dem in der Korrekturphase ein Skript zum Vergleich von PDFs für die Änderungsprüfung gebaut wurde, ist bewundernswert. Solche Ideen und diese Umsetzungskraft scheinen nötig zu sein, damit Einzelpersonen ein Buch im Self-Publishing veröffentlichen können.

  • Etwas schade ist, dass die gewünschte Seitengröße die Satzarbeit erschwert hat und dass die Wahl des Formats durch Vorgaben der Druckerei eingeschränkt war. Für ein nächstes Werk wäre ein publikationsfreundlicheres Format wohl sinnvoller.

  • Wie der Autor selbst erwähnt, beeinflusst das Cover-Design bei einem Erklärbuch zu Programmiersprachen den Verkauf vielleicht nicht stark, aber ein eigenständiges Cover, das wie hier die Besonderheiten des Inhalts aufgreift, kann durchaus ein auffälliger Vorteil sein.

  • Dass der Autor ganze sechs Jahre lang immer wieder an dem Buch geschrieben hat, verdient Respekt für Leidenschaft und Ausdauer. Jetzt bleibt nur noch abzuwarten, wie viele Leser das Buch finden und welches Feedback sie geben werden. Es dürfte auf jeden Fall vielen beim Lernen von Programmiersprachen helfen.

1 Kommentare

 
GN⁺ 2024-04-29
Hacker-News-Kommentare
  • Crafting Interpreters hat eine Webseite, die sowohl einen Link zum Kauf des Buchs als auch einen Link zur kostenlosen Online-Version anbietet
  • Dank der sorgfältigen Aufmerksamkeit, die Nystrom dem Design der gedruckten Ausgabe gewidmet hat, der handgezeichneten Illustrationen und des hervorragenden Schreibstils ist es besser als 99 % der Fachbücher und den Kauf absolut wert
  • Ich habe 2017 angefangen, mit diesem Buch zu lernen, und als ich die erste Hälfte abgeschlossen hatte, wurde mein Verständnis von Tokenizer/Lexer/Parser/Interpreter deutlich klarer. Das ist Nystroms großartigem Schreibstil und seinem tiefen Verständnis des Themas zu verdanken
  • Ich wusste nicht, dass der Autor beschlossen hatte, daraus ein gedrucktes Buch zu machen; auch wenn das nicht meine ideale Lernform ist, würde ich es gern als Sammlerstück kaufen und um den Autor zu unterstützen
  • Es gehört zu den besten Fachbüchern, die ich je gelesen habe; ich habe beim Lesen viel gelernt und es wirklich genossen. Neben dem großartigen technischen Inhalt ist es gut geschrieben, witzig und die Illustrationen sind ebenfalls gelungen
  • Die Vision, am Ende jedes Kapitels über sich weiterentwickelnden Code und ein lauffähiges Programm zu verfügen, war beeindruckend, und ich ziehe den Hut davor, dass der Autor das umgesetzt hat. Ich habe den Tree-Walking-Interpreter übersprungen und aus dem Teil über den Bytecode-Interpreter in C viel mehr gelernt
  • Ein Kommentator schrieb ironischerweise, dass er 15 Monate gebraucht habe, um das Buch zu Ende zu lesen, und bedankt sich beim Autor für seine Mühe und gratuliert ihm. Es ist ein Buch mit technischer Tiefe im Bereich Programmiersprachen, bei dem auch kleine Details in Layout und Grafik die Leser fesseln, und es dürfte noch lange ein bedeutendes Buch bleiben
  • Ich hänge so sehr an diesem Buch, dass ich auf Basis dessen, was ich daraus gelernt habe, sogar selbst die Seite https://hexmos.com/compiler erstellt habe
  • Ein Interview mit Bob, dem Autor (https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/), ist hörenswert
  • Beeindruckend ist, dass der Autor ein Compiler-Ingenieur mit Hintergrund im Grafikdesign ist
  • Nachdem ich Writing an Interpreter in Go gelesen habe, werde ich dieses Buch als mein nächstes Interpreter-Buch lesen; mit rund 200 Seiten hat es außerdem eine angenehme Länge, was mir gefällt
  • (Kommentar von 2021) Ein großartiges Buch, das beim Lesen wirklich viel Freude gemacht hat