コンテンツにスキップ

C4 model

C4 model は、ソフトウェアアーキテクチャ向けの階層的可視化記法で、Simon Brown によって 2018 年に作成されました。Context、Container、Component、Code という 4 つの入れ子になった抽象レベルを定義し、各図が何を描くべきで何を描くべきでないかを規定します。

正本リンクhttps://c4model.com
メンテナSimon Brown
キット内の hometemplate/docs/diagrams/c4/
pentaglyph 内のスロット5 つ中 #2 ― 可視化層

アーキテクチャ図は典型的に次の問題を抱えます:

  • 箱-線専制 ― 箱が何を表すか誰も分からない(プロセス? クラス? データベース?)
  • 記法の分裂 ― UML、ArchiMate、ad-hoc 形状が同じリポに混在
  • 単一ズーム呪い ― すべてを示す巨大な 1 枚は読めない。モジュールごとに 1 枚だとビッグピクチャを失う

C4 は 4 つの離散的ズームレベル を強制し、それぞれで「箱」が意味するものを明確にすることで、3 つすべてを解決します。

レベル箱が表すもの対象読者1 プロジェクトの典型件数
L1 ― System Contextソフトウェアシステム全体(自分のもの + 外部)非技術ステークホルダーを含む全員1
L2 ― Containerデプロイ / 実行可能ユニット(Web アプリ、API、DB、メッセージバス)開発者 + 運用top-level system ごとに 1
L3 ― Componentコンテナ内のコードグルーピング(モジュール、パッケージ)そのコンテナで作業する開発者コンテナごとに 1
L4 ― Codeクラス / 関数(ほぼ描かない ― IDE が既に描画)実装者稀。オンデマンドのみ

規律: 1 つの図にレベルを混ぜない。Container 図に外部システムを描いてはいけない(L1)、Component 図にコンテナを描いてはいけない(L2)。

pentaglyph は docs/diagrams/c4/workspace.dsl(Structurizr DSL)を全 C4 図の single source of truth として扱います。SVG レンダーは docs/diagrams/c4/exports/ に置かれ commit されるので、GitHub / CodeCommit Web UI がローカルツールなしで表示できます。

template/docs/diagrams/c4/
├── workspace.dsl ← 正本(Structurizr DSL)
└── exports/ ← commit される SVG レンダー
├── system-context.svg
├── container.svg
└── component-<name>.svg

pentaglyph は C4 図を arc42 と対応付けます:

  • arc42 §3 Context & ScopeC4 L1 System Context
  • arc42 §5 Building BlocksC4 L2 Container + L3 Component
  • arc42 §6 Runtime View ↔ シーケンス図(C4 自体ではないが同じ方式で描画)
  • Structurizr DSL ― テキスト DSL、バージョン管理可能、Simon Brown 本人の推奨
  • Structurizr Lite ― DSL のローカルレンダラ
  • PlantUML / Mermaid ― 動くが手動レイアウトが必要、公式 C4 スタイリングを失う
  • 作図ツール(Lucidchart、draw.io) ― 許容されるがコードからドリフトし lint できない
  • 非自明なアーキテクチャ会話で箱を描く必要があるとき。「これは何の箱?」が 1 単語で答えられるようになる
  • オンボーディングに特に有用 ― 新エンジニアが C4 図を初見で読める
  • 単一プロセススクリプト
  • プロセス の図(BPMN が良い)や、 データフロー の詳細図(DFD が良い)