Slide 1

Slide 1 text

設計の知識と技能で駆動する ソフトウェア開発 2024年3月24日 有限会社システム設計 増田 亨 Object Oriented カンファレンス 2024 1

Slide 2

Slide 2 text

自己紹介 業務系アプリケーションソフトウェアの開発者 モデル駆動設計 Java/Spring Boot/IntelliJ IDEA/JIG 有限会社システム設計 代表 コミューン株式会社 技術顧問 2 増田 亨(ますだ とおる)

Slide 3

Slide 3 text

アジェンダ はじめに ①ソフトウェア設計の基礎知識 ②モジュールの設計スタイル ③アプリケーション全体のモジュール構成 ④モデル駆動設計 3 設計の参考情報 私の経験知の言語化と可視化

Slide 4

Slide 4 text

はじめに ・設計と開発プロセスの関係性 ・ソフトウェア設計の知識と技能 4

Slide 5

Slide 5 text

設計と開発プロセスの関係性 5 開発活動 システム構造の選択 設計活動 タスク分割 の構造 作業手順 (段取り) 良い設計 (変更が楽で安全) 生産性 品質保証 設計改善=開発プロセス改善 開発のやり方は、設計に強く依存する

Slide 6

Slide 6 text

ソフトウェア設計の知識と技能 6 共創 経験則 習熟 暗黙的な経験知 技能⇒知識 成功体験 失敗体験 言語化、可視化された経験則 ・設計原則 (文脈に依存しない一般化) ・設計パターン (文脈の類型化) ・体験談 (個別の文脈) 設計の知識と技能を お互いに持ち寄って 組み合わせる 手を動かして 体で覚える 知識⇒技能 制約の多い実際の文脈 相乗効果(三つの掛け算) 足し算ではなく掛け算

Slide 7

Slide 7 text

① ソフトウェア設計の基礎知識 7 a. 基本課題 b. 解決のアプローチ c. 基本となる技法

Slide 8

Slide 8 text

a. ソフトウェア設計の基本課題 8 複雑さ 発展性 基本課題 不適切な設計 大きな泥団子 巨大な一枚岩 (モノリス) 対応できない 本質的な 不必要な複雑さ 変更がやっかいで危険

Slide 9

Slide 9 text

b. 解決のアプローチ 9 関心の分離 部品化 モジュール化 関心の分離? 指針 部品化? 分割と結合 大きな泥団子も巨大な一枚岩も なんらかの部品化はやっている (クラス、パッケージ、レイヤ、…) しかし変更がやっかいで危険 広く通用する一般則だが、 具体的なやり方がわからない モジュラー性の向上に焦点を合わせて設計する モジュール化 交換容易性 交換容易性=変更容易性 別バージョンの部品に差し替え 変更が楽で安全 モジュラー性: 交換しやすさの度合い

Slide 10

Slide 10 text

c. モジュラー性の向上:基本となる技法 10 分析モデルと設計モデル 同じ言葉、同じ構造 モデルの差異=負債 サービス提供の契約 事前条件:利用側の義務 事後条件:提供側の義務 要約 理解、伝達、再利用 固い容器に閉じ込める 関係するもの→内部 関係しないもの→外部 モジュール設計の 反復的な改善 モデル 要点の抽出 直接的な写像 わかりやすい構造 カプセル化 自立性 仕様 意図の伝達

Slide 11

Slide 11 text

② モジュールの設計スタイル 11

Slide 12

Slide 12 text

設計スタイル a. モジュールの設計スタイルの分類 b. オブジェクト指向プログラミングの設計スタイル c. ドメイン駆動設計の設計スタイル 12

Slide 13

Slide 13 text

モジュールの設計スタイルの分類軸 13 XOR XOR XOR XOR XOR システム構築の原理 状態の扱い方 モジュールの用途 抽象化の方向 AND AND AND 2択 3択 2択 2択 A B A B C A B A B

Slide 14

Slide 14 text

モジュールの設計スタイルの分類 14 機能 (Function) データ型 (Type) XOR アウトバウンド インバウンド 演算 XOR XOR 可変 (mutable) 不変 (immutable) XOR ブレーク ダウン ビルド アップ XOR システム構築の原理 状態の扱い方 モジュールの用途 抽象化の方向 AND AND AND 2択 3択 2択 2択

Slide 15

Slide 15 text

モジュールの設計スタイルの分類 機能 (Function) データ型 (Type) XOR アウトバウンド インバウンド 演算 XOR XOR 可変 (mutable) 不変 (immutable) XOR ブレーク ダウン ビルド アップ XOR システム構築の原理 状態の扱い方 モジュールの用途 抽象化の方向 AND AND AND データ型を、型名、有効な値、有効な操作の集合、の三つで要約 例:有限自然数 { > 0; <= MAX; 加算(); 減算(); 乗算(); 除算(); } 抽象データ型によるモジュール化 (設計スタイルの違いを理解する鍵)

Slide 16

Slide 16 text

オブジェクト指向プログラミングの 設計スタイル 16 機能 (Function) データ型 (Type) アウトバウンド インバウンド 演算 可変 (mutable) 不変 (immutable) ブレーク ダウン ビルド アップ システム構築の原理 状態の扱い方 モジュールの用途 抽象化の方向 AND AND AND クラスとメソッドで演算ロジックをモジュール化 抽象データ型+α subtyping subclassing ? 主な用途は演算 (インメモリ) 入出力の記述には向いてない 不変性重視へ 効率→安定性 コストの低下 演算部品⇒組み立て アプリケーション固有の 型を定義して組み合わせる

Slide 17

Slide 17 text

ドメイン駆動設計の設計スタイル 17 機能 (Function) データ型 (Type) アウトバウンド インバウンド 演算 可変 (mutable) 不変 (immutable) ブレーク ダウン ビルド アップ システム構築の原理 状態の扱い方 モジュールの用途 抽象化の方向 AND AND AND 複雑な業務ロジックに焦点を合わせる 抽象データ型+α 事業活動の観測と測定に 使う業務固有のデータ型 +必要な計算判断 主な用途は演算 (インメモリ) 業務ルールに基づく計算判断 不変性重視へ 業務ルールを 宣言的に記述 演算部品⇒組み立て 値オブジェクト ⇒集約 ⇒サービス コアに集中、費用対効果、波及効果

Slide 18

Slide 18 text

③ アプリケーション全体の モジュール構成 18

Slide 19

Slide 19 text

ポート&アダプターアーキテクチャ モック モック 基盤 19 プライマリー アダプター群 セカンダリー アダプター群 業務 ロジック データベース (内部データソース) 外部サービス (外部データソース) メッセージバス (受信) メール、SNS (通知) テスト シナリオ 外部 システム ジョブ スケジューラ メッセージバス (送信) スマート デバイス SPA Web UI (passive) (active) アダプター アプリケーション

Slide 20

Slide 20 text

ポート&アダプターの設計スタイル • コア(中央) 業務ロジック データ型 & 演算 & 不変 & ビルドアップ アプリケーション データ型 & 演算 & 可変 & ブレークダウン • アダプター(周辺) プライマリ 機能 & インバウンド & 可変 & ビルドアップ セカンダリ 機能 & アウトバウンド & 可変 & ビルドアップ 20 設計対象の特性に応じた設計スタイルを選択する

Slide 21

Slide 21 text

コア(中央)の分析と設計に投資する アプリケーション 業務 ロジック 本質的な複雑さ (事業活動の複雑さ) 事業活動の最適化を支援 コアに焦点を合わせる 競争優位性 分析モデルと 設計モデルの一致 業務知識(WHAT) 深い理解(WHY) 反復的な設計活動 (継続的学習) 事業活動の変化と成長 事業活動と歩調を合わせて 変化と成長を続ける 費用対効果、波及効果

Slide 22

Slide 22 text

コアの実装:高密度、強度、交換容易性 モック 基盤 22 業務 ロジック データベース (内部データソース) テスト シナリオ アプリケーション 複雑な業務ロジック 検証 本番データ テスト シナリオ 検証

Slide 23

Slide 23 text

アダプターの実装:必要最小限の設計 モック モック 基盤 23 プライマリー アダプター群 セカンダリー アダプター群 データベース (内部データソース) 外部サービス (外部データソース) メッセージバス (受信) メール、SNS (通知) テスト シナリオ 外部 システム ジョブ スケジューラ メッセージバス (送信) スマート デバイス SPA Web UI (passive) (active) アダプター 実績ある設計を再利用 インバウンド アウトバンド 手続き(機能・可変) フレームワーク ライブラリ 実装例

Slide 24

Slide 24 text

④ モデル駆動設計 24 モジュールの設計パターン

Slide 25

Slide 25 text

6つのモデル、6つの設計 全体 1. 事業活動モデル、基本設計 コア(中央) 2. 業務ロジックモデル、ドメインモデルのクラス設計 3. 業務機能モデル、アプリケーションサービスのクラス設計 アダプター(周辺) 4. 記録モデル、データベーススキーマ設計 5. 連係モデル、プロトコル設計 6. 対話モデル、インタラクション設計 25

Slide 26

Slide 26 text

事業活動モデルと基本設計 26 目的 制約 基本設計 1.事業活動モデル ・機能要件、非機能要件 ・アーキテクチャの選択 ・開発運用方法の選択 ・開発運用体制の構築と維持 価値の 共創 価値の 共創 顧客 事業 活動 協力 会社 事業活動の 最適化 最適化 最適化 最適化 事業環境 事業戦略 経営資源

Slide 27

Slide 27 text

事業活動の最適化機会 27 契約履行活動 出荷業務の効率化 サービスレベル vs.コスト 経営資源の有効活用 在庫、機材、設備、人員、… 販売増 vs. 物理制約、費用増 商談機会の創出 マーケティング活動 費用対効果の最適化 商談活動 営業担当者の 行動最適化 契約条件の調整 価格、納期、支払方法 売上最大化 vs. 利益確保 システム構築の基本目的、複雑な業務ロジックの背景

Slide 28

Slide 28 text

コア(中央) 28 2.業務ロジックモデル ・業務ルールに基づく 計算判断ロジック ・売上最大化とコスト最小化 のために適切な行動を刺激し 不適切な行動を制限する仕組み 3.業務機能モデル ・業務活動の最適化の支援 ・情報の提供 ・計算・判断の自動化 ・記録・通知の自動化 ドメインモデルの クラス設計 アプリケーションサービスの クラス設計 言語化された 経験則

Slide 29

Slide 29 text

分析設計パターン:おすすめ10選 29 事業活動の観測と測定 ・測定値の表現 ・整数型⇒単位付き数値型 ・金額、数量、日付、時刻 範囲演算 ・範囲内、範囲外 ・範囲の重なり ・範囲の合成 分類と判定 ・区分ごとの定数 ・区分ごとのロジック ・階段関数 状態遷移 ・状態遷移モデル ・制限 ・刺激 集合演算 ・分配ルール ・スキルセットの マッチング 複合条件 ・決定表 ・論理演算の合成 資源管理 ・実在庫、未来在庫 ・過剰予約 ・複合手配 知識の伝達 ・知識の表現 ・会話履歴 ・体系化 最適化 ・目的関数 ・制約条件 契約と当事者 ・権利と義務 ・基本契約と個別契約 ・与信 ドメインモデルのクラス設計 6/16(日)@新宿野村ビル JJUG CCC 2024 Spring で発表予定 業務ルールを記述するための参考パターン

Slide 30

Slide 30 text

アダプター(周辺) 30 データベーススキーマ設計 プロトコル設計 インタラクション設計 5.連係モデル アプリケーション間連係 4.記録モデル 事業活動の観測、記録の完全性 6.対話モデル ユーザーインターフェース

Slide 31

Slide 31 text

最後に 31

Slide 32

Slide 32 text

ソフトウェア設計の知識と技能 32 共創 経験則 習熟 暗黙的な経験則 技能⇒知識 成功体験 失敗体験 言語化/可視化された経験則 設計原則 (文脈に依存しない一般化) 設計パターン (文脈の類型化) 体験談 (個別の文脈) 設計の知識と技能を お互いに持ち寄って 組み合わせる 制約の多い実際の文脈で 手を動かして 体で覚える 知識⇒技能 相乗効果(三つの掛け算) 足し算ではなく掛け算