Upgrade to Pro — share decks privately, control downloads, hide ads and more …

目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-archite...

Avatar for MinoDriven MinoDriven
November 18, 2025

目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-architecture

アーキテクチャConference 2025の登壇資料です。
https://architecture-con.findy-tools.io/2025

Avatar for MinoDriven

MinoDriven

November 18, 2025
Tweet

More Decks by MinoDriven

Other Decks in Programming

Transcript

  1. © DMM 新たな課題 一方で、AIによる開発の難しさや問題が上がってきています。 • AIの高速実装に伴い、技術的負債が加速度的に増加 • AIが混乱し、コード実装がいつまで経っても終わらない • AIが既存コードや環境を破壊する

    etc.. こうした問題があると、AIによる持続的開発が困難です。 せっかくAIを使っても開発がスケールしません。 AIによる持続的開発を可能にする、 なんらかのアプローチが必要です。 10
  2. © DMM ソフトウェア開発=品質特性の作り込み 12 品質特性 説明 品質副特性 機能適合性 機能がニーズを満たす度合い 機能完全性、機能正確性、機能適切性

    性能効率性 リソース効率や性能の度合い 時間効率性、資源効率性、容量満足性 互換性 他のシステムと情報共有、 交換できる度合い 共存性、相互運用性 使用性 利用者がシステムを満足に利用できる度合い 適切度認識性、習得性、運用操作性、ユーザーエラー防止性、ユー ザーインターフェイス快美性、アクセシビリティ 信頼性 必要なときに機能実行できる度合い 成熟性、可用性、障害許容性、回復性 セキュリティ 不正利用から保護する度合い 機密性、インテグリティ、否認防止性、責任追跡性、真正性 保守性 システムを修正する有効性や効率の度合い モジュール性、再利用性、解析性、修正性、試験性 移植性 他の実行環境に移植できる度合い 適応性、設置性、置換性
  3. © DMM ソフトウェア開発=品質特性の作り込み 13 品質特性 説明 品質副特性 機能適合性 機能がニーズを満たす度合い 機能完全性、機能正確性、機能適切性

    性能効率性 リソース効率や性能の度合い 時間効率性、資源効率性、容量満足性 互換性 他のシステムと情報共有、 交換できる度合い 共存性、相互運用性 使用性 利用者がシステムを満足に利用できる度合い 適切度認識性、習得性、運用操作性、ユーザーエラー防止性、ユー ザーインターフェイス快美性、アクセシビリティ 信頼性 必要なときに機能実行できる度合い 成熟性、可用性、障害許容性、回復性 セキュリティ 不正利用から保護する度合い 機密性、インテグリティ、否認防止性、責任追跡性、真正性 保守性 システムを修正する有効性や効率の度合い モジュール性、再利用性、解析性、 修正性、試験性 移植性 他の実行環境に移植できる度合い 適応性、設置性、置換性 持続的開発で 特に重要なのがこれ!
  4. © DMM アーキテクチャ代表例 16 アーキテクチャ 寄与する品質特性 クラウドネイティブアーキテクチャ 可用性、スケーラビリティ、拡張性など ゼロトラストアーキテクチャ セキュリティ

    パイプラインアーキテクチャ 再利用性、性能効率性など ヘキサゴナルアーキテクチャ 変更容易性 、テスト容易性 もちろん変更容易性を促進するための アーキテクチャもあります
  5. © DMM 定義が不適切だと目的達成困難 28 【目的】 ダイエットしたい 【目標】 ・体重40kg以下にすること 【手段】 ・絶食

    ・ダイエット番組を見るだけ 身長170cmの人が40kgまで体重を 落とすと明らかに健康に害があります 絶食は健康を害したり、 リバウンドの原因になります ダイエット番組見ただけでは 絶対に痩せません!
  6. © DMM 目的、目標、手段は、 私たちが開発するソフトウェアでも同じことが言えます。 顧客の要求(目的)を叶えるための手段として、 私たちはソフトウェアを開発しているのです。 29 目的 手段 商品を売買したい

    ショッピングサイト 動画を視聴したい 動画投稿サイト 遊びたい ゲームソフト 効率良く勉強したい 学習サイト 私たちは「手段」を開発している
  7. © DMM 「目標」は要件や仕様に相当する 30 【目的】 注文数を正しく表現したい 【目標】 注文数は1〜200であること 【手段】 目的を満たすソースコード

    システムを不具合なく的確に機能させるには、 仕様を決める必要があります。 例えば注文数が負数だと不具合になりますし、 5000兆個といった非現実的な数量も 問題があります。 注文数については 出荷業務の都合などを考慮し仕様を決めます。 こうした要件や仕様が目標に相当します。 目標を満たすようにコードを実施します。
  8. © DMM 32 // 注文明細クラス class OrderItem { int orderItemId;

    int orderId; int productId; int unitPrice; int quantity; // 注文数 } たとえばショッピングサイトにおける「注文」を考えてみます。 注文明細クラスを次のように実装したとします。 quantityは注文数です。
  9. © DMM 34 class Validator { boolean isValidQuantity(OrderItem orderItem) {

    return 1 <= orderItem.quantity && orderItem.quantity <= 200; } } 正しい注文数だけを受け付けられるよう、 次のようなバリデーションをどこかに実装するかもしれません。 しかしこの実装では、以下のような問題が生じる可能性があります。 • バリデーションを呼び忘れるとバグになる • 別の箇所に重複したコードが実装される可能性 • 注文数の仕様変更時、あちこち探し回らなければならない
  10. © DMM 35 【目的】 注文数を正しく表現したい 【目標】 注文数は1〜200であること 【手段】 OrderItem.quantity 【手段】

    Validator.isValidQuantityメソッド 目的に対して手段がバラバラになっているのが原因 家電に例えるとドライヤーがバラバラに提供されているような状態
  11. © DMM 37 class Quantity { private static final int

    MIN = 1; private static final int MAX = 200; final int value; Quantity(final int value) { if (value < MIN || MAX < value) { throw new IllegalArgumentException("注文数は1以上200以下で指定してください"); } this.value = value; } Quantity add(final Quantity other) { return new Quantity(value + other.value); } } カプセル化とはデータとそのデータを操作するロジックをひとま とめにすること。これで正しい注文数を確実に表現できる。
  12. © DMM 38 class YearlyPointBonus { int value; YearlyPointBonus(PurchaseHistory purchaseHistory,

    boolean isGoldMember) { value = (int)(purchaseHistory.yearlyAmount() * 0.01); if (isGoldMember) { value += 10000; } } } 会員ランク 年間ポイントボーナス仕様 一般会員 年間購入費の1% ゴールド会員 年間購入費の1% + 10000ポイント ショッピングサイトにおけるポイントボーナスを考えてみます。 この仕様を下記のように実装したとします。
  13. © DMM 39 class YearlyPointBonus { int value; YearlyPointBonus(PurchaseHistory purchaseHistory,

    boolean isGoldMember) { value = (int)(purchaseHistory.yearlyAmount() * 0.02); if (isGoldMember) { value += 10000; } } } 会員ランク 年間ポイントボーナス仕様 一般会員 年間購入費の1% ゴールド会員 年間購入費の2% + 10000ポイント ゴールド会員側の仕様が2%に変わり、0.02に実装修正すると、 一般会員側が正しく計算できなくなります。バグになります!
  14. © DMM 40 【目的】 一般会員の年間ポイントボーナスを 計算したい 【目標】 年間購入費の1% 【手段】 YearlyPointBonusクラス

    【目的】 ゴールド会員年間ポイントボーナスを 計算したい 【目標】 年間購入費1% + 10000ポイント 手段であるYearlyPointBonusが 異なる目的に使い回されているのが原因
  15. © DMM 41 【目的】 一般会員の年間ポイントボーナスを 計算したい 【目標】 年間購入費の1% 【手段】 RegularYearlyPointBonusクラス

    【目的】 ゴールド会員年間ポイントボーナスを 計算したい 【目標】 年間購入費1% + 10000ポイント 目的それぞれで手段を分ける これが関心の分離 【手段】 GoldYearlyPointBonusクラス
  16. © DMM 42 class RegularYearlyPointBonus { private static final double

    POINT_RATE = 0.01; final int value; RegularYearlyPointBonus(final PurchaseHistory purchaseHistory) { value = (int)(purchaseHistory.yearlyAmount() * POINT_RATE); } } class GoldYearlyPointBonus { private static final double POINT_RATE = 0.01; private static final int FIXED_POINT_BONUS = 10000; final int value; GoldYearlyPointBonus(final PurchaseHistory purchaseHistory) { value = (int)(purchaseHistory.yearlyAmount() * POINT_RATE) + FIXED_POINT_BONUS; } } このように目的ごとに分離することで コード変更影響が生じなくなります。変更に強くなります。
  17. © DMM アーキテクチャの各レイヤにも目的がある 48 Domain層 目的 : 業務活動を表現するデータの正確な作成、更新 Use Case層

    目的 : ユースケースの解決 Presentation層 目的 : クライアント入出力の解決 Infrastructure層 目的 : DBやクラウドサービスといった外界 とのやり取り
  18. © DMM 「契約による設計」で目標を厳密に定める 契約による設計とは、正確性の向上を目的に バートランド・メイヤー氏が考案した設計の方法論。 • 事前条件:メソッド開始時に保証されるべき条件 • 事後条件:メソッド終了時に保証されるべき条件 •

    不変条件:常に維持されるべき条件 モジュールの機能適合性を保証するテストはこの3条件の検証が基本。 上記3条件は「目的−目標−手段」における目標に相当。 「目的を確実に達成するためにどんな目標が必要か」と考えることで 条件をより的確に設計できます。 49
  19. © DMM 57 こういう仕事をしていませんか? 仕様書だけ渡され 単に仕様を満たす実装 だけしている 仕様書を書いて プログラマに仕様書を渡し 実装をマルナゲしている

    実装と動作させること だけが仕事のゴールに なっている 技術には関心があるが 顧客要求(目的)には ほとんど関心がない こういう仕事の仕方で目的を意識したり理解できるものでしょうか…?
  20. © DMM 58 【目標(仕様)】 年間購入費の1% 【手段】 YearlyPointBonusクラス 【目標(仕様)】 年間購入費1% +

    10000ポイント 仕様は目的ではありません、目標に相当します。 仕様書だけ眺めていても目的は分かりません。 つまり変更容易性の設計が困難であることを意味します!!
  21. © DMM 60 ボールペン のり 付箋 はさみ ホッチキス 修正液 別に難しいことを言ってるわけではありません。

    みなさん、普段道具を目的ごとに収納していますよね。 ファイルを目的ごとに区分してフォルダに入れてますよね。 PCのデスクトップにファイルが散らかってるわけがないですよね!?
  22. © DMM 61 【目的】 普通注文したい 【目的】 予約注文したい 【目的】 抽選注文したい 【手段】

    注文クラス こうであっちゃいけないわけです 注文方式それぞれで取り扱うデータやロジックが違います (こういう構造は内部で注文方式をフラグで切り替えている)
  23. © DMM 62 【目的】 普通注文したい 【目的】 予約注文したい 【目的】 抽選注文したい 【手段】

    予約注文クラス 手段に対して目的がひとつに定まるよう 設計しなきゃいけないわけです 【手段】 普通注文クラス 【手段】 抽選注文クラス
  24. © DMM 仕事のタスクを目的−目標−手段で書こう 71 【Issueタイトル】 検索結果画面の表示速度改善 # 目的 ユーザーが快適にアプリを使えるようにし、離脱率を下げたい #

    目標(目的の達成条件) 主要な検索キーワードに対する検索結果の初期表示時間を2秒以内にすること # 手段 クエリの実行計画を分析し、不要なJOINを削減する GitHubのIssueやタスク管理ツールのチケットを次の形式で書こう