こたつとコード

エンジニアの読書手帖

『ソフトウェア設計の結合バランス』から学ぶ、アーキテクチャの結合について

book.impress.co.jp

Vlad Khononov 著の『ソフトウェア設計の結合バランス 持続可能な成長を支えるモジュール化の原則』 を読んだ。開発チーム内で過剰に疎結合を評価してしまった感覚があり、その違和感が何かを突き止めるために手に取った。

全体を通じて様々な角度から結合を掘り下げるため、結合周辺の語彙が自然と整理されていく。特筆すべきは、結合を一次元ではなく三次元で評価するアプローチで、この視点が最も勉強になったので重要だと思った箇所をまとめます。

モジュール性、複雑性、均衡度

本書では結合を評価するために、「モジュール性」「複雑性」「均衡度」といった言葉を用いている。それぞれ本書での説明をひく。

モジュール性

モジュール性に投資することで、適応性の高い柔軟なシステムを設計できる。つまり、モジュール性の主な目的は、システムの進化を可能にすることだ。(...) システムの柔軟性が低いほど、耐えられるストレスも少なくなる。耐えられるストレスが少ないほど、進化する要件の重圧に耐え切れず、壊れやすくなる。変化に対応する準備ができているモジュラーシステムは、長期的成功の見込みが大きい。(p.54)

複雑性

簡単に言ってしまうと、複雑性とは理解のしにくさだ。より形式的に言うなら、複雑性とは、人が何らかのシステムとやり取りする際に経験する認知負荷を反映したものと定義できる。認知負荷が大きいほど、システムがどのように動作するかを理解するのが難しく、それを制御し、その動作を予測することも難しくなる。(p.16)

本書で出てきた表現として「私たちの認知限界は成長しないが複雑性はスーパーリニア(優線形)スケールするため、ある時点で認知負荷の増加が認知能力を上回り、その時点でシステムは複雑になる」というものがある。 モジュール性・複雑性ともに、アーキテクチャの文脈でよく出てくる表現ではあるが、本書では特に瞬間的な問題や成功を扱っているわけではなく、「長期的な変化に耐えうるか」や「動作を予測することが難しくなる」といった時間軸の考慮を重要視している。

均衡度

本書では、モジュール性と複雑性を対置させ、それを均衡度という軸で表している。このように単一のスケールを置くことで3次元での評価をシンプルにしている。

均衡度

結合の次元を組み合わせる

コナーセンスであれ構造化設計のモジュール結合であれ、結合は常に強度と関連づけられてきた。しかし、たとえば名前のコナーセンス(最も低いレベルのコナーセンス)を目指すのは、追求する価値のある目標なのだろうか。そのような目標は現実的ではないだけでなく、第7章でも示したように、実際のシステムでは不可能な場合もある。(...) コンポーネント間の相互作用を設計する際のゴールは、結合の強度を最小化することではない。ゴールは、実装や進化、メンテナンスが容易なモジュラーシステムを設計することだ。これは、結合の3つの次元すべてを考慮することでのみ達成できる。(p.177)

ここでいう「3つの次元」とは、「結合強度」「距離」「変動性」を指している。それぞれの次元に対し、結合強度であれば「高い/低い」、距離であれば「遠い/近い」、変動性であれば「高い/低い」と評価を与えることで全体としての評価を出している。

均衡度の表

例えば、コンポーネント間の結合強度がたとえ低かったとしても、コンポーネント間の距離が近いということは関連のないコンポーネントが近くに配置されていることを示している。こういった局所的複雑性がある場所で、変動性(変更の頻度予想)が高いと変更時に近くに配置された関連のないモジュールでどれを変更しなければならないかを調べる必要が出てくる。 逆に、コンポーネント間の結合強度が高いとしても、コンポーネント間の距離が近ければそれは凝集性が高いモジュールだととらえることができる。

このように、単純に結合強度という一次元ではなく、複数の側面でとらえることで実用的な評価が可能になる。

変動性とドメイン理解

特に「変動性」という次元のおかげで、単純にアーキテクチャに対して静的な分析だけではなく、サービスの成長や市場の変化をもとに動的な分析が重要なことがわかる。ドメイン理解やサービス理解が重要なことはよく言われるが、それがアーキテクチャに対してどのような影響を与えるかは私自身そこまで理解できていなかった。本書は色々な側面からアーキテクチャを検討していることで、一つの概念や用語についても全体像を意識しながら理解する手助けをしてくれる。

また、本書を手に取る前に感じていた違和感として疎結合重視の感覚をあげていたが、それについても3次元的に評価することで「結合強度が低い(単に処理が共通化されていなければいい)」というわけではないことがよくわかった。

著者は『ドメイン駆動設計をはじめよう』という本も出版しているらしく、まさに変動性について深めることができそうな本になっている。 ぜひ読んでみたい。

www.oreilly.co.jp