2022年1月20日
Feature Flags
即効性を誇るトランクベース開発。導入に興味がありますか?いくつかの課題と、フィーチャーフラグがどのように役立つかについて説明します。
トランクベース開発(Trunk-Based Development: TBD)を最もよく理解するためには、今日のほとんどのエンジニアリングチームがどのように働いているかを知ることから始めるとよいかもしれません。
時には、featureブランチの代わりにリポジトリーフォークでこれを修正することもあります。具体的な方法はチームによって多少異なりますが、この一般的なアプローチが最も一般的なようです。
これは通常、ブランチ戦略と呼ばれ、長寿命featureブランチで作業すると言われることもあります。これは、当時はgitflowと呼ばれていた作業方法から生まれたものです。
そして、表面的には、トランクベース開発はそれほど異質なものではありません。開発者は自分自身のブランチをオープンしますし、あまり一般的ではありませんが、devやQAなどの本番前の環境のブランチが存在することもあり、本番リリースはリポジトリのmainブランチをキーとして行われます。
では、どう違うのでしょうか?
トランクベース開発は、上記のシナリオとは原理的にも実践的にも異なります。具体的には、TBDは次のように宣言しています。
トランクベース開発では、このような働き方をするチームをよく見かけます。
この恩恵はすぐに受けられます。数日、数週間単位で離れてしまったコードベースをマージする必要がなくなるので、マージの複雑さが軽減されます。新しい機能を構築する際には、常に現在のバージョンと照らし合わせることになります。他のチームの変更を毎日取り込み、数日前、数週間前、あるいは数カ月前に他のチームが行った変更に基づいてリファクタリングしなければならない、というつらいシナリオを避けることができます。
トランクベース開発は、CI/CDを加速させるものです。複雑さが減るということは、より多くのリリースをより早く、リベースやリファクタリングに費やす時間を減らし、コンフリクトやエラーをより早く発見することでより高い品質を得られるということです。
では、なぜ全てのチームがトランクベース開発を採用しないのでしょうか?端的に言うと、必ずしも簡単ではないからです。
常にmainブランチにマージし、全てのチームが新機能に取り組む際に最新の変更を反映させられるのは素晴らしいですが、現実には多くの衝突の余地があります。
また、リリースの場合はど うでしょうか?もし4つの機能チームが不完全な作業を唯一のブランチに送り込み、ブランチごとに機能を選択することができなくなってしまったら、どうやって本番リリースを安全にカットし、緊急に必要なホットフィックスを適用することができるのでしょうか?
このような問題があるため、多くのチームがトランクベース開発ではなく、長寿命のfeatureブランチを使い続けています。彼らは、CI/CDプロセスにさらなる摩擦を生み、速度に影響を与え、リスクをもたらすことを知りながらも、これを続けています。
ここで欠落しているのは、大抵の場合、フィーチャーフラグです。
もし、フィーチャーフラグについてあまりよく知らないのであれば、私たちの紹介ブログ「フィーチャーフラグとは」で詳しく説明しています。基本的にフラグとは、コード内に条件付きフラグを立てておいて変更を提供する方法です。これにより、特定の条件に基づいて異なるバージョンのコードを提供することができます。トランクベース開発で最も重要なのは、フィーチャーフラグによって、まだ実運用に耐えられないような変更をコードにマージしながらも、使用しないようにすることです。
トランクベース開発ワークフローにフィーチャーフラグを追加すれば、(フィーチャーフラグの他の多くの恩恵を受けつつ)リスクのほとんどが取り除かれることがわかります。