業務モデルを設計する - AI開発を支える意味グラフと実行可能なトレーサビリティ

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

はじめに

AIコーディングによって、仕様から実装を生成するコストは急速に下がっています。

一方で、生成対象となる仕様そのものが曖昧であれば、AIは曖昧さをもっともらしい実装へ変換します。コード生成能力が高いほど、誤った解釈も広範囲へ一貫して展開されます。

この問題に対して必要なのは、より長いプロンプトではありません。業務知識を、参照可能、検査可能、再生成可能な中間表現へ変換することです。

本稿では、業務モデルを単一のドメインモデルやUML図としてではなく、次の要素からなる意味グラフとして捉えます。

  • Domain:業務概念、属性、状態
  • Dictionary:属性の意味的な型
  • Use Case:アクターが達成する業務目的
  • Service:事前条件と事後条件を持つ業務操作
  • Business Rule:操作時に強制する制約
  • Error:ルール違反や業務上の失敗
  • Screen State Machine:人間とのインタラクション
  • View Structure:表示情報と論理配置

重要なのは、これらを個別に記述することではありません。モデル間の参照方向、情報の所有権、導出規則を固定することです。

業務モデルはファイル集合ではなく意味グラフである

業務モデルの全体構造は、概ね次のようになります。

Business Sources
      │ source_ref
      ▼
Use Case ──uses──▶ Service ──enforces──▶ Business Rule
                       │                       │
                       │                       └──violates──▶ Error
                       │
                       ├──reads/writes──▶ Domain
                       ├──precondition──▶ Domain State
                       └──postcondition─▶ Domain State

Domain.Attribute ──type──▶ Dictionary Domain

Screen State ──invokes──▶ Service
      │
      └──view──▶ View Structure ──field──▶ Domain.Attribute

この構造には二種類の関係があります。

一つは、明示的な参照です。

SV-M003.related_rules → BR-M005
SCR-M002.action       → SV-M003
VIEW-M002.field       → ManufacturingOrder.PlannedQuantity

もう一つは、参照をたどって決定的に導出される情報です。

ManufacturingOrder.PlannedQuantity
  → domain.yaml の type: Quantity
  → dictionary.yaml の Quantity
  → number入力、最小値0、3桁区切り表示

後者を各成果物へ書き写すと、モデルはすぐに二重管理になります。業務モデル設計では、何を記述するか以上に、何を記述せず、どこから導出するかが重要です。

Domain――業務状態の閉包を定義する

Domainは業務上の名詞を集めたデータ辞書ではありません。エンティティ、属性、関係、状態によって、業務操作が成立する空間を定義します。

entities:
  - name: ManufacturingOrder
    attributes:
      - name: OrderNumber
        type: ManufacturingOrderNumber
      - name: PlannedQuantity
        type: Quantity
      - name: CreatorId
        type: EmployeeId
      - name: ApproverId
        type: EmployeeId?
      - name: Status
        type: ManufacturingOrderStatus

Domainが所有すべきなのは、少なくとも次の情報です。

  • 業務上の識別単位
  • 属性と関連
  • 必須/任意
  • 業務状態の有限集合
  • 集約境界

ここで定義された状態は、Serviceの事前条件・事後条件、Business Rule、シナリオから参照されます。

Domain State
  ├─ Service.preconditions
  ├─ Service.postconditions
  ├─ Business Rule.condition
  ├─ Screen transition guard
  └─ Scenario Given / Then

したがって、状態モデルには閉包性が必要です。Serviceが生成する事後状態はDomainに存在し、後続Serviceの事前状態へ接続できなければなりません。

検査すべき代表的な欠陥は次のとおりです。

  • 到達不能状態
  • どの操作からも生成されない状態
  • 終端のない遷移
  • Domainに存在しない状態を参照する事前条件
  • 禁止遷移を回避できる別Service

Dictionary――プリミティブ型の上に意味型を置く

業務属性をstringintegerdateだけで表現すると、値の意味が利用箇所へ分散します。

例えばQuantityには、単なる整数以上の契約があります。

domains:
  - id: Quantity
    base: integer
    input: number
    display_format: "#,##0"
    validation:
      min: 0

Dictionaryは、プログラム言語におけるtypedefやValue Objectの型契約に相当します。

Domain.Attribute
      │ type
      ▼
Logical Domain
      ├─ base type
      ├─ allowed values
      ├─ min / max
      ├─ pattern
      ├─ input representation
      ├─ display representation
      └─ readonly semantics

この関係から、次の成果物を導出できます。

  • プロトタイプの入力コントロール
  • 出荷UIの表示形式
  • クライアント/サーバー検証
  • シナリオfixtureの妥当性
  • 境界値テスト候補
  • APIスキーマ

ポイントは、QuantityというドメインIDで実装を分岐しないことです。生成器はbaseinputvalidationといった宣言語彙を解釈します。個別ドメイン名をハードコードすると、辞書が拡張可能な型システムではなく、条件分岐の一覧になります。

Use Case――業務価値の完了条件を表す

Use Caseは画面遷移やAPI呼び出しの一覧ではありません。アクターが業務上の目的を達成する単位です。

UC-M002 製造指図を承認する
  Actor: 承認者
  Precondition: 承認対象が申請されている
  Main flow:
    1. 承認対象を照会する
    2. 対象を選択する
    3. 内容を確認する
    4. 承認する
  Alternative flow:
    - 不備がある場合は差し戻す
  Outcome:
    - 承認結果を確認できる

