適応型システム設計 / Adaptive Systems Design
Wardley Mapping、Team Topologies、リーン要件定義。
組織とシステムの共進化。
→ DDD 対応: ddd/02-context-map.md §チーム境界
1. Wardley Mapping
概念
技術コンポーネントの 進化段階 を可視化し、戦略的な意思決定を支援するツール。
進化の 4 段階
| 段階 | 英語 | 特徴 | 例 |
|---|
| I | Genesis | 新しい、不確実、カスタム | AI による見積自動化 |
| II | Custom Built | 理解が進むが、まだ個別開発 | 我々の PMS |
| III | Product/Rental | 標準製品として利用可能 | Salesforce, SAP |
| IV | Commodity/Utility | 差別化にならない。汎用サービス | AWS, メール, 認証 |
マップの読み方
ユーザーニーズ (上)
│
├── [Genesis] ← 差別化の源泉。自社で開発
├── [Custom Built] ← まだ標準製品がない
├── [Product] ← 買えるなら買う
└── [Commodity] ← 汎用サービスを使う (下)
我々のシステムでの適用
| コンポーネント | 段階 | 判断 |
|---|
| 受注別原価管理 | Custom Built | 自社開発 (差別化) |
| 見積BOM展開 | Custom Built | 自社開発 (コア) |
| Sales CRM | Product | 汎用品も検討可 → 自社開発 (統合のため) |
| 認証 (IAM) | Commodity | 外部サービス利用 |
| メール通知 | Commodity | SaaS 利用 |
| インフラ (サーバ) | Commodity | VPS |
2. Team Topologies
4 つのチームタイプ
| タイプ | 英語 | 役割 |
|---|
| ストリームアラインド | Stream-aligned | ビジネス価値の流れに沿ったチーム |
| イネーブリング | Enabling | 他チームの能力開発を支援 |
| 複雑サブシステム | Complicated Subsystem | 高度な専門知識が必要な領域 |
| プラットフォーム | Platform | 共通基盤の提供 |
3 つのインタラクションモード
| モード | 説明 | いつ使うか |
|---|
| コラボレーション | 密に協働 (発見フェーズ) | 新しい境界を探索中 |
| X-as-a-Service | API/サービスとして利用 | 安定した境界が確立後 |
| ファシリテーティング | 一方が他方を支援 | イネーブリングチームの関与 |
コンウェイの法則
「システムの構造は、それを作った組織のコミュニケーション構造を反映する」
逆コンウェイの法則: 望ましいシステム構造に合わせてチームを編成する。
我々のシステムへの適用
Stream-aligned:
├── Sales チーム → Sales CRM (bc-sales, bc-activity, bc-operations)
└── PMS チーム → PMS (bc-quotation, bc-procurement, bc-production, bc-sales-billing)
Collaboration (コラボレーション):
└── 両チーム → Integration Contracts (共同管理)
Platform:
└── 認証、インフラ、CI/CD
3. バウンデッドコンテキストとチームの対応
原則: 1 チーム = 1-3 BC
✅ PMS チーム: 見積・受注 + 手配 + 製作 + 売上 + 買掛 + 原価 (6 BC)
→ 中小チームなら OK (密結合なBCなので実質 1 システム)
❌ 1 人が Sales と PMS の両方を開発
→ BC の境界が曖昧になり、結合が強くなる
認知負荷 (Cognitive Load)
チームが管理できる BC の数は、チームの認知負荷に依存:
| チームサイズ | 管理可能な BC 数 | 注意点 |
|---|
| 1-2 人 | 1-2 BC | 最低限のドメインに集中 |
| 3-5 人 | 2-4 BC | 関連性の高い BC をまとめる |
| 5-8 人 | 3-6 BC | 明確な境界と API 定義が必要 |
4. リーン要件定義 (Lean Requirements)
要件のムダ
| ムダ | 説明 | 対策 |
|---|
| 過剰な文書 | 読まれない仕様書 | 「動くソフトウェア」を優先 |
| 過早な詳細化 | まだ不確実なのに詳細仕様 | ラストレスポンシブルモーメント |
| ゴールドプレーティング | 必要以上の機能追加 | MoSCoW 法で優先順位 |
| 手戻り | 要件の理解不足による手直し | ドメインエキスパートとの協働 |
分析の 3 レベル
| レベル | 対象 | 期間 | 成果物 |
|---|
| 戦略 (Strategic) | 事業目標、ビジョン | 四半期-年 | Wardley Map, ロードマップ |
| 戦術 (Tactical) | 機能領域、フロー | 月-四半期 | コンテキストマップ, ユーザーストーリーマップ |
| 戦闘 (Operational) | 個別機能、画面 | 週-月 | ユーザーストーリー, 受入基準 |
MoSCoW 法
| 分類 | 意味 | 例 |
|---|
| Must have | 必須。これがないとリリースできない | 受注登録、見積作成 |
| Should have | 重要。なくても回避策がある | 帳票の自動生成 |
| Could have | あると良い。時間があれば | ダッシュボード |
| Won't have (this time) | 今回は対象外 | AI 見積予測 |
5. 適応的な設計判断
ラストレスポンシブルモーメント
「決定を遅らせることのコストが、遅らせることの利益を上回る直前」に決定する
| 決定 | 遅らせてよい? | 理由 |
|---|
| DB の選択 | はい | 後で変更可能 (リポジトリパターン) |
| BC の境界 | やや | 初期は粗く、後で分割 |
| API の公開仕様 | いいえ | 他システムが依存すると変更困難 |
| テーブル名の命名 | いいえ | 後からの変更コストが高い |
可逆的な判断 vs 不可逆的な判断
| 可逆的 (Type 2) | 不可逆的 (Type 1) |
|---|
| 内部のコード構造 | 外部 API の仕様 |
| UI デザイン | データベーススキーマ (本番運用後) |
| ライブラリの選択 | 言語/フレームワークの選択 |
Type 2 は素早く決めて試す。Type 1 は慎重に、しかし過度に遅らせない。