というのは一見当然なのだけれど、いつも意識しておくと良いと思ったのでメモだけする。定期的に、やっぱり分割リリースできるとありがたい、という気持ちになる。
いくつかのリリース可能なモジュールに分割する
でかい機能を一気にリリースしようとするとしばしば失敗する。リリースは一貫性のある単位で行う必要があるから、Pull-Reqを小出しにリリースしていくのではなく、1つのPull-Reqに部分要素を溜めていって、一定のタイミングでリリースするという手法になりがち。これが大規模化したものがビッグバンリリースと呼ばれており、だいたい大変な事が起こる。
これを回避するためには、リリースをいくつかのモジュールに分解すればよい。しかも、一貫性、すなわちユーザから見て矛盾せず動作する状態を維持しつつそれぞれのモジュールをリリースできる必要がある。
ただ分解するだけでは動作確認ができないので、モジュール間を結ぶインターフェイスを適切に定義する必要がある。
- 単体でリリースしても一貫性を損ねないモジュール
- モジュールの動作確認のためのI/F
- ブラウザの場合は、クエリパラメータとかでやりとりすると便利だったりする(人間が手でテストしやすい)
実際のコードベースと、ここで言うモジュールとは別物で、リリースのために人間が作業の区切りとして設けるものがモジュールだと考えてほしい。とはいえ、コードベースとリリース単位が合致していると色々と便利なので、合致していると良い。
リバート可能性
モジュールが必ずしも安全にリリースできるとは限らない。一貫性を損ねてしまったという理由でモジュールのリリースを取り消したいといったことが起こる。リバートしても一貫性が壊れないなら、どんどん出して困ったらリバートという営みができるようになるから、万一の際にはリバートすれば良いという保険を作るためにも、「リバートすると残留したデータで一貫性が壊れる」という設計は避けておきたい。とにかく重要なのは、機能を構成するコンポーネントを疎結合にしておくこと。
パブリックからうまく隠す
最終的に機能が全部リリースされるまでは、ユーザの目線からは機能を隠しておきたいはず。スタッフだけで確認できるように、特殊なクエリパラメータを使えば確認できるとか、スタッフとしてログイン時にのみ動作するといった仕組みを用意しておくと良い。
特にオチなし
クリーンアーキテクチャを読むとだいたい同じことが書いてあって便利。