天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

ドメイン駆動設計を導入するためにやったこと(の講演部分に)参加してきた

modeling-how-to-learn.connpass.com

こちらのイベントの座談会を除いた部分に参加してきたので、会の様子と感想を書いていきます。(ラスト30分で予定されていた座談会については、今回は他イベントと被っていたため残念ながら不参加です...)

イベント概要

以下、connpassのイベントページから引用です。

ドメイン駆動設計を現場に導入するためにさまざまな体験談の発表です。

・なぜ導入に取り組んだか
・どうやろうとしたか
・うまくいったこと
・苦労した(している)こと
事業領域や開発を取り巻く環境が異なる三つの現場から、3名の体験談の発表と、座談会形式でそれぞれの考え方ややり方の意見交換をします。

イベントで話されていたこと

ドメイン駆動設計のプラクティスでカバーできること、できないこと ~松岡幸一郎さん~

発表内容

まず、DDDのポイントとしては、

  • ソフトウェアの機能性を高めること(役に立つものを作ること)
  • ソフトウェアの保守性を高めること(長期間開発しても機能開発にストレスを感じないような)

の2つがあるということで、一言で言うと、「ソフトウェアの機能性を高めることで役に立つものを作りつつ、頻繁な変更に耐えられる(機能開発が容易である)ような高い保守性を保つ」のがDDDということでした。
なお、機能性を高める・保守性を高めるというのは個別にやっても効果があるものなので、両立しないといけない(例えばモデリングをしないのはDDDじゃない...)は松岡さんの見解としては、DDDと言ってもいいんじゃないかと思っているということでした。(ただし、「ドメインモデル」で根本は繋がっているため、より大きな価値を発揮するということでした)

松岡さんはログラスに入社して、*1テストコードを増やしたり、ドメインモデル図を作成しながら開発したり、ペアプロやレビューを地道に導入したり...ということを繰り返した結果、チームにモデリングやテストをする文化が根付き、飛躍的にテストコードが増えたり、モデリングの重要性がチームに広まっていってユーザの業務を徹底的に理解する姿勢が身についたというお話でした。

後半では、具体的に新機能/既存機能に対してどのようにフィードバックをもらい、開発に活かしていったのか、というお話を聴くことができました。

文化を根付かせるために、当たり前に思えても中々継続させることが難しいこと(ユーザから早期にフィードバックを得る、テストコードを書く...)を丁寧に継続的に実践していたのが印象的でした。

参考資料

little-hands.hatenablog.com

little-hands.booth.pm

巨大レガシーシステムの戦略評価とリファクタリングにおけるDDDの活用事例~ミノ駆動さん~

続いて、リファクタリングを専門に仕事をするという、中々面白いポジションで仕事をされているミノ駆動さんから発表がありました。

ミノ駆動さんは事業領域という観点でドメインを明確化し、既存システムを分割しながらコアドメインを特定し、見つかったコアドメインリファクタリングに対して多くの投資をしていったということです。*2

また、現場への導入の際には、プロダクションコードを用いた勉強会を開いたということでした。
ミノ駆動さんも松岡さんも、現場でこれまで開発をしてきた人たちがこれまでよりもシステム開発が良くなっている実感を持ってもらえるように意識をしている様子が伺えたのが印象的でした。

変更を楽で安全にする良い設計を目指して~増田さん~

発表内容

ビジネスサイドからの期待値(ビジネスが変わった時にシステムへの反映がビジネスサイドが思うようなスピード感・コスト感で行えるようにしたい)に答えるために、超大規模なシステムのリファクタリングを行っている(現在進行形)というお話を聴いていきました。後に参考資料として貼りますが、とんでもない改善効果があったようです。*3

後半は、実際にこのような成果を出すためのスタイルが語られていきました。以下のような話が挙がっていました。

  • 設計書を読み込んで開発するのではなく、詳細設計をしながらプログラミングして、プロダクションコードを書きながら分析する
  • Whyの合意形成(悪い設計で失っているものや良い設計で得られるものを言語化・数値化)
  • Howの認識合わせ(ビジネスルール中心の構造、事実の記録付け、機能に濃淡をつけてカテゴライズ)
  • Whatの体験学習(ドメインオブジェクトを実際に書いて動かす、イミュータブルなテーブル設計、要点を絞り込んでノイズを除去する)
参考資料

実際に増田さんが現在進行形でリファクタリング&開発を進めているプロジェクトのレポートだそうです。(NRI×ドメイン駆動設計)

https://www.nri.com/-/media/Corporate/jp/Files/PDF/knowledge/publication/chitekishisan/2020/09/cs20200910.pdf?la=ja-JP&hash=8AAB2186F81D949959B358FC0D724DC972343665

全体を通した感想

現場の開発とDDDをどのように接合させるか、という試みの話が聴けたので良かったです。
松岡さんミノ駆動さんの話からは、現場で既存で取り組まれているやり方を壊し過ぎないようにして現場の理解を集めながら、DDDの要素の一部分(?)を取り入れようとする話が聴けて、増田さんの話からは、「変更を楽で安全にする」という観点とDDDがどのように関わるのかという話が聴けて、三者三様の実際の開発例が聴けて面白かったです。
この接合部分の話は、個人的にはもっともっと聞きたい感覚もありましたが、今回は30分という時間の都合もあったと思うので、また次を楽しみにしようと思います。

*1:松岡さんは、元々DDDの講師としてログラスに行っていたようで、まさにミイラ取りがミイラになったというお話をされていました

*2:この作業の過程では、有識者が全然いない&人手が全く足りないという事態に直面したそうで、相当な苦労があったそうです。。。

*3:ソースコードが183千行→97千行になる、同じ修正規模だった時に修正が必要なモジュールが追加3修正65→追加1修正2になるなど...