UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【システム開発】Featureフラグについて

Featureフラグについて調べた

こちらの資料が主に参考になった speakerdeck.com

RevComm社がサービスの安定性と信頼性を高めるためにFeature Flagを導入し、実践した過程と結果をまとめたもの

Feature Flagとは、ソースコードの修正や再デプロイなしに機能の有効化・無効化を制御する手法

単純な解釈だとソースコード上に新機能を利用するかどうかのフラグが出現するイメージ

    if( useNewAlgorithm ){
      return enhancedSplineReticulation();
    }else{
      return oldFashionedSplineReticulation();
    }

このスライドで知ったのは、Martin Fowler氏がFeatureフラグ(Feature Toggle)についての記事を書いており、その中でFeatureフラグを生存期間変更頻度という2つの軸で分類していること

martinfowler.com

生存期間は、Featureフラグをいつまで使うのか?という観点

Feature Flagの中には、数年という単位で利用されるものもあれば、数日といった短い期間で役目を終えるものもあるらしい

変更頻度は、どの程度の頻度でFeatureフラグを変更する必要があるのか?という観点

デプロイのたびに変わるものもあれば、実行中に再設定が必要なもの、リクエストごとに変更するものなど、さまざまあると

氏によると、この2軸を組み合わせることで、Feature Flagは下記の4種類に分類される

  • Release Toggles: 未完成のコードもリリースできるようにするために利用される。 トランクベース開発などで用いられ、リリースの制御を目的とする。
  • Experiment Toggles: A/Bテストを実施する際に利用される。 リクエストごとにランタイムで特定のコードを実行する。
  • Ops Toggles: システムの運用面の振る舞いを制御するために利用される。 機能のパフォーマンスが不明確な場合や、必要に応じて迅速に機能を無効化したい場合などに用いられる。
  • Permission Toggles: 特定のユーザーに対してのみ、恒久的に製品体験を変更するために利用される。 例えば、プレミアムユーザーだけに特定の機能を有効化するといった場合に用いられる。

これを参考に、最適な実装方針を決定する必要がある

Featureフラグという名前ではなかったが、私はA/Bテストの目的でFeatureフラグを使った経験があった(Experiment Toggles)

この時の感想としては、プランナーからA/Bテストしたいからとフラグの追加要求はあるものの、削除要求はなかったためフラグが残り、かなり運用が大変だった思い出がある

導入するのは良いが、不要になった定期的に削除する仕組み作りが必要であると思う

その仕組みに関しては、こちらのスライドが参考になった

OpenFeatureと自動生成を活用したフィーチャーフラグの宣言的集約管理 - Speaker Deck

フラグの利用が一定期間通過したら落ちるテストを自動生成してCIで落とす仕組み

ここまでやらないとうまくいかない気がしている