/note/tech

AI 時代のソフトウェア設計の学び方

要約:

■ 1. 発表概要

  • 発表者: 増田 亨(有限会社システム設計)
  • イベント: JJUG CCC 2026 Spring(2026年5月30日)
  • 専門領域: 業務系アプリケーション開発、技術的負債の返済支援、エンジニアの設計スキル向上支援
  • 主な著書・訳書:
    • 『現場で役立つシステム設計の原則』(2017年、技術評論社)
    • 『ドメイン駆動設計をはじめよう』(2024年、オライリージャパン、訳書)

■ 2. AI時代のソフトウェア開発の方向性

  • 設計スタイルの選択肢:
    • 大きな事前設計(BDUF: Big Design Up Front): 建築や量産型製造業で一般的、ウォーターフォール的なソフトウェア開発
    • 小さな設計の反復(Iterative/Incremental): 最初に小さな設計を行い(Enough Design Up Front)、その結果を観察し、小さな設計改善を繰り返す
  • AI技術活用の方向性:
    • 自動化(無人化): AI技術を使って人の介在を最小化し、コストダウン・スピードアップ・一定品質を達成する
    • 人の活動支援: 人の判断と行動を主体としつつ、AI技術で人の能力を増強し、コストダウン・スピードアップ・一定品質を達成する
  • 推奨する方向性: 「小さな設計の反復 × 人の活動支援」
    • 大きな事前設計は採用しない
    • 自動化(無人化)は採用しない

■ 3. デジタル化の進展と事業活動・ソフトウェア開発の一体化

  • デジタル化により、事業開発・組織開発・ソフトウェア開発の三つの活動が深く結びつき相互作用する
  • 事業フェーズにかかわらず三つの活動の連動性と相互依存性が強まっている:
    • 事業の誕生期: 0→1フェーズ
    • 事業の形成期: 1→10フェーズ
    • 事業の発展期: 10→100フェーズ
  • 事業活動を取り巻く環境(VUCA):
    • 変動性(Volatility): 変化を繰り返す
    • 不確実性(Uncertainty): 予測が難しい
    • 複雑性(Complexity): 多くの要素が絡み合う
    • 多義性(Ambiguity): 複数の解釈が可能
  • VUCAの環境は「あらかじめ用意された答えのない世界」であり、以下の取り組みが求められる:
    • 人と人との相互作用による協働創発
    • 学習と成長を続ける個人と組織
    • OADIループ(観察-評価-設計-実装)

■ 4. ソフトウェア開発の根底原則と取り組み方

  • ソフトウェア開発の根底原則は二つ:
    • 事業目的適合性
    • 変更容易性
  • 事業目的適合性について:
    • 昔も今もこれからもソフトウェア開発の根本原則である
    • 従来はソフトウェアエンジニア以外がプロダクトの企画や要求定義として取り組んできた
    • 事業活動のデジタル化の進展により、ソフトウェアエンジニアが当事者として取り組むべき課題となった
    • AI技術活用の絶対的な評価基準となる
  • 変更容易性について:
    • 良い設計は悪い設計より変更が楽で安全である
    • 予測が難しく複雑で変化を続ける事業環境でソフトウェア開発に取り組むための根本原則
    • ソフトウェア設計のあらゆる原則とパターンは、この変更容易性原則の特殊化である
    • AI技術の進展で従来とは異なるアプローチで変更容易性を実現できるという仮説は未検証
  • AI技術を活用したソフトウェア開発の方針:
    • 人と人との相互作用、組織の学習と成長、観察-評価-設計-実装ループに効果的に取り組むためにAI技術を活用し、人間の判断と行動を支援する
    • 事業目的適合性を高めるためにAI技術を活用する
    • 変更容易性を高めるためにAI技術を活用する

