BPStudy#141〜DDD(Domain Driven Design)実践の現場に行ってきました

先日開催されたBPStudy#141〜DDD(Domain Driven Design)実践の現場に参加してお話を聞いてきました。

話を聞きながら、メモした大事そうなところを整理しながら共有できればと思います。

ドメイン駆動設計の正しい歩き方〜どこに焦点を合わせ、どう実践するか

増田さん(@masuda220 ‏)

www.slideshare.net

ドメイン駆動設計でなぜつくるのか?(p.2〜p.3)

  • 進化を続ける、変更が楽で安全なソフトウェアを手に入れるため
  • 単に動くだけのソフトウェアにしないことに振り切っている
  • 変化しなくてもいいソフトウェアだとフィットしないかも

ドメイン駆動設計とはなにか?(p.4〜p.6)

  • ドメイン駆動設計について調べるとアーキテクチャやデータベースとかと紐付けられがちだがそれはソフトウェア一般論の話では
  • ここではEvansが追い求めていた中核を重点的に話す

核心にある複雑さに立ち向かう(p.7〜p.10)

  • Evansさんはソフトウェアの複雑さはたくさんあるけどなかでも複雑こそがビジネスの複雑さが根本原因と言っている
  • Evansさんの考え方はここに立ち向かえばソフトウェアを整理できるという考え方
  • ビジネスルールが特にソフトウェアの複雑さにダイレクトに効いてくる

核心にある複雑さを適切に扱う(p.11〜p.12)

  • 核心とそれ以外の部分が明確になって整理できる
  • 周辺(入出力)の複雑さが軽減される
  • 全体が整理されていく

核心にある複雑さをどう扱うか 6つの問い(p.13〜14)

  • ドメイン層を確立させる ← アーキテクチャの話
  • モデルと実装を密に結合する
  • システム間の秩序の改善を続ける(コンテキストマップなどが関連してくる)

上記の3つだけやっていてもダメ…

  • ビジネスの活動を継続的に学ぶ
  • コアドメインを選んで修正する
  • ビジネスを深く洞察する(浅い理解だとコアドメインがわからない)

チームの基本のこだわりポイントにこれらを置いて毎日続けているかがドメイン駆動設計をきちんとやっているかの指標。

→ 逆にこれを意識してきちんとできて居ればエースエンジニアがいなくても良いソフトウェアになっていく。

正しい道からはずれるとき(p.15〜p.17)

  • ビジネスの活動から目をそらす(パフォーマンスチューニングに注力しすぎたり)
  • 全体を均質にカバーしようとする(どこでも値オブジェクトやEntitynなどのドメイン駆動設計の戦術パターンを取り入れようとする)

→ コアのところだけを頑張る。メリハリをつける。コアじゃないところは手を抜く。

  • ビジネスを表面的に捉えて理解した気になる

→ ビジネスの用語を意識していなかったところからだんだん使うようになってくるとやった感が出てくる。学習曲線の1つ山越えたとこ。その段階でビジネスのキャッチアップをできた気になり、ドメイン駆動設計を行っている気になっていると得るものが少ない

→ DBの都合はドメイン層に関係ない。普通はドメイン層のモデルを再生成しようと思ったら様々なテーブルから情報をかき集めてきて結合する必要があるはず。1つのテーブルの情報で済むならそれはコアドメインではない

  • モデルと実装を切り離す

モデリングができるようになって楽しくなってきたときにやりがちなのがソフトウェアの実装に役に立たないことにもフォーカスしてしまう。

→ 実装のためのモデリングはどうしても細かい部分でスッキリしないことが多い

→ 綺麗すぎるのは危ないかも

  • システム間を力づくで連携させる

→ 訳のわからないファイル読んだり、段々APIに項目追加されてきたり、APIで条件に応じて違うデータ返さなきゃいけなかったり…

→ システム間を繋げられてしまったらそこで進化が止まってしまう。常にもっと良い繋ぎ方があるんじゃないかと考えるべき。

ソフトウェアの核心にある複雑さに立ち向かう(p.17〜p.18)

  • 青い項目(コアドメインに集中する、ビジネスを深く洞察する、システム間の秩序の改善を続ける)が肝

