2021-04-25

DDD(ドメイン駆動設計)、理念に大賛成、実装に大反対。

※追記あり。最後の追記は 2021/04/25 21:40頃※

タイトルの通りのことを思っているけど、顕名のブログで書くと社内で干されるので、増田に書く。社内の心理的安全性がそんなに低い訳ではないけども、潮流が凄いので今は慎重に振る舞いたい。

この記事を見て「キミはDDDのことを誤解している」と思われた方はコメント等で優しく(易しく、ではない)ご指摘願いたい。

※この記事では Web Application を前提とした話になっている。

DDDとは?

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88

DDD、ここがイケてる
  • ソフトウェア開発者は開発対象のドメインのことをほとんど知らない、という問題意識およびその提起。
  • 俗に言う「ビジネスサイド」の人間との共通言語を整備するべきだ、という提言。
  • ドメインモデルの構成要素のうち「エンティティ」「値オブジェクト」あたりの概念は、俗に言うビジネスサイドの人間も持たなくちゃいけない。DDDはその学びの道標として非常に優れている。
DDD、ここがイケてない
  • 共通言語たるドメインモデルを、そのままコードと1対1対応しなければならない、という思い込みや風潮。
    • 既存のWAF(Web Application Framework) の利点を潰してどうする…
  • ドメインモデルの構成要素のうち「リポジトリ」等はソフトウェアの中に閉じた世界の話であって、俗に言うビジネスサイドの人間との共通言語には登場しなくて良いことが圧倒的に多い。設計を遅延させる原因になっている。
    • 名前から考えれば、DDDの効用の範囲は「共通言語の整備」と「共通言語の会話から設計に落とし込む際のベストプラクティス」あたりであって欲しいのに、余計なお世話。
  • 過度な抽象化
じゃあ、どうすんの?
  • エンティティやその周辺のドメインモデルの話は、いわゆるビジネスサイドの人間との共通言語として、噛み砕いて共有したい(既に進行中)
  • ソフトウェアの設計としては、3月にバズってた記事 Only My Rails Way のような方針でありたい。欲を言えば静的型付け言語に乗り換えたいが、それは叶わぬ望み……。。。

短く言うならば「DDDの理念は取り入れるが実装は取り入れない」

(参考) 筆者のポジションと近況
  • データベーススペシャリストの立場で、また俗に言う「テックリード」の立場で、情報システムやWebサービスの設計と実装に従事。
  • 技術的な上司はチーム外。チーム内では筆者が一番上。
  • 社内のよそのチームが「DDDいいぞ」と言って布教しようとしてきてて、つらいお年頃。
追記@2021/04/25 21:40頃

夜中に投稿したのに多くの方に読んでもらえて嬉しく思います。コメントなどなどありがとうございます。以下、補足です。

  • 筆者にとっても普段はWAFという語は Web Application Firewall を指します。わざわざWAFの正式スペルを文中に書いたのは、通常と異なる言葉遣いであるから、です。
  • 「既存のWAFの利点を潰してどうする」が言うところの利点の主たる部分は、junior developer 職の人を新たにチームに招き入れる際に、当該言語やWAF(frameworkの方)、そして基本情報レベルのセキュリティや通信の知識さえあれば容易に参画可能であるという利点です。seniorならまだしも、juniorを迎え入れるときにDDDの知識を持ってる人を必須にしたり on boarding の時点でDDDの話をしなくちゃいけないのは、コストに見合わないと判断しています。

あと、素晴らしい引用に感謝したいのですけれども、

「一般的に言えることだが、使っているフレームワークとは争わないこと。 フレームワークと対立してしまった時には、ドメイン駆動設計の基本を保ちながら、 詳細は捨て去る方法を模索すること。」エヴァンス本 p157

https://b.hatena.ne.jp/entry/4701728015809111618/comment/sonota88

例えば、アプリケーションのディレクトリ構造をDDDの用語に合わせたものにするという行為は、ここで言うところの「対立」に相当すると考えています。「基本」すなわち理念だけ存分に私たちのアプリケーションに取り込みたいものです。

少し違う角度の話をすると、初っ端からDDD前提のWAF(frameworkの方)を、できれば静的型付け言語で(←個人的な趣味)、新しく開発してそれを普及させることによって、当該WAFを学んだ人は自然とDDDも身に付いているという文化を作ることには熱い賛同の言葉を贈りたいと思っています。

  • おおむね同意する。 大事なのはDDDを実践しようとした場合のビジネスサイドとの協調という心構えなのであってフレームワークとしてとらえるとただ面倒くさいだけの手法だと思う。 SOL...

  • 極端な表現をすれば、馬鹿の一つ覚えで終わる話だと思う

  • 言おうとしていることはわかる。言語仕様にもよるが、例えばGoで適用してDDDの概念がそのままディレクトリー名になるとか、まじでありえない

  • どうして増田にはIT関連企業の人がいないの?

  • 日本のアホだけど偉い人名言に加えておけ ?「よし、AIだ」 ?「よし、ディープラーニングだ」 ?「よし、ブロックチェーンだ」 ?「よし、DXだ」 ?「よし、マイクロサービスだ」 ?...

  • わかってない。ドメインはWAFの外側なんだよ。 あとWAFってWeb Application Firewallじゃないの普通

  • Wikipedia読んでもドメイン駆動設計がどういうことなんかさっぱりわからんやで この前ホッテントリに入ってたオブジェクト指向の増田みたいにわかりやすく解説してくれやで

  • っていうかドメイン駆動設計ってクライアントアプリとかやってる人なら意識せずに普通にやってることじゃないの? webアプリだからフレームワークに沿わずに特別なことにみえるだけ...

  • 以下はあくまで個人の解釈だから異論は認める ドメイン駆動設計ってあくまで設計手法っていうかビジネスロジックのモデリングまでが本分だから システムドメイン(領域)にビジネス...

  • RailsやLaravelみたいな(Web)MVCフレームワークで開発する場合、無理にDDD文脈のアーキテクチャ(レイヤードアーキテクチャ/クリーンアーキテクチャ/オニオンアーキテクチャ)を採用すべきで...

  • 「共通言語たるドメインモデルを、そのままコードと1対1対応しなければならない、という思い込みや風潮。 既存のWAF(Web Application Framework) の利点を潰してどうする…」 こういう誤った...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん