PlanOutはFacebookのオンラインフィールドの実験のためのフレームワークであり、"A/Bテスト"、ファクトリアルデザイン、より複雑な実験をサポートする。Facebookによれば、PlanOutはアプリケーションのコードから分離したかたちで検証用のデザインを実装でき、正確にデザインを記述できる。
PlanOutはGitHub上で公開されているPythonベースのフレームワークで実装されている。オンラインサービスを制御するパラメータにランダムの値を提供し、UIや代替の機能のために固定値を使う必要はない。PlanOutがパラメータの値を決めてくれる。
PlanOutのフレームワークは次を含む。
- 拡張可能なPythonクラスで実験を定義する。これによって、ランダムの引数や自動的に大事なデータをロギングできる。
- 複数の排他的な関係にある実験を管理する。
- PlanOutインタプリンタの参照実装。実験の定義をシリアライズ、保存、実行できる。
- PlanOutのドメイン定義言語をシリアライズしたPlanOutコードに変換するコンパイラ。
PlanOutのページにあるサンプルは下記の通り。
class MyExperiment(SimpleExperiment): def assign(self, params, userid): params.button_color = UniformChoice(choices=['#ff0000', '#00ff00'], unit=userid) params.button_text = UniformChoice(choices=['I voted', 'I am a voter'], unit=userid)
PlanOutの実験の目的はユニット、例えばユーザをサービスのパラメータにマップするかを記述することだ。上記の例では、ボタンの色とテキストをランダムに均一にユーザに表示される。
一度実験を定義すると、アプリケーションのコードから問い合わせができ、どの値を現在のユーザに表示させるべきかを特定できる。
my_exp = MyExperiment(userid=42) color = my_exp.get('button_color') text = my_exp.get('button_text')
フレームワークは値は正確にランダムになることを保証し、各ユニット(例えば、上記の例ならuserid)が常に同じパラメータ値にマップさせる。
PlanOutを使う利点は、実験のパラメータにアクセスさせたらすぐに、実験の分析に必要な関連するデータが自動的にログ出力されることだ。
PlanOutは複数の実験で同じパラメータを使たい場合にパラメータ名前空間で実現する。名前空間によって実験を順に実行することもできる。これはテストを反復的に実施するのに使える。また、サービスの同じ側面を複数のチームがテストする場合には、実験を並列で実行することも可能だ。
FacebookはPlanOutを使って毎日数千の実験をしているという。億単位のひとが実験に参加していることになる。一方で、同社はHackで記述した別の実装でも実験をしている。
オンラインフィールド実験はデザインの代替をテストする方法であり、意思決定者がユーザのサービスに対する反応を理解する手助けをする。
また、InfoQの"A/Bテスト"のセクションには、オンラインフィールド実験に対するさまざまなコンテンツを用意している。