Use CaseとServiceは、一対一とは限りません。

UC-M002
  ├─ SV-M002 承認対象を照会する
  ├─ SV-M004 製造指図の詳細を取得する
  ├─ SV-M003 製造指図を承認する
  └─ SV-M005 製造指図を差し戻す

逆に、一つのServiceが複数Use Caseから再利用されることもあります。

Use Caseを軸に検証するのがE2Eシナリオです。E2Eは個々のルールではなく、アクターの目的がUIから永続化まで貫通して成立することを確認します。

Service――状態変化を契約として定義する

Serviceは業務モデルの主要な実行単位です。単なるユースケース名の言い換えではなく、入力、事前条件、事後条件、関連ルール、失敗を持つ契約として定義します。

- id: SV-M003
  name: 製造指図を承認する
  inputs:
    - ManufacturingOrder.OrderNumber
    - Approver.EmployeeId
  preconditions:
    - 製造指図が申請済みである
  postconditions:
    - 製造指図が承認済みになる
    - 承認者と承認日時が記録される
  related_rules:
    - BR-M005
  errors:
    - ERR-M003

Serviceは各モデルを接続するハブになります。

Use Case ──uses──────────▶ Service
Screen   ──invokes───────▶ Service
Service  ──input─────────▶ Domain.Attribute
Service  ──pre/post──────▶ Domain State
Service  ──related_rule──▶ Business Rule
Service  ──error─────────▶ Error
Scenario ──verifies──────▶ Service

Serviceの事前条件はUIの活性条件へ投影できますが、ルールの強制点はService層に置きます。UI制御をセキュリティ境界や業務ルールの実体にすると、API、バッチ、別UIからの呼び出しで制約を回避できます。

また、事後条件は「処理が成功した」という抽象表現ではなく、シナリオのThen節とテストassertionへ落とせる粒度が必要です。

Business Rule――検証可能な業務制約を分離する

Business Ruleは、特定画面の条件ではなく、業務操作に対して常に成立させる制約です。

- id: BR-M005
  name: 自己承認の禁止
  condition: 製造指図を承認するとき
  expectation: 承認者は当該指図の作成者と異なる
  source_ref:
    - doc: sources/製造管理規程.pdf
      section: "4.2 職務分掌"
  confidence: confirmed

Ruleには、少なくとも次の性質が必要です。

  • 一意なIDを持つ
  • 適用条件と期待結果が分離されている
  • 真偽判定可能である
  • 業務ソース上の根拠を持つ
  • confirmed / inferred / assumedを区別する
  • 少なくとも一つのServiceから強制される
  • 対応する機能シナリオを持つ

confidenceは承認状態ではなく、由来の分類です。人間がassumedを承認しても、それは「受容された仮定」であり、文書根拠を持つconfirmedへ自動昇格してはいけません。

Error――失敗の語彙を統一する

業務上の失敗をメッセージ文字列だけで扱うと、Service、UI、API、テストで表現が分岐します。

- id: ERR-M003
  name: SelfApprovalProhibited
  related_rule: BR-M005
  message: 作成者本人は承認できません

Errorを独立した語彙として管理すると、次の参照を同一の意味へ束縛できます。

Business Rule violation
       ↓
ERR-M003
  ├─ Service.errors
  ├─ Scenario expected_error
  ├─ UI message
  ├─ API error mapping
  ├─ Test assertion
  └─ Verification report

HTTPステータスや例外クラスは技術表現です。業務エラーIDを中心に置き、それぞれの実装表現へマッピングするほうが責務を分離できます。

Screen State MachineとView Structureを分離する

画面モデルでは、インタラクションと表示構造を分離します。

Screen State Machine

Screen State Machineは、画面やダイアログを状態として扱い、操作、ガード、Service呼び出し、遷移先を定義します。

SCR-M001 承認対象一覧
  │ select
  ▼
SCR-M002 承認内容確認
  │ approve → SV-M003
  ▼
SCR-M003 承認完了

ここには表示項目の詳細や入力検証を重複して持たせません。

View Structure

View Structureは、再利用可能なVIEWとして表示項目と論理配置を定義します。

VIEW-M002
  main
    基本情報
      ManufacturingOrder.OrderNumber
      ManufacturingOrder.CreatorId
    製造計画
      ManufacturingOrder.PlannedQuantity
    actions
      SV-M003 承認
      SV-M005 差戻し

それぞれの所有権は次のようになります。

情報 SSOT
画面・ダイアログの状態遷移 Screen State Machine
項目の配置、順序、一覧列、タブ View Structure
項目の存在と必須性 Domain
入力形式、表示形式、値域 Dictionary
操作の事前条件・事後条件 Service
業務上の禁止・制約 Business Rule
仮想スクロールなど技術的実現方法 Architecture

この分離により、画面モデルは技術非依存の論理画面契約になります。

画面構造IRによる決定的な合成

Screen、View、Domain、Dictionary、Serviceは、画面構造IRへ合成できます。

Screen State Machine
       +
View Structure
       +
Domain
       +
Dictionary
       +
Service
       ↓
Screen Structure IR
  ├─ fields
  ├─ labels
  ├─ layout tree
  ├─ list columns
  ├─ control types
  ├─ actions
  └─ transitions

