日経ソフトウエア2004年12月号(10月23日発売)で「プログラミングの良書100冊!」という特集を担当した。記事中では,まつもとゆきひろ氏にRubyを作るのに役立った本を挙げていただくなどなど,現役の技術者の方々に自分が読んでためになった本,読者にお薦めの本を紹介していただいた。

 実のところ,執筆をお願いした方々の中には日々の作業に終われてあまり本を読んでいない人もいるのでは(失礼!),といった心配もあったのだが,まったくの杞憂に終わった。忙しいながらも何とか時間を作って自己研磨に励む,というのが優秀な技術者の方々に共通する姿勢のようである。

 紹介していただいた書籍の中には,JSF(JavaServer Faces)などの最新技術の解説書がある一方で,やはり強かったのがBertrand Meyerの「オブジェクト指向入門」(アスキー発行),Jon Bentleyの「プログラム設計の着想」(近代科学社発行)およびその第2版の新訳「珠玉のプログラミング」(ピアソン・エデュケーション発行),Tom DeMarcoの「構造化分析とシステム仕様」(日経BP出版センター発行),Gerald M. Weinbergの「コンサルタントの秘密」(共立出版発行)といった古典的な名著,もしくはその新版である(特集で紹介した書籍の一覧はこちら)。

親切な入門書にはない「何か」がある

 こうした古典的名著の多くは,最近の手取り足取り教えてくれる入門書ほど親切ではないし,訳が古かったり堅苦しいものも少なくない。単に知識を得ることだけが目的なら,もっと読みやすくわかりやすい本が今ならほかに何冊もあるはずだ。でも,こうした名著には,最近の親切な入門書にない「何か」がある。すでにほかの書籍を読んでそうした分野の知識を身に付けた後であっても,あえて読むだけの価値を有しているのである。

 例えば,Meyerの「オブジェクト指向入門」の原書が出版されたのは1988年,オブジェクト指向開発が普及するかどうかすらわからなかった時代だ。本書は著者自身が設計したオブジェクト指向言語Eiffelを例にとってオブジェクト指向開発の手法を解説する,というスタイルをとっている。JavaやC++といった言語が主流になった今となっては,何が悲しくてEiffelなどといった一生使いそうにない言語でオブジェクト指向を学ばなくてはいけないのか,というのが正直な感想だろう。本書で述べている継承の使い方や契約による設計(Design by Contract)などの手法も,ほかの本で学べる内容である。

 しかし,本書には,オブジェクト指向がまだ当たり前のものでなかった時代に書かれたゆえの良さがある。オブジェクト指向を当たり前のものとして客観的に提示するのではなく,オブジェクト指向に対する著者なりの考えや哲学をしっかりと織り込んでいるのである。

 例えば,開放/閉鎖原則などのモジュールに関する原則や要件の帰結としてオブジェクト指向の様々な概念/技法を導き出していくくだりは,こうした概念/技法の位置付けについてのより深い理解を与えてくれるはずだ。Eiffel言語を設計する際に著者が直面した様々な検討事項について詳細に考察している点も参考になる。

 代入演算子と等値演算子を値型と参照型で区別すべきかどうか(Simula 67では区別している),戻り値をどのような形式で返すべきか(Fortranは関数と同名の変数,Cはreturn文を使う),クラスとオブジェクトを区別すべきかどうか(Smalltalkでは区別していない)――こうした考察は,まつもと氏のような言語の設計者にはもちろん,言語の利用者にとっても役に立つ。現在ではMeyerの考え方に同意できない部分もあるものの,一読すればオブジェクト指向や言語仕様についての見方がきっと変わるのでは,と思う。

