Ruby会議2010(2日目)に行ってきました

今回は都合により2日目のみですが、つくばで開催中のRuby会議2010に行ってきました。セッションで印象に残ったことをいくつか記録しておきます。

Jake Scruggs氏「The Necessity and Implementation of Speedy Tests」

ソフトウェアの品質測定ツール metric_fu の開発メンバーであるScruggs氏によるセッション。実行に時間のかかるテストコードの問題と解決策について。まず時間のかかるテストは「モラルを蝕む」「失敗に対して口論になる」「テストを憎むようになる」といった問題があると指摘していました。たしかに「時間がかかる」→「面倒になって実行しない」→「バグを生む」というような流れはありがちですね。テストが遅いということは潜在的な問題であるということです。Scruggs氏はここで、テストを変更せずに実行時間を短縮する方法をいくつか紹介していました。(hydraなどの並列実行ライブラリの利用、IOコストの軽減、Ruby Enterprise EditionでGCの設定を変更する…、など)

次に実際の解決策として、以下を挙げていました。

  • Stub out the expensive stuff
    例えばデータベース処理や外部のAPI呼び出しなど、重たい処理はスタブ化してしまおうという話。外部APIなどは処理の重さに関わらずスタブ化して、環境に関わらずテストを実行できることが求められますね。
  • Big Set Up == Big Problem
    テストの事前条件として多くの処理が必要ということは、テスト対象のオブジェクトに多くの依存関係があるということです。つまり設計に改善の余地があるということ。思い当たるフシがあるので肝に銘じたいと思います。
  • FactoryGirl is too Damn Awesome
    FactoryGirl (gem)がとても良いそうです。(すいません。どういう観点で良いと言われてたか覚えてません。)以前 Railscastsで紹介されていた のを見て、自分のプロジェクトで少し使ったことがあります。fixtureだと必要なデータをすべてYAMLで記述する必要がありますが、FactoryGirlはDSLで定義、使い回しできるので便利ですね。
  • create vs build
    これもActiveRecordの話ですが、テストで使うインスタンスを用意する際にcreateとbuildを使い分けたいですね。データベースに保存する必要がないのであればbuildで十分です。

Scruggs氏も最後に触れていましたが、テストを書くことは動作検証だけでなく、設計の改善に役立ちます。レッド、グリーン、 リファクタリング のサイクルを適用して、テストコードも最適化していきたいものですね。

Paolo Nusco Perrotta氏「A Metaprogramming Spell Book」

もうひとつは「黒魔術」と言われることもあるメタプログラミングについてのセッション。Perrotta氏は元々Javaプログラマをやっていたそうですが、ActiveRecordのソースコード(たとえば class_eval とか base.extend… といったコード)を見て「いったい何をやっているんだ?」と驚いたそうです。このセッションでは、それからPerrotta氏自身がメタプログラミングの世界を探究していった過程も垣間見えるような内容で、とても楽しめました。

メタプログラミングは使い方を間違えれば危険なものになりますが、正しく利用すれば高機能性やモジュール分割によるテスト容易性などを実現できます。Ruby(や、たとえばRailsなどのフレームワークやライブラリ)をより理解・活用するためには、ぜひ学んでおきたい領域ですね。セッション終了後、角 征典さん翻訳の『メタプログラミングRuby』を購入しました。このセッション同様、一見難解そうなメタプログラミングの世界を、丁寧に解説した内容になっているようです。

終わりに

つくばまではちょっと距離がありましたが、今回もいい刺激を受けることができました。このようなイベントを支えてくださっている実行委員会の皆さん、Rubyコミュニティの皆さん、本当にお疲れ様です。ありがとうございました。明日も 魅力的なセッションが多数 予定されています。直接会場まで行けない方も、 Ustreamでの中継 など、のぞいてみてはいかがでしょうか。

blog comments powered by Disqus