BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル ソフトウェアアーキテクチャのためのC4モデル

ソフトウェアアーキテクチャのためのC4モデル

ブックマーク

原文(投稿日:2018/07/09)へのリンク

重要なポイント

  • アジャイル方法論への移行の結果として、ソフトウェアに関する図を作成することは縮小されています。図を作成したとしても、混乱と不明瞭さをしばしば抱えています。 
  • C4モデルは、コンテキスト、コンテナ、コンポーネント、コードといった一連の階層的なソフトウェアアーキテクチャ図で構成されています。
  • C4モデルの階層構造は、異なるレベルの抽象化を提供するとともに、それぞれが異なる関心の聞き手に直結しています。
  • 使用する表記法の凡例だけでなく十分な量のテキストを含めることで、図の曖昧さを回避できます。
     

ソフトウェアアーキテクチャ図(ダイアグラム)は、ソフトウェアシステムを構築するための設計(事前設計)や既存ソフトウェアシステムの仕組み(ふりかえりの文書化や知見の共有、学び)を伝える手段として素晴らしいものです。

しかしながら、あなたがこれまでに見てきた大多数のソフトウェアアーキテクチャ図は箱と線が乱雑で大変困惑したことでしょう。アジャイルソフトウェア開発宣言の不運で意図していない副作用は、多くのチームが(UMLの使用を含む)図解や文書化の取り組みをやめたり縮小してしまったことです。

今日ではこういったチームは、ホワイトボードに描いたアドホックな図や、Microsoft Visioのような汎用的なツールの併用に依存する傾向があります。これらの取り組みについてIonut Balosin氏は昨年、"The Art of Crafting Architectural Diagrams"を投稿しています。このなかでは、不可解な表記法や不明瞭なセマンティクスに関連した、いくつもの一般的な問題が解説されています。

(画像をクリックして拡大)

曖昧なソフトウェアアーキテクチャ図は誤った理解を招き、良いチームをも減速させます。我々の業界では、より良いソフトウェアアーキテクチャ図を作成しようと真摯に努めていくべきです。数年におよぶ私自身のソフトウェア開発経験と、世界中のチームとの協力によって、私は「C4モデル」を作りました。C4はコンテキスト(context)コンテナ(containers)コンポーネント(components)コード(code)の略です。ソフトウェアアーキテクチャを様々な表示倍率で記述するための一連の階層図で、それぞれが(関心の)異なる聞き手に有用です。コードをGoogleマップと考えてみてください。

(画像をクリックして拡大)

これらのコードのマップを作成するには、ソフトウェアシステムの静的構造を記述するためにユビキタス言語を定義し、そのための共通の抽象セットが必要です。C4モデルはコンテナ(アプリケーション、データストア、マイクロサービスなど)やコンポーネントコードの観点からソフトウェアアーキテクチャの静的構造に関心を払っています。また、構築するソフトウェアシステムを使う人々についても考慮しています。

(画像をクリックして拡大)

レベル1: システムコンテキスト図

レベル1のシステムコンテキスト図は、構築しようとしているソフトウェアシステムが、それを使用する人や関連する他システムとの相互作用の観点からどのような位置づけにあるのかを図示します。次の例では、これから構築するインターネットバンキングシステムを示しています。

(画像をクリックして拡大)

銀行の個人顧客は、銀行口座に関する情報を参照したり、支払いを行うためにインターネットバンキングシステムを利用します。インターネットバンキングシステムは、銀行が従来からもつメインフレームバンキングシステムを通してこれを処理し、そして電子メールシステムから顧客に電子メールを送信します。図中の色分けは、どれが既存のソフトウェアシステム(灰色の箱)で、どれが構築するソフトウェアシステム(青色の箱)かを示しています。

レベル2: コンテナ図

レベル2のコンテナ図は、ソフトウェアシステムを拡大したもので、それを構成するコンテナ(アプリケーション、データストア、マイクロサービスなど)を図示します。技術的な決定事項もこの図の重要な一部です。以下は、インターネットバンキングシステムのコンテナ図の例です。インターネットバンキングシステム(破線の範囲)は、サーバーサイドのWebアプリケーション、クライアントサイドのシングルページアプリケーション、モバイルアプリケーション、サーバーサイドのAPIアプリケーション、データベースという5つのコンテナで構成されています。

(画像をクリックして拡大)

