4 ポイント 投稿者 GN⁺ 2024-04-29 | 1件のコメント | WhatsAppで共有

15か月で640ページの本を完成

  • 2021年7月29日、プログラミング言語に関する書籍『Crafting Interpreters』を完成。15か月前に完成したとしていたが、今回は本当に完成した。印刷版、e-book、PDF版のすべてが揃い、購入可能になった。
  • 640ページ、横8インチ・縦10インチで、予想よりはるかに大きな本になった。

新しいビルドシステムの開発

  • 1か月ほど休んだ後、再び作業を開始。読者が報告してくれた誤字やミスを修正。
  • 特別な理由もなく、書籍のビルドシステムをDartで新たに書き直した。以前のPython製のものは遅すぎて、保守もしにくかった。
  • 新しいビルドシステムは、思い通りに正確なHTMLとsyntax-highlightされたコードを生成でき、従来のPython版より10倍も高速になった。
  • Markdown処理をより細かく制御できるようになったが、当時は単に楽しみでやった作業だった。

書籍デザイン

  • 大きなグラフィックデザインのプロジェクトは、Webやゲームプログラミングのように二段階で進む。まず「フレームワーク」や「エンジン」を設定し、その構造にコンテンツを流し込む。
  • Adobe InDesignではスタイルとマスターを設定する。マスターはページの余白やグリッドラインを定義し、スタイルはCSSのように特定のテキストやオブジェクトにフォント、スタイル、色を指定する。
  • 書籍デザインは文字通り二次元空間での作業だ。水平方向と垂直方向の両方で、簡単ではない作業になる。

幅と高さの決定

  • メインの本文カラムは、最も長いコード行を収められるだけの幅が必要。Asideは特定の文の横に配置する必要があり、さらにスペースが要る。
  • 結局、横幅8インチのページ寸法を採用した。高さを10インチにしたのは、POD(Publish on Demand)業者が対応するサイズの制約によるもの。
  • 全体としては大きいが、大きすぎるという印象にはならないことを願っている。次に本を書くなら、もっと小さな本にするつもりだ。

XML処理

  • InDesignはXML importをサポートしている。特定のタグに自動でスタイルを適用できる。
  • Markdown処理を完全に制御できたので、InDesign向けに最適化したXMLを直接生成できた。

InDesignでのJavaScript

  • XML importだけでは限界がある。Asideやコード位置の表示は本文から取り出して横に配置しなければならない。
  • InDesignはJavaScriptでスクリプトを書ける。ただし、デバッガやスタックトレースのようなものはなく、あるのはalert()だけ。
  • なんとかAsideと位置タグを取り出して別のテキストボックスにするスクリプトは書けたが、正確な位置指定はできなかった。InDesignのアンカー機能である程度解決した。

編集作業

  • 書籍全体をもう一度読み返しながら編集。同じ言葉遊びを何度も繰り返していたことに気づいた。5か月かかった。
  • プロの校正編集者を雇った。Wordを使う編集の世界とは違い、自分はplain textとGitにこだわったが、編集者はうまく適応してくれた。

組版作業

  • 組版作業の流れは次の通り。
    1. 次の章用の新しいInDesignファイルを作成
    2. XMLとしてexport
    3. InDesignにXML import
    4. JSスクリプトでAsideと位置タグを抽出
    5. Sidebar要素にアンカーを設定
    6. ページ末尾の空白を調整
  • 1〜5の工程は簡単だったが、6の工程が最も難しかった。
  • 図が切れたり、Asideが次のページに送られたりしてはならず、可能ならコードもページ途中で切りたくない。ヘッダーの下に本文がないままページが終わるのも避ける必要があり、widow/orphanを防ぐことも重要だった。
  • 630ページものすべてにこれらのルールを適用するのは簡単ではなかった。

挿絵

  • 挿絵は比較的簡単だった。白黒のペン画なので印刷に向いていた。
  • ただし、ページ上に配置するのはまた別の問題だった。自分の本は挿絵を直接参照するように文章を書いていたため、挿絵は言及された位置の近くにある必要があった。そこで630ページにわたって、挿絵とコード、本文がうまく収まるよう手作業で調整しなければならなかった。

前付け・後付けの作業

  • プロの索引作成者という職業があることを初めて知った。自分は2週間かけて索引を自作した。
  • 前付けにはタイトル、著作権、献辞、謝辞を入れ、InDesignに目次を自動生成させた。ここまででようやく本の中身が完成した。

