de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

はじめに

ソフトウェアアーキテクチャのドキュメント作成は、しばしば圧倒感を与える。開発者は、誰も理解できないほど複雑な図を描くか、ドキュメントをまったく作らない。その結果、チームはコードの迷宮に迷い込んでしまう。

登場するのはC4モデル——シモン・ブラウンが考案した、ソフトウェアアーキテクチャの可視化のためのシンプルで階層的なアプローチ。ソフトウェアのGoogleマップと考えてください。世界地図から始めて、徐々にズームインして、個々の通りや建物まで見ることができるようになります。

VPasCode Editor: C4 Model - Hierarchical Drill-Down Software Architecture Framework

このチュートリアルでは、実際の例やPlantUMLのコードスニペット、Visual Paradigmのような現代的なツールの使い方についてのガイドを通じて、C4モデルの4つのレベルをすべて解説します。それにより、チームに実際に役立つプロフェッショナルなアーキテクチャ図を作成できるようになります。


🎯 実際の事例を通じてC4モデルを理解する

では、以下のようなドキュメントを作成しましょう「PayQuick」——ユーザーが送金、請求書の支払い、カードの管理ができる現代的なオンライン決済プラットフォームです。C4モデルの各レベルに対応する図を作成します。


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

何を示すか

システムが存在する環境における、3万フィート上からの俯瞰図。

PayQuickの例

アクター:

  • 個人顧客

  • Merchant(加盟店)

  • 銀行システム

  • SMSゲートウェイ

関係:

  • 顧客が送金する

  • 加盟店が支払いを受け取る

  • システムは外部の銀行と統合されている

  • システムはSMS通知を送信する

C4-PlantUMLコード

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

title PayQuick - システムコンテキスト図

Person(customer, "個人顧客", "アプリを使って送金や請求書の支払いを行う")
Person(merchant, "加盟店", "顧客からの支払いを受け取る")

System_Boundary(payquick, "PayQuickプラットフォーム") {
    System(payquick_system, "PayQuick", "顧客が支払いと送金を行うことを可能にする")
}

System_Ext(bank_system, "銀行ネットワーク", "銀行間送金を処理する", $tags="外部")
System_Ext(sms_gateway, "Twilio SMS", "取引通知を送信する", $tags="外部")
System_Ext(email_service, "SendGrid", "メール領収書を送信する", $tags="外部")

Rel(customer, payquick_system, "送金、請求書の支払い、取引の確認")
Rel(merchant, payquick_system, "支払いの受領、返金の発行")
Rel(payquick_system, bank_system, "API経由で送金を処理")
Rel(payquick_system, sms_gateway, "HTTPS経由でOTPおよび通知を送信")
Rel(payquick_system, email_service, "SMTP経由で領収書を送信")

LAYOUT_WITH_LEGEND()
@enduml

Visual Paradigmのヒント

Visual Paradigmでは、次の機能を使用してください。AIアシスタント自然言語でシステムを説明することで、初期のシステムコンテキスト図を生成します:「顧客、 merchants、および銀行連携を備えた決済プラットフォームのシステムコンテキスト図を作成する。」


📦 レベル2:コンテナ図

表示内容

主要な技術選定とそれらの相互作用。

PayQuickの例

コンテナ:

  • モバイルアプリ(iOS/Android)

  • Webアプリケーション(React)

  • APIアプリケーション(Spring Boot)

  • データベース(PostgreSQL)

  • メッセージキュー(RabbitMQ)

  • キャッシュ(Redis)

C4-PlantUMLコード

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

title PayQuick - コンテナ図

Person(customer, "顧客", "モバイルアプリまたはWebインターフェースを使用")
Person(merchant, "merchant", "Webダッシュボードを使用")

System_Boundary(payquick, "PayQuickプラットフォーム") {
    Container(mobile_app, "モバイルアプリ", "React Native, TypeScript", "顧客向けのユーザーインターフェースを提供")
    Container(web_app, "Webアプリケーション", "React, TypeScript", "管理者およびmerchant用ダッシュボードを提供")
    
    Container_Boundary(api, "APIアプリケーション") {
        Container(api_gateway, "APIゲートウェイ", "Node.js, Express", "ルーティング、認証、レート制限を処理")
        Container(payment_service, "決済サービス", "Spring Boot, Java", "決済および送金処理")
        Container(notification_service, "通知サービス", "Python, FastAPI", "SMSおよびメール通知を送信")
    }
    
    ContainerDb(database, "データベース", "PostgreSQL", "ユーザーアカウント、取引、残高を保存")
    ContainerDb(cache, "キャッシュ", "Redis", "セッションデータおよび頻繁にアクセスされるレコードを保存")
    ContainerQueue(queue, "メッセージキュー", "RabbitMQ", "非同期通知処理を処理")
}

System_Ext(bank_api, "銀行API", "外部銀行連携")
System_Ext(sms_provider, "Twilio SMS API")

