ソフトウェア開発におけるフィーチャー・トグルは、ソースコード内で複数のフィーチャーブランチを維持する代替手段を提供します。コード内の条件によって、実行時にフィーチャーを有効または無効にします。アジャイル環境では、トグルは本番環境で使用され、一部またはすべてのユーザーに対してオンデマンドでフィーチャーを有効化します。このように、フィーチャー・トグルを使用すると、頻繁なリリースが容易になります。カナリアリリースやA/Bテストなどの高度なロールアウト戦略も扱いやすくなります。[ 1 ] [ 2 ]
継続的デリバリーは、新しいリリースが継続的に本番環境にデプロイされない場合でも、フィーチャー トグルによってサポートされます。機能は完成する前であってもメイン ブランチに統合されます。バージョンはテスト環境に一度デプロイされ、トグルによって機能をオンにしてテストできます。ソフトウェア統合サイクルが短縮され、本番環境にデプロイできるバージョンを提供できるようになります。[ 3 ]
この技術の3つ目の用途は、開発者が未完成の機能を持つ製品のバージョンをリリースできるようにすることです。これらの未完成の機能は非表示(切り替え)にされ、ユーザーインターフェイスには表示されません。本番ブランチへの機能のマージやマージ解除の手間が軽減されるため、ソフトウェアの小さな増分バージョンを多数作成できます。[ 4 ]
機能トグルは、機能スイッチ、機能フラグ、機能ゲート、機能フリッパー、または条件付き機能とも呼ばれます。
フィーチャー・トグルは、基本的に条件文内で使用される変数です。そのため、これらの条件文内のブロックは、フィーチャー・トグルの値に応じて「オン」または「オフ」に切り替えることができます。これにより、開発者はソフトウェアの流れを制御し、展開準備ができていない機能をバイパスすることができます。ランタイム変数の背後にあるコードブロックは通常存在し、条件付きで実行できます(場合によっては同じアプリケーションライフサイクル内で)。一方、プリプロセッサディレクティブの背後にあるコードブロックやコメントアウトされたコードブロックは実行できません。フィーチャー・フラグ方式では、これらの方法のいずれかを使用して、開発の異なるフェーズでコードパスを分離できます。
機能トグルの主な用途は、リリース直前にソフトウェアの変更をマージする際に発生する可能性のある競合を回避することですが、これはトグル負債につながる可能性があります。トグル負債とは、機能が永続的に有効化された後にソフトウェア内に残るデッドコードによって発生し、オーバーヘッドを生み出します。このコード部分は、他のコードに影響を与えないように慎重に削除する必要があります。
フィーチャー トグルは通常、実装に使用される条件文を超えたライフサイクル管理を必要とします。38 社の実務担当者と開発者を対象とした調査では、フィーチャー トグルの使用に関する 17 のプラクティスが特定され、管理、初期化、実装、クリーンアップのプラクティスに分類されました。よく報告されたプラクティスには、各トグルのメタデータの記録、デフォルト値の定義、トグルに加えられた変更のログ記録、および専用ツールを使用した管理などがありました。[ 5 ]
Google Chrome の調査では、機能トグルは迅速なリリース、トランクベースの開発、A/B テストをサポートできるが、トグルが長期間コードベースに残ると追加のメンテナンスが必要になることもわかった。[ 6 ]機能トグル構造に関するその後の研究でも同様に、トグルは目的が終わった後に削除または整理されないと、コードの複雑さを増大させ、デッドコードを導入し、保守性を低下させる可能性があることが指摘された。[ 7 ]
機能切り替えには主に2種類あります。1つはリリース切り替えで、開発者は製品リリース前に動作状況に応じて残すか削除するかを決定します。もう1つはビジネス切り替えで、以前のコードとは異なる用途を満たすため残されます。
機能トグルは、次のシナリオで使用できます。[ 1 ]
機能切り替えは次のように保存できます: [ 8 ]
機能グループは、連携して動作する機能トグルで構成されます。これにより、開発者は関連するトグルのセットを簡単に管理できます。[ 9 ]
カナリアリリース(またはカナリアローンチ、カナリアデプロイメント)を使用すると、開発者は少数のユーザーによって機能を段階的にテストできます。フィーチャーフラグは、カナリアローンチを行う別の方法であり[ 10 ]、地理的な場所やユーザー属性によるターゲティングも可能です[ 11 ] 。機能のパフォーマンスが満足できない場合は、悪影響なくロールバックできます[ 12 ] 。 この名前は、有毒ガスを鉱夫に警告するためにカナリアが使用されたことに由来しています。
Martin Fowler氏は、リリース・トグル(特定の種類の機能トグル)は「機能を本番環境に導入する際には最後の手段にすべきである」と述べています。その代わりに、機能をそれぞれ実装してリリース製品に安全に導入でき、他の問題を引き起こさない小さな部分に分割するのが最善です。[ 2 ]
機能切り替えは、Flickr [ 13 ]、Disqus [ 14 ]、Etsy [ 15 ] 、 Reddit [ 16 ] 、 Gmail [ 17 ]、Netflix [ 18 ]などの多くの大規模ウェブサイトや、 Google Chrome Canaryや Microsoft Office [ 19 ]などのソフトウェアで使用されています。