Crafting Interpreters : un livre de 640 pages achevé en 15 mois
(journal.stuffwithstuff.com)Un livre de 640 pages achevé en 15 mois
- Le 29 juillet 2021, l’auteur a achevé le livre « Crafting Interpreters » consacré aux langages de programmation. Il avait dit l’avoir terminé 15 mois plus tôt, mais cette fois il est vraiment fini. Les versions imprimée, e-book et PDF sont désormais toutes prêtes et disponibles à l’achat.
- Avec 640 pages et un format de 8 pouces sur 10, le livre est devenu bien plus grand que prévu.
Développement d’un nouveau système de build
- Après environ un mois de repos, le travail a repris. Les fautes de frappe et erreurs signalées par les lecteurs ont été corrigées.
- Sans raison particulière, le système de build du livre a été entièrement réécrit en Dart. L’ancienne version en Python était trop lente et difficile à maintenir.
- Le nouveau système de build génère exactement le HTML et le code avec coloration syntaxique souhaités, et il est dix fois plus rapide que l’ancienne version Python.
- Il a aussi permis de mieux contrôler le traitement du Markdown, même si à l’époque cela avait surtout été fait pour le plaisir.
Design du livre
- Un grand projet de design graphique se déroule en deux étapes, comme dans le développement web ou la programmation de jeux : on met d’abord en place un « framework » ou un « moteur », puis on y insère le contenu.
- Dans Adobe InDesign, cela consiste à définir des styles et des masters. Les masters définissent les marges et les lignes de grille des pages, tandis que les styles attribuent police, style et couleur à certains textes ou objets, un peu comme le CSS.
- Le design d’un livre est littéralement un travail dans un espace en deux dimensions. Travailler à la fois sur l’horizontal et le vertical n’a rien de simple.
Choisir la largeur et la hauteur
- La colonne principale devait être assez large pour accueillir les lignes de code les plus longues. Les encadrés devaient aussi être placés à côté de certaines phrases, ce qui demandait encore plus d’espace.
- Au final, un format de page de 8 pouces de large a été retenu. Le choix d’une hauteur de 10 pouces venait des contraintes de taille prises en charge par le prestataire POD (Publish on Demand).
- L’ensemble est assez grand, mais l’auteur espérait que cela ne paraîtrait pas excessif. S’il écrit un autre livre, il le fera plus petit.
Traitement XML
- InDesign prend en charge l’import XML. Il peut appliquer automatiquement des styles à certaines balises.
- Comme le traitement du Markdown était totalement maîtrisé, il a été possible de générer directement un XML optimisé pour InDesign.
JavaScript dans InDesign
- L’import XML seul avait ses limites. Les encadrés et marqueurs de position de code devaient être extraits du corps du texte pour être placés sur le côté.
- InDesign peut être scripté en JavaScript. En revanche, il n’y a ni débogueur ni stack trace, seulement
alert(). - Un script a malgré tout été écrit pour extraire les encadrés et balises de position vers des zones de texte séparées, mais sans parvenir à les positionner précisément. La fonction d’ancrage d’InDesign a permis de résoudre une partie du problème.
Travail éditorial
- L’auteur a relu tout le livre pour l’éditer et s’est rendu compte qu’il répétait souvent les mêmes jeux de mots. Cela a pris cinq mois.
- Un correcteur-réviseur professionnel a aussi été engagé. Contrairement au monde de l’édition centré sur Word, l’auteur est resté fidèle au plain text et à Git. L’éditeur s’y est bien adapté.
Travail de composition
- Le processus de composition était le suivant :
- créer un nouveau fichier InDesign pour le chapitre suivant
- exporter en XML
- importer le XML dans InDesign
- extraire les encadrés et balises de position via un script JS
- ancrer les éléments de sidebar
- ajuster les espaces vides en bas de page
- Les étapes 1 à 5 étaient simples, mais l’étape 6 était de loin la plus difficile.
- Il ne fallait pas que les illustrations soient coupées ni que les encadrés passent à la page suivante ; si possible, le code non plus ne devait pas être coupé par une page. Il fallait aussi éviter qu’une page se termine juste après un en-tête sans contenu dessous, ainsi que les problèmes de widow/orphan.
- Appliquer toutes ces règles sur pas moins de 630 pages n’a pas été simple.
Illustrations
- Les illustrations ont été relativement faciles à produire. Elles étaient dessinées au stylo en noir et blanc, donc adaptées à l’impression.
- En revanche, leur placement dans les pages posait un autre problème. Comme le texte du livre faisait directement référence aux illustrations, celles-ci devaient se trouver près de l’endroit où elles étaient mentionnées. Il a donc fallu ajuster manuellement, sur 630 pages, la disposition des illustrations, du code et du texte.
Parties liminaires et finales
- L’auteur a découvert qu’il existait aussi des indexeurs professionnels. Il a finalement créé lui-même l’index pendant deux semaines.
- Dans les pages liminaires, il a ajouté le titre, les mentions de copyright, la dédicace et les remerciements, puis a laissé InDesign générer automatiquement la table des matières. À ce stade, l’intérieur du livre était enfin terminé.
Design de la couverture
- La couverture d’un livre est importante. Comme ce livre se distingue par ses illustrations au trait, il a été décidé de s’appuyer dessus.
- L’illustration de la montagne utilisée comme métaphore de l’ascension a été redessinée en plus grand et avec davantage de détails. Le titre a aussi été réécrit à la main.
- Des couleurs rappelant les manuels de scout des années 1950 ont été utilisées.
Vérification des épreuves
- En recevant les épreuves commandées en POD, l’auteur a réalisé pour la première fois la taille réelle du livre. Toute l’ampleur du travail accumulé sur une longue période s’est alors fait sentir.
- Mais ce n’était pas encore terminé. Comme une grande partie de la composition avait été faite à la main, des erreurs pouvaient subsister, et il fallait donc tout relire une nouvelle fois.
- Les fichiers InDesign ont été placés dans Git, mais comme ce sont des binaires, il était difficile de vérifier les modifications.
- Pour comparer les épreuves et les changements, un script Dart convertissait le PDF en images page par page, puis une action Photoshop traçait un contour rouge là où des différences de pixels apparaissaient.
- Cela a permis de vérifier par programmation que seules les modifications intentionnelles avaient été appliquées, ce qui a rassuré l’auteur.
Fabrication de l’e-book
- En s’appuyant sur le système de build, tous les XHTML et métadonnées nécessaires à l’EPUB ont été générés. Le CSS a ensuite été ajusté après des tests sur plusieurs liseuses.
Avis de GN⁺
-
Achever, après six ans de travail au long cours, un livre de 640 pages est une réussite remarquable. Il est particulièrement intéressant de voir que l’auteur a mobilisé toutes ses compétences en programmation, en développant lui-même un système de build en Dart et des scripts pour InDesign afin d’assurer la composition.
-
Le passage où il crée un script de comparaison de PDF pour vérifier les modifications au stade des épreuves est particulièrement impressionnant. Il semble qu’il faille ce genre d’idées et cette capacité d’exécution pour autoéditer un livre à titre individuel.
-
On peut toutefois regretter que le format de page visé, assez grand, ait compliqué la composition, et que le choix de taille ait été limité par les contraintes de l’imprimeur. Pour un prochain ouvrage, il vaudrait mieux choisir un format plus favorable à l’édition.
-
Comme l’auteur le souligne, pour un livre d’explication sur les langages de programmation, le design de couverture n’aura sans doute pas un impact majeur sur les ventes. Mais une couverture originale qui reflète les caractéristiques du contenu, comme c’est le cas ici, peut au contraire devenir un vrai point fort visuel.
-
Le fait que l’auteur ait écrit ce livre par intermittence pendant pas moins de six ans force le respect pour sa passion et sa persévérance. Il ne reste plus qu’à voir à quel point les lecteurs s’y intéresseront et quels retours ils en feront. Il semble certain que ce livre aidera de nombreuses personnes à apprendre les langages de programmation.
1 commentaires
Avis Hacker News
Crafting Interpretersdispose d'une page web proposant à la fois un lien d'achat du livre et un lien vers sa version gratuite en ligneWriting an Interpreter in Go, je compte lire ce livre comme prochain ouvrage sur les interpréteurs ; avec environ 200 pages, sa longueur me semble idéale et me plaît