同じIRをプロトタイプ生成器と出荷UIレンダラが消費すれば、ゲートで承認した画面構造と出荷される画面構造を定義上そろえられます。

Screen Structure IR
  ├─ Prototype HTML
  └─ Production UI View

これは単なるコード生成の効率化ではありません。「導出可能な構造を人間が手書きし、意味の一部を落とす」という欠陥経路を閉じるための設計です。

実装者が担当するのは、原則として次の領域です。

  • データ結線
  • HandlerとServiceの接続
  • 共有UIコンポーネント
  • CSSと視覚表現
  • フレームワーク固有の挙動

一方、業務項目、ラベル、項目順、コントロール種別、業務操作はSSOTから導出します。

二軸のシナリオで意味を検証する

業務モデルは、二つの異なる軸でシナリオへ変換します。

シナリオ 起点 検証対象
E2Eシナリオ Use Case アクターの業務目的が端まで成立するか
機能シナリオ Business Rule 正常、境界、期限、閾値、異常を網羅するか

Use Caseだけを検証すると、業務フローは通っても境界条件が漏れます。Ruleだけを検証すると、個別条件は正しくても利用者の目的が端まで成立する保証がありません。

さらに、Serviceの事後条件とエラーについて、機能シナリオのThen節が全節を検証している必要があります。

Service.postconditions
  ├─ 状態が承認済みになる
  ├─ 承認者が記録される
  └─ 承認日時が記録される
           │
           ▼
Scenario.Thenのassertion集合

テストが存在するだけでは不十分です。仕様上の保証がassertionへ保存されていることが必要です。

トレーサビリティを実行可能なグラフとして扱う

トレーサビリティは管理表ではなく、コンパイル結果の健全性を検査するグラフです。

Business Source
  → UC / BR / SV
  → Scenario
  → Test
  → Source Code
  → Verification Report

このグラフから、次の欠陥を検出できます。

欠陥 検出条件
根拠のないルール source_refがない
参照切れ SVが存在しないBRを参照する
孤立ルール どのSVからも参照されないBR
未検証ルール BRに対応する機能シナリオがない
未検証ユースケース UCに対応するE2Eシナリオがない
空疎なテスト SCは参照するが対象SVや主要assertionがない
勝手な実装 どのSVにも対応せず、テストにも踏まれないコード
stale成果物 上流変更後に下流が再生成されていない

「テストがgreenである」だけでなく、「どの業務上の主張が、どのテストによって、どの実装を通じて検証されたか」を追跡できることが重要です。

モデル全体で守るべき不変条件

業務モデルを意味グラフとして扱うなら、モデル全体に対する不変条件を定義できます。

参照整合性

  • すべてのID参照が解決できる
  • すべての属性参照がDomainに存在する
  • すべての属性型がDictionaryで解決できる
  • すべての画面操作がServiceへ接続される
  • すべてのError参照が共通語彙へ解決される

到達可能性と網羅性

  • 重要なRuleが少なくとも一つのServiceで強制される
  • Serviceが少なくとも一つのUse Caseまたは契約から到達可能である
  • Use CaseにE2Eシナリオが存在する
  • Ruleに機能シナリオが存在する
  • シナリオに実行テストが存在する

状態整合性

  • Serviceの事前・事後条件がDomain Stateと一致する
  • 状態遷移に到達不能状態や抜け道がない
  • 画面の遷移ガードがServiceの事前条件を弱めない
  • UI制御が漏れてもService層でRuleが強制される

生成物中立性

  • プロトタイプがSSOTからの再生成結果と一致する
  • 出荷UIの構造がSSOTからの再生成結果と一致する
  • トレーサビリティ表がモデル、シナリオ、実テストからの射影と一致する
  • 生成物を直接編集して第二の真実源を作らない

人間向け表現への逆コンパイル

構造化モデルは機械検査に適していますが、人間の意味判断には必ずしも適していません。

そこで、同じモデルを確認目的に合った表現へ変換します。

判断対象 人間向け表現
業務の流れとルール 業務マニュアル
情報量と操作性 触れるプロトタイプ
境界値と例外運用 シナリオ一覧
AIによる補完 仮定・疑義一覧
変更の影響 差分とトレーサビリティ

コードへの変換を順方向のコンパイルとするなら、マニュアル、図、プロトタイプへの変換は人間向けの逆コンパイルです。

ここで重要なのは、逆コンパイルされた成果物も直接編集しないことです。マニュアルに誤りがあればモデルを修正し、再生成します。プロトタイプに項目が不足していればViewまたはDomainへ戻ります。

人間が承認した表現と、テストやコードを駆動する原本を一致させなければ、承認の意味が失われます。

変更は上流へ戻して再コンパイルする

例えば、自己承認禁止ルールの適用条件が変更された場合、正しい変更経路は次のようになります。

BR-M005を修正
  ↓
業務マニュアルと仮定・差分一覧を再生成
  ↓
影響するServiceとScenarioを再評価
  ↓
Testを再生成してredを確認
  ↓
実装を変更してgreenにする
  ↓
E2Eと検証レポートを再実行

テストやコードだけを修正すると、モデル上の業務と実装上の業務が分岐します。

変更管理の単位はファイルではなく、IDによって接続された影響部分グラフです。差分コンパイルでは、変更されたRuleからService、Scenario、Test、実装、レポートへ影響を伝播させます。

業務コンパイラとしてのモデリング

