ソフトウェアアーキテクチャ・ハードパーツ - 読書メモ

Photo by Dimitar Stevcev on Unsplash

「ソフトウェアアーキテクチャ・ハードパーツ ― 分散アーキテクチャのためのトレードオフ分析」を読んだ。仕事でマイクロサービスを扱っているため読むことにしたが、トレードオフを認識した上での判断がとても重要であること。どのような状態がチームとしてよりよい状態なのかの判断軸のようなものを持てた。

何を目的としてどのように行うのか

モジュール化の推進要因の関係性の図があり、これがとてもわかりやすく会社やチームの現在のフェーズにおいて「何をやるべきか」の判断が適切に行える図だとおもう。

以下のような図が記載されており、各項目は以下のように説明されている。

モジュール化の推進要因の関係性の図

会社として求められている部分に焦点をあて、かつチームとして足りていない部分を補うための対策が考えられるとてもよい図だとおもう。モジュール化の推進要因としてこの図は整理されているが、以下の注意書きがある。

P49
アーキテクトは、明確なビジネス上の推進要因が存在しない限り、システムを小さなパーツに分割するべきではない

本書の冒頭にも以下のような注意書きがあり、一貫性を感じる。

P1
アーキテクトは、自分の問題に対する「銀の弾丸」を探し求めてはならない

P2
アーキテクトには、重要な決定の両側にある一連のトレードオフを客観的に判断・評価する能力が求められる
「決して最善のアーキテクチャを狙ってはいけない。むしろ、少なくとも最悪ではないトレードオフの組み合わせを狙おう」

分解と統合

どの単位で分解すべきか、分解の要因。どの単位で統合すべきか、統合の要因を小さなコンポーネント単位から大きくまとめたサービスの単位毎に定義されていく流れがとても素敵。個人的にはすんなり理解できる理論に思えた。

個人的な一番の関心事は、データベースの分解・統合をどのように考えるべきか。ここをちゃんと考えないと後でとても変更が大変になる印象があるためだ。分解・統合のパターン(パーツ)がいくつか紹介されているため実践でも活用できるのがありがたい。

分解・統合パターンの紹介でちゃんとトレードオフを認識できていなかったものとして「共通ライブラリとバージョニング」があった。この部分は読んでおいて良かったと思っている。

P226
粒度の荒い共通ライブラリのクラスファイルに変更が入った場合には、その変更を取り込みたいかどうかにかかわらず、共通ライブラリのバージョンが古くなってしまう
そのため、全てのサービスが最終的にその変更を採用しなければならない
ちいさな機能ベースのライブラリに分割した場合、どの機能がどのライブラリと依存しているかのマトリクス管理が必要になり、分割した泥団子のように見える(分散モノリスと呼ぶ人もいる)

P227
「バージョニングはシンプル」というのは、分散コンピューティングの9番目の誤信

バージョニングは非常に複雑
・バージョン変更の伝達
・古いバージョンの非推奨化

共通ライブラリのためにデプロイ性や保守性を下げてしまう可能性があり、またコミュニケーションコストも爆上がりする。npmパッケージで気軽にversion upして動かなくなる状況と似ているのかも知れない(非推奨化が伝えにくい)。

「Clean Craftsmanship」という書籍に以下の記述があり

P220
偶然の重複は排除すべきではない
本物の重複と偶然の重複の区別は、コードがどれだけ意図を表現できているかに依存する

本物の重複を共通ライブラリとして適切に切り出せるかどうか、境界付けられたコンテキストを抽出できているかによってしっかり見極めなければ共通ライブラリ化は行わないべきだと思う。偶然の重複を共通化してしまう代償はめちゃくちゃに大きい(自戒を込めて)。

雑なメモ

駄文

たくさん本を読んでいるが、それをまとめるようなアウトプットが間に合っていない。

ここ数年で、読んだ書籍についてちゃんとアウトプットしないと自分の中で知識が定着しない印象あるためやっていく。

See Also