Rel(customer, mobile_app, "使用", "HTTPS")
Rel(merchant, web_app, "使用", "HTTPS")
Rel(mobile_app, api_gateway, "APIコールを実行", "HTTPS/JSON")
Rel(web_app, api_gateway, "APIコールを実行", "HTTPS/JSON")
Rel(api_gateway, payment_service, "リクエストをルーティング", "gRPC")
Rel(api_gateway, notification_service, "リクエストをルーティング", "gRPC")
Rel(payment_service, database, "データの読み書き", "JDBC")
Rel(payment_service, cache, "頻繁にアクセスされるデータをキャッシュ", "Redisプロトコル")
Rel(notification_service, queue, "イベントを公開", "AMQP")
Rel(notification_service, sms_provider, "SMSを送信", "REST API")
Rel(payment_service, bank_api, "送金処理", "HTTPS")
@enduml

Visual ParadigmのAI機能

次を使用してください。スマートコネクタAIの提案機能を活用して、コンテナの種類や責任に基づいて、相互関係を自動検出・提案します。


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

表示内容

単一のコンテナの内部構造。

PayQuickの例

以下に、コンテナを詳細に見てみましょう。決済サービスコンテナを表示してそのコンポーネントを確認する:

コンポーネント:

  • 決済コントローラー

  • トランザクションマネージャー

  • 不正検出サービス

  • 残高計算機

  • リポジトリ層

C4-PlantUMLコード

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

title PayQuick - 決済サービスコンポーネント図

!define C4ShapeInRow 4
!define C4BoundaryInRow 1

Container_Boundary(payment_service, "決済サービス") {
    Component(payment_controller, "決済コントローラー", "Spring RESTコントローラー", "着信する決済リクエストを処理")
    Component(transaction_manager, "トランザクションマネージャー", "Springサービス", "決済ワークフローを調整")
    Component(fraud_detector, "不正検出サービス", "Springサービス", "不正の可能性がある取引を検証")
    Component(balance_calculator, "残高計算機", "Springサービス", "アカウント残高を計算および更新")
    Component(validation_service, "検証サービス", "Springサービス", "決済データおよびビジネスルールを検証")
    
    ComponentDb(transaction_repo, "取引リポジトリ", "Spring Data JPA", "取引記録を保存")
    ComponentDb(account_repo, "アカウントリポジトリ", "Spring Data JPA", "アカウントデータを管理")
    ComponentDb(fraud_repo, "不正ルールリポジトリ", "Spring Data JPA", "不正検出ルールを保存")
    
    Component(notification_client, "通知クライアント", "Feignクライアント", "通知サービスを呼び出し")
    Component(bank_client, "銀行クライアント", "Feignクライアント", "外部銀行APIと統合")
}

Rel(payment_controller, transaction_manager, "決済リクエストを転送")
Rel(transaction_manager, fraud_detector, "取引を検証するために")
Rel(transaction_manager, validation_service, "データを検証するために")
Rel(transaction_manager, balance_calculator, "残高を更新するために")
Rel(transaction_manager, transaction_repo, "取引を保存するために")
Rel(balance_calculator, account_repo, "アカウントデータを読み書きするために")
Rel(fraud_detector, fraud_repo, "ルールを照合するために")
Rel(transaction_manager, notification_client, "通知を送信するために")
Rel(transaction_manager, bank_client, "外部送金を処理するために")

@enduml

Visual Paradigmのヒント

使用する:コンポーネント図テンプレートVisual Paradigmのコンポーネント図テンプレートを使用すると、コンポーネント構造を迅速に作成できます。AIは、コンテナの種類に基づいてリポジトリ、サービス層、コントローラーなどの一般的なパターンを提案できます。


💻 レベル4:コード図(オプション)

表示内容

実際のクラス、インターフェース、メソッド。

例:不正検出サービスクラス

@startuml
title 不正検出サービス - クラス図

class 不正検出サービス {
    - 不正ルールリポジトリ fraudRepo
    - 取引リポジトリ txnRepo
    + checkFraud(txn: 取引): 不正結果
    - evaluateRules(txn: 取引): List<ルール>
    - calculateRiskScore(txn: 取引): Double
    - isVelocityExceeded(userId: String): Boolean
}

class 不正結果 {
    + isBlocked: boolean
    + riskScore: double
    + blockedRules: List<String>
    + getRiskLevel(): リスクレベル
}

class 不正ルール {
    + id: Long
    + ruleName: String
    + threshold: Double
    + isEnabled: boolean
    + evaluate(txn: 取引): boolean
}

class 取引 {
    + id: String
    + amount: BigDecimal
    + userId: String
    + timestamp: DateTime
    + merchantId: String
}

不正検出サービス --> 不正結果 : 戻り値
不正検出サービス --> 不正ルール : 使用
不正検出サービス --> 取引 : 検証
不正結果 ..> 不正ルール : 含む

@enduml

注意:レベル4の図は、以下のツールを使ってコードから自動生成するのが最適です:

  • Visual Paradigmのコードエンジニアリング機能

  • IntelliJ IDEAの組み込み図生成機能

  • APIドキュメント用のSwagger/OpenAPI