具体事例(p.19〜p.21)

DDD Allianceさんで開催しているドメイン駆動ワークショップのお題

  • P.21のような但し書きがいっぱいの複雑なルール

複雑な料金計算ロジックをどうやってコードで表現するか(p.22〜p.24)

→ 画面の関心ごとと実際の計算ロジックを分離する

→ ビジネスルールだけで開発してそこだけでテストできるように開発させるという意味で、独立した存在として取り扱えるよう開発する

oO チームごと分けられるようにするくらいの意味合いかも

  • 自然言語や数式、クラス図などを用いて構造、要素を整理する → コード書いてみる → うまくいかなかったらモデルにFBする → またコードを書いてみるという感じで行ったり来たりする
  • 最初から良いモデルを作るのは無理。モデルとコードはズブズブの関係

コアドメインに集中する(p.25)

  • 例えば、どう考えても幼児の寝具が料金計算の軸になってることはない

→ 主軸の取り方考える。(部屋のグレードなのかシーズンなのか)実験的にやってみてコードでうまく表せたらOK。

→ うまくいかなかったら軸の取り方を変えてまたやってみる。実験してやってみる方が早い

ビジネスを深く洞察する(p.26)

  • 開発者が料金表にタイポがあった場合に指摘できるか。歯抜けが料金があったときに仕様を補完して提案できるか。

→ これが出来るほどビジネスを理解していると後から変更したいという要望があっても反映しやすくコミュニケーションロスも少なくなる。

→ そういうレベルで自分たちが業務を理解していないんじゃないかという意識を常にチームで持ち、互いに声をかけていく

システム間の秩序の改善を続ける(p.27)

  • 外部の予約サービスではこの複雑なプランを表現できないのでどう簡単化して外部予約サービスで表示するかというのが課題になる。

→ 周辺のサービスなどの状況を俯瞰して把握することでコアのドメイン、サービスが締まってくる

ビジネスの活動を継続的に学ぶ(p.28)

上記の3項目(コアドメインに集中する、ビジネスを深く洞察する、システム間の秩序の改善を続ける)を行っていくためには必然的にビジネス学ぶことになる。

ドメイン駆動設計を現場に導入する(p.31〜p.32)

  • 体験的に習得する

→ 大事だけど苦労するところ

  • Evans本を読む

→ 特効薬じゃないけどじわじわ効いてくる。設計の質が変わってくる。時間のかけ方が変わってくる。ただし読みにくい→Evansの文章スタイルに立ち向かう

想定読者の要件をクリアする(p.33〜p.34)

→ 2003年くらいのオブジェクト指向の知識はむしろ捨て去った方が良いかも * オブジェクト指向設計の文献

→ 有名どころだと寧ろEvans本より鈍器で敷居高い

想定読者の要件をクリアする教材セット(p.35〜p.38)

現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法の補足

Evans本をちゃんと読む(p.39〜p.49)

  • 行ったり来たりするために紙の本を推奨
  • あとから確認したり検索するために電子版もあると良い
  • まずは28ページの抜粋版から読んでみる

→ どういうことを注力したいかということがわかる * IDDD本はEvans本の一部をピックアップして書いている本だというのを分かった上で読むのがオススメ

→ IDDD本で紹介されていない71のセクションにも宝物が埋まっている

Evansの文章スタイルになれる(p.50〜p.51)

  • 本の中盤にある設計課題と考え方の説明を読んでから前の方にあるプロジェクトの経験談や具体例を読んだほうが理解が深まる

質問

  • Q.ドメインエキスパートの説明力足りない場合どうしているか?

A.基本的にドメインエキスパートの説明が足りていることなんてない。具体例持っていくとよく話を引き出せる。わざと間違った具体例を持っていっても良い感じに話してくれる。スタートアップだとエキスパートいないのでみんなで考えるしかない。逆に自分が興味を持てない仕事はしない。

  • Q.ドメインエキスパートが決定権を持っていない、アクセスできない場合どうする?

