進化的アーキテクチャ
https://cover.openbd.jp/9784873118567.jpg
進化的アーキテクチャという本が翻訳され出版された。光栄なことにレビューに参加させていただていた。 私が手探りでやっていたアーキテクチャ構築というものに対する姿勢を一変させるような本だった。
ソフトウェアアーキテクチャというのは、ソフトウェアを多く含むが、その外側も包含したアーキテクチャのことである。しかしソフトウェアが多くを占めるため、ソフトウェアの方法論を拡張して通じる部分が多い。
近年のよいソフトウェアのトレンドである、変化し続け、古びにくく、適切に境界づけられているという性質をソフトウェアアーキテクチャに持ち込んだものが進化的アーキテクチャである。
本書には進化的アーキテクチャを構築し育てるための考え方や方法論が網羅的に書かれている。
進化的アーキテクチャに限らず、ソフトウェアアーキテクチャを構築する役割(ソフトウェアアーキテクト)の仕事は何か。 本書の第一章の第一段落にこう書いてある。
アーキテクトの仕事とは、(それが何であれ)重要なものを全て理解し、釣り合いを取ることだ。
ソフトウェアアーキテクトの仕事のアウトプットは、ソフトウェアアーキテクチャを構築することではあるが、それは単なる結果だ。 よいソフトウェアアーキテクチャを構築するためには
重要なものを全て理解する。重要なものには法律、慣習やビジネス上の制約といったソフトウェア以外のものも含まれる。
重要なものの釣り合いを取る。重要なものの特徴はしばしば相反する。
の2つが必要だ。
さて、ソフトウェアでは、ソースコード、ハードウェアの性質、エコシステム、成し遂げたいもの、あるいは私たちの知識が日々刻々と変化し続ける。 そのため、現時点での最善が今後も最善であることなどなく、時間の経過による変化を避けられない。
そのソフトウェアを利用するソフトウェアアーキテクトも同様に、現時点での最善が今後も最善であることなどなく、時間の経過による変化を避けられない。
近年までは、自分達がリソースを投じてコントロールできる部分で吸収可能であったので、変化がソフトウェアアーキテクチャの問題として顕在化することは少なかった。 しかし近年はソフトウェアがカバーする領域の拡大やオープンソースなライブラリの充実などで、自分達のリソースのみでコントロールできる部分は相対的に減少し、変化はソフトウェアアーキテクチャの問題として無視できなくなっている。
つまり、近年のよいソフトウェアアーキテクチャの必須の性質の一つとして変化に対応し続けられることが加わったということだ。 この絶え間なく変り続けてゆける性質を「漸進的な変更」と呼ぶことにする。
さらに、単に変化に反応し適応するのではソフトウェアアーキテクチャの複雑さが徐々に上昇し柔軟性が失われて寿命を迎えてしまうため、自分達が考える好ましい形へと誘導あるいは良い性質を保持するような仕組みをソフトウェアアーキテクチャ自身に持たせておかなければいけない。 この好ましい形へと誘導し保持し続ける仕組みを「適応度関数」というもので担保させることにする。
最後に、ソフトウェアを用いたシステムというものは何かと繋がって仕事をするものがほとんどだ。 繋がって仕事をなすソフトウェアに仕事をさせようとした場合、特に意図をもっていなければ繋がりを増やす方向へと向かい続けてしまう。 ソフトウェアが複数あり、いずれかのソフトウェアを入れ替えようとした場合に繋がりが多ければ多いほどそのソフトウェアを入れ替えるのは困難になる。 もし実情に合わなくなったソフトウェアを入れ替えられないとしたら、それと繋がっているソフトウェアの塊の寿命を早めてしまうことになる。
そのため、長寿命なソフトウェアアーキテクチャには、ソフトウェア同士は仕事をするには十分に繋がるが必要以上には繋げないという「適切な結合」という観点が欠かせない。
この3つのキーワード「漸進的な変更」「適応度関数」「適切な結合」に気を配ったソフトウェアアーキテクチャが進化的アーキテクチャと呼ばれるものだ。 本書では、これらのトピックについてそれぞれ章を割いて説明している。
この中で私がとくにハッとさせられたのは「適応度関数」という概念だった。
先ほどよいソフトウェアアーキテクチャの条件に、重要なものを全て理解し釣り合いを取ることだと述べた。 重要なものの釣り合いを満たした状態を維持し続けるためにはどうするか。 条件を観測できるよう定量化し、もしソフトウェアアーキテクチャの変更によって違反がうまれたらすぐに検知し知らせればよい。
私はソフトウェアを作るときにまずどう使いたいかをユニットテストに書き、その条件を満たすようなプロダクションコードを書くテスト駆動開発というやり方をとることが多く、それなりにうまくいっていた。 ソフトウェアを繋いで構築するソフトウェアアーキテクトでもこのやり方を拡張し、どういう性質を保護したいかを適応度関数に書き、それを満たすソフトウェアアーキテクチャを構築するというのは、「あ、これでいいんだ」という衝撃と「なるほどな」という納得が同時にやってきた。