ここまでの構造を、業務コンパイラとしてまとめると次のようになります。

業務資料・規程・ヒアリング
        ↓ 構造化
検査可能な業務モデル
        ├─ 逆コンパイル
        │    マニュアル・図・プロトタイプ
        │          ↓
        │       人間の意味承認
        │
        └─ 順方向コンパイル
             シナリオ・テスト・コード
                       ↓
                  機械的な整合検査

この方式の信頼性は、AIの出力品質そのものから生まれるのではありません。

  • モデル要素に明確な所有権がある
  • モデル間の参照が機械的に解決される
  • 導出可能な情報を重複記述しない
  • シナリオとテストが意味の網羅性を束縛する
  • 人間が適切な表現で業務妥当性を判断する
  • 変更を上流へ戻して再生成する

これらの合成によって、AIが誤っても誤りを次段へ無検査で伝播させない構造を作ります。

まとめ

業務モデリングの価値は、個々のモデルの精緻さだけでは決まりません。業務知識が適切な責務へ分けられ、それらが検証可能な関係として接続されていることが重要です。

本質は次の四点です。

  1. 業務知識を責務ごとの中間表現へ分解する
  2. 各情報のSSOTと参照方向を固定する
  3. モデル間の不変条件を機械検査する
  4. 機械向け成果物と人間向け成果物を同じモデルから導出する

Domain、Use Case、Service、Rule、Screenは、それぞれ独立した設計書ではありません。

業務の根拠から検証結果までを接続する、一つの型付き意味グラフです。

AI時代のモデルは、実装前に作って保管する資料ではありません。生成、検査、承認、変更管理を駆動するソースになります。

【モデリング再考 #08】UMLの復活ではなく、モデル駆動AI開発の始まり

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

8.1 UMLは復活するのか

この連載の最初に、AIコーディングによってモデリングが復活するのではないか、という問いを置きました。

最後に、私なりの答えをまとめます。

モデリングは復活する。しかし、昔のUML中心主義と同じ形では戻らない。

UMLの記法を覚え、設計者が図を作り、開発者が図を見てコードを書く。その流れがそのまま復活するとは思いません。

復活するのは、もっと広い意味でのモデリングです。

8.2 図を描くことから、意味を固定することへ

従来、モデルといえば図を思い浮かべることが多かったと思います。

AI時代には、モデルの原本は次のような形式になるかもしれません。

  • YAMLやJSON
  • 独自のドメイン固有言語
  • JSON Schema
  • 状態機械の定義
  • APIやイベントの契約
  • 事前条件と事後条件
  • シナリオ形式の実行可能仕様

そして、必要に応じてMermaid、PlantUML、HTML、業務マニュアルなどへ変換します。

大切なのは記法ではありません。

業務の意味が一か所に固定され、複数の成果物へ一貫して投影されること。

8.3 開発者の役割はどう変わるのか

コードを書く量の多くをAIが担うようになると、開発者の仕事はなくなるのでしょうか。

私は、役割が上流へ移ると考えています。

  • 業務の言葉を定義する
  • 暗黙のルールを発見する
  • 状態と責任の境界を決める
  • 検証可能な期待結果を書く
  • AIが置いた仮定を見抜く
  • 生成結果をモデルとの関係で評価する

つまり、コードの記述者から、意味と制約の設計者へ移ります。

8.4 AI時代のモデル駆動開発

最終的には、次のような開発が可能になるはずです。

業務担当者の言葉
  ↓ AIが構造化
検査可能な業務モデル
  ├─ マニュアル・図・プロトタイプへ逆コンパイル
  ↓ 人間が理解し、違和感を発見し、意味を承認
シナリオとテスト
  ↓ AIが実装
アプリケーション
  ↓ 機械が整合性を検査
検証結果

ここで信頼するのは、特定のAIが常に正しいことではありません。

モデル、検査、テスト、人間の承認を組み合わせた工程全体です。

8.5 まとめ

AIコーディングによって、実装コストは下がります。一方で、業務の意味を定義し、生成結果の正しさを判断する重要性は高まります。

この連載で考えてきたことをまとめます。

  • プロンプトは検討に強いが、長期的な真実源にはなりにくい
  • モデルは説明資料ではなく、生成と検査の中間表現になる
  • マニュアル、図、プロトタイプは、人間の認知を助けるモデルの投影として使う
  • 業務上の意味と技術上の制約を分ける
  • 機械は構造、AIは疑義、人間は意味を判断する
  • 誤りは上流のモデルへ戻して修正する

復活するのは、UMLという特定の記法ではありません。

人間の意図を構造化し、AIが生成したものを検査可能にするモデリングです。

コードを書くAIが身近になるほど、「何を正しいとするか」を定義する力が必要になります。

モデルは、実装前に作って忘れられる資料ではありません。

AI時代には、モデルそのものが開発を動かすソースコードになるのだと思います。

そして業務コンパイラとは、そのモデルを機械が実行できるものへ変換するだけでなく、人間が理解し承認できるものへも変換する、双方向の仕組みなのです。

【モデリング再考 #07】AIに任せる判断、人間に残す判断

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

7.1 AIにすべてレビューさせればよいのか

コードをAIが書くなら、レビューもAIに任せればよい。そう考えるのは自然です。

AIは大量のファイルを読み、矛盾やバグの候補を短時間で探せます。人間より広い範囲を一度に確認できることもあります。

しかし、AIによるレビューには一つの問題があります。

AIは、与えられた前提の中でもっともらしい答えを作ります。その前提自体が業務として正しいかは保証できません。

7.2 機械が得意な検査

正解条件を明確に定義できるものは、機械へ任せるべきです。

  • スキーマに適合しているか
  • ID形式が正しいか
  • 参照先が存在するか
  • 必要なシナリオが揃っているか
  • 期待するテストが実行されたか
  • モデル変更後に古い成果物が残っていないか
  • 禁止された依存関係がないか

これらは、同じ入力に対して同じ結果を返す決定的な検査にできます。

人間が何百件ものIDを目で追うより、チェッカーに任せたほうが速く正確です。

7.3 AIが得意な疑義の抽出

明確な正解はないものの、見落とし候補を探す作業ではAIが役立ちます。

  • 二つのルールが意味的に矛盾していないか
  • 例外系が不足していないか
  • 用語が異なる意味で使われていないか
  • 業務資料とモデルの間に違和感がないか
  • 画面に必要な判断材料が不足していないか

ただし、これは合否判定ではありません。

AIは疑義を出し、人間が業務の文脈で判断します。

7.4 人間に残すべき判断

人間が担うのは、意味と受容の判断です。

例えば、代理承認を考えます。

システム上、代理承認を実装することはできます。監査ログも残せます。テストも通せます。

それでも、次の問いは機械だけでは決められません。

  • この業務で代理承認を認めてよいか
  • どの役職まで認めるか
  • 緊急時とは何を指すか
  • 現場で理由を入力できるか
  • 監査上、この証跡で十分か

これらは組織の責任とリスクに関わる判断です。

7.5 人間の判断には適切な表現が必要である

人間に意味判断を任せるとしても、生のモデルファイルを渡すだけでは十分ではありません。

業務の流れを確認するならマニュアルが向いています。状態の抜けを確認するなら図が向いています。画面上の情報量や操作の迷いを確認するなら、実際に触れるプロトタイプが向いています。

同じモデルを複数の表現へ変換するのは、見た目を整えるためではありません。

人間が持つ異なる認知能力を使い、モデルの誤りを見つけやすくするためです。

文章だけでは気づかなかった不足が、画面を触ると見つかることがあります。図では正しそうに見えた業務が、具体的なシナリオを追うと成立しないこともあります。

このため、人間ゲートでは「誰が確認するか」だけでなく、「何を、どの表現で確認するか」を設計する必要があります。

7.6 人間のレビュー対象を変える

従来のレビューでは、人間が大量の設計書やコードを読み、形式的な不備まで探していました。

AI時代には、人間のレビュー対象を絞るべきです。

機械:
  構文、参照、網羅、形式、実行結果

AI:
  矛盾候補、漏れ候補、影響候補

人間:
  業務妥当性、仮定の受容、リスク判断

人間を検査作業から外すのではありません。人間にしかできない判断へ集中させます。

7.7 承認は会議ではなく状態遷移である

「レビュー会を実施した」だけでは、何が承認されたのか分かりません。

承認対象、前提検査、問い、判断結果を固定します。

例えばモデル承認なら、次を揃えます。

  • 構文と参照検査に合格している
  • 仮定の一覧が提示されている
  • AIが抽出した疑義が提示されている
  • モデルから生成したマニュアルやプロトタイプで確認できる
  • 業務担当者が意味を確認する
  • 承認したモデルの版を記録する

これにより、承認を開発パイプライン上の状態遷移として扱えます。

7.8 まとめ

AI時代の分担は、「AIか人間か」の二者択一ではありません。

  • 決定的に判定できることは機械へ任せる
  • 意味的な疑義の抽出はAIを活用する
  • 業務妥当性とリスク受容は人間が判断する
  • マニュアル、図、プロトタイプなど判断に適した表現を用意する
  • 承認対象と判断結果を記録する

重要なのは、人間を単純な目視確認から解放し、意味の判断へ戻すことです。

次回は、連載全体を振り返りながら、UMLとモデリングの将来を考えます。

【モデリング再考 #06】モデルからテストとコードを生成する「業務コンパイラ」

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

6.1 AIを信頼するのではなく、工程を信頼できるようにする

AI開発では、「どのモデルなら正しいコードを書けるか」が話題になりがちです。

しかし、どれほど高性能なAIでも誤ります。重要なのは、AIが一度も間違えないことではありません。

間違いが無検査のまま次工程へ伝わらないこと。

この考え方から、開発全体をコンパイラとして捉えます。この連載では、この種の仕組みを一般的な概念として「業務コンパイラ」と呼びます。

業務コンパイラは、特定のツール名でも、特定企業だけで使える開発方式でもありません。

業務知識を検査可能なモデルへ変換し、モデルから人間向け資料と実行可能なソフトウェアを段階的に生成する仕組み。

これが業務コンパイラの基本的な定義です。

6.2 業務開発をコンパイルする

通常のコンパイラは、ソースコードを読み、中間表現を作り、型検査を行い、実行可能なプログラムを生成します。

業務コンパイラでは、次のように対応させます。

業務ソース
  ↓ モデリング
業務モデル
  ├─ 人間向けに逆コンパイル
  │    マニュアル・図・プロトタイプ・承認資料
  │
  ↓ 画面設計
論理画面
  ↓ シナリオ生成
業務シナリオ
  ↓ テスト生成