A.ドメイン駆動設計をやった手応えの1つで変更が楽だと仮の決定でコードを書くハードルが低くなる、抵抗がなくなる。確定したらそれに合わせるというのがやりやすくなる。

  • Q.ビジネスルールが複雑になるのはなぜ?

A.ビジネスルールの複雑さに立ち向かうを参考にしてみると良いかも

感想

スライドだけでは説明しきれいない補足的な内容について口頭でお話されていて、そのお話の中にも勉強になる事柄が散りばめられていました。

技術的なパターンセットとしてではない、ドメイン駆動設計の心意気、考え方の部分というのを増田さんの言葉でお話していただいて、自分の実体験や本を読んだ知識としてしか知らなかった部分とリンクさせながら聞けて勉強になりました。

DDD Allianceさんで開催されていたドメイン駆動ワークショップに参加したときのことも思い出し、今回のお話を踏まえながら社内などでドメイン駆動設計を体験してもらう場として同じお題でワークショップを開催してみたいなというモチベーションにも繋がりました。

また、Evans本についてもお話いただいた要点や読み方を参考に再度読み直したいと思います。

大変貴重なお話ありがとうございました。

モデル駆動設計によるビジネスをソフトウェアに落とし込む1つのやり方

高崎さん(@ken_takasaki) speakerdeck.com

  • 工業的にではなく工芸的につくるのがドメイン駆動設計なのでは

背景(p.8〜p.11)

ドメインの背景を知る

アクティアさんはJava×DDDの会社

なぜプロジェクトは炎上するのか(p.12〜p.15)

  • 様々な理由があるけど技術的に複雑なものをシンプルに持っていくことができれば

モデリング(p.16〜p.19)

  • ある物体や事象について簡略化した物を作ること
  • モデリングを通じてビジネスとソフトウェアの乖離が見つかる。
  • エンドユーザにコードを読んでといってもむりなので中間成果物がいる。それがモデルになるという取り組みを行っている。これによりモデルと実装が分離しない

ドメインの用語を理解する(p.20〜p.29)

→過去にあった2001年ごろ。UMLをつかってかいていく。

  • 言語の歴史は抽象度が上がっている
  • 廃れた

→ 何故か: 仕様や思想がふわっとしている。説明自体もふわっとしている

モデル駆動開発のいいところ(p.30〜p.41)

  • ビジネス要件とプログラムの分離
  • プログラムの均質化
  • 自動生成による生産性の向上

当初のモデル駆動開発はグラフィカルだとぱっと見わかりやすいけど差分管理しんどい、動的振る舞いの表現難しい

→ 良い設計はなんだろうと考えドメイン駆動設計にたどり着いた

今はMarsという自動生成のためのプラットフォーム作っている

  • 今の構成は三層構造+ドメイン
  • DSLで記述していきソースを自動生成。モデリングとして人が注力すべきところにリソースを割ける

言葉を共有(p.42〜p.48)

通じない思い

DDDにはたくさんの言葉

  • ドメインエキスパートと開発者の間で普通は乖離があり通訳するのに労力がかかる

ユビキタス言語で共有。言語に問題があれば代わりとなる言語を探してモデルを更新する

用語集を作るわけではない。その用語が浸透しきっている状態がユビキタス言語

ユビキタス言語やらかしたあるある(p.49〜p.53)

① 用語集を作る。メンテされない ② ドメインを集めて共有するために壁一面にユビキタス言語貼っていこうという試みを行う

→ 最初に自身が貼ってからだれも追従してくれず…

→ 結局浸透していないから

対話でユビキタス言語(p.55〜p.65)

対話をするためには

一般業務知識を学ぶ → 業種そのものを学ぶ → 顧客のドメインを学ぶのが大事

海図の販売管理の例

一般業務知識を学ぶ

→ 業種そのものを学ぶ。Webで調べる。実物をもらう。

業務を整理するときの手法

→ RDRA

区分を発見した実例

言語IDを用いてソートしたいなどの要件があった

→ 国とか商品とか様々な区分が含まれているように見えるが実際現場では言語IDとして取り扱っているので同じようにそう扱う

ユビキタス言語の選択をミスした実例

