Rubyを「知ってるつもり」の人にお勧めな「Metaprogramming Ruby」本

9th Mar, 2010 | ruby book

とてもいい本だったので紹介してみる。

Metaprogramming Ruby: Program Like the Ruby Pros by Paolo Perrotta

この本を読み始めてすぐに、自分がこの本に対してタイトルから想像していた内容と違うことに気付いた。

自分が想像していたのは、「こういうケースでは、こういうメタプログラミングをするといいよ」「こういうメタプログラミングのパターンもあるよ」というRubyでするメタプログラミングの実践編の本かと思っていた。でも、これは間違いで、この本はRubyでメタプログラミングができるようになるためのRubyの基礎知識が書いてある本だった(基礎、と言っても初心者向けというわけではなくて、Rubyのベース部分という意味で)。

想像とは違っていたのだけど、結果的に、ちょうど今自分が読むべき本だった。

自分は、この本を読むまで半年ちょっとRailsを通してRubyを経験してきて、期間的にはそれほどでもないが、それなりの規模のシステムも作ってきた。その結果、それなりにRubyのことをわかっているつもりだったし、最近はRailsのソースとかも少しずつ読むようになってきて、見よう見まねでメタプログラミングもしていた。

そのくらいのときにこの本にめぐり合ったのだけど、とてもいいタイミングだったようだ。実はよくRubyのことわかってなかった、ということを痛感できた。

この本を読む前にメタプログラミング実践編的なのに入っていたら、上辺だけのメタプログラミングをしてしまい、訳がわからなくなっていたかもしれない。

この本の構成としては、

  • 10%: メタプログラミングとは何か、の導入
  • 50%: メタプログラミングで必要になってくるRubyについての解説
  • 20%: メタプログラミングの基礎を習得したところで、RailsのActiveRecordを例にとってメタプログラミングがどう使われているかの解説
  • 10%: メタプログラミングに対するテストの書き方
  • 10%: 便利なTipsを含むその他

な感じ。

こんな感じで半分くらいをRubyそのものについて読ませる内容になっている。Rubyでメタプログラミングができるようになるための基礎体力をじっくり着けてくれる作りになっている。

たとえば、「スコープ」というプログラミング言語を勉強するときに基本中の基本なところだけども、10ページくらいかけてしっかりと教えてくれる。スコープの章の中の各タイトルを抜き出してみると、Scope/Changing Scope/Scope Gates/Flattening the Scope/Sharing the Scope とこれだけある。そして、スコープを理解することはメタプログラミングをするときにもとても重要なこともよくわかる。

その他にも、自分が今まであやふやに過ごしてきたことで、この本によってはっきりと理解できるようなったものとして、ぱっと思いつくものだけでも、

  • Objectとは何か?
  • Classとは何か?
    • Class名とは何か?
  • Classはどこにあるか?
  • Class変数とは何か?
  • selfとは何?

  • メソッドとは何?
  • Class メソッドとは何か?
  • Instance メソッドとは何か?
  • Moduleとはなにか?
  • classとsuperclassとmoduleの関係
    • methodを探す順序は?
  • lambdaとは何か?
  • procとは何か?
  • lambdaとprocの違いは?
  • instance_eval とは?
  • class_eval とは?
  • eval とは?
  • include と extendの違いは?
  • scopeが変わる場所はどこ?何種類ある?
  • 特異メソッドはどこに存在する?

おそらく、それぞれの説明は、Googleにでも聞いてどっかのページを見ればわかると思うのだけど、なぜそうなっているのか、それぞれがどう関係しているのか、ということをこの本はとてもわかりやすく説明してくれる。そして、これらのそれぞれの技術が独立したものではなくて、関連し協調しあって、「Rubyらしさ」を作っていることもよくわかる。

読んでいるときには「ここまでの知識が必要?」と感じたところもあったけど、読み終わってみると、すべてがしっかりとつながっていて、余分かなと思ったところは実は伏線で、最後までにはしっかりと回収されている感じになっている。

この本を読んでから、Railsのコードとかを見ると、一行一行はっきり意味がわかるようになって、今までコードを読んでいるつもりだった自分はなんなんだったんだろう、という気分にすらなった。ちょっと大袈裟だけど、わりと本気。

1.9 対応

ちゃんとRuby 1.9にも対応している。たとえば、Objectの解説のところでは、BasicObjectのこともしっかり説明されていて、どういうときに使うのが便利か、ということまで解説している。

英語