良薬は口に苦し

 記者がプログラミングを始めた20年以上前と比べると,現在のプログラミング関連書籍の発行点数は大幅に増えている。ただ,書店に並んだ本を眺める限り,お薦めできる本はそれほど多くないし,出版される分野も偏っているように感じられる。

 特に目立つのが,キャプチャ画面を貼り付けただけとも言える,開発環境の使い方の説明に終始する本である。Visual Basic全盛の時代と比較すれば少し減ったようにも見えるが,Visual Studioの新版やEclipseといった開発環境が出るたびに大量の入門書が出版される,といった状況はあいかわらずだ。プログラミングをこれから始めようという人々にとって,こうした本が必要なのは理解できる。しかし,その「次」に読むべき,もっと本質的なことを学ぶための本が入門書に比べて少なすぎるのである。

 プログラミングは文章を書く作業とよく似ている。文章を書く際にまず重要なのは,文法,語彙などの知識や論理的な構成力といったところだろう。それに比べれば,ワープロ・ソフトの使い方などとるに足らない知識である。プログラミングも同様で,文法,イディオム(定型的なコード),アルゴリズム,設計の手法といった知識/技術のほうが,開発環境の使い方よりもはるかに重要だ。にもかかわらず,開発環境の入門書ばかり出版されるのは,そのほうが売れる,という点を考慮しても度が過ぎるように思える。

 文法書やアルゴリズムの解説書にしても,最近はわかりやすさを前面に押し出す一方で,解説する内容を絞ったり,サンプル・コードを極端に短くしているものが多い。記者はこうした方針自体が間違っているとは思わないが,これらの書籍はあくまで次にもう一冊本格的な書籍を読むことを前提にしたものである。ところが,その「次」に読むべき本がなかなか見当たらない。古典的とまでは言えないまでも,比較的古い本がいまだに読まれているのは,こうしたことも理由の一つではないだろうか。

 名著と言われる本の多くは,キャプチャ画面が多い本やわかりやすさを重視した本のようにスラスラ読み進められるとは限らない。じっくり考えながら読まないとためにならないものもあれば,内容が凝縮されているために一つの文章を3回読んでようやくわかることもある。でも「良薬は口に苦し」という言葉もある。読むのに時間がかかるかもしれないが,時間をかけただけの価値はあるはずだ。

適切な情報源を選ぶ“眼”が重要に

 それでも読むのが辛く感じるなら,先に同じ分野のもっとやさしい本を読むことを勧めたい。読みにくさを別にしても,名著の多くは暗黙のうちにある程度の知識/経験を仮定しているものが多いからだ。また仮にそうでなくても,そうした知識があったほうが読んで得られるものが多いこともある。

 極端な話,KernighanとRitchieの「プログラミング言語C」を読むのが辛ければ,その前に別のやさしめのC言語の入門書を読めばよい。一見無駄なようにも思えるが,名著と呼ばれる本には見た目よりもはるかに多くの情報が詰まっていることが多い。何度読んでも新たな発見がある,といわれるゆえんである。

 名著に限らず,プログラミングの解説書は,Aを読むためにはBの知識が必要で,そのBはCに関する知識を前提とする・・・といった場合が少なくない。例えば中級者以上に向けた書籍の一部はリンクリストや2分探索などの基本的なデータ構造やアルゴリズムについての知識を読者が持っていると仮定している,C/C++の中・上級者向け書籍はCPUやメモリーについての多少の知識を前提としている,といった具合だ。

 初心者が徐々に知識を広げていく場合には,先輩などに道案内をしてもらったほうが効率よく学習できるだろう。日経ソフトウエアの特集でもこうした点を配慮して,学習する(書籍を読む)順番や前提となる知識を得るための本などについて触れるようにした。

 インターネットをはじめ,最近は書籍以外にもプログラミングに関する知識/情報を得る手段がいくらでもある時代である。消費できる以上の情報を入手できるようになった現在,適切に情報源を選択するための眼を養うことがますます重要になっている。そのためにも,名著と言われる本を読んでおくことは有用だ。読書の秋,たまには「骨のある」本を読んでみてはいかがだろうか。

(山本 哲史=日経ソフトウエア)

日経ソフトウエア2004年12月号(10月23日発売)で紹介した書籍の一覧(オンライン書店へのリンク付き)はこちらのページでご覧いただけます。