船主

→ よくよく考えたいったら顧客という用語が適切

→ かっこいい言語につられて失敗した例

ユビキタス言語は値オブジェクトになる

ユビキタス言語を表現することで概念や用語がソースになり顧客とエンジニアの間で話が通じやすくなった

貧血との戦い

抜けられない染み付いたやり方

ドメインモデルやらかしたあるある

トランザクションスクリプトになりがち

→ テーブルから入るとそのデータ構造に引っ張られる

→ 結果ドメインモデル貧血症に

→ 貧血症にハマることは通る道なのでその後どうするか

ビジネスルールに集中する

ドメインだけでビジネスルールをまとめていく力をつける 見積伝票モデルの例)

値引きや為替というのを切り出してドメインに隔離

→ 隔離前のシステムにはなかったルールなのでお客さんにもFBを出来た

ビジネスルールをどこに持つか?

  • 数量がビジネスルール知っているのは微妙
  • 明細金額が数量と定価を知っているというように変えた

貧血とビジネスルールと日々格闘

感想

ユビキタス言語やドメインモデルの育て方などの話を現場の実体験をベースにお話しいただきました。

実際取り組んでみてどうだったというあたりや、こんな発見があった、こんな失敗をしたという生の話を聞けて大変勉強になりました。

特にユビキタス言語の深め方のあたりは前半の増田さんのお話を含め通じて今回の勉強会に参加して、次にフォーカスを当てて取り組んでいきたいという部分のお話だったのでかなり刺さりました。

お話の仕方自体も洗練されていて聞き入りました。

懇親会でも現場や実例の話を更にお話いただいて、非常に勉強になりました。

大変貴重なお話ありがとうございました。

最後に

今回の勉強会参加して、ドメイン駆動設計についての特に戦略的な話のところの理解がぐっと深まり、モチベーションも更に上げられるいい機会となりました。

お話いただいたお二方、企画、運営をしていただいた関係者に皆様、会場を提供していただいたPixiv様、大変貴重な機会をありがとうございました

JJUG CCC 2019 Springに行ってきました

本日開催されたJJUG CCC 2019 Springに参加しました

JJUG CCCへの参加は2回目で前回は去年のspringに参加しました。 今回は都合で午後からの参加になってしまいましたが、聴講したセッションについて感想など整理できればと思います。

先行開発!Javaでクリーンアーキテクチャ -- ゼロから始める新規開発

成瀬さん(@nrslib) speakerdeck.com

成瀬さんのお話を直接お聞きするのは2回目で、1回目がボトムアップドメイン駆動開発の勉強会でした。

こちらの勉強会がとてもわかりやすく噛み砕いて伝えていただいた印象が強かったのですが、今回もわかりやすく理解も深まりました。

クリーンアーキテクチャのワークショップ、非常に興味あります。

私は普段の開発でオニオンアーキテクチャを意識していて、クリーンアーキテクチャの方は思想的なところは少し抑えていたのですが細かい要素が何を表しているのかは余り把握出来ていないというレベル感でした。

今回の発表の中でadapterやport, controllerやpresenterをテレビゲーム機に例えていて、イメージがしやすくそれぞれが何を指しているか掴めました。

コード例も見やすく、充実していて他の方に伝播させるときなどにも是非参照させていただきたいです。

お話の中でもありましたが、クリーンアーキテクチャの導入に際しては用意するクラスが多いので自動化ツール必須だなという印象をうけたのと、オニオンアーキテクチャはクリーンアーキテクチャの内側に相当するという説明の部分でどの層がどの層に該当するのかという辺りが気になりました。

オニオンアーキテクチャ クリーンアーキテクチャ
アプリケーション層 ユースケース
インフラストラクチャ層 インターフェースアダプタ層

私の理解では表のような対応関係を考えていたので、互換ではなく内側ということは私の理解が異なっているのでしょうか。 この辺を調べて理解深めたいです。

テストエンジニアが教えるJUnitを書き始める前に考えるべきテスト

ブロッコリーさん(@nihonbuson) speakerdeck.com