今のところ英語版しかないようなんだけど、英語苦手な人でもコードの例もたくさんあるし、そんな難しくない英語なので大丈夫だと思う。BillとBobという二人の登場人物が対話する形でRubyの物語が進んで行く。読み物としてもよくできている。

そういう自分も英語だと日本語で読むより数倍遅い。でも日本語で読んだ時よりも頭の中に残っている感じはある。日本語だと字を追っているだけで頭に入ってないときとかあるんだけど、英語だと一文ずつしっかり読むので頭に残りやすいのかも。

お勧め

そんなわけで、Rubyをなんとなくやっているけど、深いところまでびしっと理解はしていない、という人にすごくお勧めな本でした。

日本語訳も出るようなのでそちらも期待!



RspecとCucumberでTDD/BDDを極める (The Rspec Bookの紹介)

17th Feb, 2010 | development ruby rspec cucumber tdd bdd book

本の紹介第2弾。少し前、Twitter上でTDD/BDDについて盛り上がっていたので、この本を紹介してみたくなった。

The Rspec Book: Behaviour Driven Development With Rspec, Cucumber, and Friends」という本。

この本は、RspecCucumberを使い、どう考え、どうシステムを作っていくか、というをチュートリアルを交えながら紹介する構成になっている。

ただUnit Testを紹介するだけではなく、Unit TestツールであるRspecに、BDDツールであるCucumberを組み合わせて使うことで、Unit Testでカバーできない部分をCucumberで補い開発をする、というところがこの本の肝になっている。

この本を読み、実践することで、Unit Test*だけ*を書いてシステムを作っているときのモヤモヤ感をかなり解消できる。また、RspecもCucumberも知っているけど、両方をどうやって使っていくかよくわからない、という人もこの本を読むとかなりすっきりできるのでお勧め。

以下に、自分なりに理解したところを書いておく。本の内容から少し離れているところもあるので、詳しくは本を読んでみて欲しい。

また、ここでは触れないが、この本では、RspecとCucumberの基本的な使い方や、webratseleniumなどのWeb系のテストツールと一緒に使う方法や、Railsとの組み合わせ方なども含まれているので、Rubyでのテストに関するかなりの部分がカバーされていてかなりお得な作りになっている。

Unit Testとは

改めて書くまでもなく、Unit Testというのは(自動化するかどうかは関係なく)、とにかくコンポーネントとしての精度を高めるものである。また、Unit Testの優れている点として、Unit Testは「テスト」だけのためではなく、「設計」のためであるということが言える。テストを書くということ自体が設計となる。テストが書きにくい=設計が悪い、ということでもあるので、テストをきれいに書くことで、自然といい設計になるように導いてくれる。

しかし、Unit Testは、コンポーネント単位での動作は保証するが、それらを組み合わせたときに、最終的にシステムがどのような物になるか、ということまでは基本的保証しない。そして、Unit Testは、基本的にプログラマの自作自演ということもあり、外部から、システムとして見たときにどう動くかということも保証しない。また、非エンジニアの人にどういうシステムか、というのを説明するのにもUnit Testは向いていない。

これらは別にUnit Testの欠点というわけではなくて、Unit Testはそういうものなのである。

「Unit Testだけ」で開発するモヤモヤ

Unit Testでカバーできる範囲は「設計」を設計としてそのままコードに落とし、そしてそれがそのままテストにもなり、自動化もでき、再利用もできる。

しかし、Unit Testの対象外である、システムを外部から見たときの振る舞いに関して、設計やテストはコード化されずに、BTSや色々なツールで管理しても、結局「使い捨て」になりやすい。ドキュメントをコードとは別に書いても、プロジェクトが進むごとにコードとどんどん乖離していってしまう。

今まで、この部分を解消するためにいろいろなツールやプラクティスを試してみたが、どうも自分的にしっくりくるのがなかった。それは、おそらく、そういうものの多くは、ドキュメント(紙)ベースなものが多いからだと思っている。やはりプログラマとしては、そこも「コード」で定義したいし、コードに書いてあることをドキュメントにも書くということはしたくない。

Cucumberとは

このモヤモヤを解決してくるのがCucumberというツールと、それを使ったプラクティスになる。Cucumberでは、外側の設計(とテスト)をコードに落とすものである。Cucumberを使うと、ユーザから見た動作に関しての設計を、そのままコードにすることができる。Unit Testでコンポーネントに対してテストを書くのと同じ構図になる。