■ 5. AI時代の設計技能の学び方: 初級から中級へ

  • 事業目的適合性と変更容易性を体験的に学ぶ手順:
    • 事業目的をざっくり理解する(スタートライン)
    • コードの中で事業目的適合性に強く関係する場所の見つけ方を覚える
    • 事業目的適合性に強く関係する場所(コードのごく一部)に集中して、変更容易性を改善するやり方を体験的に学ぶ
    • 区分がらみのコードの変更容易性を改善すると事業活動とコードのつながりが捉えやすくなる効果を評価する
  • 事業目的をざっくり理解する三つの公式:
    • 利益 = 売上 - 費用
    • 安定した利益 = 競争優位
    • 競争優位 = 差別化戦略の実行結果
  • 事業目的適合性に強く関係するコードの見つけ方:
    • 区分を判定するロジックと、区分ごとの適用ルールの切り替えを記述している場所に注目する
    • 具体的には if/switch(名前のない暗黙の区分)および enum 列挙定数(名前を付けて明示された区分)
    • 区分マスタテーブルを参照している場所
  • なぜ区分に焦点を合わせるか:
    • 区分を判定し区分ごとに適用ルールを切り替えるのは「利益=売上-費用」を持続的に達成するため
    • 区分の分類ロジックや適用ルールが「売上」「費用」「競争優位」「差別化の実行」にどう影響するかを注目することで、事業活動とコードのつながりが見えてくる
    • このつながりを理解できると視野が事業活動に広がり、事業目的適合性を判断し改善する技能が向上する
  • 区分まわりのコードに見られる乱雑さの特徴:
    • 複雑なif/switchの記述(区分の暗黙化)
    • 同じような分類ロジックやルール適用の切り替え構造があちこちに散在し、重複した記述も多い
    • 区分に異なる分類軸が混在(隠された掛け合わせ構造)
    • 特殊な条件を分岐構造の奥深くに記述
    • 使われていない区分の温存
    • これらは現実世界のVUCAの写像であり、技術負債でもある
  • 変更容易性の改善手法:
    • 名前を付けて明示化(変数名/メソッド名/列挙型定数)
    • 特殊な条件をガード節として外だし
    • 名前の整合性や記述順序に違和感があれば複数の区分軸が混在している可能性が高い
    • enumで列挙型定数を定義し、分類ロジックと適用ルールをenum内部にカプセル化した際にきれいに整理できない場合も、分類軸の混在を疑う
  • 区分に焦点を合わせた効率的・効果的な学び方:
    • 準備運動: 『現場で役立つシステム設計の原則』1章と2章を完全に理解する
    • 練習: 『リファクタリング』1章 switch文のリファクタリングを徹底的に練習する
    • 実践: 実コードで区分がらみの乱雑なコードを三つ特定し、設計改善と事業目的との関係づけを掘り下げる

■ 6. AI時代の設計技能の学び方: 中級から上級へ

  • 中級と上級の間の大きなギャップ:
    • 中級の特徴: ルールベース(文脈に関わらず同じルールで判断する)、視野が狭く視点が少ない、つながりで考えない、現状にとどまりやすい
    • 上級の特徴: 文脈依存で判断しようとする、視野を広げ視点を増やしつながりで考えようとする、現状に安住するとスキルが劣化することを知っている
  • 上級を目指すための取り組み:
    • 学びの目的を強く意識し、成長を確認しながら進む
    • 事業目的適合性を判断し改善する技能を高める
    • 変更容易性を判断し改善する技能を高める
    • 視野を広げる練習と実践、視点を増やす練習と実践、つながりで考える練習と実践を継続する
  • 推奨書籍と学習方法(視野・視点・つながりの強化):
    • 『ドメイン駆動設計をはじめよう』(1章、2章、10章、11章、13章、付録): 差別化戦略を実行するためのソフトウェア設計を学び、現実の事業開発・組織開発・ソフトウェア開発と関連づける、時間をかけてなんども繰り返しながら学習し成長する
    • 『マイケル・ポーターの競争戦略』【エッセンシャル版】: 差別化戦略を実行するための考え方とやり方を学ぶ
    • 財務関連書籍(『財務3表一体理解法』など): 事業目的と事業活動を財務の視点から捉える
    • これらを時間をかけて少しずつ学習し、現実の課題と関連づける

■ 7. まとめ

  • AI時代に役立つ知識と技能:
    • ソフトウェアの事業目的適合性を判断し向上するための知識と技能
    • ソフトウェアの変更容易性を判断し向上するための知識と技能
  • 効率的かつ効果的に学ぶための実践的アプローチ:
    • 区分まわりの乱雑なコードを掘り下げ、事業目的適合性と変更容易性を体験的に学ぶ
    • 事業活動と差別化戦略に視野を広げつながりで考える習慣を身につける