アーキテクチャ・ハーネス
ソフトウェアのアーキテクチャは、求める機能と品質を実現するために、システムを構成する仕組み、その役割、組合せ方を定める基本設計です。SimpleModeling (シンプルモデリング)は、ドメイン知識に近い抽象度でソフトウェアを記述し、そのモデル (Model)を開発と実行の基盤にするリファレンス・アーキテクチャを提供します。本稿では、連載全10回で扱う技術をこの全体像に位置付け、必要な品質を確保しながら開発速度の向上とAIコストの低減を図る組合せを説明します。開発から実行まで何重もの歯止めを配置するこの設計が、AI開発のアーキテクチャ・ハーネスとしても機能します。
アーキテクチャで開発全体を設計する
アーキテクチャでは、求める機能と品質を実現するために、採用する技術とその役割、相互の関係を定めます。SimpleModelingでは、その共通設計としてリファレンス・アーキテクチャを用意しています。
モデリング手法だけを取り入れたり、CozyやTextusを単独で利用したりすることもできます。モデルの検査、Cozyの生成規則、Scalaの型検査、Textusの実行規則などは、それぞれがAIの生成・変更・実行を制約 (Constraint)するハーネスとして働きます。各要素技術がどのように歯止めをかけるかは、該当する回で説明します。
リファレンス・アーキテクチャは、これらの要素技術を組み合わせた全体最適の設計を示します。例えば、モデルと生成規則で個別実装を減らし、コンポーネント (Component)で変更範囲を限定し、型検査でレビューへ持ち込む問題を減らします。さらに、共通の実行基盤で実行時の制約を適用します。この役割分担によって、必要な品質を確保し、開発速度の向上とAIコストの低減を図りながら、AIが要求や規則から逸脱 (deviation)することを抑え、正しい解へ到達しやすい環境を整えます。この組合せがもたらす効果が、本稿で扱うアーキテクチャ・ハーネスの主題です。
生成・レビュー・修正にかかる時間とコスト
AIを用いた開発では、コード生成に加えて、仕様との照合、レビュー、修正にも時間とコストがかかります。AIによるレビューでは、仕様や周辺コード、依存関係を確認するための推論が必要になり、修正後の再レビューにも推論時間と利用コストが発生します。
リファレンス・アーキテクチャが歯止めを配置する
SimpleModelingの出発点はモデル駆動開発です。モデルの意味を保ってソフトウェアを構築し実行するために、モデル言語、コンポーネント、プログラミング言語、生成・検査・実行の仕組みを組み合わせます。この共通設計がリファレンス・アーキテクチャです。
AI開発では、この設計がAIの判断を必要とする範囲と、生成規則や型や実行規則に従う範囲を定めます。ハーネスをアーキテクチャの文脈で捉えると、作業手順を伝えるスキルもその一部となり、AIが適切な成果を生みやすい開発・実行環境全体が対象になります。
SimpleModelingのリファレンス・アーキテクチャの全体像
SimpleModelingのリファレンス・アーキテクチャでは、ドメインの概念・関係・規則を表すモデルを、生成、補完実装、実行、検証の共通の基準にします。CML (Cozy Modeling Language)に記述したモデルからCozyが構造を導き、AIはその契約の下で不足する処理を補完し、Textusが実行可能なモデルを動かします。CBD (Component-Based Development)でモデルと実装の担当を部品ごとに定め、知識と実行の証拠も同じモデルへ対応付けます。この構成によって、各段階で規則を別々に解釈し直す範囲を減らし、変更や不整合があったときに確認する対象を絞ります。

モデル・生成・補完の共通基準で再実装を減らす
CMLはモデルの記述、Cozyはモデルからの構造の導出、Textusは実行を担当します。モデルに書いた規則をTextusが直接実行し、その周辺の接続構造をCozyが生成することで、規則と接続の両方をAIが個別に書き直す作業を減らします。補完コードにもモデルから導いた型や操作契約を適用すれば、AIがモデルとは別の前提で実装する余地を狭められます。
CBDは公開された操作 (Operation)と利用条件を持つ部品を定め、3層の構成は各部品の役割を整理します。画面や対話はプレゼンテーション、ユースケース (Use Case)に沿う処理の組合せはアプリケーション、対象の概念・状態・規則はドメインが担当します。ドメインは静的モデル、アプリケーションはユースケースを起点とするワークフローを中心とします。この二つの区分を組み合わせると、画面を増やす場合も既存の業務操作を利用でき、規則を画面ごとに再実装・再検証する負担を減らせます。
実行経路とモデルの共有で重複と調査を減らす
アプリケーションのワークフローがドメインの公開操作を呼び出し、状態機械 (StateMachine)や業務規則に従って処理を進めます。CLI、REST、MCP (Model Context Protocol, モデル・コンテキスト・プロトコル)はその同じ処理を呼び出す入口にします。業務ロジックと認可・外部資源へのアクセスを共通の経路へ集約することで、入口ごとに異なる判定が生じる余地を減らせます。共通部分の仕様と検証結果を再利用し、入口固有の入力変換や認証情報の引渡しは個別に確認します。
全10回の技術を全体の役割へ位置付ける
第1回は、AI開発の可能性と業務アプリケーションで必要な条件を整理し、検証・修正・承認までを含む収束コストを扱います。第5回は、その条件を満たすために各回の技術を組み合わせる設計を扱います。
第2回のモデル・ハーネスは、CML、モデル駆動開発、モデル・アップ・ダウン、要求と実現の対応を基盤にします。第3回はエンティティ、値オブジェクト、集約、関連、パワータイプ (Powertype)、トレイト (Trait)、リソース、タスクの分類や制約などの静的モデル、第4回はワークフロー、状態機械、ユースケースなどの動的モデルを扱います。対象の操作や状態 (State)と手順を突き合わせて不整合を検出し、実装前の修正につなげます。
第6回はScalaの型、代数的データ型、イミュータブルなデータ、純粋関数型プログラミング、高階関数、モナディックな計算構造、内部DSL (internal DSL)、Free Monadとインタープリタで補完実装を制約します。第7回はTextusによるモデルの実行と、イベント (Event)、認可、外部作用、並行性、再試行・補償を扱います。言語側で許す操作を実行基盤の経路へ接続し、実行前に判定できる問題は型などで検出し、利用者や実行時の状態に依存 (Dependency)する条件はランタイムで検査します。両者を組み合わせることで、AIの補完コードごとに権限や失敗制御を作り込む範囲を減らします。
第8回の知識ハーネスは、BoK (Body of Knowledge)の用語集 (Glossary)を鍵に文芸モデル (Literate Model)とオブジェクト・モデル (Object Model)を関連付け、RDFで出典・版・適用範囲を管理し、MCPからAIへ提供する仕組みを扱います。対象のモデルや部品の契約と知識を揃えることで、AIが古い仕様や別の利用条件に基づいて実装し、後から大きく修正する事態を減らすことを目指します。
第9回の観測モデルは実行時エビデンスをモデルの語彙と抽象度へ戻し、第10回の検証ハーネスは動く仕様書 (executable specification)、テスト (Test)、AIレビュー、人間の判断・承認を扱います。期待する結果と実際の操作・遷移を対応付ければ、結果が違った事実に加えて、どこを修正するかを判断できます。各要素技術の検査と診断を利用して、原因に応じた修正を行います。個別の仕組みは担当回へ委ね、本稿はその相互作用を説明します。
高い抽象度のモデルを実行の基準にする
DDDレベルのモデルと直接実行を組み合わせる
要求の検査と規則の評価を実行モデルへ結び付ける
ユースケースは、利用者の目的と実例を表す要求モデルです。ユースケース自体を直接実行するのではなく、それを実現するワークフロー、状態機械、ドメインの操作へ対応付けます。textus-cbd-supportによるモデルのレビューで実現対応と構造の整合を確認し、動く仕様書で同じ実例の実行結果を確かめます。この二つを組み合わせることで、要求に対する実現の不足をモデル段階で探し、実行時にその意図どおりの結果が得られるかを確認できます。
業務規則はドメイン側のモデルとしてまとめ、ルール・エンジンに評価を委ねる構成を取れます。規則の所有場所をCBDで定め、評価方法を共通化すれば、画面や操作ごとに別の判定処理を書く余地を減らせます。CNCF (Cloud Native Component Framework)にはルール・エンジンの基盤がありますが、ドメイン・ルールをモデルの第一級要素として実行系へ対応付ける部分は設計課題として残ります。
生成とAIによる補完の担当を分ける
モデルから機械的に導けるインターフェース (Interface)や接続構造はCozyが生成します。同じ規則で構造を導くことで、AIが機能ごとに異なる構成を選び、それを後からレビューして揃える作業を減らします。
CBDとScalaで補完実装とレビューを局所化する
モデルを直接実行する構成では、モデルに記述できない処理をコードで補完し、そのコードと部品間の接続を検査します。CBDで担当範囲を区切り、その内部にScalaの型や計算の規律を適用することで、部品間の不整合と局所的な実装の誤りをそれぞれ確認できます。
公開契約が変更と確認の範囲を限定する
各コンポーネントには、提供する能力を表すケーパビリティ (Capability)と、公開するサービス・操作、その入出力や利用条件を定めます。外部は公開APIを使い、差し替え可能な実装はSPIに従います。内部データへ直接依存させず、許された依存関係を定めることで、内部実装の変更が周囲へ波及する経路を減らします。
公開契約をモデルから導く型や動く仕様書と結び付けると、部品内部をAIが変更しても、利用側との接続と期待する振る舞い (Behavior)を別々に確認できます。契約を保つ変更では担当部品とその契約の確認を中心にでき、システム全体を毎回読み直す負担を抑えられます。契約自体を変える場合は依存関係から利用側を調べ、必要な確認範囲を広げます。
Scalaの検査能力をレビューの前に働かせる
Scalaの型検査は、それ自体が補完実装に対するハーネスです。これをモデルから導く型やCBDの公開契約と組み合わせると、AIが別の意味の値を渡したり、契約に合わない結果を返したりする問題のうち、型に表せるものをレビュー前に検出できます。代数的データ型で操作の結果や状態を表し、必要な場合分けの不足もコンパイラの診断へ結び付けます。
イミュータブルなデータと純粋関数は、値の書換えや副作用の発生箇所を限定します。CBDで狭めた部品内部を、入力と出力、明示的な作用に分けて理解できるため、レビューの際に追跡する状態と実行経路を減らせます。
この組合せによって、機械的に検査できる不具合を理由とするレビューと修正の反復を抑え、開発速度の向上とAIコストの低減を図ります。これは設計上の効果であり、削減率の実測を示すものではありません。要求や業務上の意味が正しいかは、別途モデルと実例に基づいて確認します。
複数のハーネスで制約の抜けを補う
各ハーネスが制約できる範囲には限りがあります。例えば、型検査を通る実装でも業務規則には違反する場合があり、モデルに整合する操作でも実行時の権限や状態によっては許可できません。モデル検査、型検査、契約の検査、実行時の制約、要求に基づく検証を重ねることで、一つのハーネスでは扱えない条件を別のハーネスで確認し、制約の抜けを補います。
リファレンス・アーキテクチャでは、各ハーネスの適用範囲と、残る条件を確認する機構との対応を定めます。モデル検査で構造や対応、型検査で値や操作の整合を確認し、実行時には利用者の権限や現在の状態を確認します。実行結果は要求の実例と照合します。機械的に確認できる問題を早期に処理し、後段で残る条件を確認する配置によって、多重の制約と開発効率を両立させます。
検査対象のモデル、契約、実装には、対応する版と適用条件を指定します。対象が変わった場合は、依存関係から影響する検査を特定して再実行します。前段の結果を利用できる範囲を明確にすることで、重複した確認を減らし、変更後に必要な検査を実施できます。
部品と組合せの検査で修正対象を絞る
モデルの構造や対応を確認してから、そのモデルに基づく生成と型検査へ進みます。モデル側に原因がある診断はモデルへ戻し、補完コードの型違反は担当部品で修正します。この連携によって、誤ったモデルから生成した多数の箇所を個別に直す作業や、型で判定できる問題をAIが繰り返しレビューする作業を減らせます。
CARは実装・契約・依存・設定・仕様を同じ配布・検査単位へまとめ、SARは複数部品の構成を表します。これにパッケージ検証とlintを適用し、必要な構造や規則化できる依存・禁止パターンを調べます。単体の部品の成立と、組み合わせた際の依存や設定の整合を分けて確認し、その結果を受理条件に使います。検査で不整合が見つかった部品や組合せを修正対象として示せるため、後から構成全体を調べ直す負担を抑えます。
実行時にも権限と状態の規則を適用する
知識と契約を揃えて判断の前提と範囲を限定する
注文処理で組合せの働きを確認する
在庫確保と支払い承認を経て注文を確定する処理を、組合せを説明する設計例として用います。要求、モデル、補完実装、実行、検証の対応を順に示します。
要求とモデルから部品の操作を定める
ユースケースに購入者の目的と、在庫不足・支払い失敗を含む実例を記述します。注文・明細・金額を静的モデル、在庫確保・支払い承認・注文確定をワークフロー、注文の状態と遷移条件を状態機械として定義します。要求した結果へ至る操作が揃うかをモデル上で確認します。
価格や税額の規則はドメイン側が所有し、アプリケーションのワークフローは価格を求める公開操作を利用します。規則をルール・エンジンへ接続する構成なら、その評価も当該操作の内側へ集約します。規則モデルと所有部品と利用操作を揃えることが、画面ごとの別計算を防ぐ設計になります。
補完コードを検査して同じ処理を実行する
証拠を使って修正対象を絞る
動く仕様書で、正常な注文確定と支払い失敗時の結果を確かめます。観測モデルには、どの操作と遷移 (Transition)を経たかを示します。実行順序の問題ならワークフロー、金額計算なら規則や補完コード、利用者権限ならポリシーというように、証拠に基づいて修正対象を絞ります。
品質と効率を両立させるアーキテクチャ・ハーネス
SimpleModelingのリファレンス・アーキテクチャは、モデルを中心に、CBD、Scala、生成・検査・実行基盤、知識、観測、検証を組み合わせます。各技術の担当を定めることで、必要な品質を確保しながら、開発速度の向上とAIコストの低減を図ります。何重もの歯止めの配置も、この全体最適の設計に含まれます。
予防・局所化・共通化によって反復を減らす
個々のハーネスは、モデル、部品、実装、実行などの範囲で誤りを防ぎます。リファレンス・アーキテクチャでは、その間を同じモデルや契約で結びます。直接実行と生成によって減らした補完コードをCBDで区切り、その内側を型で検査し、許された操作を共通基盤で実行します。個別実装、確認範囲、レビューへ持ち込む問題がそれぞれ減るため、各段階で行うAIの推論と修正の反復を抑えられます。
各機構の役割分担に、単独では残る制約の抜けを相互に補う関係を組み合わせます。機械的に確認できる条件を生成・検査・実行基盤で扱い、意味や要求との適合をレビューで確認することで、確認範囲を補いながらAIによる推論と修正の反復を抑えます。この構成は、構造の維持、誤変更の影響の限定、公開仕様に基づく再実装にも役立ちます。効果の確認には、検証・修正・再レビュー・承認までの時間とAI利用量を用います。
各回で仕組みを具体化する
各要素技術のハーネスとしての働きは、第2〜4回のモデル、第6回のScala、第7回の実行基盤、第8回の知識、第9回の観測、第10回の検証で説明します。リファレンス・アーキテクチャは、これらの間でモデルや契約を共有し、実装・推論・レビューの重複を減らす構成を定めます。各機構の制約と診断によって、AIの変更範囲を限定し、要求に適合する成果へ修正を進める環境を整えます。
CNCFでは、DDDレベルのモデルを実行する構成に、リアクティブな処理、高可用性、セキュリティ (Security)、AIの利用を組み合わせ、業務システムの品質要求へ対応させます。その具体的な構成や実装段階は後続のCNCFシリーズで扱います。
参照
用語集
- モデル (Model)
-
Modelとは、対象を特定のPurposeとConcernに基づいて選択し、理解、判断、検証、構築に利用できる形で表した抽象です。対象そのものではなく、目的に必要な要素、関係、意味を保持する表現です。
- シンプルモデリング (SimpleModeling)
-
SimpleModelingは、KnowledgeからDomain Modelを構成し、CMLで形式化し、CozyとAIによって実行可能ソフトウェアへ実現し、Textus上で動作させる、モデリング中心のソフトウェア開発方法論と技術体系です。
- Cozy
-
Cozyは、CMLと各種DSLで記述されたModelを解析し、プログラム、設定、文書などの実現成果物へ変換するSimpleModelingのツールチェーンです。
- Scala
-
Undefined
- 制約 (Constraint)
-
UMLにおけるConstraintは、一つ以上のModel ElementのSemanticsの一部を宣言するため、自然言語または機械可読言語で表した条件または制限です。評価結果はBooleanであり、評価は副作用を持ちません。
- Textus
-
Textusは、SimpleModelingによって実現されたソフトウェアを動作させるための実行基盤です。アプリケーションに共通する実行、運用、連携の機構を提供します。
- 逸脱 (deviation)
-
計算値や観測値が、基準値や真値から外れている状態。観測可能な量的ずれを表す。
- コンポーネント (Component)
-
責務・契約・依存関係を明示的に定義し、再利用可能で交換可能な単位としてカプセル化されたソフトウェア構成要素。論理モデルでは抽象構造単位として、物理モデルでは実装・デプロイメント単位として扱われる。
- 型 (Type)
-
Undefined
- Cozy Modeling Language (CML)
-
CML(Cozy Modeling Language)は、オブジェクト・モデルのうち、プログラム生成と実行へ接続する実行可能モデルを記述するSimpleModelingの形式モデリング言語です。
- CBD (Component-Based Development)
-
CBD(コンポーネント指向開発)は、ソフトウェアを責務・契約・インターフェースを明確に定義したコンポーネント単位で構築・再利用する開発方式です。 コンポーネントは独立性と交換可能性を備え、システムを疎結合に構成することで保守性と再利用性を高めます。 論理モデルでは機能や契約を定義する抽象構造単位として、物理モデルでは実際の実装・デプロイメント単位として扱われます。
- 操作 (Operation)
-
UMLにおけるOperationは、関連するBehaviorを呼び出すための名前、型、Parameter、Constraintを定めるClassifierのBehavioral Featureです。Operationは呼び出し契約を定め、MethodなどのBehaviorがその実現を担います。
- ユースケース (Use Case)
-
UMLにおけるUse Caseは、対象システムがActorまたは他の利害関係者に観測可能な価値あるResultをもたらすために実行するActionの集合を定めるModel Elementです。
- モデル・コンテキスト・プロトコル (MCP, Model Context Protocol)
-
モデル・コンテキスト・プロトコル(Model Context Protocol、MCP)とは、生成AIを利用するアプリケーションと外部のデータ源やツールを接続し、コンテキストと機能を標準化された形で提供するためのオープンプロトコルです。
- 状態機械 (StateMachine)
-
UMLにおけるStateMachineは、Eventの発生によって起動されるTransitionでStateのグラフをたどり、システム要素のevent-driven Behaviorを表すBehaviorです。
- パワータイプ (Powertype)
-
Undefined
- 状態 (State)
-
UMLにおけるStateは、ある不変条件が成立している状況をモデル化したものです。Objectの現在のStateによって、受け付けられるEventやOperation、成立するConstraint、次に可能なTransitionが変わります。
- トレイト (Trait)
-
Undefined
- 依存 (Dependency)
-
UMLにおけるDependencyは、ClientとなるModel Elementの仕様または実装が、Supplierとなる別のModel Elementの定義へ意味的または構造的に依存することを表すDirected Relationshipです。
- イベント (Event)
-
UMLにおけるEventは、Behaviorの実行中に発生し得る出来事を記述するものです。EventのOccurrenceを受け取ることで、StateMachineのTransitionなどのBehaviorが起動されます。
- 内部DSL (internal DSL)
-
内部DSL(Internal DSL)は、ホスト言語の構文と型システムを利用して構築されるドメイン特化表現です。 ホスト言語の文法範囲内で設計されるため、既存の型検査やツール群をそのまま活用でき、実行可能で保守性にも優れます。 Scalaでは、関数・型クラス・マクロ・拡張メソッドを組み合わせて柔軟なDSLを設計できます。
- RDF
-
W3C により標準化された、情報を「主語–述語–目的語」の三つ組(トリプル)で表現するための知識記述モデル。
- オブジェクト・モデル (Object Model)
-
Undefined
- 用語集 (Glossary)
-
Glossaryとは、対象領域で使用する用語について、名称、意味、境界、同義語、識別子を管理する知識資源です。関係者が同じ用語を同じ意味で扱うための共通基盤になります。
- BoK (Body of Knowledge)
-
SimpleModelingでは文脈共有の核となる知識体系をBoK (Body of Knowledge)と呼んでいます。 BoKの構築は、知識の共有、教育、AIによる支援、自動化、意思決定支援を可能にするための基盤です。
- 文芸モデル (Literate Model)
-
Undefined
- テスト (Test)
-
Testとは、指定した条件で対象を実行または評価し、観測した結果を期待する結果やConstraintと比較して、要求または契約への適合を確認する活動とその仕様です。
- 動く仕様書 (executable specification)
-
Executable Specification(動く仕様書)とは、実行可能な形で記述され、実行することで仕様の正否や意味が確定する仕様表現である。
- ドメイン駆動設計 (DDD, Domain-Driven Design)
-
Domain-Driven Designとは、複雑な問題領域をDomain Modelによって捉え、Ubiquitous Language、Bounded Context、Aggregateなどを用いて、業務上の意味とソフトウェア設計を接続するための原則、パターン、プラクティスの集合です。
- Cloud Native Component Framework (CNCF)
-
Cloud Native Component Framework(CNCF)は、クラウド・アプリケーションを構成するコンポーネントを、単一かつ一貫した実行モデルで実行するためのフレームワークです。 Component / Service / Operation という構造を中核とし、command、server(REST / OpenAPI)、client、script といった異なる実行形態から、同一の Operation を再利用できることを特徴とします。 ログ、エラー処理、設定、配備といったクラウド・アプリケーションに必要な品質属性をフレームワーク側に集約することで、コンポーネントはドメイン・ロジックの実装に集中できます。 CNCF は、文芸モデル駆動開発および AI 支援開発を前提に、「何を実行するか」と「どのように呼び出すか」を分離するための実行基盤として設計されています。
- インターフェース (Interface)
-
Undefined
- ケーパビリティ (Capability)
-
ケーパビリティ(Capability)とは、モデルまたはシステムが利用者や対象領域に対して何を可能にするかを表す概念です。実現方法ではなく、提供できる結果や働きに着目します。
- 振る舞い (Behavior)
-
UMLにおけるBehaviorは、そのContextとなるBehaviored Classifierが時間とともにどのようにStateを変えるかを定める仕様です。可能な実行、創発する振る舞い、または特定の実行例を表せます。
- DSL (Domain Specific Language)
-
DSL(ドメイン固有言語)は、特定の領域(ドメイン)に特化して設計された言語であり、その分野の概念や構造を直接的かつ簡潔に表現することを目的とします。 一般的な汎用プログラミング言語(GPL)に比べ、DSLは特定ドメインの問題解決や自動生成に適した高い抽象度を持ちます。
- 遷移 (Transition)
-
UMLにおけるTransitionは、StateMachine内のSource VertexからTarget Vertexへ進む有向関係です。Trigger、Guard、Effectなどによって、いつ遷移し何を実行するかを定めます。
- セキュリティ (Security)
-
Securityとは、情報と機能を正当な権限に従って保護し、不正な閲覧、利用、変更、破壊、否認を防ぐ性質です。Confidentiality、Integrity、Authenticity、AccountabilityなどのConcernを含みます。