Pragmatic Studio行ってきました(その一)。

「達人プログラマー」のDave Thomasと「Rails Recipe」「My Job went to India」のChad Fowler が主催したAdvanced Ruby Courseに参加してもう既に帰国してから一週間たとうとしているので、復習もかねながらぼちぼち書いていこうと思います(私は写真とっていないので、他の参加者の人がとった写真がFlickrなどにアップされたら、それも紹介していきます)。

レーニングの参加人数は40人ぐらい。事前のメーリングリストでみんな自己紹介メールを送っていて、NASAGoogleからの参加者もいるというのがわかっていて「みんなレベル高いんだろうな」とちょっとビビりながらの参加でした。 参加者のRuby経験は1〜2年が大多数。中には5年ぐらい使っている人やはじめて2週間という人(でもその人はJavaの経験が15年あるといってましたが)もいました。
もともとの言語のバックグラウンドはJavaが一番多かったですが、中には.NET やPerl使いもいました。面白かったのは「FortranのコードをRubyで生成している」という人がいたことです。


3日間でならった項目は以下の通りです。

一日目

  • Blocks/Procs/Closure
  • Rubyソースコードの読み方
  • OOデザインについての考え方(Inheritance と Composition についてのディスカッション)

二日目

三日目

並列処理も要望が多かったのですが時間の都合でカバーされませんでした。でも中には「並列処理とか使うんだったら他の言語使ったら」という他の参加者の声もありました。Erlangってことなんでしょうか?


授業の進め方はDaveとChadが交互に各トピックの必要どころを説明し、時にはお互いの説明に疑問を投げかけたり、参加者とディスカッションをしながらすすめられました。今回がはじめてのAdvanced Ruby Courseだったので試行錯誤しながら進めていたのでしょうが、逆に型通りにならず、興味深い項目をどんどん掘り下げて解説してくれたので非常に良かったです。私は気合いをいれて最前列に陣取っていたおかげで、わかんないところをガンガン質問できて良かったです(あんまり初心者すぎる質問をしてないと良いのですが)。

ここからは各トピックの要点などを自分なりにまとめながら書いていこうと思います。


Block

1日目のメインはBlock。Rubyを使いこなす上でもっとも重要な概念ですが正直今まであまり自分のコードでは使っていませんでした。Rake やRailsのテーブルを作る設定ファイルとかにもしょっちゅうでてくるのにもかかわらずです(BlockとProcに関してはここがわかりやすいです)。
ちょうどこのトレーニングにくる寸前に書いていたコードにBlockを使う機会があり、ようやくBlockのありがたみがわかったところでした。 授業ではBlockはわかっているのを前提にbinding, retry, closureといった項目が
いかにBlockと絡めて使うことによって威力を発揮するかについてChadとDaveは力説していました。

Chadにいたっては「Closureをちゃんと理解できているかどうかがRuby中級者から上級者へあがっていくための試金石なるのでちゃんと理解するように」とまで言っていました。

Closureについては以下の記事(日本語)が詳しく書いています。

一応下のよう(コードはMartin Fowlerのブログから参照しました)にブロックの外側で定義された変数をブロック内で参照可能なことなのはわかるのですが、なんで
Closureがそこまで画期的でRubyを理解する上で重要なのかがまだピントきてません。他の言語の経験があまりないので、ありがたみがわからないのかもしれませんが、もしどなたか他に説明方法ご存知でしたら教えてください。

def highPaid(emps)
threshold = 150
return emps.select {|e| e.salary > threshold}
end

あとRakeを作成したことで有名なJim Weirichのブログ(英語)でもBindingが結構わかりやすく説明されています


Ruby Internal
次はRubyソースコードの読み方についての解説。私自身学生時代に学校でCを1年ほど習った経験があるのですが、既に10年近く前のことなのでほとんど覚えていません。
「Cのソースコード読むなんて敷居高そう」というのが事前の印象だったのですが、「ソースコードは隅から隅まで読む必要はなくて、自分が興味ある機能が書いてある箇所の概要がつかめる程度で十分」とのことです。
ChadはRubyの振る舞いでよくわからないところがあると、レファレンスを読むより、ソースコードを読むそうです。まさに「ソースコードが仕様書」の域まで達しています。
膨大なソースを読むなんて雲をつかむことのように感じますが、Rubyのソースの要はparse.yというファイルとeval.cという2つのファイルに集約されているそうです。


続く