2023.09.14 asken withミライトデザインのDDDのはじめ方 DDD x RDRA x ICONIX
https://asken.connpass.com/event/293085/
© asken.incRDRA, ICONIX, DDDの実践から得た学び23/09/14asken hsawaji
View Slide
© asken.inc 2背景「あすけん」のサービスをリアーキテクチャするために、約5ヶ月間、技術検証を行ってきました。この検証では、既存システムを対象に分析から実装まで一通り行いました。その際、RDRA, ICONIX, DDDなどの手法を活用して進めてきました。今回は、各手法をどの用に使ったのか、どのような学びが合ったのかを紹介したいと思います。
© asken.inc 3自己紹介askenでバックエンドエンジニアをやっています。海外事業部にいたり、医療事業部にいたりして、今は国内事業部でシステムのリアーキテクチャを推進しています。askenではずっとPHPを触っていましたが今回のリアーキテクチャからKotlinを触るようになりました。設計とアーキテクチャの勉強中です。
© asken.inc 4テックブログも書いていますPHPからKotlinへ、ドメイン駆動設計を用いたリアーキテクチャへの挑戦https://tech.asken.inc/entry/2023/08/10/170000より良い設計にするための勉強会を行いましたhttps://tech.asken.inc/entry/2022/03/30/180000Slackで「マルチチャンネルゲスト」のGithub通知を改善しましたhttps://tech.asken.inc/entry/2022/10/07/170000
© asken.inc 5スタート時点の私RDRA- 「RDRAハンドブック2.0」は読んだ- 用語はざっくりと理解している- 実践した経験はないICONIX- 「ユースケース駆動開発実践ガイド」は未読- 用語はいくつか聞いたことがある- 実践した経験はないDDD- 「エヴァンス本」は読んだ- 社内の勉強会で学んだ- 用語と概要くらいはわかる- 実践した経験はない
© asken.inc 6RDRA
© asken.inc 7スプレッドシート版のRDRAを使用しました。このスプレッドシートは、左のシートから順番に埋めていくことで、RDRAの工程を進めてられるような構成になっています。スプレッドシート版のRDRA:http://vsa.co.jp/rdratool/rdragraph0.7/RDRAToolDoc.pdf
© asken.inc 8スプレッドシート版RDRAは下記のようなような流れで使い方を覚えました- ミライトデザインさんのRDRAワークショップの勉強会動画を見る- 参考: 【RDRA × AI】AI時代の要件定義ワークショップ【ペチオブ】- https://www.youtube.com/watch?v=IfEu2KE7_5U- RDRAハンドブック2.0を見直しながらスプレッドシートと対応させていく
© asken.inc 9食事記録- ビジネスユースケース(BUC)- アクティビティ- ユースケース(UC)- 情報- アクター
© asken.inc 10食事記録目的達成までのユーザの動きシステムの動作ユーザの目的 「情報」はエンティティ 対象ユーザ左から記載していく
© asken.inc 11あすけん会員(アクティビティ)システム(UC)食品検索食事記録分量変更キーワード検索を行う食事記録を保存する食事記録の分量を更新する食品選択食事を記録しよう(BUC)データ(情報)食品マスタ食事記録あすけん会員(アクター)
© asken.inc 12効果RDRAではユースケースをアクティビティから分析するので、既存のシステムに影響されることなくユースケースを洗い出すことができた複数のユースケースが含まれていたControllerもユースケース毎にクラスが切り出され処理がわかりやすくなった
© asken.incController13ControllerUseCase1 クラスUseCase2 クラスUseCase1.処理()UseCase2.処理()UseCase1の処理UseCase2の処理UseCase1’の処理UseCase3の処理UseCase2’の処理UseCase3.処理() UseCase3 クラス
© asken.inc 14概念モデル
© asken.inc 15設計に入る前に、既存システムの構成要素と各要素の関係を整理するために「概念モデル」を作ることにしました合計10時間ほど時間をかけて、全員でワークショップを行なった
© asken.inc 16ワークショップはMiroを使って下記のような流れで行なった1. 要素を付箋を書きながら周辺の業務知識を説明していく2. 疑問点は都度質問を受けて付箋を使って説明をしていく3. モデリングの観点で議論しながら付箋を修正していく
© asken.inc 17
© asken.inc 18効果- システムが「どうあるべきか」の共通認識が持てた- 既存システムがどうなっているかではなく「どうあるべきか」話すことができた- ドメイン知識の伝達ができた- 概念に関連する知識を網羅的に説明できた- 質問を受けることで「暗黙的な知識」も説明できた- システムの複雑な箇所が可視化された- システムの複雑な所に対して検証を行うことができた- 概念と説明を同じ資料にまとめたので後で参照しやすくなった- 質問などで前提を説明する必要がなくなった- ドメインエキスパートとも同じ資料で会話ができた- 用語と関連性の情報なのでエンジニア以外も理解がしやすい
© asken.inc 19チームで「概念モデル」を一緒に作ることにより素早く共通認識を作る事ができた、出来上がったもと同じくらい過程も大切だと感じたこのワークショップは、その後の開発をスムーズに行うために効果的だった
© asken.inc 20ICONIX / ユースケース記述
© asken.inc 21RDRAで洗い出したユースケースに対して、ユースケース記述をつくるユースケース記述は、ユーザの操作とシステムの処理を数行で記載する
© asken.inc 22ユーザの動作とシステムの処理代替コースは途中で処理が終了するもの
© asken.inc 23振る舞いモデルに必要な用語 ドメインモデルに反映ドメインモデルに反映
© asken.inc 24ユースケースを具体的に記述することで、見えていなかった概念が見えてくるそれをドメインモデルに反映することで良いモデルにアップデートできる必要な振る舞いがわかることで、クラス設計の足がかりになる効果
© asken.inc 25DDD (クラス設計 ~ 実装)
© asken.inc 26分析を元に設計する概念モデルドメインモデルユースケース記述クラスの分け方クラスの振る舞い
© asken.inc 27設計を元に実装する概念モデルドメインモデルユースケース記述クラスの分け方クラスの振る舞いソースコード実装
© asken.inc 28実装の結果でモデルを更新する概念モデルドメインモデルユースケース記述クラスの分け方クラスの振る舞いソースコード実装フィードバック
© asken.inc 29実装中に得られる情報- 実装することで得られた知識- 新しく思いついたアイデア- モデルの欠陥 (実装できない・情報が取れない)実装を進めていくと、ドメインモデルがどんどん変わっていく実装しながらドメインモデルも洗練していくアイデアを素早く確認するためにドメインモデルを使用する
© asken.inc 30DDDを使うメリット- 実装からドメインモデルにフィードバックをするメリット- ドメインモデルの検証を実装で行なう- 実装することで、ドメインモデルの矛盾点や欠陥が明らかになる- ドメインモデルを使うメリット- 設計の良し悪しはドメインモデルで全体を見たほうが分かりやすい- 視覚的に分かりやすいので、設計の議論をする際に共通認識を取りやすい- 簡単に変更できるので、レビューと修正がしやすい
© asken.inc 31まとめ今回の技術検証では RDRA、ICONIX、DDDを1つ1つ丁寧に行うことで、それぞれの成果物が実装に繋がっている感覚を得ることができた概念モデルは、素早く共通認識を作ることができ、非常に有効なものであったその概念モデルからドメインモデルを作るので、認識のズレが少なく設計の議論ができたと感じている
© asken.inc 32成果物のつながりのモデル
© asken.inc 33スタート時点の私RDRA- 「RDRAハンドブック2.0」は読んだ- 用語はざっくりと理解している- 実践した経験はないICONIX- 「ユースケース駆動開発実践ガイド」は読んでいない- 用語はいくつか聞いたことがある- 実践した経験はないDDD- 「エヴァンス本」は読んだ- 社内の勉強会で学んだ- 用語と概要くらいはわかる- 実践した経験はない
© asken.inc 34今の私RDRA- RDRAの各要素の意味を理解した- 業務フローを意識して RDRAで分析できるようになった- 既存システムに影響されないユースケースの分析ができるようになったICONIX- ユースケース記述とモデルの関係性を理解した- ユースケース記述を設計に繋げられるようになったDDD- モデルと実装のフィードバックループの利点を理解した- ドメインモデルを中心とした開発を実践できるようになった
© asken.inc 35この5ヶ月間で業務をモデル化してソースコードで検証する方法を学ぶことが出来ました。これらの方法を使って、リアーキテクチャを確実に前に進められるようになったと思います。まだまだ勉強中ですが、頑張っていきます。
© asken.inc 36ご清聴ありがとうございました