社内ドメインモデリング・ワークショップを開催しました

マーベリック技術広報のリチャード伊真岡です。8月26日月曜日に弊社内でドメインモデリング・ワークショップを行いました!当日の様子を紹介します。

f:id:maverick-techblog:20190903131621p:plain

題材

今回は映画館の券売・発券システムを題材に以下のような架空の設定を元にワークショップを進めました。

https://github.com/richardimaoka/ddd_hanson

ある映画館ウェブサイト https://cinemacity.co.jp/ の券売システムと、映画館においてある券売機システムを統合することになりました。我々はその統合システムの分析・開発をするプロジェクトを任されました。チケットの購入から発券にまつわるルールと業務フローを分析・モデリングしましょう。

準備段階当初はツイッター上で盛り上がった #チケット料金モデリング を参考にワークショップを行うつもりでした。しかし私個人の好みもあり、今回に限ってはチケット料金モデリングだけを扱うよりは、券売システム全体を考えるほうがドメインモデリングの醍醐味を味わえるのではないかと考え、上記のような題材を設定しました。

ユーザーストーリー分析

いきなりドメインモデリングに入る前にチケット販売・発券の業務フローを理解するためユーザーストーリー分析を行いました。理解が深まった後にドメインモデリングを行った方が議論がスムーズになるだろうと考えたからです。

こちらはユーザーストーリー分析で貼った付箋のすべてです。

f:id:maverick-techblog:20190903131654p:plain

  • 見たい映画を決める(スタート)
  • シアターの席に座る(ゴール)

という2つの時点を定め、それらをつなぐ動作(水色の付箋)を洗いだす事から始めていきました。

手法の詳細は省略しますがオライリーの「ユーザーストーリー・マッピング」という本に載っている印象的な言葉を紹介します。

  • ストーリーを使う目的は、良いストーリーを書くことではない
  • ストーリーを作る本当の目的は、共通理解をつかむことだ

以下の画像は書籍「ユーザーストーリー・マッピング」から引用したものです。左上にあるようにみんなが「合意できた」と思ったことも、よくよく話してみるとそれぞれが違ったことを考えていたということがあります。そういった認識の齟齬を防ぐため、話し合いを通してほんとうに共通した理解を得られるようにすることが重要だということが書籍では語られています。

f:id:maverick-techblog:20190903131915p:plain

私リチャードはすっかりこの考えに感化されてしまい、ワークショップでも10回以上共通理解、共通理解と繰り返す人になっていました。若干めんどくさい人ですね。

ドメインモデリング

ワークショップの後半はいよいよ本題であるドメインモデリングにみんなで取り組みました。ユーザーストーリー分析から「オブジェクト」を抜き出し、どの属性がどのオブジェクトに属するか議論をしていきました。

https://cinemacity.co.jp/ticket/ を見ていただくと料金体系だけでもなかなか複雑であることがわかるかと思います。今回の題材はチケット料金の計算ロジックをコードに落とし込めばよいというわけではないので「チケット料金計算に必要な属性を全部パラメタとして突っ込んで力技で金額を返すメソッド」を実装すればよいわけではありません。券売システム全体を考えどのオブジェクトがどの属性をもつか設計しなくてはなりませんでした。

ドメインモデリングを始めると議論は盛り上がり、以下のような点をはじめとしていい意味で意見が割れ、議論を深めるに連れ券売システムというドメインにたいして理解が深まっていきました:

  • 映画を見る場所をなんと呼ぶ?シアター?スクリーン?
  • 映画館オブジェクトはチケット販売システムには不要なんじゃない?
  • 18歳未満は見られない映画がある
    • R18指定の映画がある
    • 東京都の条例により、18歳未満の方は、終映時刻が23:00を過ぎる回は、保護者同伴の場合でも入場はできない
  • 料金はメソッドの戻り値として計算されるべきじゃないか?
    • いや計算された値は固定されないと支払い後料金が変わるのはおかしい
  • チケットの「予約オブジェクト」をつくろう
    • 「予約オブジェクト」は「チケット」と同一なのではないか?
    • いや、一回の予約で一人が友人の分もまとめてチケットを予約するかも

議論が白熱する中、何度か洞察の鋭い意見を出していた参加者の一人がチケットの券面のスクリーンショットをみつけました。項目が多い…!

f:id:maverick-techblog:20190903132047p:plain

これらすべてを「チケットオブジェクト」に結びつけてしまうと大変な巨大オブジェクトが出来上がってしまうので、できるだけきれいにしようとしたのがこちら。

f:id:maverick-techblog:20190903132416p:plain

オレンジの付箋はオブジェクト名、水色の付箋はオブジェクトの属性、黄色はメソッド(時間がなくて網羅できませんでした)、そしてピンクの付箋は疑問点やモデリングが複雑そうな項目を忘れないようにメモとして残したものです。

感想

複数人で議論を深めながら「映画チケット発券」に対する共通理解を育てていくというのが体験を伴って学べたのが何よりの収穫でした。

今回はユーザーストーリー分析とドメインモデリング含めて3時間だったので、ドメインモデリングが完了するところまでは想定しておらず、またソースコードに起こす時間もとっていませんでした。個人的にはあとでソースコードを書く時間をとって考察を深めてみるつもりです。

実際の業務のなかでドメインモデリングを活かすにはソースコード、ドメインモデル、さらにはユーザーストーリーも含めてなんども行ったり来たりしながら議論を深めて共通理解を育てていくのが良いのかなと思います。

参加者からも好評だったようで第2回社内ドメインモデリング・ワークショップをいま計画中です!