ソフトウェアアーキテクチャのためのC4モデル
#Simon_Brown
https://www.infoq.com/jp/articles/C4-architecture-model/
重要なポイント
アジャイル方法論への移行の結果として、ソフトウェアに関する図を作成することは縮小されています。図を作成したとしても、混乱と不明瞭さをしばしば抱えています。
C4モデルは、コンテキスト、コンテナ、コンポーネント、コードといった一連の階層的なソフトウェアアーキテクチャ図で構成されています。
C4モデルの階層構造は、異なるレベルの抽象化を提供するとともに、それぞれが異なる関心の聞き手に直結しています。
使用する表記法の凡例だけでなく十分な量のテキストを含めることで、図の曖昧さを回避できます。
曖昧なソフトウェアアーキテクチャ図は誤った理解を招き、良いチームをも減速させます。我々の業界では、より良いソフトウェアアーキテクチャ図を作成しようと真摯に努めていくべきです。数年におよぶ私自身のソフトウェア開発経験と、世界中のチームとの協力によって、私は「C4モデル」を作りました。C4はコンテキスト(context)、コンテナ(containers)、コンポーネント(components)、コード(code)の略です。ソフトウェアアーキテクチャを様々な表示倍率で記述するための一連の階層図で、それぞれが(関心の)異なる聞き手に有用です。コードをGoogleマップと考えてみてください。
レベル1: システムコンテキスト図
レベル1のシステムコンテキスト図は、構築しようとしているソフトウェアシステムが、それを使用する人や関連する他システムとの相互作用の観点からどのような位置づけにあるのかを図示します。次の例では、これから構築するインターネットバンキングシステムを示しています。
https://res.infoq.com/articles/C4-architecture-model/en/resources/c4-4-1529935843626.jpg
レベル2: コンテナ図
レベル2のコンテナ図は、ソフトウェアシステムを拡大したもので、それを構成するコンテナ(アプリケーション、データストア、マイクロサービスなど)を図示します。技術的な決定事項もこの図の重要な一部です。以下は、インターネットバンキングシステムのコンテナ図の例です。インターネットバンキングシステム(破線の範囲)は、サーバーサイドのWebアプリケーション、クライアントサイドのシングルページアプリケーション、モバイルアプリケーション、サーバーサイドのAPIアプリケーション、データベースという5つのコンテナで構成されています。
https://res.infoq.com/articles/C4-architecture-model/en/resources/1c4-5-1529934730472.jpg
レベル3: コンポーネント図
レベル3のコンポーネント図は、個々のコンテナの内部コンポーネントにまで拡大したものです。これらのコンポーネントは、コードベースのなかの実際の抽象概念(たとえば、コードのグループ化など)にマップしなければいけません。APIアプリケーション内のコンポーネントの(すべてではなく)一部を次に例示します。
https://res.infoq.com/articles/C4-architecture-model/en/resources/2c4-6-1529935332322.jpg
レベル4: コード
最後に、もしあなたが望むのであれば、個別のコンポーネントを拡大してどのように実装されているかまで図示できます。MainframeBankingSystemFacadeコンポーネントを構成する要素(インタフェースとクラス)を図示したUMLクラス図の例を示します。
https://res.infoq.com/articles/C4-architecture-model/en/resources/c4-7-1529935331734.jpg
ここからコンポーネントが多くのクラスで構成されており、コードを直接反映した実装の詳細であることがわかります。ただし、とりわけほとんどのIDEからオンデマンドに生成できる現代では、このレベルの詳細度で図を作成することはまずお勧めできません。