お話の仕方自体が上手な方で、今まで体験したことのないリアルタイムなアンケートやペアワークなどタイプの催しも開催されていて新鮮でした。

内容も学びになる点が多く得るものが多かったです。

私が普段書くテストは期待通りの振る舞いをすること、リファクタをかけた時に元の動作を担保することという目的が大きいです。

書いたテストも私の理解する仕様的にこうあるべきという主観で記述していたので想定していないバグを作り込んでいるではという不安がいつも付きまとっています。

今回の発表で

  • コードを書き始める前に始めるテスト活動もある
  • テストにも設計がある
  • コードレビューに勉強会もある
  • 開発者が行うのはChecking
  • QAチームなどが行うのはTesting

など今まで知らなかった世界が結構あるなという学びがありました。 コードレビューも苦手なので、興味があるので勉強会に参加してみたいです。

LINEのBot Platformの裏側

長谷部さん(@be_hase1014) speakerdeck.com

LINE チャットアプリのバックに興味があったので聴講しました。

トラフィックが大量で大規模なLINEさんならではのアーキテクチャフレームワークの話が聞けました。

社内の有志とAkkaの勉強がてらチャットツールを作ろうと動き始めていたところだったので、タイムリーでした。

SpringのWebFluxやCloud Sleuthを利用しているという話があり特に後者は普段の業務でも有用そうなので押さえていきたいです。

ストラングラーパターンによるマイクロサービスマイグレーションの勘所

川上さん(@kawakamitor0312) speakerdeck.com

先週の現場DDDでストラングラーパターンという用語を聞き、気になったので聴講しました。

レガシーシステムからマイクロサービスに移行していくに当たってのプロセスで、少しずつ切り出していく流れを話されていて参考になりました。

DB分割の仕方のところで

  • 新規機能でまずAPI経由でDBにアクセスする
  • 既存機能でDBを直接参照しているものAPIに切り替える
  • 全部API経由に切り替えたところでDBに着手する

というアプローチを取られていました。

順番についても全部を分割するのではなく、効果的だと判断できる部分から取り組むということでした。

少しずつ切り出しているのでレガシーシステムと並行稼動していてリクエストの振り分けの話もされていて実務でレガシーシステムの改修をするという場合に参考になりそうな情報が盛り沢山でした。

マイクロサービス 4つの分割のアプローチ

増田さん(@masuda220)

www.slideshare.net

先週の現場DDDに引き続き増田さんの話を聴講しました。

増田さんもモノリスからマイクロサービスに部分的に切り出していくアプローチでお話されていて、これまで聞いてきた話で概ねそのパターンなのでレガシーからの移行は少しずつが正解なのかなという印象でした。

マイクロサービスの分割の限界は経験値による → 経験を積んでいくとより細かく出来るかもしれないが最初から細分化は難しい という話が先週のDDDの話の最初から良いモデルを作るのが難しいという話と重なってくるなと感じました。

ビジネスファンクションでの分割の例が、私の業務で分割したパターンそのままで、自分たち(人間側が)がサービス単位まで分解されていなく複数面倒みることになったりや、修正取り消しうまく回らなくなるという課題があるという話が実際起きてしまっているのでかなり刺さりました。

コーディネータパターンも複数のサービスにまたがったトランザクションを考えるときにそうするしかないよなと思いつつも、メッセージキューなどが絡んでくると訂正処理もまたなかなか難しいなという実体験とリンクさせて聞けました。

全体的にかなり背景にDDDというものを意識されているように感じて、非常に楽しかったです。

BPStudy#141〜DDD(Domain Driven Design)実践の現場にも参加させていただこうと考えているので、増田さん、高崎さんのDDDのお話が聞けるのを楽しみにしています。

最後に

普段業務でJavaを使用しているのでコード例などもすんなり入ってくるという点と、CCCということで多様な分野のお話が1つの会場で聞けてお得だなという印象が強かったです。

環境面でも広い会場で運営の方もたくさんいらしゃって、Wi-Fiも提供されていたりハッシュタグも整理されていたりとかなり快適でした。

良い機会を作っていただいて、関係者の皆様に心よりお礼申し上げます。

