DDD 序文とか

DDD勉強メモ

出典: 

Foreword by Martin Fowler

  • ソフトウェアの複雑性

    • 本質的に、問題のドメインそれ自体が複雑
    • なくすことはできない、制御できるのみ
  • 複雑性を制御するには、ドメインをうまくモデリングすることがカギ

    • できる人はそうはいない
    • 人に教えるのはすごくむずかしい
  • 本書は、ドメインモデリングを説明し、語彙を与える本

    • ドメインモデリング熟練者にとってはあまり新しいアイデアは得られないかもしれないが、それでも価値がある
  • 概念と実装とは分けるべきではない

    • 有能なドメインモデラーはホワイトボードのポンチ絵だけでは説明しない
    • プログラミング言語を交えて説明する

      • 実装にあたり考えるべきことがあり、切っても切れない
      • ユビキタス言語によりドメイン専門家と技術者との理解をすり合わせる
  • 「デザインして、しかる後に作る」ではない

    • ドメインモデルは刻一刻と成長する

      • 実装・リリース後に、よりよいモデルを思いつくことがある
      • 熟達したモデラーがドメインモデリングしてもそうなる
  • 成功体験だけでなく、失敗も載せているのがすばらしい

    • 両方から得たものを読者に提供してくれる

Preface

  • ドメインモデリングの重要性は古くから気づかれていた

    • が、方法論に関する書籍がぜんぜんなかった
  • 複雑なシステムを構築してきた

    • 成功・失敗両方経験した
  • 成功したものに共通すること

    • リッチなドメインモデルを構築していたこと

      • 設計を繰り返す中で成長する

        • 【補】たぶんリファクタのこと
      • プロジェクトの骨子
  • この本の提供するもの

    • 設計上の意思決定のフレームワーク
    • ドメイン設計を議論するための語彙

Contrasting Three Projects

  • ドメインモデリングなしに、経験と勘で突き進んで失敗したケース

    • 最初のリリースはうまくいった

      • まだシンプルだったから
    • バージョン2を出せなかった

      • バージョン1が負の遺産となった

        • 満足に構造化されない未熟な状態で凝り固まってしまった
        • ビジネスロジックの変化に追従できなかった
  • ちゃんとドメインモデリングして成功したケース

    • 開発者のみならず、開発者とドメイン専門家とのコミュニケーションも円滑に
    • 設計が柔軟に
  • ちゃんとドメインモデリングしたが、まじめにやりすぎて失敗したケース

    • ちゃんと設計してから作ろう、という遠大な志
    • 開発のイテレーションを回してもコードが向上しない

      • 開発者ごとにスキルのレベルが異なるから
    • ガチガチに形式ばった結果

      • 開発プロセスが複雑になり泥沼化
      • システムに関して、チーム全員が共通認識をもてなくなった
    • 結局、志を下げて、ガチガチにやらなくして、いい感じのものをリリースできた

複雑性による困難

  • プロジェクトがうまくいかなくなる要因

    • ソフトウェアの複雑性
    • 煩雑すぎるプロセス
    • 不明瞭な目的
    • リソース不足
  • 複雑性は設計に大きく左右される

    • 技術的側面

      • 多くの書籍が書かれ、多くの技術者が修練を積んできた

        • N/W
        • DB
        • etc.
    • 技術的でない側面

      • ドメイン・ビジネスロジック自体の複雑性
  • 本書の前提となる考え方

    • ドメインとドメインロジックに一番の焦点をおくべき
    • 複雑なドメイン設計は、モデルに基づいてなされるべき

設計と開発プロセス

  • 設計と開発プロセスは不可分

    • 設計思想は開発・実装につながらねばならない
    • さもなくば、学術的な議論に終わってしまう
  • 設計を学んだ者は可能性にわくわくする
  • そして現実に打ちひしがれる

    • 使用技術とマッチしない
    • いつ、時間の都合で妥協すべきかわからない
    • いつ、妥協せずにこだわるべきかわからない
  • 設計について抽象的に議論するよりも、開発で実際になされる内容をあげたほうがわかりやすい
  • ので、開発プロセスのことについてもあえて言及する
  • 本書は特定の方法論に基づいた本ではないが、アジャイルを意識してはいる

    • DDDとアジャイルは相乗効果がある
  • 以下、プロジェクトに求める前提要件

    • 開発が反復型であること
    • 開発者とドメイン専門家とが密にコミュニケーションをとっていること

      • ドメインの知識をモデルに落とし込むため
  • XPのはなし

    • コミュニケーションに重きをおく

      • モデルと設計によりコミュニケーションの質が左右される
    • プロジェクトがすばやく舵を切れることに重きをおく

      • ミニマリズム

        • 巨大で取り回しの悪いわりに、あまり価値を生み出さないドキュメンテーションからの解放
        • 過剰実装はNG
        • 過剰実装をさけるあまり、設計について深く考えなくなるのもNG
      • 絶え間なくリファクタ(=小さな再設計)

        • XPはすぐれた設計センスありきのもの
        • リファクタ前の設計により、難度は左右される

英語

  • du jour [də dʒə́ːr]

    • 【仏】今はやりの、最新の

      • 後置修飾
  • intricacy

    • 複雑さ、込み入っていること
  • gestate

    • 思想・計画等を温める

      • 満を持している感じ
  • old hands

    • 熟練者たち
  • a raft of

    • 大量の
  • disinterested

    • 私心のない、公正な

      • uninterested (興味のない)とはだいぶ違う意味
  • omnipotence

    • 全能
  • fly by the seat of one’s pants

    • 経験と勘を頼りにする
  • bogged down

    • 泥沼にはまった
  • exemplary

    • 模範的な
  • ossify

    • 骨化する
    • 変えられなくなる
  • legacy

    • 遺物

      • 遺産とか負債とか
  • upward trajectory

    • 上向きの軌道 -> 出世コース

      • 本文では、「上り調子」くらいの意味か
  • incisive

    • 鋭敏な
    • 鋭利な

      • 日本語で言う「キレッキレな」が近いかも
  • virtuous cycle

    • 好循環
  • lofty aspirations

    • 高い望み、遠大な志
  • become mired in

    • …で泥沼にはまる
  • bureaucracy

    • 官僚政治
    • 転じて、官僚的に煩雑な手続き
  • to name a few

    • 2,3例を挙げると
  • a great deal of

    • 多大な
  • legions of

    • 多数の
  • cultivate

    • 修める、練磨する

      • skills 等を目的語にとって
  • inextricable

    • ほどけない、不可分な
  • dry up

    • 干上がる -> ~に終わる
  • descend on

    • …を急襲する
  • let go of

    • 離す -> あきらめる
  • in the interest of time

    • 時間の都合で
  • dig in one’s heels

    • 妥協を拒む、頑なに自分の意見に固執する

      • let go of の対として使用
  • advocate

    • 提唱する
  • profound

    • 深遠な
  • once in a while

    • 時たま

      • ある日突然急成長したりするやつ
  • onion peeling

    • ちょっとずつ進むこと
  • delve

    • 掘り下げる

      • digのような「穴を掘る」的な意味はたぶんない
  • sprawling

    • 広大な
  • center of discourse

    • 論議の中心
  • lucid implementation

    • わかりやすい実装
  • scrutinize

    • 精査する
  • grope

    • 模索する
  • pore over

    • しげしげと見つめる
  • shepherding process

    • PLoP: Pattern Languages of Programs の査読フェーズ