2008-07-21 (Mon) [長年日記]

_ Ruby リファレンスマニュアルを読むための前提知識 はてなブックマークに追加 del.icio.usに追加 MM/Memoに追加

初めてのRuby 初めてのRuby

『初めてのRuby』出版記念トークイベント に行ってきたまとめ

辺りを読んで。

Ruby にはリファレンスマニュアルはありますが、あれは、例えばPython の
ドキュメントのように、まったくの初心者が読める物ではなく、ある程度
Ruby を知っていないと読めないもので初心者には向いていない

初めてのRuby を読んだ後にどうすればいいか
結論から言えば、「リファレンスマニュアルを読め!」です。

私は Ruby という言語の勉強のために参照したRuby本は実は1つも 無く(ライブラリの使い方のための本とかは読みましたが)、 まさにリファレンスマニュアルで育ちました。 リファレンスマニュアルを読めば大抵のことは*1わかる。 (まぁ、これは Ruby に限らず、どの言語でも大抵は 通用する王道なんですが。)

で、私自身、Ruby勉強会とか社内のRuby勉強会とか、 後輩にRubyを教えるときとかにも、 「とにかくマニュアル読め」と何度も言い続けて来ています。

例えば、以下の「Rails開発ツールガイド」という発表の中でも いきなり最初に「マニュアル」の話から入ってます。

が、トークイベントでも語られているように、 Rubyのリファレンスマニュアルってどうも読みにくいらしいのですね (私はそう思ったことはなかったので、なかなかその感覚は理解できなかった のですが)。

で、 トークイベントで角谷さんが

リファレンスマニュアルは、Rubyが分かってる人にしかわからないよね(笑

発言したようなのですが、 私が過去に何人かに Ruby を教えてきた経験から、

Ruby リファレンスマニュアルは C や UNIX のシステムコールが
わかってないと読めない

ということを付け加えたいと思います。 (正確には POSIX というのが良いのかな、と思いますが、UNIXの方が 通じやすいので以下では UNIX と言うことにします)

Array とか String などはまぁいいとして、チュートリアル的なコードで よく使いがちな IO#new のリファレンスマニュアルを引用してみましょうか。

オープン済みのファイルディスクリプタ fd に対する新しい IO オブジェクト
を生成して返します。IO オブジェクトの生 成に失敗した場合は例外
Errno::EXXX が発生します。

まず、最初の「オープン済みのファイルディスクリプタ fd」という言葉。 これ自体、いきなり UNIX 用語ですよね。 Windows の世界では ファイルハンドルとか言うし、ノーマルな C だとファイルポインタとか言う ので。

百歩譲って、これは UNIX を知らない人が読んでも、かろうじて 「あぁ、fd ってのはきっとファイルを操作するための何かなんだな」程度の 理解でなんとかなりそうだということにして、その続きを読んでみましょうか。

すると、「Errno::EXXXが発生します」と書かれていて、 このリンクをたどってみると、

各 errno に対応する例外クラスです。実際のクラス名については Errno モ
ジュールとシステムのマニュアル errno(3) を参照してください。

えー、、、雲行きが怪しくなってまいりました(笑)

「システムのマニュアル errno(3) を参照してください」???

しかも、ご丁寧に、manual page という、UNIX のマニュアルの引き方を説明するページにリンクが張ってあっ て、そこをたどってみると

$ man 1 foo

とかいう記述が出てくる。

ありのまま今起こったことを話すぜ!俺はRubyのマニュアルを読んでいたと思ったらいつのまにかUNIXのマニュアルを読んでいた

その他にも、標準入力、標準出力、標準エラー出力、パイプ、 リダイレクト、ディレクトリ、シンボリックリンク、 パーミッション、 プロセス(親プロセス、子プロセス、fork & exec)、 シグナル、ソケット、 環境変数などなど、Rubyの世界というのは大部分が UNIX の世界を背景として 構成されています。

Ruby が Perl を参考に作られており、 Perl はより高機能な awk やシェルスクリプトとして 設計されたことから言っても UNIX が背景になってしまうのは 必然なんですが。

そして、Ruby リファレンスマニュアルも UNIX の知識を前提として 書かれている部分が多いので、 UNIX のことを知らないと、Rubyのリファレンスマニュアルは 読みにくいわけなんですね。

その昔、プログラミングといえば、CとかUNIXなんてのは基礎中の基礎で(私は今でも そうだと思っていますが)、 「知ってて当たり前」だったので、こんなこと説明しなくても良かったんですが、 どうやら最近のプログラマーというのはCもUNIXも知りません、Javaしか 知りません、PHPしか知りません、Windows しか知りません、という人が 増えて来ちゃったから、こういう食い違いが発生しちゃうのでしょうね。

さて、 UNIX プログラミングの勉強といえば、

詳解UNIXプログラミング 詳解UNIXプログラミング

とか

UNIXネットワークプログラミング UNIXネットワークプログラミング

辺りが定番なんですが、これらは高い上に重い(物理的にも精神的にも)ので、 とりあえずは以下のようなところから入って行くのが良いと思います。

ふつうのLinuxプログラミング ふつうのLinuxプログラミング

関連記事

Permalink | このエントリを含むはてなブックマーク | このエントリをはてなブックマークに追加 | このエントリを含むMM/Memo | このエントリをMM/Memoに追加 | このエントリを含むdel.icio.us | このエントリをdel.icio.usに追加 | Tags: ruby

*1 リファレンスマニュアルを読んでもわからないことはRubyのソースコードを読みます

本日のツッコミ(全2件) [ツッコミを入れる]
_ まいむぞう (2008-07-24 (Thu) 15:11)

普通のLinuxプログラミングはおいらも読みました。ちょうどRubyをかじりだした時期だったと思います。
Rubyのリファレンスを見ていてよく思うのは「この本読んでなかったら絶対コレわかんないよなぁ」という表現が多い事です。
その意味で、UNIX系のプログラミングの概念を知るだけなら、この本で十分なのかなぁと思っています。

_ tmaeda (2008-07-25 (Fri) 00:40)

おぉ。まいむぞうさん、コメントありがとうございます。
やはり「ふつうのLinuxプログラミング」ぐらいが
ちょうど良いですよね。

[]