書籍『初めてのRuby』を書いた

他言語プログラマのためのRuby入門書『 初めてのRuby 』を執筆した。オライリー・ジャパンのいわゆる動物本の1つとして、6月25日に発売される。

なお、本書は翻訳ではない。オライリー・ジャパンの慣例によると『初めてのRuby』というタイトルの本は米国O'Reilly Mediaの『Learning Ruby』の翻訳本の筈だが、そうはならなかった。諸般の事情により『Learning Ruby』を訳すのではなく、私が日本語で書き下ろした。

対象

本書は、他のプログラミング言語の経験があるプログラマを対象としている。Rubyについての知識は一切問わない。一方、コンピュータ科学一般の用語やオブジェクト指向そのものについては知識を要求していて、こうした話題の説明は殆ど含まれない。

内容

新しいプログラミング言語を習得するとはどういうことだろうか。まず、その言語の文法を知っていて処理系が受理してくれるようなソースコードを書けなければならない。だが、それは出発点でしかない。その言語が持っている標準的なライブラリを活用して、車輪の再発明をすることなくプログラムを構築することができなければならない。そして、その言語らしい考え方を身につけなければならない。その言語の特色を活かした設計をしたり、その言語らしいソースコードを書いたりできなければならない。

さて、これらをすべて含んだ本を書くこともできる。だが、それはとてつもない大著となるだろう。手軽に買って手軽に読めるものにはならない。だから、私は本書をハブとして書くことにした。本書は他の様々な資料をつなぎ止めて体系的な知識を形作ることを目指した。

文法

まず、Rubyの文法。最低限の文法を解説しなければ他の部分について説明することすらできないし、入門書とは呼べないだろう。だから、本書はRuby文法についての解説を含んでいる。

ただし、

これを鑑みて、「条件分岐( if )とは」とか、そういうところの説明は抑えている。あくまでも、条件分岐という概念をRubyではどういう風に表記するのか、Rubyにおける真・偽とは何か、という説明にとどめている。

また、文法を網羅はしていない。例えば、AWK由来の BEGIN{} , END{} についての説明はない。利用頻度が低いし、Rubyの他の部分を理解した後ならば、リファレンスマニュアルを読めば分かるはずだからだ。

リファレンスマニュアル

本書の狙いは「 Rubyリファレンスマニュアル 」を読めるだけの前提知識を提供することにある。

ある言語を習得したいなら、少なくともライブラリリファレンスの主要な部分は通読すべきだ。例えばJavaならば、 java.lang.* , java.util.* なんかを通読すべきであるように。

だが、文法を理解しているというだけの人間がライブラリリファレンスを読んで理解できるのか? リファレンスは実務者の手引きとしての邪魔にならない程度に冗長性を抑えてあるのが常だ。やはり、その言語についての一定の前提知識は要求する。何よりも「何ができるか」は分かってもそれを「どうやって使うべきなのか」「いつ使うべきなのか」は書いていない。そうした文化や考え方に相当する部分はリファレンスの責務でない。

だから、私はそれを書いた。

本書は配列・ハッシュ、数値、文字列、入出力のそれぞれに章を割いている。だが、目的はこれらのクラスの機能を説明することではない。目的の1つは、他のクラスのリファレンスを読めるようにするためだ。これらの基本的なクラスはRubyライブラリの随所で使われていて、リファレンスにもしばしば説明なしに出現するためだ。

またもう1つの目的はこれらのクラスを素材としてRubyのプログラミングの流儀なり考え方を説明するためだ。例えば、一般にコンテナクラスをどうやって設計するべきか、どうやって実装するのか。

故に、配列・ハッシュ、数値、文字列、入出力についても網羅的な機能解説はしていない。それこそリファレンスを読めばよいことだ。 String#split の第2引数とか FileTest.symlink? の機能とか、それを書いてもRubyの考え方についての理解は深まらないし、本書の後にリファレンスを読めば分かることだ。

Rubyの機能についての網羅的なデータが欲しければ「 Rubyリファレンスマニュアル 」を読めばよい。一応、Rubyについてのすべてが書かれている建前になっているし、不完全な部分は目下「 Rubyリファレンスマニュアル刷新計画 」が更新中だ。何より、これらは無料で読める。どうしても紙媒体が欲しければ、Dave Thomasの『 プログラミングRuby 第2版 ライブラリ編 』を買えばよい。

『初めてのRuby』はそれらを読みこなすための前提知識を提供する。

文化

真に語るべきは文化だ。Rubyistはどのように考えるのか、どのように設計するのか。それを理解すれば、ライブラリの機能1つ探すにしてもどこを探せばよいのかは自明となる。どのようなAPIを提供すれば他のライブラリとの接続が容易となって再利用性が高まるのかが分かる。

例えばANSI Cライブラリにおいて、プログラマは引数のどちらがsourceでdestinationなのかリファレンスを調べる必要がない。第2引数がsourceで第1引数がdestinationという規約があるからだ。こうした慣習を積み重ねて文化を織りなし、その上に言語を構築したとしよう。そうすれば「分かる者にとってはすべてが自明」であるような言語ができあがる。それがRubyである。少なくとも、Rubyとはそうであろうと努めている言語である。

そういえば以前、 日経ソフトウェアに書いた記事 でもそんなことを触れた。

とはいえ、文化というものは陽には語りがたいものではある。確かに私も、配列やハッシュや……という素材を利用した。その素材を通じて読者が「察して」くれることを期待した。それでも、私は本書において、今まで公式にはUndocumentedだった文化習俗をいくらかでも明文化したつもりではある。

Rubyに付いての事実を知りたければ、他の資料(特にリファレンス)を読めばよい。だが、事実の羅列は知識ではない。それらを糊づけ順序づけ関連づけて体系を築いてこそ、知識となる。かつてRubyistは、既存のライブラリのソースコードを読んだりRubyコミュニティで活動したりということを通じて、そうした「糊」となる文化を習得したものだ。

プログラマパターン認識に優れた種族だから自分でそうやってRubyの背景にある膨大なパターンの山を再発見できるのだが、それで良いのだろうか。

いや、いつまでもそうした「背中で語る」的スタイルだけに頼っているべきではない。できるだけ明文化すべきだし、それができなくても、せめて高い濃度で多くの文化パターンに接触できる教材があるべきだ。本書はその解決を狙っている。あまりにも壮大な狙いであるが故に私の実現したものは不完全ではあろうが。

最後に読者へ

本書は、Ruby入門者をRuby初級者に引き上げる本である。入門者と初級者の違いは、Rubyの慣習に馴染んでいるかという点にある。既に他のプログラミング言語を習得したことのあるあなたである。いったん初級者になりさえすれば、後は自力でRubyを極めるのも容易なことだろう。

本書には、参照すべき他資料へのポインタもちりばめられている。例えばテキスト処理を扱うプログラマであるならば言語を問わず正規表現は心得ているべきだし、『 詳説正規表現 第3版 』は読むべきだ。そうしたガイドが読者にとって、初級者から更に上への道行きの助けとなれば誠に幸いである。

関連ページ

初めてのRuby

初めてのRuby