Crafting Interpreters: Ein 640-seitiges Buch in 15 Monaten fertiggestellt
(journal.stuffwithstuff.com)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:
- Eine neue InDesign-Datei für das nächste Kapitel erstellen
- Als XML exportieren
- XML in InDesign importieren
- Mit einem JS-Skript Asides und Positions-Tags extrahieren
- Den Sidebar-Elementen Anker zuweisen
- 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
Hacker-News-Kommentare
Crafting Interpretershat eine Webseite, die sowohl einen Link zum Kauf des Buchs als auch einen Link zur kostenlosen Online-Version anbietetWriting an Interpreter in Gogelesen 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