■ 1. ソフトウェア開発の基本課題
- 事業活動のデジタル化:
- 事業開発、組織開発、ソフトウェア開発が広く深く連動する時代になった
- 3領域の一体化により、事業目的適合性はソフトウェアエンジニアが当事者として取り組むべき課題となった
- 事業活動の不確実さと複雑さ:
- 事業開発、組織開発、ソフトウェア開発は、すべての関係者が互いの知識と技能を持ち寄る創発的な活動である
- この創発的な活動によって、不確実さと複雑さに取り組む
- 不確実さと複雑さへの向き合い方:
- ソフトウェアエンジニアは事業活動の当事者として判断し行動すべきである
- 事業価値を生むソフトウェアは、他分野の専門家と協働しながら創発していくべきものである
- 事業側と技術側という分断モデルでは、事業価値を生むソフトウェア開発はできない
- 継続的な学習と成長:
- 不確実だからこそ、何かを仮決めして進むしかない
- 事業の複雑さは変化を続けるため、事前にすべてを調査分析して整理することはできない
- 開発とは、観察・評価・設計・実装のサイクルを何度も回しながら学習し成長する活動である
- ソフトウェア開発の根底原則:
- 事業目的適合性と発展性の2つが根底原則である
- 事業目的適合性:
- 事業目的への適合は大きな事業価値を生む一方、事業目的からはずれたソフトウェアは事業に損失を生む
- 発展性:
- 事業は発展を続けるため、事業活動と一体化したソフトウェアの発展性が大きな事業価値となる
- 発展性に欠け、変更がやっかいで危険なソフトウェアは、事業発展の足かせであり事業リスクである
■ 2. AI技術をソフトウェア開発に活用するアプローチ
- 設計スタイルの選択:
- 大きな事前設計(BDUF)は、建築や量産型製造業、ウォーターフォール的なソフトウェア開発で一般的な手法である
- 小さな設計の反復は、最初に小さな設計を行い、その結果を観察して小さな改善を繰り返すインタラクティブかつインクリメンタルな手法である
- AI技術活用の方向性:
- 自動化(無人化)は、AI技術によりできるだけ人を介在させず、コストダウン、スピードアップ、一定品質を達成する方向である
- 人の活動支援は、人の判断と行動を主体としつつAI技術で人の能力を増強し、同様の効果を目指す方向である
- 目指すべき象限:
- 小さな設計の反復と人の活動支援を組み合わせた領域を目指すべきである
- この領域では、協働創発、学習と成長、観察・評価・設計・実装のサイクルが実現される
- 小さな設計の反復をAIで支援:
- 不確実さに対応する工夫、複雑さに対応する工夫、学習しながら成長することがポイントとなる
- 観察・評価・設計・実装のサイクルを回すほど学びが進み、よいソフトウェアに発展させることができる
■ 3. これからのソフトウェア開発にどう取り組むか
- 役立つ知識と技能:
- 一般論として、事業理解や業務知識、ソフトウェアの設計原則やパターンの知識はAI時代にも役立つ
- 現状の課題:
- 事業理解や業務知識が役立つと言われてもピンとこない
- 設計原則やパターンをある程度知っていても、実践で役立つ実感が少ない
- 何を、どう学べば、どんな効果があるか具体的にわからない
- 日々の仕事の中で学習の時間を確保できない
- 効率的に学ぶ方法:
- ソフトウェアの事業目的適合性と発展性を判断し改善するための知識と技能を学ぶ実践的な考え方とやり方が存在する
- その具体例として、『ドメイン駆動設計をはじめよう』(Vlad Khononov著、増田亨・綿引琢磨訳)を紹介する
■ 4. ドメイン駆動設計 再入門
- ドメイン駆動設計の目指すところ:
- 事業活動のモデルと設計に焦点を合わせる
- 知識豊富な設計と深いモデルの探求を重視する
- 人と人との相互作用、コミュニケーションを重視する
- モデルと実装を一致させる
- これらは、事業目的適合性と発展性を向上するための基本原則である
- 土台となる知識と技能:
- 業務ロジックと入出力を分離する:
- ビジネスルールの表現に特化したクラスを作る
- 画面、データベース、通信に依存した構造から切り離す
- ビジネスルールをプログラミング言語で記述する:
- 区分、日付、期間、金額、数量、比率などのアプリケーション特化のデータ型を定義して組み合わせる
- モデルとコードの継続的なリファクタリングを行う:
- 事業活動を学び理解したことをモデルと実装に反映し、事業目的適合性と発展性を向上する
- 土台の効率的な学び方:
- 『現場で役立つシステム設計の原則』の1章と2章の基本技法を完全に理解し、3章の考え方を加えるとよい
- 『リファクタリング』の1章にあるswitch文のリファクタリング例を徹底的に練習するとよい
- 『ドメイン駆動設計をはじめよう』の内容:
- ソフトウェアの実装と事業戦略を結びつけるさまざまな経験則が書かれている
- 経験則5点
- 中核の業務領域に焦点を合わせること
- 同じ言葉を使うこと
- 事業の成長と連動したソフトウェアの成長
- 現実世界のドメイン駆動設計への取り組み
- 事例研究
- 事業戦略とソフトウェアを結びつける方法:
- ソフトウェア開発の対象業務を2つの軸で4分類する
- 横軸: 競合他社との差別化への影響度
- 縦軸: 業務ロジックの複雑さ(開発の難易度)
- カテゴリーごとに適切な設計方針を選ぶ
- 業務ロジックが複雑で自社独自性が高い中核の業務領域では、変更容易性の改善に継続的に取り組む
- 業務ロジックが単純で他社と同じ一般の業務領域では、模倣または購入を検討する
- 業務ロジックが単純で自社独自性が高い補完的な業務領域では、簡略に済ませる
- 同じ言葉を使って開発する:
- 業務エキスパートと開発者が、業務知識、概念モデル、解決モデル、ソースコードにまたがって同じ言葉(業務の言葉)を使う
- これにより、協働創発、学習と成長が実現される
- 事業の成長とソフトウェアの成長:
- 事業が成長すれば、業務領域のカテゴリーは変化する
- 業務領域のカテゴリーが変化すれば、設計方針も変化する
- 中核・補完・一般の3カテゴリー間では、差別化の機会や単純化などの要因により移行が起こる
- 現実世界のドメイン駆動設計への取り組み:
- 以下のような状況はありえないし必要もない:
- チーム全員がドメイン駆動設計を熟知している
- 最初から全員が役立つモデルの探求に全力を尽くす
- 全ての関係者が同じ言葉を忠実に使う
- 既存システムや外部サービスを考慮しなくてよい、制約の少ない新規案件である
- ドメイン駆動設計のすべての技法を使う必要はない
- ドメイン駆動設計が組織として受け入れられていない状況でも実践は可能である:
- 適切な道具を必要に応じて選択的に使う
- それぞれのやり方の背景にある考え方と原則を意識して使う
- 組織の変化とソフトウェアの成長に忍耐強く取り組む
- 事例研究(付録A):
- 原著者の経験談(失敗談)であり、ドメイン駆動設計の浅い理解から出発し、失敗を繰り返しながら学び成長した物語である
- この本の内容のリアルな元ネタであり、他の情報源では手に入らない貴重な内容である
- さらに学ぶための参考書:
- 差別化戦略を実行するための考え方とやり方を学ぶには『マイケル・ポーターの競争戦略【エッセンシャル版】』が参考になる
- 財務会計の専門家ではない人向けに、事業活動のざっくりした全体像を財務の視点から学ぶには『財務3表一体理解法』が参考になる