次は是非懇親会にも参加したいです!

レガシーをぶっつぶせ。現場でDDD!に行ってきました

レガシーをぶっつぶせ。現場でDDD!に参加しました。 参加してみて、現場の生の声や体験談などなど聞けて初学者ながら良い刺激をいただきましたので熱が冷めきらないうちに感想をまとめてみました。

私の背景としては、昨年の今頃から増田さんの現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法を読んでDDDに興味を持ち、現在業務に導入できないか検討しているというレベル感です。

ソフトウェアの核心にある複雑さに立ち向かう / ビジネスルールの複雑さに立ち向かう

増田さん(@masuda220)

アプリケーションが複雑になるのは、ビジネスルールを適用するの条件に分岐が出てくるから複雑に

心当たりがあります。コーディングしていて複雑なビジネスルールがあるところは読み解くの大変だったり汚くなりがち… うまく記述していかないと、ほぼ使われないオプションのためにあらゆる箇所に新しいフィールドを加える…といった残念な設計に…

入出力と計算の分離

変換部分でなかなかコストがかかるなというのはDDDをかじっていて思う部分ではありますが、そうすることで計算モデルを純粋に保てるというのはまさに良い恩恵かなと思います。 逆にそこにあまりメリットが感じられない人に対してこの変換の手間を納得してもらうのもなかなか大変だよなぁと公演を聞きながら考えていました。 後のパネルディスカッションでもお話ありましたが巻き込んでいける人とそうではない人との関わり方をうまくハンドリングしていくのもDDDをやる上ではかかせないのかも…

型指向プログラミング

値の取り得る範囲での生成を強制することで安全に値を取り扱えて防御的プログラミングならず、コードがビジネスの本質に集中できるというのは現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法を読んだときから共感する部分でした。 テストについてはリファクタかけたときに元の仕様担保出来ていることを確認するため私は用意するのですが、値オブジェクトのテストは一般的には自明なので書かないのかな… また、どの粒度まで値オブジェクトとして用意するかという部分が悩むところではあって、例えばお金を取り扱う業務があったときに取り扱う金額の範囲でMoney型を定義するのはもちろんとして、数量を表すAmount型も合わせて用意するべきなのか、もし用意する場合は他の数量を取り扱うようなAmount型を使いまわして良いのか(Util, 共通モジュールのような取扱にならないか)でよく悩みます。

複雑さに本格的に立ち向かう

言語化できないもやもや(新しい概念)にうまく名前をつけられたときに、他の複雑さを持っていると整理していた部分についても同じ区分で表現でできることがわかりより良い整理ができる。といった体験があったため共感する部分でした。 コレクションのカプセル化の部分で、カプセル化したクラスに特定の操作やロジックがあるものはビジネスルールがまとまって扱いやすいので共感できる部分でした。 一方でコレクションクラス化を進めているとロジックが内部の値にアクセスするだけの貧血起こしているクラスも出来てきて、そうならないための切り分けや判断材料等など聞いてみたいと感じた次第でした。

抽象的な教えを試行錯誤しながら解釈したDDDの実践レポート