Webアプリケーションは、シングルページアプリケーションを含んだ静的コンテンツ(HTML、CSS、JavaScript)をシンプルに配信するJava/Spring MVCアプリケーションです。シングルページアプリケーションは、顧客のWebブラウザ上で実行されるAngularアプリケーションであり、インターネットバンキングの全機能を提供します。また、クロスプラットフォームのXamarinモバイルアプリケーションを使用して、インターネットバンキングの機能サブセットにアクセスすることもできます。シングルページアプリケーションとモバイルアプリケーションはどちらもJSON/HTTPS APIを使用します。JSON/HTTPS APIは、サーバーサイドで実行される別のJava/Spring MVCアプリケーションが提供します。APIアプリケーションは、データベース(リレーショナルデータベーススキーマ)から顧客情報を取得します。その他、独自のXML/HTTPSインターフェースを使用して、既存のメインフレームバンキングシステムと通信し、銀行口座に関する情報を取得したり、トランザクションを作成したりします。APIアプリケーションは、顧客に電子メールを送信する必要がある場合は、既存の電子メールシステムも利用します。

レベル3: コンポーネント図

レベル3のコンポーネント図は、個々のコンテナの内部コンポーネントにまで拡大したものです。これらのコンポーネントは、コードベースのなかの実際の抽象概念(たとえば、コードのグループ化など)にマップしなければいけません。APIアプリケーション内のコンポーネントの(すべてではなく)一部を次に例示します。

(画像をクリックして拡大)

2つのSpring MVC RESTコントローラは、JSON/HTTPS APIのためのアクセスポイントを提供し、その後データベースやメインフレームバンキングシステムと通信するための他のコンポーネントを利用します。

レベル4: コード

最後に、もしあなたが望むのであれば、個別のコンポーネントを拡大してどのように実装されているかまで図示できます。MainframeBankingSystemFacadeコンポーネントを構成する要素(インタフェースとクラス)を図示したUMLクラス図の例を示します。

(画像をクリックして拡大)

ここからコンポーネントが多くのクラスで構成されており、コードを直接反映した実装の詳細であることがわかります。ただし、とりわけほとんどのIDEからオンデマンドに生成できる現代では、このレベルの詳細度で図を作成することはまずお勧めできません。

表記法

C4モデルは特別な表記法を規定していません。ここまでの例でみてきたようにホワイトボードや紙、付箋、インデックスカード、その他様々なツールで十分機能するシンプルな表記法です。もちろん、パッケージ、コンポーネント、ステレオタイプを適切に用いて、表記法としてUMLを使うこともできます。使用する表記法にかかわらず、すべての要素に名前と種別("Person"、"Software System"、"Container"、"Component")、(適切であれば)技術選択、そして説明テキストを含めることを推奨します。図中に多くのテキストを含めることは珍しいかもしれませんが、この追加のテキストはソフトウェアアーキテクチャ図でよくある曖昧さを取り除きます。

たとえあなたにとって分かりきったことであっても、使用する表記法の凡例(key/legend)があることを確認してください。これは、色や形、略語、線のスタイル、罫線、サイズなどを含みます。その表記法は、理想的には詳細の各レベルにわたって一貫性を維持するべきです。先のコンテナ図の凡例を次に示します。

(画像をクリックして拡大)

最後に、図にタイトルを含めることを忘れないでください。それぞれの図の種別やスコープ(たとえば、「インターネットバンキングシステムのシステムコンテキスト図」)を明確に説明するために必要です。

より詳しい情報

C4モデルは抽象度の異なるレベルでソフトウェアアーキテクチャを伝えるシンプルな方法です。異なる(レベルの)聞き手に適した説明を伝えることができます。それはまた、いくつかの厳密で軽量なモデリングをソフトウェア開発チームに導入(多くの場合、再導入)する方法でもあります。補足的な図(ランタイムとデプロイメント)や例、表記法のチェックリスト、FAQ、カンファレンスのビデオ、ツールオプションなど、C4モデルについてより詳しく知りたい場合はc4model.comを参照してください。

著者について

Simon Brown氏は、ソフトウェアアーキテクチャを専門とする独立したコンサルタントであり、"Software Architecture for Developers"(ソフトウェアアーキテクチャ、技術的リーダーシップ、アジリティとのバランスについて役立つ開発者向けガイド)の著者です。また、コードのマップを作成するシンプルなアプローチであるC4ソフトウェアアーキテクチャモデルの考案者です。氏は国際的なソフトウェア開発カンファレンスの常連講演者であり、ソフトウェアアーキテクチャを視覚化し文書化することで世界中の組織を支援しています。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT