Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

設計の知識と技能で駆動するソフトウェア開発

 設計の知識と技能で駆動するソフトウェア開発

Object Oriented Conference 2024

登壇の機会をいただいたので、ここ数年、設計について考えていることを、言語化してみました。

はじめに

設計と開発プロセスの関係性
ソフトウェア設計の知識と技能

① ソフトウェア設計の基礎知識
a. 基本課題
b. 解決のアプローチ
c. モジュール化:基本となる4つの技法

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

③アプリケーションのモジュール構成(参照モデル)
コア(中心)
ポート(境界)
アダプタ(周辺)

④モデル駆動設計

全体
事業活動、要件、アーキテクチャ

コア(中央)
業務ロジック、ドメインモデル
業務機能、アプリケーションサービス

アダプター(周辺)
記録モデル、データベーススキーマ
連係モデル、プロトコル設計
対話モデル、インタラクション設計

増田 亨

March 23, 2024
Tweet

More Decks by 増田 亨

Other Decks in Programming

Transcript

  1. 設計と開発プロセスの関係性 5 開発活動 システム構造の選択 設計活動 タスク分割 の構造 作業手順 (段取り) 良い設計

    (変更が楽で安全) 生産性 品質保証 設計改善=開発プロセス改善 開発のやり方は、設計に強く依存する
  2. ソフトウェア設計の知識と技能 6 共創 経験則 習熟 暗黙的な経験知 技能⇒知識 成功体験 失敗体験 言語化、可視化された経験則

    ・設計原則 (文脈に依存しない一般化) ・設計パターン (文脈の類型化) ・体験談 (個別の文脈) 設計の知識と技能を お互いに持ち寄って 組み合わせる 手を動かして 体で覚える 知識⇒技能 制約の多い実際の文脈 相乗効果(三つの掛け算) 足し算ではなく掛け算
  3. b. 解決のアプローチ 9 関心の分離 部品化 モジュール化 関心の分離? 指針 部品化? 分割と結合

    大きな泥団子も巨大な一枚岩も なんらかの部品化はやっている (クラス、パッケージ、レイヤ、…) しかし変更がやっかいで危険 広く通用する一般則だが、 具体的なやり方がわからない モジュラー性の向上に焦点を合わせて設計する モジュール化 交換容易性 交換容易性=変更容易性 別バージョンの部品に差し替え 変更が楽で安全 モジュラー性: 交換しやすさの度合い
  4. c. モジュラー性の向上:基本となる技法 10 分析モデルと設計モデル 同じ言葉、同じ構造 モデルの差異=負債 サービス提供の契約 事前条件:利用側の義務 事後条件:提供側の義務 要約

    理解、伝達、再利用 固い容器に閉じ込める 関係するもの→内部 関係しないもの→外部 モジュール設計の 反復的な改善 モデル 要点の抽出 直接的な写像 わかりやすい構造 カプセル化 自立性 仕様 意図の伝達
  5. モジュールの設計スタイルの分類 14 機能 (Function) データ型 (Type) XOR アウトバウンド インバウンド 演算

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

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

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

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

    ロジック データベース (内部データソース) 外部サービス (外部データソース) メッセージバス (受信) メール、SNS (通知) テスト シナリオ 外部 システム ジョブ スケジューラ メッセージバス (送信) スマート デバイス SPA Web UI (passive) (active) アダプター アプリケーション
  10. ポート&アダプターの設計スタイル • コア(中央) 業務ロジック データ型 & 演算 & 不変 &

    ビルドアップ アプリケーション データ型 & 演算 & 可変 & ブレークダウン • アダプター(周辺) プライマリ 機能 & インバウンド & 可変 & ビルドアップ セカンダリ 機能 & アウトバウンド & 可変 & ビルドアップ 20 設計対象の特性に応じた設計スタイルを選択する
  11. コア(中央)の分析と設計に投資する アプリケーション 業務 ロジック 本質的な複雑さ (事業活動の複雑さ) 事業活動の最適化を支援 コアに焦点を合わせる 競争優位性 分析モデルと

    設計モデルの一致 業務知識(WHAT) 深い理解(WHY) 反復的な設計活動 (継続的学習) 事業活動の変化と成長 事業活動と歩調を合わせて 変化と成長を続ける 費用対効果、波及効果
  12. アダプターの実装:必要最小限の設計 モック モック 基盤 23 プライマリー アダプター群 セカンダリー アダプター群 データベース

    (内部データソース) 外部サービス (外部データソース) メッセージバス (受信) メール、SNS (通知) テスト シナリオ 外部 システム ジョブ スケジューラ メッセージバス (送信) スマート デバイス SPA Web UI (passive) (active) アダプター 実績ある設計を再利用 インバウンド アウトバンド 手続き(機能・可変) フレームワーク ライブラリ 実装例
  13. 事業活動モデルと基本設計 26 目的 制約 基本設計 1.事業活動モデル ・機能要件、非機能要件 ・アーキテクチャの選択 ・開発運用方法の選択 ・開発運用体制の構築と維持

    価値の 共創 価値の 共創 顧客 事業 活動 協力 会社 事業活動の 最適化 最適化 最適化 最適化 事業環境 事業戦略 経営資源
  14. 事業活動の最適化機会 27 契約履行活動 出荷業務の効率化 サービスレベル vs.コスト 経営資源の有効活用 在庫、機材、設備、人員、… 販売増 vs.

    物理制約、費用増 商談機会の創出 マーケティング活動 費用対効果の最適化 商談活動 営業担当者の 行動最適化 契約条件の調整 価格、納期、支払方法 売上最大化 vs. 利益確保 システム構築の基本目的、複雑な業務ロジックの背景
  15. コア(中央) 28 2.業務ロジックモデル ・業務ルールに基づく 計算判断ロジック ・売上最大化とコスト最小化 のために適切な行動を刺激し 不適切な行動を制限する仕組み 3.業務機能モデル ・業務活動の最適化の支援

    ・情報の提供 ・計算・判断の自動化 ・記録・通知の自動化 ドメインモデルの クラス設計 アプリケーションサービスの クラス設計 言語化された 経験則
  16. 分析設計パターン:おすすめ10選 29 事業活動の観測と測定 ・測定値の表現 ・整数型⇒単位付き数値型 ・金額、数量、日付、時刻 範囲演算 ・範囲内、範囲外 ・範囲の重なり ・範囲の合成

    分類と判定 ・区分ごとの定数 ・区分ごとのロジック ・階段関数 状態遷移 ・状態遷移モデル ・制限 ・刺激 集合演算 ・分配ルール ・スキルセットの マッチング 複合条件 ・決定表 ・論理演算の合成 資源管理 ・実在庫、未来在庫 ・過剰予約 ・複合手配 知識の伝達 ・知識の表現 ・会話履歴 ・体系化 最適化 ・目的関数 ・制約条件 契約と当事者 ・権利と義務 ・基本契約と個別契約 ・与信 ドメインモデルのクラス設計 6/16(日)@新宿野村ビル JJUG CCC 2024 Spring で発表予定 業務ルールを記述するための参考パターン
  17. ソフトウェア設計の知識と技能 32 共創 経験則 習熟 暗黙的な経験則 技能⇒知識 成功体験 失敗体験 言語化/可視化された経験則

    設計原則 (文脈に依存しない一般化) 設計パターン (文脈の類型化) 体験談 (個別の文脈) 設計の知識と技能を お互いに持ち寄って 組み合わせる 制約の多い実際の文脈で 手を動かして 体で覚える 知識⇒技能 相乗効果(三つの掛け算) 足し算ではなく掛け算