実行可能なテスト
  ↓ 実装
アプリケーション
  ↓ 検証
検証レポート

各段階の成果物を中間表現として固定し、検査に合格してから次へ進みます。

ここで、マニュアルやプロトタイプは付属資料ではありません。人間がモデルの意味を確認するための、開発パイプライン上の正式なインターフェースです。

6.3 真実源を二つに分ける

業務コンパイラでは、真実源を二種類に分けます。

一つは、業務として何が正しいかを表す「What」です。

  • ドメイン
  • ユースケース
  • ビジネスルール
  • 業務サービス
  • 論理画面
  • 項目の意味や値域

もう一つは、どのような品質と構造で作るかを表す「How well」です。

  • レイヤー間の依存方向
  • セキュリティ制約
  • 性能要件
  • 採用する技術判断
  • 特定機能に対する実装上の指示

業務上の正しさと技術上の制約を分けることで、責任の所在が明確になります。

6.4 IDで成果物を結ぶ

モデルの各要素にはIDを付けます。

UC-*  ユースケース
BR-*  ビジネスルール
SV-*  サービス
SCR-* 画面
SC-*  シナリオ
CT-*  契約テスト

例えば、次の鎖を作ります。

業務規程
  → BR-M005
  → SV-M003
  → SC-M012
  → TEST-M012
  → 実装
  → 検証結果

これにより、「このルールはどこで実装され、どのテストで確認されたか」を追跡できます。

6.5 機械が検査すること

構造化されたモデルなら、次の内容を機械的に検査できます。

  • YAMLやJSONとして正しいか
  • 必須項目が存在するか
  • IDが重複していないか
  • 参照先が存在するか
  • すべてのユースケースにE2Eシナリオがあるか
  • すべてのルールに機能シナリオがあるか
  • 古いモデルから作られた成果物が残っていないか

これらを人間の目視レビューに頼る必要はありません。

6.6 人間が承認すること

機械検査に合格しても、業務として正しいとは限りません。

そこで、人間は次を判断します。

  • 現場の業務と一致しているか
  • 暗黙のルールが抜けていないか
  • AIが置いた仮定を受け入れられるか
  • 例外や上限値は妥当か
  • この画面で現場の判断ができるか

人間は構文や参照切れではなく、意味に集中します。

6.7 下流を直接直さない

業務モデルが間違っていた場合、生成されたテストやコードだけを直してはいけません。

モデルを修正する
  ↓
影響範囲を再生成する
  ↓
テストと実装を再検証する

下流だけを修正すると、モデルとは異なる真実が生まれます。やがて人間が承認した内容と、実際に動く内容が離れていきます。

同じ理由から、モデルから生成した業務マニュアルやプロトタイプも直接修正しません。

マニュアル上の説明が間違っているなら、原本であるモデルを修正して再生成します。プロトタイプに必要な項目が不足しているなら、論理画面や業務操作のモデルへ戻ります。

生成物を手で直すと、人間が承認した内容と、テストやコードを駆動する内容が別々になってしまいます。

6.8 人間の認知を支援する逆コンパイル

人間には、構造化モデルをそのまま渡せばよいわけではありません。

業務担当者が確認したいのは、YAMLの構文ではなく、実際の業務です。

そのため、確認したい内容に応じて表現を変えます。

確認したいこと 人間向けの表現
業務の流れやルール 業務マニュアル
状態と遷移の全体像 状態遷移図
現場で操作できるか 触れる画面プロトタイプ
例外や境界値の妥当性 シナリオ一覧
AIが補った内容 仮定・疑義一覧
変更による影響 差分とトレーサビリティ

文章を読む、図で関係を見る、画面を触る、具体的なシナリオを追う。複数の認知方法を組み合わせることで、人間はモデルの誤りに気づきやすくなります。

業務コンパイラは、コード生成を自動化する仕組みであると同時に、人間の理解と判断を支援する仕組みでもあります。

6.9 まとめ

業務コンパイラは、AIにすべてを一度で作らせる方法ではありません。

業務知識を複数の中間表現へ段階的に変換し、境界ごとに検査する方法です。

  • AIは誤ることを前提にする
  • 業務モデルを開発の原本にする
  • 成果物をIDで結ぶ
  • モデルをマニュアルやプロトタイプへ逆コンパイルする
  • 人間の理解、違和感の発見、承認を支援する
  • 機械は構造、人間は意味を検査する
  • 誤りは上流へ戻して再生成する

次回は、人間とAIの判断をどのように分担すべきか、さらに詳しく考えます。

【モデリング再考 #05】何をモデリングし、何をコードに任せるべきか

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

5.1 すべてをモデル化してはいけない

モデルが重要だと言うと、すべてを詳細に書きたくなります。

しかし、すべてをモデル化すると、再びコードとの二重管理になります。

モデルには、モデルでなければ守りにくい情報を書きます。コードから簡単に再現できる情報まで、人間が重複して管理する必要はありません。

5.2 業務用語はモデルに置く

業務システムでは、用語の違いが設計の違いになります。

「注文」「受注」「出荷指示」「売上」は似ていますが、同じものではありません。

それぞれの意味、識別子、状態、関係をモデルに置きます。用語を固定することで、AIが画面ごとに異なる意味で解釈することを防ぎます。

5.3 ルールと不変条件はモデルに置く

