Uberは、失効した機能フラグ(feature flag)によって発生する不要なコードを自動的にクリーンアップする、同社のツールPiranhaをオープンソースとして公開した。Piranhaはパイプライン内での動作が可能で、クリーンアップ対象となる不要コードを継続的に検索する。現時点ではJava、Swift、Objective-Cをサポートしている。
Piranhaは静的解析を使用して、おもに3つのタスク — 機能フラグAPIで囲まれたコードの即時削除、その結果として到達不能になったコードの削除、フラグに関連するすべてのテストの削除 — を実行する。実行時には、対象とするフラグ、処理の挙動、フラグのオーナの3つを入力する必要がある。
例として、機能フラグを含む次のようなJavaスニペットを考えてみよう。
public class MyClass {
private XPTest expt;
...
public void foo() {
if(expt.flagEnabled(TestExperimentName.SAMPLE_STALE_FLAG)) {
System.out.println("Hello World");
}
}
public void bar() {
if(expt.flagDisabled(TestExperimentName.SAMPLE_STALE_FLAG)) {
System.out.println("Hi World");
}
}
}
以下のパラメータでPirahaをコールすると、
options.errorprone.errorproneArgs << "-XepOpt:Piranha:FlagName=SAMPLE_STALE_FLAG"
options.errorprone.errorproneArgs << "-XepOpt:Piranha:IsTreated=true"
options.errorprone.errorproneArgs << "-XepOpt:Piranha:Config=config/piranha.properties"
処理条件(treatment condition、機能が有効な部分)はそのまま残り、制御条件(control condition、機能が有効でない部分)は削除される。この結果、コードを次のように変更する差分(diff)が生成される。
public class MyClass {
private XPTest expt;
...
public void foo() {
System.out.println("Hello World");
}
public void bar() {
}
}
このツールを開発するにあたってUberのエンジニアたちは、Boolean API、アップデートAPI、パラメータAPIという、3つのタイプのフラグAPIがあることを確認していた。Boolean APIは前述の例のように、Boolean値を返すものだ。アップデートAPIは、動作中のシステム内の機能フラグ値を更新する。そしてパラメータAPIは、バックエンドからコントロールされる実験値に対応した、非Booleanのプリミティブ値を返す。Piranhaは、"必要なエンジニアリング作業の量は極めて多いが、コードベース内に発生する頻度が極めて低い"ことから、最初の2タイプのみを処理する。
Piranhaの実行をチームの積極性に頼っていたのでは、不要なコードが定常的にクリーンアップされない可能性がある。そのためチームは、Piranhaを定期的に実行するワークフローパイプラインを構築した。Uberの場合、コードベース上で毎週、Piranhaを実行している。さらにパイプラインは、Uberのタスク管理システム内に、Piranhaが生成したプルリクエストを追跡するためのタスクも自動生成する。
Piranhaパイプラインはフラグ管理システムに、失効したフラグのリストを問い合わせる。個々のチームには、失効を定義する独自のタイムフレームの設定が認められている。起動されたPiranhaは、プルリクエストを生成し、フラグの元々に作者にアサインする。作業が処理されたことを確認するために、PiranhaTidyというリマインダボットも作成されており、オープン中のPirtanha関連タスクを定期的にユーザに通知する。
PiranhaはApache 2.0でライセンスされるオープンソースである。現時点ではJava、Swift、Object-Cをサポートしているが、オープン中のイシューでは、Kotlinや.NET、JavaScriptといった言語のサポート追加が求められている。チームは近々開催される第42回International Conference of Software Engineeringで、Piranhaに関する研究論文を発表する予定である。