この記事の要点
• コンウェイの法則: 組織のコミュニケーション構造がシステムのモジュール境界に反映される
• 逆コンウェイ戦略で理想のアーキテクチャに合わせて組織を編成する
• Team Topologiesの4つのチーム型で認知負荷を制約条件にした組織設計を行う
コンウェイの法則(Conway’s Law)は、1968年にMelvin Conwayが論文「How Do Committees Invent?」で提唱した、組織論とソフトウェア設計の橋渡しとなる洞察です。「システムを設計する組織は、その組織のコミュニケーション構造を反映した設計を生み出す」という、一見単純ながら現代のアーキテクチャ設計に深い影響を与える法則です。本記事では、コンウェイの法則の本質から、逆コンウェイ戦略、Team Topologies までを体系的に解説します。
概要
コンウェイの法則とは
Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure. — Melvin Conway, 1968
組織のコミュニケーション構造が、そのままソフトウェアのモジュール境界として現れるという観察です。4つのチームでコンパイラを作ると4パスのコンパイラになる、という有名な例があります。
flowchart TB
subgraph Org["組織構造"]
T1["Team A"]
T2["Team B"]
T3["Team C"]
T1 <--> T2
T2 <--> T3
end
subgraph System["システム構造"]
M1["Module A"]
M2["Module B"]
M3["Module C"]
M1 <--> M2
M2 <--> M3
end
Org -. 反映 .-> System
なぜ起こるのか
- コミュニケーションコスト: チーム間の会話は社内で最も高コスト
- 所有権の明確化: モジュール境界 = チーム境界で責任が明確になる
- 局所最適化: 各チームは自分の担当範囲を最適化する
- API = 契約: チーム間インターフェースがそのままAPIになる
原則・定義
コンウェイの法則の系
- ホモモルフィズム: システム構造 ≅ 組織構造
- コミュニケーションパスの反映: 会話しないチームのモジュールは統合されない
- 非可逆性: 一度できたシステム構造は組織構造を変えても簡単には変わらない
- マネジメントの制約: マネジメント階層が設計を制約する
- 組織変更=設計変更: 組織再編はアーキテクチャ再編と等価
Inverse Conway Maneuver(逆コンウェイ戦略)
ポイント: 「欲しいアーキテクチャが先にあり、それに合わせて組織を編成する」という戦略です。組織変更とアーキテクチャ変更は必ずセットで考えましょう。
flowchart LR
subgraph Traditional["従来型"]
O1["組織"] --> A1["アーキテクチャ"]
end
subgraph Inverse["逆コンウェイ戦略"]
A2["理想の<br/>アーキテクチャ"] --> O2["組織設計"]
O2 --> Result["期待通りの<br/>アーキテクチャ"]
end
構成要素
Team Topologies の 4 つのチーム型
Matthew Skelton と Manuel Pais が提唱した、コンウェイの法則を活用するチーム編成モデルです。
flowchart TB
Stream["Stream-aligned Team<br/>(価値提供チーム)"]
Platform["Platform Team<br/>(基盤提供チーム)"]
Enabling["Enabling Team<br/>(能力支援チーム)"]
Complicated["Complicated Subsystem Team<br/>(専門領域チーム)"]
Enabling -. 支援 .-> Stream
Platform -. サービス .-> Stream
Complicated -. 部品 .-> Stream
| チーム型 | 役割 | 認知負荷 |
|---|---|---|
| Stream-aligned | エンドツーエンドの価値提供 | 中 |
| Platform | 内部プラットフォーム提供 | 中 |
| Enabling | 他チームのスキル向上支援 | 低 |
| Complicated Subsystem | 専門知識が必要な部分 | 高 |
3 つのインタラクションモード
- Collaboration(協業): 期間を区切って密に協力
- X-as-a-Service(サービス提供): セルフサービスで利用
- Facilitating(ファシリテート): 学習や改善の支援
実装例
1. モノリスからマイクロサービスへの移行
flowchart TB
subgraph Before["移行前: 機能別組織"]
FE["Frontend Team"]
BE["Backend Team"]
DBA["DBA Team"]
QA["QA Team"]
Mono["単一モノリス"]
FE --> Mono
BE --> Mono
DBA --> Mono
QA --> Mono
end
subgraph After["移行後: ドメイン別組織"]
UserTeam["User Team<br/>(FE+BE+DBA+QA)"]
OrderTeam["Order Team<br/>(FE+BE+DBA+QA)"]
PayTeam["Payment Team<br/>(FE+BE+DBA+QA)"]
UserSvc["User Service"]
OrderSvc["Order Service"]
PaySvc["Payment Service"]
UserTeam --> UserSvc
OrderTeam --> OrderSvc
PayTeam --> PaySvc
end
機能別(FE/BE/DBA)の組織のままマイクロサービスに移行すると、各サービスに複数チームが関与し、調整コストが爆発します。ドメイン別のクロスファンクショナル組織に再編することが前提です。
2. コードオーナーシップと組織の対応
# .github/CODEOWNERS
# ドメイン別オーナーシップ
/services/user/** @org/user-team
/services/order/** @org/order-team
/services/payment/** @org/payment-team
/services/notification/** @org/notification-team
# プラットフォームチーム
/platform/** @org/platform-team
/infra/** @org/platform-team
# 共有ライブラリ(Enabling)
/libs/design-system/** @org/enabling-ui
/libs/auth-sdk/** @org/enabling-security
3. モジュール境界の設計例(TypeScript Monorepo)
// apps/user-service/src/index.ts
// User Team が所有。Order Team は import できない
export { UserService } from "./user.service";
export type { User, UserId } from "./user.types";
// apps/order-service/src/index.ts
// Order Team が所有。User の詳細型には依存しない
import type { UserId } from "@company/user-contracts"; // 契約のみ
export class OrderService {
async createOrder(userId: UserId, items: Item[]): Promise<Order> {
// UserId を使うが、User 実装の内部には触れない
return this.repo.create({ userId, items });
}
}
4. プラットフォームチームによるセルフサービス
// Platform Team が提供する内部プラットフォーム SDK
// Stream-aligned Team はこれを使って自律的にデプロイできる
interface PlatformSDK {
// Stream チームは YAML 1つで新サービスをデプロイできる
deployService(spec: ServiceSpec): Promise<DeploymentResult>;
provisionDatabase(spec: DbSpec): Promise<DbCredentials>;
createObservabilityDashboard(serviceName: string): Promise<DashboardUrl>;
}
interface ServiceSpec {
name: string;
image: string;
replicas: number;
resources: { cpu: string; memory: string };
env: Record<string, string>;
}
プラットフォームチームが良いAPIを提供すれば、他チームとの会話を最小化でき、コンウェイの法則の「密結合」を防げます。
メリット・デメリット
法則を活用するメリット
- 意図した設計の実現: 逆コンウェイで狙ったアーキテクチャに
- 高い自律性: チーム境界=モジュール境界で独立して動ける
- 低コミュニケーションコスト: 調整会議の削減
- 高速な意思決定: チーム内で完結
- 明確な責任: 誰が何を所有するか曖昧にならない
法則を無視するデメリット
- アーキテクチャの歪み: 組織の不整合がそのままコードの不整合に
- 密結合の蔓延: チーム間の非公式な依存が増える
- 調整の肥大化: 何をするにも会議が必要
- 責任の押し付け合い: バグの所有者が不明確
- リリースサイクルの硬直化: 全チーム同時リリースが必須に
ユースケース
コンウェイの法則を意識すべき場面
- マイクロサービス移行プロジェクト
- 大規模チームのスケーリング(Spotify Model など)
- モジュラーモノリスの設計
- 組織再編に伴うシステム再構築
- M&A による複数組織の統合
注意が必要な場面
- 小規模チーム(法則の影響が小さい)
- 研究開発フェーズ(構造がまだ流動的)
- 単発プロジェクト(長期最適化の必要が薄い)
落とし穴
注意: 組織を変えずにアーキテクチャだけ変えるのは最もよくある失敗パターンです。機能別組織のままマイクロサービス化すると、調整コストが爆発します。
1. 組織��変���ずにアーキテクチャだけ変��る
「マイクロサービスにすれば生産性が上がる」と思い、機能別組織のままサービス分割すると、1サービスに4-5チームが関与する地獄が待っています。組織変更とアーキテクチャ変更はセットです。
2. 過度な自律性の追求
全チームが完全独立を目指すと、共通基盤が崩壊します。Platform Team と Enabling Team による「意図的な共有」が必要です。
3. チームサイズの不適切さ
Amazon の「2ピザルール」(チームは2枚のピザで賄える人数)は、認知負荷の観点から妥当です。大きすぎると内部でさらに分裂し、小さすぎると専門性を維持できません。
実践メモ: Team Topologiesでは認知負荷をチーム設計の最重要指標と位置づけます。1チームが扱える範囲を明示的に制限しましょう。
4. 認知負荷の見落とし
1チームが扱うサービス数・技術数が多すぎると、認知負荷が限界を超えます。Team Topologies では認知負荷をチーム設計の最重要指標と位置づけます。
5. 組織変更の頻度
組織変更はアーキテクチャに直接影響するため、頻繁な再編はシステムの安定性を損ないます。最低でも1-2年は同じ構造を維持するのが望ましいとされます。
6. マトリクス組織の罠
機能横断型のマトリクス組織は、1人が複数の指揮系統に属するため、コンウェイの法則的には「境界が曖昧なシステム」を生みます。明確なオーナーシップが損なわれがちです。
比較表
組織モデルの比較
| モデル | 特徴 | アーキテクチャ傾向 |
|---|---|---|
| 機能別(FE/BE/QA) | 専門性重視 | モノリス寄り、層で分割 |
| ドメイン別 | 価値提供重視 | マイクロサービス |
| プロジェクト型 | 期間限定 | 一時的、負債が残りがち |
| マトリクス | 柔軟性重視 | 境界が曖昧 |
| Team Topologies | 認知負荷重視 | 意図したアーキテクチャ |
Stream-aligned vs Platform Team
| 観点 | Stream-aligned | Platform |
|---|---|---|
| 目的 | 顧客価値の継続的提供 | 他チームの生産性向上 |
| 成果物 | 機能・サービス | プラットフォーム・SDK |
| ステークホルダー | エンドユーザー | 他の開発チーム |
| 成功指標 | ビジネスKPI | DX/採用率 |
| リリース | 高頻度 | 安定重視 |
ベストプラクティス
- アーキテクチャ先行: 欲しい構造を決めてから組織を設計
- 認知負荷を制約条件に: チームが扱える範囲を明示
- APIファースト: チーム間は必ず明示的なAPIで通信
- 自律チーム: 1チームで価値提供を完結できる構成
- プラットフォーム投資: 共通基盤を専任チームで育てる
- Enabling Team: 横断的な学習支援を制度化
- 定期的な見直し: 半年~1年で組織設計をレビュー
- ドキュメント化: チームAPIとオーナーシップを明文化
まとめ
コンウェイの法則は、単なる観察を超えて、現代のソフトウェア設計に組織論を組み込む強力なツールです。
- 本質: 組織構造 ≅ システム構造
- 活用: 逆コンウェイ戦略で意図した設計を実現
- 枠組み: Team Topologies の4種のチーム型
- 指標: 認知負荷を制約条件とする
- 現実: 技術だけでは良いアーキテクチャは作れない
「良い組織なくして良いアーキテクチャなし」という視点を持つと、技術的決定の多くが別の景色に見えてきます。
応用トピック
Spotify Model の再評価
Spotify が2012年頃に公開した「Squad / Tribe / Chapter / Guild」モデルは世界中で模倣されましたが、Spotify 自身が2016年以降「これは理想像ではなく特定時点のスナップショット」と明言しています。盲目的な模倣ではなく、自組織に合わせた適用が重要です。
| 要素 | 役割 | 規模 |
|---|---|---|
| Squad | 自律的な機能提供チーム | 6-12人 |
| Tribe | 関連Squadの集合体 | 40-150人 |
| Chapter | 同職能の横串組織 | 数人-数十人 |
| Guild | 興味ベースの自発コミュニティ | 任意 |
認知負荷の3タイプ
Team Topologies では認知負荷を3つに分類します。
- Intrinsic(内在的): タスク自体の本質的難易度
- Extraneous(外在的): ツール・プロセスによる不要な負荷
- Germane(学習関連): スキル向上に役立つ負荷
外在的負荷をプラットフォームチームが吸収することで、Stream-alignedチームはIntrinsic/Germane負荷だけに集中できます。
ドメイン駆動設計との接続
Bounded Context とチーム境界を一致させることで、コンウェイの法則を設計に活かせます。
flowchart LR
subgraph DDD["DDD: Bounded Contexts"]
BC1["User Context"]
BC2["Order Context"]
BC3["Payment Context"]
end
subgraph Teams["Teams"]
T1["User Team"]
T2["Order Team"]
T3["Payment Team"]
end
BC1 <-.-> T1
BC2 <-.-> T2
BC3 <-.-> T3
リモートワーク時代のコンウェイの法則
物理的な距離ではなく「コミュニケーション頻度」が構造を決めます。非同期コミュニケーション(Slack、GitHub Discussion、ドキュメント)が中心のリモート組織では、より明確なAPI契約と文書化が必要になります。
組織再編の実例
Amazon の 2ピザチーム: Jeff Bezos が提唱。「全員を2枚のピザで賄えない規模のチームは大きすぎる」。この原則がAWSマイクロサービスアーキテクチャの基礎となりました。
Netflix の Freedom & Responsibility: 少人数チームに最大限の自律性を与え、Chaos Engineering など独自の文化を生みました。
GitHub の Open by default: リポジトリオープン化によりチーム間の情報非対称を削減し、境界を柔軟に保ちました。
組織と技術的負債の関係
技術的負債の多くは、過去の組織構造の「化石」です。機能別組織時代に作られたモノリスを、ドメイン別組織に再編後も使い続けると、組織とコードのミスマッチが負債として蓄積します。逆に言えば、組織を変えずにコードだけリファクタリングしても、同じ構造が再生成されます(これをコンウェイの逆襲と呼ぶ人もいます)。
チームAPIの文書化
各チームは自分たちの「API」を文書化すべきです。
# User Team API
## 提供するサービス
- User Service (REST/gRPC)
- User Events (Kafka topic: user.events)
## 所有するドメイン
- ユーザー登録・認証・プロフィール管理
## 所有しないもの
- 注文履歴 (Order Team)
- 決済情報 (Payment Team)
## 連絡方法
- Slack: #team-user
- On-call: PagerDuty "user-team"
- Office Hours: 火曜 14:00-15:00
## SLO
- API可用性: 99.95%
- p99 レイテンシ: < 200ms
Fracture Plane(破断面)
Team Topologies では、チーム境界を引くべき「自然な破断面」として以下が挙げられています。
- ビジネスドメイン境界: DDDのBounded Context
- 規制要件: PCI-DSS、GDPR等の対象範囲
- 変更頻度: 高頻度変更と低頻度変更の分離
- パフォーマンス特性: レイテンシ重視 vs スループット重視
- 技術スタック: モバイル vs Web vs データ分析
- リスクプロファイル: ミッションクリティカル vs 実験的
これらの破断面に沿ってチームを編成すると、コンウェイの法則が味方になります。
アンチパターン: 一つのPRに複数チームがレビュー必須
1つの変更に対して複数チームの承認が必要な状況は、コンウェイの法則の観点では「境界が壊れている」サインです。オーナーシップを見直し、1つのPRは1チームで完結できる設計にします。
測定可能な指標
コンウェイの法則の活用度を計測するために、以下の指標を追跡できます。
| 指標 | 意味 | 望ましい状態 |
|---|---|---|
| Cross-team PR rate | 複数チームが関与するPR割合 | 低い |
| Team deployment frequency | チーム単位のデプロイ頻度 | 高い(独立) |
| Lead time per team | 変更から本番までの時間 | 短い |
| Incident blast radius | 1障害の影響チーム数 | 1 |
| On-call escalation breadth | オンコール中に招集されるチーム数 | 少ない |
Modular Monolith への示唆
マイクロサービスに移行せずとも、コンウェイの法則の知見は Modular Monolith にも適用できます。同一リポジトリ内でもモジュール境界を明確にし、モジュールごとにオーナーを決め、モジュール間の依存をCIで検査することで、組織構造とコード構造の一致を保てます。DDDの文脈では「Bounded Context per Module」が自然な単位です。
// モジュール依存ルールの例 (dependency-cruiser)
{
forbidden: [
{
name: "no-cross-module-internals",
from: { path: "^src/modules/([^/]+)/" },
to: {
path: "^src/modules/(?!$1)([^/]+)/internal/",
},
},
],
}
ソフトウェア考古学としての組織分析
既存コードを調べると、過去の組織構造が読み取れます。特定ディレクトリのコミット履歴を分析すれば、かつてそこに責任を持っていたチームが見えてきます。リファクタリングや再編の計画時、このようなソフトウェア考古学的アプローチで「なぜこうなっているか」を理解することが、効果的な変更の前提になります。
参考リソース
- Melvin Conway - How Do Committees Invent?
- Martin Fowler - Conway’s Law
- Team Topologies (Skelton & Pais)
- Thoughtworks - Inverse Conway Maneuver
- Martin Fowler - MicroservicePremium
- Accelerate - Forsgren, Humble, Kim
- Platform Engineering on Kubernetes (Manning)