表紙デザイン

  • 本の表紙は重要だ。自分の本はペン画風の挿絵が特徴なので、それを活かすことにした。
  • 登山のメタファーとして使っていた山の絵を、より大きく細部まで描き込んだ。タイトルも手書きで新しく描いた。
  • 1950年代のスカウトマニュアルのような色使いにした。

校正刷りの確認

  • PODで注文した校正刷りで、初めて本の大きさを実感した。長い時間をかけた作業量が感じられた。
  • しかし、まだ終わりではない。多くの部分を手作業で組版したためミスがあるかもしれず、もう一度読み返して確認する必要があった。
  • InDesignファイルをGitに上げていたが、バイナリなので変更点の確認が難しかった。
  • 校正刷りと変更点を比較するため、DartスクリプトでPDFを1ページずつ画像化し、Photoshopアクションでピクセル差分のある箇所に赤い枠を描かせた。
  • プログラムによって意図した変更だけが行われたことを正確に確認でき、安心できた。

E-book制作

  • ビルドシステムを活用して、EPUBに必要なXHTMLとメタデータをすべて生成した。複数のリーダーでテストしながらCSSを調整した。

GN⁺の意見

  • 6年にわたる長い道のりの末に、640ページもの大作を完成させたのは見事な成果だ。執筆過程でDartによるビルドシステムを自作し、組版のためにInDesign用スクリプトまで作るなど、プログラミング技術を総動員している点が興味深い。

  • とりわけ、校正刷りの段階で変更検証のためにPDF比較用スクリプトを作った部分には感心させられる。こうした発想と実行力があってこそ、個人でself-publishingができるのだろう。

  • ただ、目標としていたページサイズが大きかったために組版作業が容易ではなかった点や、印刷所の事情でサイズ選択に制約があった点は惜しい。次回作では、より出版向きのサイズを選ぶとよさそうだ。

  • 著者が述べているように、プログラミング言語の解説書では表紙デザインが売れ行きに大きく影響するわけではないかもしれないが、この本のデザインコンセプトのように内容の特徴を反映した個性的な表紙は、むしろ目を引く強みになり得る。

  • 実に6年間、合間を縫って書き続けたという点からも、著者の情熱と粘り強さには敬意を表したい。あとは読者がこの本をどれほど手に取り、どのようなフィードバックを返すのかを見守るだけだ。プログラミング言語を学ぼうとする多くの人にとって、間違いなく役立つ一冊になりそうだ。

1件のコメント

 
GN⁺ 2024-04-29
Hacker Newsのコメント
  • Crafting Interpreters には、書籍購入リンクと無料のオンライン版リンクの両方を提供するウェブページがある
  • 著者のNystromが紙の書籍のデザインに払った細やかな配慮、手描きの挿絵、そして優れた文章のおかげで、技術書の99%よりも出来がよく、十分に買う価値がある
  • 2017年からこの本で学び始め、前半を終えるころにはトークナイザー/レクサー/パーサー/インタプリタへの理解が明確になった。これはNystromの優れた文章力と主題への深い理解のおかげだ
  • 著者が実物の本にすることを決めたとは知らなかったが、自分にとって最適な学習方法ではないにせよ、コレクション用として、そして著者を支援するために購入したい
  • これまで読んだ技術書の中でも最高水準で、読みながら多くを学べて本当に楽しかった。優れた技術的内容に加えて、文章はよく書けていて、機知に富み、挿絵も素晴らしい
  • 各章の終わりに進化していくコードと実行可能なプログラムを備えるというビジョンが印象的で、著者がそれをやり遂げたことに賛辞を送りたい。ツリーウォーク・インタプリタは飛ばし、Cベースのバイトコード・インタプリタの部分を通してはるかに多くを学んだ
  • 皮肉にも読むのに15か月かかったというコメントもあるが、著者の労に感謝し祝福を伝えている。言語分野で技術的な深みがあるだけでなく、レイアウトやグラフィックの細部まで読者を没入させる本で、今後長く意味のある一冊であり続けるだろう
  • この本を読んで学んだ内容をもとに、自分で https://hexmos.com/compiler のページを作るほど、この本に強い愛着を持っている
  • 著者Bobへのインタビュー(https://corecursive.com/032-bob-nystrom-on-building-an-interpreter/)は聴く価値がある
  • 著者がグラフィックデザイナー出身のコンパイラエンジニアだという事実が印象的だ
  • Writing an Interpreter in Go を読んだあと、次のインタプリタ本としてこの本を読む予定で、200ページ程度と分量もちょうどよく気に入っている
  • (2021年のコメント)素晴らしい本で、読みながら本当に楽しかったとのこと