フィーチャーフラグ
ルール
- フィーチャーフラグを使用して段階的ロールアウトを行う — コードをフラグの背後に配置し、段階的に有効化する
- フラグのタイプ: ブール値(オン/オフ)、パーセンテージ(ユーザーの10%)、ユーザーターゲティング(特定のID/セグメント)
- LaunchDarkly(エンタープライズ向け)、Flagsmith(オープンソース向け)、Vercel Flags または
@vercel/flags(Next.js向け)
- デフォルトでフラグをサーバーサイドで評価する — クライアントにはフラグの値のみを渡し、評価ロジックは渡さない
- フラグの命名規則:
enable-new-checkout、show-pricing-v2 — 説明的で、ケバブケースを使用
- 完全ロールアウト後はフラグを削除する — 古いフラグは技術負債となる; 有効期限を設定する
- パーセンテージロールアウト: ユーザーIDをハッシュ化して一貫したバケティングを行う — 同じユーザーは常に同じバリアントを表示する
- 新機能はデフォルトでフラグオフにする — フラグサービスが利用できない場合に安全に動作する
- A/Bテストにフラグを使用する: バリアントを定義し、コンバージョンイベントを追跡し、統計的有意性を測定する
- ローカル開発用にフラグのオーバーライドを環境変数に保存する
パターン
import { flag } from "@vercel/flags/next";
export const showNewCheckout = flag({
key: "show-new-checkout",
decide: () => false,
});
const enabled = await showNewCheckout();
import * as ld from "@launchdarkly/node-server-sdk";
const client = ld.init(process.env.LAUNCHDARKLY_SDK_KEY!);
const showFeature = await client.variation("new-checkout", user, false);
避けるべきこと
- フラグなしで機能をリリースする — すべての新機能はトグル可能であるべき
- フラグの依存関係をネストする — フラグロジックはフラットで独立した状態に保つ
- 100%ロールアウト後にフラグをコードに残したままにする — 2週間以内にクリーンアップを予定する
- ターゲティングルールを公開するクライアントサイドでのフラグ評価 — サーバーで評価し、結果を送信する