🛠️ 推奨ツール: Visual Paradigm + AI機能

なぜVisual Paradigmなのか?

Visual Paradigmは、C4図をネイティブでサポートし、強力なAI支援機能を提供する包括的なモデリングツールです:

C4モデリングの主な機能:

  1. AI駆動の図生成

    • システムを平易な英語で説明する

    • AIが適切なC4レベルの図を提案する

    • 初期構造を自動生成する

  2. スマートレイアウトエンジン

    • コンポーネントの自動配置

    • インテリジェントな接続線ルーティング

    • 図全体に一貫したスタイルを適用

  3. コードエンジニアリング

    • コードを逆に解析して図に変換する(レベル4)

    • 図を前向きに解析してコードの骨格を生成する

    • 図をコードベースと同期させる

  4. コラボレーション機能

    • リアルタイムでのチーム協働

    • バージョン管理との統合

    • 複数形式(PNG、PDF、SVG)へのエクスポート

  5. C4モデルテンプレート

    • 各C4レベル用の事前構築済みテンプレート

    • 業界別例

    • ベストプラクティスガイドラインが内蔵

Visual Paradigmの使い始め:

  1. ダウンロードコミュニティエディション(無料)またはエンタープライズエディション

  2. インストールマーケットプレイスからC4モデルプラグインをインストール

  3. 作成ウィザードを使って最初の図を描いてください

  4. AIアシスタントを使用する魔法の杖のアイコンをクリックすることで

  5. エクスポートチームと共有する


🚀 初心者のためのベストプラクティス

1. シンプルから始め、次に段階的に改善する

  • レベル1から始めましょう。たとえあまりにも基本的だと感じても

  • より深い掘り下げを行う前に、関係者からの承認を得ましょう

  • 必要に応じて段階的に詳細を追加する

2. 図を最新の状態に保つ

  • 主要リリースごとにレベル1〜2の図を更新する

  • 可能な限りレベル4の生成を自動化する

  • 古くなった図はアーカイブするが、削除しない

3. 名前を明確に付ける

以下のフォーマットを使用する:名前 [技術] – 説明

✅ 良い例:決済サービス [Spring Boot] - 決済取引を処理する
❌ 悪い例:PaymentServiceまたは決済のやつ

4. 対象の聴衆に適したレベルを選択する

対象の聴衆 推奨されるレベル
経営陣/クライアント レベル1のみ
プロダクトマネージャー レベル1〜2
DevOps/インフラストラクチャ レベル2〜3
開発者 レベル2〜4

5. 一貫した視覚的言語を使用する

  • C4の色の規則に従う

  • 類似した要素には一貫した形状を使用する

  • 関係の種類に応じて矢印のスタイルを維持する


📊 完全な例:レベル間でのユーザー体験のマッピング

以下を追跡してみましょう:「送金」機能をすべてのC4レベルで確認します:

レベル1(コンテキスト):顧客 → PayQuick → 銀行ネットワーク

レベル2(コンテナ):モバイルアプリ → APIゲートウェイ → 支払いサービス → データベース → 銀行API

レベル3(コンポーネント):支払いコントローラー → 取引マネージャー → 不正検出 → 残高計算 → 取引リポジトリ

レベル4(コード): PaymentController.transfer() → TransactionManager.process() → FraudDetection.checkFraud()


この階層的なアプローチは、異なるチームメンバーがシステムを適切な詳細レベルで理解するのを助けます。


🎓 結論

C4モデルは、恐れられる抽象的な概念であるソフトウェアアーキテクチャを、実用的でナビゲート可能な地図に変換します。全体像から始め、段階的に詳細にズームインすることで、CTOから初心者開発者まで誰もが役立つドキュメントを作成できます。

主なポイント:

✅ レベル1 舞台を設定するものであり、技術的な対象者であっても無視してはいけません
✅ レベル2 あなたのテクノロジー・スタックとデプロイ戦略を明らかにします
✅ レベル3 サービス内のコードの構成方法を示します
✅ レベル4 オプションです—可能であれば自動化しましょう
✅ Visual Paradigm およびAI機能を備えた類似ツールは、図の作成を50〜70%速めることができます
✅ ライブドキュメント 完璧なドキュメントより良いです—段階的に更新しましょう

思い出してください:目的は美しい図をつくることではありません。コミュニケーションを円滑にし、オンボーディング時間を短縮し、より良いアーキテクチャ意思決定を可能にするのです。今日からシンプルなシステムコンテキスト図から始め、チームの理解力と生産性が向上する様子を見てください。

次のステップ:

  1. 現在のプロジェクトの一つを選んでください

  2. 紙またはホワイトボードにレベル1の図をスケッチしてください

  3. それをC4-PlantUMLまたはVisual Paradigmに変換してください

  4. 非技術的なステークホルダーに共有してフィードバックを得ましょう

  5. 必要に応じて段階的にレベル2の詳細を追加する

楽しい図解を! 🎨