[読書]進化的アーキテクチャ ―絶え間ない変化を支える
頭の中で手段と目的がこれまでよりも深く繋がった。
ソフトウェアをとりまく環境はものすごいスピードで日々変化していく。ソフトウェアをその変化に適応させ、すばやく適切に進化させていかないと、厳しい環境でそのソフトウェアは生き残れない。
これまで自分は、スクラムなどのアジャイル開発手法のような「チームの作り方 / 開発の進め方」という観点から、変化の激しい環境でソフトウェアを適切に進化させていく方法について学んだり、実践したことはわりとあった。ただ、「ソフトウェア設計」という観点から、こういったテーマについてあまり学んだり考えたりしたことが少なく、たまたま書店でみかけてたこともあり読んでみた。
ソフトウェアを設計する際には、(当然だけど)要件をみたす設計を考えること、その要件を満たすにあたって重視すべきソフトウェアの性質を特定することの二点が必要になってくる。
ここで言っているソフトウェアの性質とは、例えば以下のようなもので、ものすごく種類がたくさんある。
- パフォーマンス
- セキュリティ
- 信頼性
- 拡張性
- カスタマイズ性
- スケーラビリティ
- パフォーマンス
- 保守性
- etc.
互いに相反するものも多いこれらの性質の中から、自分達のソフトウェアにとってもっとも重要なものが何であるかについて、トレードオフを考慮しつつ決定するのがアーキテクトの最初の仕事の一つだ。
Architecture Decision Records という考え方がある。ソフトウェア設計上の何らかの意思決定を行なった際に、背景や目的、検討に上がった選択肢と分析結果、最終的に選択した内容とその理由をきちんと記録として残しましょう、という考え方。
「なぜ」その設計上の意思決定をしたのか、背景や理由が記録に残っていないことが多い。意思決定を行なった人の記憶が薄れたり人が入れ替わったりすることで、背景や理由がチームから失われてしまう。結果として、意思決定時に重視していたソフトウェアの性質とは真逆の方向にソフトウェアを進化させていってしまい、ソフトウェアが本来の目的を達成できなくなってしまうリスクがある。Architecture Decision Records はこういったリスクを軽減・回避するための考え方。
本書では、Architecture Decision Records とは違ったアプローチでこのリスクに対応する方法を案内している。言っていることは凄くシンプル。
- 設計上重視したいソフトウェアの性質を決めましょう
- ソフトウェアがその性質を満たせているかを測定するための「適応度関数」を特定しましょう
- ソフトウェア修正時にデプロイメントパイプラインで「適応度関数」によるソフトウェアの再評価が行われるようにしましょう
- この前提の上で環境の変化に適応するために漸進的な進化を、適応度関数によって正しい方向に誘導しながら、ソフトウェアを適切な方向にすばやく成長させていきましょう。
抽象的な話が多く書かれていたけど、中心となるメッセージはこれだけ。
適応度関数は自動テストや静的解析のような自動的に実行されるものかもしれないし、ソフトウェアを法的な観点で検査する人力のものかもしれない。SLO / SLI のようなプロダクション環境で計測される指標かもしれない。重視したい性質の種類の数以上に、測り方の種類はたくさんある。
適応度関数によって、ソフトウェアが当初重視していた性質をどれくらい満たせているのかがわかり、意図しない方向に進化していることにすばやく気づく事ができる。気づくことによって、正しい方向にソフトウェアを導き直すことや、設計上重視していた性質がそもそも間違っていないかを考え直すきっかけにもなる。
そうすれば、アーキテクチャやデータ構造を、これまでよりもアグレッシブ/適切なタイミングで/確実に変更していけるようになる。ソフトウェアの表層的な部分だけではなく、アーキテクチャやデータ構造といった、より深い部分まで、ソフトウェアが身を置く環境に適応させながら進化し続けることができる。
それが、他のソフトウェアが環境に適応できず駆逐されていくなかで、自分達のソフトウェアが強く生き残り続けることに繋がる。
ソフトウェアがもつ性質のすべてが、適応度関数によって簡単に測れるものではないかもしれない。人は測れることしか測れない。
ただ、測れることを正しく測るための仕組みを作っておくことで、人の想像力や発想力を、もっとクリエイティブな部分や、見えないものを見ようとする部分に使うことができるようになるのかな。
あくまでも測ることは手段で、実際の測り方はこれまでもあたりまえのようにやっていることが多いんだけど、本書を読んで、その手段と成し遂げたい目的が、自分の頭の中でこれまでよりもうまくリンクした感覚がある。
結局の所、やっているすべてのことは、世界に通用する強いプロダクトをつくるためにつながるべきだし、つなげないといけないんだ。
ちょうど新しいソフトウェアの設計を考えているタイミングなので、今回はこれまで以上に本書に書いてあったことを意識してみようと思う。
おしまい。