ほげさん(@suzuki_hoge

何やらレビュー時に抽象的なフレーズが飛び交っている

入門してすぐがDDDの用語に圧倒されるというのはどこでもあるあるなのかなと感じました。 例に漏れず私も圧倒されているので松岡さんのブログ成瀬さんのボトムアップドメイン駆動設計勉強会に非常に助けられています。

名詞の抽出

名詞同士の関係性まではなんとなく見えてくるものの、振る舞いがよくわかっていないままコードを書く → アプリケーション層やインフラ層が膨らむ & モデルが貧血起こしてGetterだけあるという状態に私も陥りました 同じ流れたどっていて入門者あるあるなのかなと感じていました。

ドメインに集める?

私の場合はDB操作はインフラ層に持っていっていたものの更新のための判定ロジックも一緒にインフラ層に散っていたり、それぞれのRepositoryに永続化を依頼するため条件がアプリケーション層に散っているといった状態です。 ほげさんの取られていた動詞に着目してinput param → prosess → output paramの形を徹底的してドメイン層にロジックを集めていくというアプローチは目からウロコでした。

境界を決める

知りすぎているドメインを切断した流れが、Evans本の独立したクラスに当たるのかなと考えながら聞いていました。 私がまだ実践できていない部分なので今聞けてよかったというのと、事業戦略を考慮して変えたい願った部分だけを変えられるよう設計するという言葉が強く印象に残っています。

DDDサンプルコード ライブリファクタリング

いろふさん(@irof) 増田さん(@masuda220) https://github.com/system-sekkei/isolating-the-domain

どういう意図でサービスを呼んでいるのかというのを明示的にするためにControllerからCoordinatorというクラスを作成しそこに操作の組み合わせを記述していくというものでした。 機能を変更するときの影響箇所の特定が簡単になるので安心というのがいいなという印象でしたが、あまり多用すると私の場合はビジネスルールの関心事も外のCoordinatorに流出させてしまいそうな気がしたので、採用する際はビジネスルールなのかシステムの都合なのかを慎重に判断した上で操作を記述すべきだと感じました。 Jigというツールや1つのパッケージのファイル数max10個ルールなど実践的な話を生で聞けたのも収穫でした。

劇的ビフォーアフターBIGLOBEのDDDの昔と今〜

曽根さん

のれん分け方式

リードしている人だけでなく暖簾が分けられるほど他のメンバーも成熟して行けているのが凄い成果だなと。DDDに限らず新しい技術の伝播するのに良いなと感じました。

Pull Requestが大荒れ

Beforeの部分でプルリクのコメントでそもそもの責務の話から入るのエネルギー奪われて気が滅入るなと…辛い…

状態の表し方

ファクトリで状態の加工処理を行っているというのが勉強になりました。

チェック

チェック処理をドメインサービスにまとめているという話が新鮮 Applicatin層にチェックロジックが漏れていく話はほげさんのお話聞いているときも私やりがちだなぁと感じていた部分ではあり、あるあるなのかなと。 ドメインサービスはチェック項目毎にドメインサービスを作るイメージなのか気になりました。

実録!LOHACOにおけるDDDとCleanなArchitecture

さとうさん(@dskst9) なかむらさん https://speakerdeck.com/askul/ddd-and-clean-architecture-at-lohaco

ストラングラーアプリケーションパターン

そういう名前がついているんですね。ワードを初めて聞いたので勉強になりました。

抽象的であっているかいないかもわからないままやっていくしかない

結構いろいろな方がこの状況に遭遇して日々手探りしている部分ではあるのかなと感じました。手探りでやっているのは自分たちだけじゃないという話を聞けただけでも収穫でした。

コードが語り始める

そのレベルまで進めて行けているのが素晴らしく、よりコードが自然言語の振る舞いに近づくとそうなる?

Web層

モジュールの構成でインフラ層の配下にWeb, DB…のようなモジュールを私の場合切ってしまいそうで、あえてインフラとWebを別物として切り分けているのが印象的でした。

質問:振る舞いではないのでGetter書きたくないがほかレイヤへの情報の開示どうしているか?

利用する側に内部の情報を展開するためだけにGetterを書きたくない(振る舞いではないから)というのは私も同じことを思います。 私はJava, Springで開発する機会が多く、増田さんに質問する機会があったのでこの問題に対してどうされているのかお伺いしたところSpringのDirect Field Accessを使っているとおっしゃっていました。 かとじゅんさんの記事でもこの問題に触れられていますね。 一般にはどうするのが良いのでしょうか。

おわりに

参加して良かった、同僚にも次があればぜひ行こうと言える充実した内容でした。 皆様の話を聞くとレガシーを潰そうというよりもうまくレガシーと付き合っていっているというように印象が強かったです。 技術的な用語や内容にフォーカスされがちだけど、それだけがソフトウェア開発やDDDじゃない。人付き合いを始めとしたコーディング以外の戦いの場(むしろそちらのほうが主戦場かもしれない)もあるとひしひしと感じました。 今回の勉強会を企画、運営してくださった方々、登壇者の皆様、参加させていただき誠にありがとうございました