ソフトウェアアーキテクチャの基礎メモ
ソフトウェアアーキテクチャの目的
ソフトウェアアーキテクチャは建築構造と同様に、内外からシステムに作用する力に対して、システムが崩壊しないように保つためのもの。内外から働く作用を考慮しながらシステムをヘルシーに進化させ続けるためのものとも言えるだろうか。
アーキテクチャ特性
そしてこの目的を達成するために備わっていることが期待される性質がアーキテクチャ特性である。アーキテクチャ特性の候補となるのが、-ility
である。
- Testability
- Scalability
- Security
- Agility
など
ソフトウェアアーキテクチャの本書での定義
本書におけるソフトウェアアーキテクチャとは、アーキテクチャ特性を備えるために必要なもので、構造になったものと構造にならなかったもので構成される。
- 構造になったもの
- 構造にならなかったもの
- システムを構築する上でのルールやガイドなど
クリーンアーキテクチャのような「xxアーキテクチャ」はアーキテクチャパターン (アーキテクチャスタイル)であり、アーキテクチャそのものではない。構造にならなかったもの、に近い。
アーキテクティングのプロセス
1. 要件やドメインの関心事から優先すべきアーキテクチャ特性とその程度を定める
例えば、事業として「市場への投入速度」が求められるような開発の場合、以下のような優先すべきアーキテクチャ特性が考えられる (アジリティは複合的な特性として捉えている)。
前提としてアーキテクチャ特性の全部入りのようなものはできない:
- 設計や構造が複雑になりすぎてしまうため
- アーキテクチャ特性は互いに干渉し合うため
- ex. セキュリティ向上のための取り組みは基本的にパフォーマンスに影響を与える
なので、与えられた制約条件、環境下で備えなければならないアーキテクチャ特性を定めることが重要となる。
2. 様々な影響を考慮してアーキテクチャ上の決定を行っていく
アーキテクチャは様々なものに影響を受ける、与えるためそれらを考慮して決めていく必要がある。
アーキテクチャが影響を受ける、与えるもの
- 開発チームの能力、スキル、知識
- 開発チームがシステムを構築するまで構造は実際には存在しない
- 作らないとアーキテクチャ特性を満たしているか、計測、評価できない
- 開発チームが作れない構造では意味がない
- ソフトウェア開発エコシステムの変化
- 構造は何かしらの技術を用いて実現される
- ソフトウェア開発エコシステムエコシステムは絶えず変化している
- 技術の変化はアーキテクチャ特性の実現容易性などに影響を与える
- ex. Dockerのコンテナ技術
- 現在エコシステムがどう変化しているか、この先どう変化していくかを考える必要がある
- 組織のコミュニケーション構造
- システムを設計する組織は、そのコミュニケーション構造をそっくり真似た構造の設計を生み出してしまう (コンウェイの法則)
- データ
- データは貴重なもので、システム自体よりも寿命が長い
- どこにどのように格納するのかが重要
- 分析データの扱いはアーキテクチャ特性に影響を与える
- ex. パフォーマンス、セキュリティ
- データは貴重なもので、システム自体よりも寿命が長い
アーキテクチャにおけるすべての影響を事前に把握できない
影響を与えるものは大きく以下のようなパターンがあり、事前にすべては把握できない。
- 既知の既知
- 我々が知っていると知っていること
- 既知の未知
- 現時点で既知ではないと知っていること
- 未知の未知
- 我々が知らないということさえ知らないこと
アーキテクティングの指針
ソフトウェアアーキテクチャはGoogleで答えが見つかるような類のものではない。そしてアーキテクチャには正解も不正解もなく、ただトレードオフが存在するだけのものである。
アーキテクティングの指針は
- トレードオフを見極め、最善ではないかもしれないが、少なくとも最悪ではないソリューションを選択していく
アーキテクティングへの向き合い方
1. イテレーティブな活動であると捉えること
「必要最小限のアーキテクチャ」を心がける。そしてそれをイテレーティブに育てていくイメージ。
必要最小限のアーキテクチャを実現するためのテクニック
- 責任を持てる限りにおいて判断、意思決定を遅らせる、ここぞという時 (以下の時点)で決める
- 最終責任時点: 決定を下し損ねると、重要な代替案がなくなる時点
- 最大責任時点: 決定することで、最も前向きな影響を与える時点
- アーキテクチャ特性に直接影響しない設計判断や具体的な実現方法は開発チームに委ねる
- 開発チームと一緒に実現していく
- 開発や運用からフィードバックを得ていく
- 未知なものが減っていく
2. 継続的な活動であると捉えること
アーキテクチャを見直し続ける。
アーキテクチャが経年劣化しないように、継続的に見直し続けることが重要。
- システムが備えるべきアーキテクチャ特性はビジネスの状況や環境の変化によって変わっていく
- アーキテクチャに影響を受ける、与えるものの状況も時間の経過とともに変化していく
これはまさに建築物のリフォーム、リノベーションの感覚に近い。