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

Software Architecture in an AI-Driven World

Software Architecture in an AI-Driven World

2025年の新卒研修の資料です。

Avatar for AGAWA Koji

AGAWA Koji

May 15, 2025
Tweet

More Decks by AGAWA Koji

Other Decks in Technology

Transcript

  1. 阿川 耕司 ソフトウェアエンジニア (株)サイバーエージェント AI事業本部 協業リテールメディアDiv. ミライネージ 2014年1月入社 Scala/Rust/関数型が好き #times_atty303

    🤔💭 バズワード感があって名乗りたくないけどフ ルスタックエンジニアと呼ばれるような仕事 をしています。 2/54
  2. 今日深掘りする3本柱 1. 分割統治 (Divide & Conquer) AIが集中し、理解しやすい単位に、システムをどう「分ける」か? 2. コード化 (Everything

    as Code) 設計の意図やドメイン知識を、AIが「読める」形でどう表現するか? 3. 品質 (Quality) AIで代替できない、人間が変わらず責任を負う必要がある部分とは? 8/54
  3. 講義 (約2時間) Part 0: イントロダクション (今ココ!) Part 1: AI基礎ブロック Part

    2: 原則ブロック Part 3: DDD戦略設計 Part 4: レイヤード & マイクロサービス設計 Part 5: AIリスク Part 6: 未来展望 Part 7: まとめ Agenda
  4. AIコーディングエージェントの三類型 タイプ 特徴 代表例 得意なこと 苦手なこと・課題 自律型エー ジェント 大規模タスク、曖昧な指示にも挑戦。自律的に計 画・実行。

    Devin 複雑な問題解決の試み、広 範囲のコード修正 安定性、コスト、完全な自律 性、巨大コンテキスト 協調型アシ スタント 対話を通じてコード生成、リファクタリング、デバ ッグ等を支援。人間との協調が前提。 Cursor 特定範囲のコード生成、質 問応答、アイデア出し 大規模改修、深いドメイン知 識の理解 補完型ツー ル コーディング中のリアルタイムなコード片提案。 GitHub Copilot 定型コード、スニペット生 成、単純な補完 文脈理解の限界、複雑なロ ジック生成 9/54
  5. コンテキストウィンドウの壁 LLM (大規模言語モデル) が一度に処理できる情報量には限界がある。 例:Claude 3.7 Sonnet (20万トークン) 1トークン ≈

    英語で約3.5文字 (あくまで目安) 20万トークン ≈ 英語で約70万文字 の情報を一度に扱える。 コード量とコンテキストウィンドウの試算例 (あくまでイメージ) 大規模の入り口である10万行のコードベース (1行平均50文字 = 500万文字) を LLMに読ませようとすると… 総想定トークン数: 500万文字 / 3.5文字/トークン ≈ 約143万トークン コンテキストウィンドウの大きいGeminiの200万トークンなら処理できるが…… 11/54
  6. ここでミライネージのコードベースを見ると…… =============================================================================== (長いので言語別は一部省略) Language Files Lines Code Comments Blanks ===============================================================================

    GraphQL 423 19811 18376 11 1424 HCL 221 18285 15371 324 2590 Java 91 7061 5485 548 1028 JavaScript 27 1181 989 83 109 JSON 100 116383 116376 0 7 Kotlin 367 32045 27072 1410 3563 Markdown 118 5486 0 3516 1970 Protocol Buffers 53 5506 4250 194 1062 Python 5 763 627 33 103 Rust 11 528 447 3 78 Scala 4348 259755 227290 6033 26432 Shell 49 7147 4936 1299 912 SQL 471 11833 10875 175 783 TSX 326 24522 22240 296 1986 TypeScript 335 28406 25143 645 2618 Vue 273 7526 7003 29 494 XML 174 56475 56266 42 167 YAML 77 8123 6918 801 404 =============================================================================== Total 7604 617168 554770 15565 46833 12/54
  7. 5年経過したコードベースの実際 =============================================================================== Language Files Lines Code Comments Blanks =============================================================================== Total

    7604 617168 554770 15565 46833 =============================================================================== Gitチェックアウト直後でビルド結果は含まず、自動生成ファイルもコミットしていない おおよそ50万行のコードベース (1行平均50文字 = 2500万文字) 総想定トークン数: 2500万文字 / 3.5文字/トークン ≈ 約714万トークン 全コード = 最高解像度だが最悪のトークン効率 13/54
  8. Layer 3: Code (実際のソースコード) サイズ 数MB~数GB以上 内容 具体的な実装。AIが直接全てを読むのは困難な場合が多い。 だからこそ、Layer 1,

    Layer 2の情報でAIに「何を作るべきか」を正確に伝え、AIが Layer 3のコード生成に集中できるようにする「分割」と「コード化」が重要になる。 🤔💭 人がこのLayer 3を触らなくなる日がそう遠くない未来に来るかもしれません。 18/54
  9. 原則1. コンテキスト分割 AIの課題 一度に多くの情報を処理できない (トークン上限) 解決策 AIが扱う情報 (コンテキスト) を適切に「分割」し、一度に処理する量を限定する。 鍵となる概念:

    Bounded Context (境界づけられたコンテキスト) ドメイン駆動設計 (DDD) の中心的な概念。 ビジネスドメインにおける特定の関心事を明確な境界で区切ったもの。 1つのBounded Context = 1つのAIコンテキスト 1つのAIエージェントが責任を持って扱える、適切なサイズと複雑性の単位。 コンテキスト境界は“公開言語”(OpenAPI/GraphQL)で接合 19/54
  10. ミライネージの例 signage : サイネージ事業のコアドメイン retail : 小売の関心事のコンテキスト 自社の販促掲示物、店舗の管理、広告掲載による収益 demand :

    広告主の関心事のコンテキスト 広告の管理、クリエイティブ、キャンペーン予算 delivery : コンテンツ配信の関心事のコンテキスト 小売、広告主の配信要求からサイネージが再生すべきコンテンツを決定 sdm : サイネージ端末の支援サブドメイン 死活監視、アプリの更新、リモートメンテナンス authn : 認証の汎用サブドメイン Auth0を利用 20/54
  11. 原則2. Project as Code (PaC) "Everything as Code" の思想を設計にも適用 ソースコードだけでなく、設計情報、ドメイン知識、API仕様などもバージョン管理し、

    機械可読な形式で記述する。 なぜPaCがAI活用に重要なのか? 最小トークンで最大の意味を伝えるコツ。 現在のAIは人間と違い、ドメインに長く係わっていてもその経験から学習したりしない ので、毎回ドメインの知識をゼロから与えないといけない。 人間は経験から学習するので暗黙知になりがちだった。 AIとチームメンバーは同じ AIのための準備はチームにジョインする人も同じく恩恵を受ける。 せっかくオンボーディングの準備をするならAIも活用できるようにしたほうがいい。 21/54
  12. 具体的なPaCの対象ファイル例 domain.md : ユビキタス言語、主要ドメイン概念、ビジネスルール designdoc.md : Design Doc adr.md :

    Architecture Decision Record openapi.yaml / schema.graphql : APIの公開言語 (契約) spec/*.feature : BDDのフィーチャーファイル (振る舞い定義) 🤔💭 ミライネージでは実装に必要だったGraphQLスキーマはありますが、他はあまり実践できていないです。AI活用のた めにこれから作っていこうとしています。 22/54
  13. 原則3. 品質 = テスト + HITL AIが生成したコードも、人間が書いたコード以上に品質担保が不可欠。 AIには「責任」がない。 人間がAIに代って責任を負う必要がある。 人間が指示した「意図」通りに動くかどうかは人間が確認する必要がある。

    ただしテストは自動化しないと人間がボトルネックになる。 現在よりテストの重要性が増す。 🤔💭 AI社会のためのソフトウェアであれば人間が介在する必要はないですが、当面ソフトウェアの適用先が人間社会である 以上、人間が責任を負う必要は将来にわたってあり続けると思います。 23/54
  14. HITL (Human In The Loop) AIの実装はあくまで「提案」。鵜呑みにせず、人間がレビューし最終決定。 3段階のHITLゲート(レビューポイント) Spec-PR (仕様・設計レビュー) domain.md

    , openapi.yaml , *.feature のレビュー。AIが誤解しない明確な指 示になっているか? AI-PR (AI生成コードレビュー) AIが生成したコードのプルリクエストレビュー。ロジック、セキュリティ、パフォーマ ンス、可読性。 24/54
  15. DDDの戦略的設計と戦術的設計 戦略的設計 (Strategic Design) ドメイン全体を俯瞰し、どのように分割するかを考える。 Bounded Context や Context Map

    を定義する。 ドメインの全体像を把握し、システムのアーキテクチャを設計する。 戦術的設計 (Tactical Design) 各 Bounded Context 内での具体的な設計を行う。 エンティティ、値オブジェクト、集約、ドメインサービスなどの設計を行う。 ドメインモデルを具体化し、実装に落とし込む。 🤔💭 DDDの原典で解説されている戦術的設計はオブジェクト指向パラダイムに偏った方法論で、昨今の関数型パラダイム と親和性が低い部分も多く、そこは割り引いて考えたほうが良いと思います。 27/54
  16. ドメインの分類 Core Domain (コアドメイン): ビジネスにとって最も重要で、 競争優位性の源泉 となる領域。 最も多くの時間とリソースを投入して開発・洗練させるべき。 AIを活用する場合も、このCore Domainの理解と設計が最優先。

    Supporting Subdomain (支援サブドメイン): Core Domainを支援するが、それ自体は競争優位性を持たない領域。 カスタム開発が必要な場合もある。 Generic Subdomain (汎用サブドメイン): どのビジネスでも共通して必要となる一般的な機能 (例: 認証、通知)。 SaaSやOSSの利用を検討。 28/54
  17. Ubiquitous Language (ユビキタス言語) プロジェクト関係者 (ドメインエキスパート、開発者、ビジネス、etc.) 全員が、特定のドメイ ンについて話す際に一貫して使用する厳密な言語。 なぜ重要か? 誤解を防ぎ、コミュニケーションを円滑にする。 AIへの指示やドキュメント記述の基盤となる。

    AIに「顧客」と指示したときに、それが何を指すのか明確でなければならない。 作成のポイント: Markdownの定義リストなどで管理する (原則2. Project as Code)。 最初から完璧を目指さず、継続的に改善する。 作った言語は浸透させる。 29/54
  18. ユビキタス言語の例 お題: ECサイトの「商品レビュー機能」 # Ubiquitous Language - レビュー - :

    商品に対する顧客からの評価・コメント - 評価点 - : 1~5の星で表される満足度 - 投稿者 - : レビューを書き込んだ認証済みユーザー 30/54
  19. Bounded Context (境界づけられたコンテキスト) 原則1. 「コンテキスト分割」の核となる概念。 定義 特定のモデルが定義され、適用される明確な境界。その境界内では、用語や概念が一 貫した意味を持つ。 逆に異なるBounded Context間では、同じ用語でも異なる意味を持つことがあ

    る。 各Bounded Contextが、AIにとって扱いやすい単位 (AIコンテキスト) となる。 🤔💭 同じチームが複数のBounded Contextを担当する場合、異なる意味の同じ用語は定義しないほうが無難でしょう。 31/54
  20. Context Mapping (コンテキストマップ) 目的: 複数のBounded Contextがどのように連携し、影響し合っているかを明確にす る。 主要な関係性パターン: Shared Kernel

    (共有カーネル): 2つのコンテキストがモデルの一部を共有。慎重な 運用が必要。 Customer-Supplier (顧客-供給者): 一方が他方の要求を満たす形でサービスを 提供。 Anti-Corruption Layer (ACL / 腐敗防止層): 外部コンテキストのモデルが内部 に影響を与えないよう隔離する層。 Open Host Service (OHS / 公開ホストサービス): 標準化されたインターフェース でサービスを公開。 33/54
  21. Project as Code & AIコンテキスト (再び) OpenAPI / GraphQL Schema:

    Bounded Context間のインターフェースを定義する「公開された言語」。 AIはこれらのスキーマを読み解くことで巨大な実装詳細を知らずとも、APIを通じて 他のコンテキストと連携できる。 明確なAPIスキーマは、AIがBounded Contextの責務と機能を理解するための鍵とな る。 34/54
  22. サービスをまたがる整合性 強い整合性 (Strong Consistency): 従来のRDBのような即時一貫性。マイクロサービ スでは実現が難しい。 結果整合性 (Eventual Consistency): 時間の経過とともに最終的にデータが一致す

    る。非同期通信でよく採用される。 補償トランザクション (Compensating Transaction): 一連の処理の途中でエラーが発生した場合、それまでの処理を取り消す操作を実行す る (Sagaパターンで利用)。 🤔💭 ドメインの性質にもよりますが、できるだけ結果整合性を選択しておくとスケーラビリティで問題になりにくいです。 39/54
  23. 伝統的な4レイヤアーキテクチャ責務早見表 レイヤー 主な責務 具体例 AIとの相性・活用のヒント Presentation ユーザーインターフェース、 APIエンドポイントの公開、リ クエスト/レスポンス処理 REST

    Controller, GraphQL Resolver, Webページ API仕様(OpenAPI)があれば、AIはエンドポイ ントの雛形やリクエスト/レスポンスのDTOを生成 しやすい。 Application ユースケースの実現、複数のド メインオブジェクトやインフラ サービスを利用した処理フロ ーの調整 〇〇UseCase, △△Workflow 処理フローが明確であれば、AIは定型的な呼び出 しコードを生成可能。複雑な分岐やエラー処理は 人間の設計が重要。 Domain ビジネスロジック、エンティテ ィ、値オブジェクト、ドメインサ ービス。システムの核。 Productエンティティ, Orderド メインサービス 最もAIによる自動生成が難しく、人間の深い理解 と設計が求められる。ただし、ユビキタス言語やド メインモデルが明確なら、AIも一部支援可能。 Infrastructure データベースアクセス、外部サ ービス連携、メッセージングな ど技術的詳細の実装 UserRepositoryImpl, EmailSender, S3Client インターフェースが明確であれば、AIは具体的な DBアクセスコード(SQL)や外部API呼び出しコー ドを生成しやすい。 41/54
  24. AI化された開発バリューストリーム フェーズ アクター 内容 Idea 人間 ビジネスアイデア、解決したい課題を提示 Planning AI+HITL 要求分析支援、仕様の明確化、タスク分解

    Coding AI 設計に基づき、ソースコード、テストコード、ドキュメントを生成 Review AI+HITL AIによる自動レビュー + 人間による重要箇所のレビュー CI/CD AI ビルド、多段階テスト (ユニット、結合、E2E) の自動実行 安全なデプロイ戦略 (カナリアリリース、ブルーグリーンデプロイ) の実行 Monitoring AI 本番環境の監視、異常検知、パフォーマンス分析。障害発生時の原因特定支援、自己修復の試み これは夢物語ではない: 部分的には既に実現しつつあり、今後さらに進化していく。 50/54
  25. 本日のキーポイント 分割 (Divide & Conquer) AIが集中し、理解しやすい単位に、システムをどう「分ける」か? Bounded Context こそが、AIにとっての最適なコンテキスト単位。 コード化

    (Everything as Code) 設計の意図やドメイン知識を、AIが「読める」形でどう表現するか? Markdown, OpenAPI, BDDフィーチャーファイルなどがAIへの重要な指示書とな る。 品質 (Quality) AIと共に、システムの「品質」をどうコントロールするか? 自動テスト、HITL (Human In The Loop)で人間が責任を持つ。 51/54
  26. AI時代のアーキテクトの役割 変化する役割: 従来: 詳細な設計図を描き、実装を指示する。 AI時代: AIが最高のパフォーマンスを発揮できる「舞台」を設計し、AIの提案を評価・ 判断し、最終的な意思決定を行う。 求められるスキル: 技術的スキル (アーキテクチャ設計、プログラミング)

    に加え、 ドメイン理解力: AIに何をさせるべきかを的確に指示する力。 コミュニケーション能力: AIとの対話、チーム内外との連携。 批判的思考力: AIの提案を鵜呑みにせず、多角的に評価する力。 倫理観と責任感: AIの利用に伴うリスクを理解し、責任ある開発を推進する力。 52/54