また、Cucumberは非常に自然言語に近い形で書けるので、非エンジニアの人が読むことが(場合によっては書くことも)可能だ。

RspecとCucumberの連携

RspecとCucumberは、それぞれ単体で使っても、もちろん便利なのだが、この本では、それらを組み合わせることで、さらに強固で柔軟なシステムを作ることができると説明している。

コンポーネントレベルでの動作の保証にはRspecを使い、ユーザから見た動作に関しての保証にはCucumberを使うということになる。

この本では、1つの機能毎に下記の各フェーズを繰り返し開発を進めて行くことを提案している。

  1. Cucumberを使い外部の設計(=テスト)を書く - この段階では実装がないのでCucumberに実行結果はRed(失敗)になる。
  2. Rspecを使い内部の設計(=テスト)をする - この段階では実装がないのでRspecを実行するとRedになる。
  3. Rspecが通るように実装する。この時点でRspecはGreen(成功)になる。
  4. Cucumberが通るようにCucumberの実装を書く。ここで、2-3で作った部分がうまく1.の設計にあわない場合、2.に戻る必要がある。場合によっては1.に戻る。

つまり、外側 (Red) - 内側 (Red) - 内側 (Green) - 外側 (Green) という順序で開発して行くことになる。

この手法は、非常にアジャイル開発とも相性がいい。上記の1から4の一回で作る機能の単位として、アジャイルの一つのユーザストーリはぴったり当てはまる。

本の入手方法

ここまで書いておいてなんなんだが、まだこの本は紙の本としては発売されてない。延期につぐ延期で、次の予定は2010/4になっている。しかしとりあえず現時点ではベータ版をPDFで買うことができる。上のリンクから買える。

一度購入しておくと、新しいベータ版が出る度にダウンロードできるので、個人的にはここ半年位楽しんでいる。英語だが、チュートリアル形式でコードも多いので英語にあまり自信がなくてもなんとかなるだろう。

Amazon日本でも紙の本の予約はできるみたい。



[本] 初めてのRuby

9th Feb, 2010 | ruby book

たまには読んだ本の感想。ちょっと前の本だし、有名どころだけどお世話になったので感謝の気持ちを込めて。

プログラミング言語などの新しい技術を習得するとき、最初の数日〜数週間は本を集中して読むことにしている。Web+検索エンジンは知りたいことがわかっている場合には便利だけど、何も知らない状態ではやはりまだ本に分がある。ある程度の知識を得てからはWebに頼り、一通りわかるようになった後で再度本を漁るという感じが多い。今のところこれが最速学習法だと思っている。

重い腰を上げ、Rubyを本格的に始めたのが半年ほど前。そのときに読んだ本の中の一冊がこれ。何冊か目に開いた本だが、今思えば最初に読むべきだったと強く思う。

この本は、他の言語をそれなりに知っている人がRubyを初めて学ぶ、ということに完全にフォーカスしている点が本当に素晴らしい。「入門〜」「はじめての〜」「〜日で覚える〜」系の本は、簡単過ぎたり、(自分の知識に対して)冗長過ぎていたりするのだが、この本はそれがほとんどない。また、Ruby系の良書で「アジャイル」とか「デザインパターン」とか「Rails」とかとセットになっているのは英語含めいろいろあるのだけど、Ruby単体を学べる良書というのは意外と少ない。やっぱり何か学ぶには基礎をしっかりやるべきなので単体で学べるのは嬉しい。

それなりにプログラミングの経験があると自負しているが、最初から最後までページを飛ばすわけにはいけない作りになっている。すべてのページがとても濃い。1度読んだ後も、開発中(今も)手元に置いてしばしば手にとって復習している。

(余談。この本を読んで思い出したのが、たのしいUNIX、という本。始めてUNIXを学んだのがこれだった。それも同じような雰囲気を持った本だった。平易な文体だが勘所は抑えている入門用の本。読んだのが10年以上前で、もう売ってなさそうだけど、今でも*NIX入門者にはそれなりに通じる本だと思う。最初にどういう本を読むかって重要。)

これだけRubyがメジャーになってくると、学習の立ち上がりの部分でだらだらやってられないので、こういう本である程度の知識まで駆け登れるのは本当に素晴らしい。後発学習者のお得なところ。

(個人的な)唯一の欠点は英語版がないこと。同僚に勧められない。1.9完全対応版とか出るならぜひ英語でもお願いしたいところだ。

サポートページ: http://yugui.jp/wiki/LearningRuby