次のような情報は、実装方法にかかわらず守らなければなりません。

  • 注文金額は0円未満にならない
  • 承認済みの指図は削除できない
  • 作成者本人は承認できない
  • 出荷済みの注文はキャンセルできない

これらは業務ルールです。UI、API、バッチのどこから操作しても同じように守る必要があります。

したがって、特定画面の条件ではなく、独立したルールとしてモデル化します。

5.4 状態と遷移はモデルに置く

状態遷移は、AIがもっともらしい処理を追加しやすい場所です。

下書き → 申請済み → 承認済み → 完了
             ↓
           差戻し

どの状態からどこへ進めるのか。誰が操作できるのか。遷移時に何を記録するのか。

この情報をモデルに置けば、状態遷移図だけでなく、正常系と禁止遷移のテストも生成できます。

5.5 事前条件と事後条件はモデルに置く

業務操作は、単なるメソッド名だけでは表現できません。

例えば「受注を確定する」には、次の意味があります。

事前条件:
- 受注が下書き状態である
- 明細が1件以上ある
- 必要在庫を確保できる

事後条件:
- 受注が確定状態になる
- 在庫が引き当てられる
- 確定者と確定日時が記録される

ここまで定義されていれば、AIは実装だけでなく、検証すべき内容も理解できます。

5.6 実装の詳細はコードへ任せる

一方、次のような情報は、原則としてコードや技術設計へ任せます。

  • privateメソッドの分割
  • フレームワーク固有の設定
  • ORMの細かなマッピング
  • 画面内部の状態管理方法
  • debounceやキャッシュの実装
  • コードから容易に生成できる詳細クラス図

これらは業務上の意味ではなく、実現方法です。

もちろん性能やセキュリティなど、実現方法にも守るべき制約があります。その場合は業務モデルへ混ぜず、アーキテクチャ制約として別に管理します。

5.7 判断の基準

何をモデル化するか迷ったときは、次の問いが役立ちます。

その情報は、複数の成果物や実装経路で共有される業務上の意味か。

Yesなら、モデルに置く価値があります。

画面、API、バッチ、テストで同じ意味を使うなら、一か所へ固定すべきです。特定の実装内部だけで完結するなら、コードに置いたほうが自然です。

5.8 まとめ

AI時代のモデリングでは、詳細さより境界が重要です。

モデルに置くもの:

  • 業務用語と概念
  • ビジネスルールと不変条件
  • 状態と遷移
  • 操作の事前条件と事後条件
  • システム間の契約
  • 正常系、境界値、異常系

コードや技術設計へ任せるもの:

  • 局所的な実装手順
  • フレームワーク固有の詳細
  • コードから再生成できる構造

次回は、このモデルを起点に開発全体を進める「業務コンパイラ」を紹介します。

【モデリング再考 #04】AI時代のモデルは「図」ではなく「中間表現」である

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

4.1 コンパイラはソースコードを直接実行しない

プログラミング言語のコンパイラは、ソースコードを読んですぐに機械語へ変換するわけではありません。

途中で、構文木や中間表現を作ります。中間表現にすることで、型の誤りを調べたり、最適化したり、異なる実行環境向けに出力したりできます。

業務システム開発にも、同じ考え方を適用できます。

業務資料・規程・ヒアリング
  ↓
業務モデル
  ↓
画面・シナリオ・テスト
  ↓
コード

このとき、業務モデルが中間表現になります。

4.2 業務資料から直接コードを作る危険

AIに業務マニュアルを渡して、アプリケーションを生成させることは技術的には可能です。

しかし、業務資料にはさまざまな性質の情報が混ざっています。

  • 現在の正式なルール
  • 古い運用の説明
  • 単なる操作手順
  • 背景事情
  • 書かれていない暗黙ルール
  • 部門ごとに異なる用語

AIがこれを一度に解釈してコードへ変換すると、どこで意味を取り違えたのか分かりにくくなります。

そこで、一度モデルとして固定します。

4.3 中間表現に必要な性質

AI時代の業務モデルには、少なくとも次の性質が必要です。

一意なID

ユースケース、ルール、サービス、画面、シナリオにIDを付けます。

UC-M001  受注を登録する
BR-M003  在庫不足時は確定できない
SV-M002  受注を確定する
SCR-M001 受注入力画面

IDがあることで、成果物同士を明確に結べます。

根拠

そのルールが、どの規程やヒアリングから得られたかを記録します。

根拠がなければ、後から「なぜこの仕様なのか」を判断できません。

確信度

資料に明記された内容と、AIが推測した内容を区別します。

confirmed: 文書や業務担当者によって確認済み
inferred:  複数の情報から推論した
assumed:   作業を進めるために仮定した

AIは空白を自然に補います。そのため、補った事実を隠さないことが重要です。

検証可能な期待結果

「適切に処理する」では、テストできません。

「承認者は作成者と異なる」「在庫数は0未満にならない」のように、真偽を判定できる形にします。

4.4 図はモデルの表示形式である

状態遷移図やシーケンス図は、今後も重要です。

しかし、図そのものを唯一の原本にする必要はありません。

例えば、状態を構造化データで持っていれば、そこから状態遷移図、テストケース、画面の活性条件を生成できます。

構造化モデル
  ├─ 人間向けの図
  ├─ 業務マニュアル
  ├─ テスト
  └─ AIへの実装指示

図は、人間が理解しやすい投影の一つです。

