BT

リファクタリングを助けるGitHubのScientist

作者: Sergio De Simone , 翻訳者 徳武 聡 投稿日 2016年2月14日 |

原文(投稿日:2016/02/07)へのリンク

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メソッドは処理の最後に呼び出され、収集したデータを公開する。tryuseブロックの結果の比較以外にも、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

Relevance
Style
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション
サイト全般について
バグ
広告
記事
Marketing
InfoQ.com and all content copyright © 2006-2016 C4Media Inc. InfoQ.com and 株式会社豆蔵 InfoQ Japan hosted at Contegix, the best ISP we've ever worked with.
プライバシー
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.