GitHubはScientist 1.0をリリースした。これは、GitHubのエンジニアのJesse Toth氏が開発したRubyのライブラリで、開発者のリファクタリングを支援する。ここ数年、GitHubの多くのプロジェクトで使われてきた。
Toth氏によれば、Scientistは重要なコードをリファクタリングするときにとても役にたつ。新しい実装が確かなものであるという確証が得られることが重要になるようなリファクタリングだ。Scientistは抽象化によるブランチというアーキテクチャパターンよりもよりしっかりした安全保障を提供することを目指している。抽象化によるブランチは便利だが、単に古いコンポーネントがどこにあろうと、確実に新しいコンポーネントを使うようにするだけだ。さらに、Scientistは、あらゆるケースや入力値の組み合わせをカバーすることはほとんどできないというテストの限界を迂回しようとする。
Scientistの基本的なアイディアは、古いパスと新しいパスの両方を実行できる環境を用意し、両者の結果を比較して、ミスマッチや例外を記録する、というものだ。新しいパスを検証している間、古いパスがシステム全体が正しく動作するということを保障する。
これは、ふたつの振る舞いを提供する軽量な抽象によって実現される。use
という振る舞いは古いパスを実行する。try
は新しいパスを実行する。
experiment = Scientist::Default.new "my-experiment"
experiment.use { <call the old code here, the control> }
experiment.try { <call the new code here, the candidate> }
experiment.run
#...
def publish(result)
#...
run
メソッドは常にuse
ブロックの戻り値を返す。publish
メソッドは処理の最後に呼び出され、収集したデータを公開する。try
とuse
ブロックの結果の比較以外にも、Scientistは実行の順番をランダムにして相関を排除したり、ふたつの実行時間を計測したり、例外を管理しあtり、結果を公開したりする。
Scientistには、デフォルトの振る舞いをカスタマイズするための多くの方法がある。compare
メソッドを定義し、デフォルトの==
演算子をオーバーライドしたり、データを公開するときに有効になるcontext
を定義して、試験の実行の有効化、無効化を制御したりできる。結果を無視したり、ひとつ以上のtryブロックを実行したり、特別なユースケースをカバーするtryブロックだけを実行したりする。
InfoQはGitHubのプリンシパルエンジニアでScientistの開発者であるJesse Toth氏に話を聞いた。
Scientistが生まれた経緯を教えてください。
Scientistは同僚だったRick Bradleyがとても複雑なAPIエンドポイントをリファクタリングしようとしているときに生まれました。彼は変更したコードに対して、十分なカバレッジのテストができているということに地震が持てず、本物のデータセットでテストしたいと考えていました。そして、ちょっとしたハックを行い、リファクタリングしたメソッドを呼び出し、そのメソッドがオリジナルのコードと振る舞いが違った場合に記録するという仕組みを作りました。これがうまくいったのでライブラリにした誰でもこのような試験ができるようにしたのです。
Scientistを使って試験をするために必要なコードの変更はどのくらいでしょうか。GitHubでは、Scientistを使うことのコストと利益の割合を最適化するためにどのような条件を適用していますか。
試験したいコードがどの程度高価なのか、どの程度呼び出されているのかに依存します。テスト対象のコードが元のコードと同じパフォーマンスだったら、試験の実行には2倍のコストがかかります。テスト対象のコードの性能が元のコードに比べて、大幅に改善されていたら、コストはもっと少ないでしょう。
試験のコストが高いと思う場合は、大抵、Scientistを使った試験をする割合を緩やかに増やします。トラフィックの1%から5%で試験をすれば、性能やミスマッチしたデータを収集するのに十分です。
Scientistに付け加えたい機能はありますか。
すでに必要な機能はすべて盛り込んでいますが、Scientistの異なる使い方を見つけた誰かが、新しい機能を付け加えたいと思って貢献してくれたら、とても面白いと思います。
ScientistにはRuby 1.9が必要。gemからインストールできる。
Rate this Article
- Editor Review
- Chief Editor Action