このブログを読んでいるということは、十中八九あなたはプログラマーなのだと思う。だけどご安心を、これから書くことは、べつに技術的なことに深入りするつもりはないので、プログラマー以外にも読んでいただけます。
あなたがある程度経験のあるプログラマーなら、すくなからず技術書を読んだことがあると思う。いろいろな事情により、ぼくが、昔に比べて最近あまり技術書を読まなくなったのは事実だ。情報源のインターネットへの移行、ライフステージの変化、他の趣味が増えたこと…など、まあいろいろある。しかし、ぼくも昔は、すこしは読んだ。とくにプログラミングに入門したばかりのころは、インターネットの雲の上のプログラマーたちが紹介しているすごそうな本を目を輝かせて読んだ。読む本、読む本、みんな刺激的で、新しい知識を吸収する喜びに浸ったものだし、難しい本を読むことで、自分がすこしすごいプログラマーになれたような気分があり、それは一種の官能だった。
そんな中でも、いつまでも色褪せない、やはりすごい本だといまでも思う本が3冊ある。この記事ではそれらを紹介したい。すごさのベクトルというのはいろいろあると思う。三冊とも技術的な内容としてすごい、あるいは当時すごかったのは間違いないのだけど、今回の「すごい」は技術的な内容ではなく、著者の文書を書くことへの姿勢、伝えるということ、読者に価値を提供するやりかた。そういったことのすごさだ。それではまず一冊目。
スコット・メイヤーのEffective C++
Effective C++ は、90年代〜2000年代初頭にかけて一世を風靡した、偉大なC++解説者スコット・メイヤーズによるC++の本で、当時、C++プログラマーでこの本を読んでいなければ、もぐりと言っても過言ではなかった。C++言語というのは、その誕生の経緯や作者の設計思想から、歪な言語として成長した。言語の構文や機能が山程あり、それらを一通り覚えるだけでも一苦労。その上、ただ機能を知っているだけでは「正しく」使うことが難しい。知識が欠けていると、ふつうに使ったつもりが自分の足を打ち抜くようなことが簡単に起きた。そういった、言語の仕様からだけではわからない、良い使い方の具体例、いまで言うベストプラクティスを教えてくれたのがこの本だった。
この本の感動したところは、導入だ。ぼくは技術書でもどんな本でもまえがきや導入を読むのがすごく好きなんだけど、この本のは当時読んでしびれたのを今でも覚えている。なんというか、読者が読みやすいようにという心配りがひしひしと伝わってくるんですよ。そう、本の中に本の読み方の説明が書いてあるというのが衝撃だったんだよなあ。この本は50の独立した項目で構成される1。本というと、最初から順番に読むものという固定観念が当時のぼくにはあった。ところが、メイヤーズは、別に最初から読まなくてもよくて、興味のある章から始めればいいと丁寧に教えてくれる。そして、各章には関連する他の章への参照があるので、章から章へジャンプしながら読んでいってもいいと。すごい! ゲームブックみたいだ。たしかに興味があるとこからつまみ食いできる設計になってるのは、技術書だったらすごく助かるし、実用的だ。
もしかすると、あなたはそんなのあたり前じゃないかと思うかもしれない。けど、とくに初学者や、新しい分野に慣れない人にとっては、ランダムに読んでいいというのは、べつに自明なことではないと思う。実際に、最初から読んで、読者が知識を積み上げていくことを前提に、後半になるにつれて高度になっていくというタイプの本だって、めずらしくはない。途中の章からいきなり読みはじめてしまったら、前提知識がなくて理解できないかも。読者がそういう怖さを感じたとしても、責めることはできないんじゃないですかね。しかし、この本は独立してどこから読んでもいいように配慮してあるよと、著者がお墨付きを与えてくれる。だから、安心してそういう読み方ができる。ぼくは、読み手の気持ちをわかってくれてる気がしてうれしかった。2。他にも、この本は入門書ではないから言語機能全部を詳細にカバーはしないけど、必要に応じてある程度説明はするよとか、他の本と比べてのこの本の立ち位置はどうだとか、読むことで読者はなにを得られるとか、そういう、本の内容についてのメタ的な記述がたくさん書いてあるのが、これから本を手にする人に対する親切心を感じられて、好きになってしまったんだよなあ。あと、この本は第3版まで出ているんだけど、版を重ねて構成が変化したときには、前の版の読者のために対応関係を付録で示してくれたり、正誤表をホームページで管理してすべて公開してくれたりと、読者へのサポートがほんとうに手厚い。
まあ、べつにそのくらいのことが導入として書いてある本は、この本のユニークな特徴だと言うつもりはさらさらない。けど、ぼくにとっては、技術書でのそういうおもてなし体験は、この本がはじめてだった。それに、スコット・メイヤーズはこの本以外にもC++関連でベストセラーをいくつも出している。ここまで書いたような著者の心配りが、多数の読者のこころをつかむことと関係していないとは、ぼくは思わない。
リチャード・スティーブンスの本
次は、リチャード・スティーブンスの 詳解TCP/IP や UNIXネットワークプログラミング などの書籍群。大学のころに、数少ないプログラミング友達だったY君から、スティーブンスの本はすごいからぜひ読むようにと勧められて手に取ったのを覚えている。
TCP/IPやネットワークの概念や仕組み、プロトコルといったことを解説している本は、コンピューター関連書籍コーナーの本棚ひとつを埋め尽すほどたくさん出版されている。この著者の本が他と一線を画するのは、その徹底した経験主義にある。TCP/IPの本でありがちなのが、まずARPANETの歴史の振り返りとかからはじまって、OSI参照モデルとインターネットの4層モデルの比較をしてから、パケットの構造体を示して各フィールドの意味を説明し、RFCに書いてあることを一般読者にもわかりやすい言葉で噛み砕いて繰り返す、といったようなやつ。なんというか、眠くなる。おもしろみがない。理論的には、TCP/IPの仕様はRFCで文書化されているので、それを読んで想像を働かせればプロトコルスタックの動作を理解することも可能……なのもしれない。しかし、スティーブンスの本ではそのような立場は取らない。
スティーブンスのTCP/IP解説本では静的な仕様の解説に留まらず、むしろプロトコルスタックの動的な振舞いに着目する。そのための手段として、さまざまなツールを使い、また必要に応じてツールを自作もする。そして、実際にデータを送信し、その挙動を観察する。これによって、単に仕様やデータテーブルを眺めているだけでは得られない、はるかに豊かな世界が目の前に広がる。もちろん、そこから得られる理解の深さは段違いだ。スティーブンスは、たぶんすごく几帳面な性格なんだと思う。だからかれの解説は、厳密で、すごく細かい。そのぶんきちんと追おうとすると読解に時間がかかるけど、逆にきちんと読みさえすればちゃんと仕組みが理解ができる。ソケット本(UNIXネットワークプログラミング)のほうも、畢竟、要はAPIの解説本なんだけど、プログラムを書いて動作させることを通じて、実験し、振舞いを観察することで理解を深めるという姿勢は通底している。
この本の影響で、ぼくは技術調査をしたり、文書を書くとき、動作する小さなプログラム断片もセットにして、できるかぎり読んだ人も実際に手を動かして再現することができるように心掛けている。
Jim Blinn’s Corner
最後は、 Jim Blinn’s Corner という、雑誌に連載されたCG技術に関するエッセーをまとめて出版した本。この本のすごさは、切り口の選びかたと著者の遊び心。ひとつひとつは、どれも短くて小さなトピックではあるけど、こんなにおもしろく、感心を誘う見せかたができるのか。世間ではあたりまえに受け止められて気にも止められていないようなことなんだけど、その細部をとことん突き詰めてみると、意外とおもしろい事実が浮き出てきたりする。言ってしまえばアイデアのおもしろさ、ではある。グレッグ・イーガンとかテッド・チャンの傑作SF短編集を読んだときのような感じと似ているかもしれない。
たとえば、3Dグラフィクスの基本である同次座標系3。3Dのオブジェクトを最終的に2次元の画面に投影するために、透視変換という特殊な変換が使われる。ふつうの3Dの教科書でも、まあ導出方法くらいまではやって、実際に計算してピクセルに落し込んでみると3Dオブジェクトがビューポートに正しく写し出されて感動したりはする。けど、手順をそのまま踏めばやりたいこと(3Dオブジェクトの投影)ができるということはわかるものの、いったい何がどうなってそうなるのかは、平行移動や回転など他の素朴な変換ほどには腑に落ちない。ブリンは、そのわかりづらい透視変換の「意味」を丁寧に調べ直すことで、同次空間を直感的に理解する方法を教えてくれる。目から鱗。
また、こういうのもあった。3Dのレンダリングパイプラインでは、NDC(Normalized Device Coordinate)と呼ばれる、x ∈ [-1,1]の正規化された座標を幅Nピクセルのスクリーン内におけるピクセルに写像するという工程がある。素朴に考えると、ピクセルは0からN - 1まであるので、NDCの-1がスクリーンの0、1がスクリーンのN -1 に対応するという写像になる。実際、多くの教科書ではこのように記述されていた。しかし、これを単純に適用すると、たとえばNが512だとして、スケール係数に255.5という半端な数値が出てくる4。スケール係数は単純にピクセル数の半分で256になるべきなので、これは直感に合わない。なにかがおかしい。一体どこからこの奇妙な結果が出てくるのというと、実はピクセルを幅のない点とらえて式を立てているからで、ブリンはそれを補正するより合理的な手法を提示してくれる。[-1, 1]の空間から画面のピクセルへの写像という極めて素朴な問題にもよく考えるとこんな奇妙なことあるというのにはびっくりした。
まとめ
以上をぼくなりにまとめるとこうなる:
- 読む側への理解や配慮を感じ取ると読者は感動する
- 実験と観察にもとづく洞察は価値ある情報になる
- 多くの人が気にも止めないことでも、突き詰めると面白くなる