ここで重要なのは、モデルからコードへ向かう変換だけを考えないことです。

構造化モデルは機械にとって扱いやすい一方、生のYAMLやJSONは業務担当者の確認には向きません。そこで、同じモデルを人間が認知しやすい形へ変換します。

構造化モデル
  ├─ 業務マニュアル       言葉と業務の流れを確認する
  ├─ 状態遷移図           状態の抜けや禁止遷移を確認する
  ├─ 画面プロトタイプ     現場で業務が回るかを確認する
  ├─ シナリオ一覧         例外や境界値を確認する
  └─ 差分・仮定一覧       変更点と未確定事項を確認する

これは単なる文書生成ではありません。モデルを、人間が理解し、違和感を発見し、承認できる表現へ変換する工程です。

コード生成を「順方向のコンパイル」とするなら、人間向けのマニュアルやプロトタイプの生成は「逆コンパイル」と考えられます。

4.5 モデルをコンパイル対象として扱う

中間表現としてのモデルは、保存するだけでは不十分です。

  • 必須項目があるか
  • IDが重複していないか
  • 参照先が存在するか
  • すべての業務ルールにシナリオがあるか
  • すべての画面操作がサービスへ接続しているか

こうした検査を自動化します。

モデルを文書ではなくコンパイル対象として扱うことで、曖昧さや漏れを次工程へ持ち込む前に発見できます。

4.6 まとめ

AI時代のモデルは、単なる説明図ではありません。

業務の言葉を、画面・テスト・コードへ変換するための中間表現です。

重要なのは、次の点です。

  • 業務資料から直接コードへ飛ばない
  • モデルにID、根拠、確信度、期待結果を持たせる
  • 図や文書はモデルから生成する
  • マニュアルやプロトタイプへ逆コンパイルし、人間の認知と承認を支援する
  • モデル自体を機械検査する

次回は、何をモデル化し、何をコードに任せるべきかを考えます。

【モデリング再考 #03】プロンプトは仕様書になれるのか

[AIによる執筆注記] 生成AIを活用して執筆しています。内容の監修・確認は著者が行っています。

3.1 AI開発は会話から始まる

AIコーディングでは、まず作りたいものを自然言語で説明します。

受注を登録するAPIを作ってください。
在庫が不足している場合はエラーにしてください。

AIはこの指示を読み、必要なコードを考えます。人間同士で仕様を伝えるより速く感じることさえあります。

では、プロンプトをそのまま仕様書として使えるのでしょうか。

3.2 自然言語は意味を豊かに伝えられる

自然言語には大きな利点があります。

背景、目的、例外、微妙なニュアンスをまとめて説明できます。形式を先に決めなくても、思いついたことから書けます。

AIは不完全な文章から意図を補うことも得意です。

仕様策定の初期段階では、この柔軟さが非常に役立ちます。

3.3 しかし、同じ言葉が同じ意味とは限らない

例えば、「注文を確定する」という表現を考えます。

営業担当者にとっては、入力内容を保存することかもしれません。倉庫担当者にとっては、在庫を引き当てることかもしれません。経理担当者にとっては、売上計上の対象になることかもしれません。

一つの文章だけを読んでも、どの意味なのか決まりません。

さらに、会話の途中で意味が変わることもあります。以前の指示では「確定時に在庫を減らす」としていたのに、後の会話では「出荷時に在庫を減らす」と説明しているかもしれません。

AIがどちらを採用したとしても、もっともらしいコードは生成できます。

3.4 プロンプトは網羅性を検査しにくい

自然言語の最大の弱点は、「何が書かれていないか」を調べにくいことです。

業務ルールが50件あるとします。各ルールについて正常系、境界値、異常系のテストが必要です。

文章だけでは、どのルールにテストがあり、どのルールが漏れているかを機械的に数えるのは困難です。

一方、それぞれにIDがあれば確認できます。

BR-001 → SC-001 → TEST-001
BR-002 → SC-002 → TEST-002
BR-003 → 対応シナリオなし

この場合、BR-003が未検証だとすぐに分かります。

3.5 会話履歴は真実源になりにくい

AIとの会話には、検討途中の案も含まれます。

  • 最初に出した案
  • 後から撤回した案
  • 一時的な仮定
  • 確定した決定
  • AIが補完した内容

これらが一つの履歴に混在します。

人間は文脈から区別できますが、開発全体の正式な入力として使うには不安定です。

会話は検討の場として使い、確定した内容は別の構造へ固定する必要があります。

3.6 プロンプトとモデルは競合しない

ここまで読むと、自然言語をやめて、すべてYAMLや図で書くべきだと思うかもしれません。

そうではありません。

自然言語は、モデルを作るための優れた入口です。

人間の説明・資料・会話
  ↓
AIによる構造化
  ↓
人間による意味確認
  ↓
確定したモデル

プロンプトで自由に考え、モデルで決定を固定する。この二つを役割分担させることが重要です。

3.7 まとめ

プロンプトは、仕様策定の強力な道具です。しかし、長期的な真実源としては弱点があります。

  • 用語の意味が揺れる
  • 変更履歴と確定事項が混ざる
  • 参照関係を追いにくい
  • 網羅性を検査しにくい
  • 書かれていないルールを発見しにくい

自然言語で考え、構造化モデルで固定する。この組み合わせがAI開発には適しています。

次回は、その構造化モデルを「中間表現」という観点から考えます。