Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
設計人材を育てるために DDD をどう使うべきか / How to use DDD to ...
Search
Toshishige Hagihara
May 11, 2019
Technology
8
5.1k
設計人材を育てるために DDD をどう使うべきか / How to use DDD to share design skills
Toshishige Hagihara
May 11, 2019
Tweet
Share
More Decks by Toshishige Hagihara
See All by Toshishige Hagihara
2024-07-19 組織/チームのコアなメンタルモデル = 骨の構造を見出す/変える
hagifoo
2
130
宇宙開発の方法論をもとにした 要求分析の進め方 / Requirements analysis based on space development methodology
hagifoo
0
370
システム設計の中でドメインモデルの役割を体感する / the Place of Domain Model in System Design
hagifoo
2
1.2k
Other Decks in Technology
See All in Technology
3次元点群データ「VIRTUAL SHIZUOKA』のオープンデータ化による恩恵と協働の未来/FOSS4G Japan 2024
kazz24s
0
130
組み込みLinuxの時系列
puhitaku
4
1k
Incident Response Practices: Waroom's Features and Future Challenges
rrreeeyyy
0
110
音声×Copilot オンコパの世界
kasada
1
110
ライブラリでしかお目にかかれない珍しい実装
mikanichinose
2
330
Redmine 6.0 新機能評価ガイド
vividtone
0
260
データ活用促進のためのデータ分析基盤の進化
takumakouno
2
450
Microsoft MVPになる前、なってから/Fukuoka_Tech_Women_Community_1_baba
nina01
0
170
Lambdaと地方とコミュニティ
miu_crescent
2
240
What to do after `laravel new`
mattstauffer
0
140
Deno+JSRでパッケージを作って公開する
askua
0
120
End of Barrel Files: New Modularization Techniques with Sheriff
rainerhahnekamp
0
280
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
327
21k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
How to Ace a Technical Interview
jacobian
276
23k
Ruby is Unlike a Banana
tanoku
96
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
BBQ
matthewcrist
85
9.3k
YesSQL, Process and Tooling at Scale
rocio
168
14k
Unsuck your backbone
ammeep
668
57k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
700
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
Transcript
Copyright levii Inc. All rights reserved. 設計人材を育てるために DDD をどう使うべきか? 萩原利士成(@hagifoo)
株式会社レヴィ CTO 2019/05/11 レガシーをぶっつぶせ。現場でDDD! #genbadeDDD
本セッションのゴール
Copyright levii Inc. All rights reserved. 設計って大事ですよね? 3
Copyright levii Inc. All rights reserved. 新規開発でも 4
Copyright levii Inc. All rights reserved. レガシーでも 5
Copyright levii Inc. All rights reserved. 良い設計は人が作り、人が育てる 6
Copyright levii Inc. All rights reserved. 設計できる人がたくさんいれば、 大きな絵が描けるようになる 7
Copyright levii Inc. All rights reserved. しかし、、 8
Copyright levii Inc. All rights reserved. 自分が設計できる != メンバーが設計できるようになる 9
Copyright levii Inc. All rights reserved. 良い設計は人が作り、人が育てる ではどうやって良い人=設計人材 を育てればいいのか? 10
Copyright levii Inc. All rights reserved. 「考えていること」 「試してみたこと」を そのまんま話します 11
Copyright levii Inc. All rights reserved. みなさんの 「こうやってるよ」 「こうしたらいいのでは?」 も教えてください!
12
自己紹介
Copyright levii Inc. All rights reserved. 萩原 利士成 @hagifoo 株式会社レヴィ
共同創業者兼CTO 14
Copyright levii Inc. All rights reserved. 宇宙物理@大学院 15
Copyright levii Inc. All rights reserved. 熱量が足りずドロップアウト 16
Copyright levii Inc. All rights reserved. cybozu.com のインフラ開発チーム 17
Copyright levii Inc. All rights reserved. 契約社数 0 社から 1.5
万社 複雑化する cybozu.com 18
Copyright levii Inc. All rights reserved. どうやったら複雑さに 立ち向かえるのか? 19
Copyright levii Inc. All rights reserved. そうだ設計だ! 20
Copyright levii Inc. All rights reserved. システムモデリングツール 「Balus」を開発 株式会社レヴィを起業 21
Copyright levii Inc. All rights reserved. 22
Copyright levii Inc. All rights reserved. Balus Mega システム設計 コンサル
システム思考 セミナー 複雑さの中に 価値がみつかる 顧客の 頭の中を 変える 顧客の 業務を 変える 顧客の ツールを 変える 23
Copyright levii Inc. All rights reserved. 4 社で技術顧問 (設計や組織・人など色々と) 24
課題意識
Copyright levii Inc. All rights reserved. 案の定 Balus 自体も複雑化 26
Copyright levii Inc. All rights reserved. 終わらないリファクタ 27
Copyright levii Inc. All rights reserved. 敵は強い。強すぎる。 一人で倒すことはできない。。 28
Copyright levii Inc. All rights reserved. さぁどうする? 29
Copyright levii Inc. All rights reserved. 自分はなんとなくできるようになった (気がする) → メンバーに設計を振ってみる
30
Copyright levii Inc. All rights reserved. 全然できない → 苛立つ自分 →
メンバーも萎縮 31
Copyright levii Inc. All rights reserved. 負のスパイラル 32
Copyright levii Inc. All rights reserved. 設計と実装て似てるようで違う 33
Copyright levii Inc. All rights reserved. どうしたらいいのか。。 34
Copyright levii Inc. All rights reserved. 35
Copyright levii Inc. All rights reserved. これは良さそう! 36
Copyright levii Inc. All rights reserved. DDD を使って もっと「設計」力を ダイレクトに育てられないか?
37
そもそも設計って?
Copyright levii Inc. All rights reserved. ここまで「設計」という言葉を 割と雑に使って来ました 39
Copyright levii Inc. All rights reserved. 改めて設計とは? 40
Copyright levii Inc. All rights reserved. “design” The art or
action of conceiving of and producing a plan or drawing of something before it is made. https://en.oxforddictionaries.com/definition/design 41
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 42
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 利用者の 関心ごとを 43
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 利用者の 関心ごとを システムに 落としこむ ための 44
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 利用者の 関心ごとを システムに 落としこむ ための Art or Action 45
Copyright levii Inc. All rights reserved. システムが単純なら(さほど) 難しさはない 46
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード FizzBuzz 表示させて 47
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード FizzBuzz 表示させて for i in range(1, 101): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i) 48
Copyright levii Inc. All rights reserved. システムが複雑だと 49
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード AI x 人材で 何かやろう 50
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー サービス AI x 人材で 何かやろう 51
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ ペーパー プロト パッケージ サービス AI x 人材で 何かやろう 52
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 53
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 様々な抽象度で モデルが必要になる 54
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 実装上の制約がコン セプトレベルで影響 を与えたりすること もある = 下から上もある 55
Copyright levii Inc. All rights reserved. 改めてやりたいこと = この Art
を 師匠から弟子へと伝える 56
Copyright levii Inc. All rights reserved. なぜ DDD か? 57
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード クラス ドメインモデル 58
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード クラス ドメインモデル ドメインモデルが システムの外 (ユーザーの関心) と システムの中 (クラス設計) を繋ぐ 59
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード クラス ドメインモデル 実装とも無理なく 繋がる & ドメイン層を 隔離できる 60
Copyright levii Inc. All rights reserved. 設計の Art を体験しやすい 61
Copyright levii Inc. All rights reserved. とはいえ、 「DDD でやって」 だけだとやっぱり難しい
62
試してみて分かってきたポイント
ポイント1 ドメインモデルで議論する 64
Copyright levii Inc. All rights reserved. 当たり前やん 65
Copyright levii Inc. All rights reserved. が、意外とできない 66
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード クラス ドメインモデル 67
Copyright levii Inc. All rights reserved. 実装圧力に負けずに 責務をちゃんと考える 68
Copyright levii Inc. All rights reserved. 責務の分割と組み合わせ = 設計の基礎となる力 69
Copyright levii Inc. All rights reserved. プロパティだけでなく メソッドについて議論を振ると 責務が見えてくる(ことが多い) 70
ポイント2 別の視点で見てみる 71
Copyright levii Inc. All rights reserved. とはいえドメインモデルだけでも 見えてこないものも多い 72
Copyright levii Inc. All rights reserved. そんな時は、 73
Copyright levii Inc. All rights reserved. 視点を変えてみる! 74
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 操作 シナリオ 画面 デザイン クラス ドメインモデル 価値 75
Copyright levii Inc. All rights reserved. クラスに落としてみたらどう? 画面はどうなるかな? それをユーザーはどう操作する? 価値はあるかい?
76
Copyright levii Inc. All rights reserved. ドメインモデルの中だけで議論しても 見えてこないこともある → 蒸留する感覚を身につける
77
ポイント3 全体が連動する感覚を体験する 78
Copyright levii Inc. All rights reserved. 設計は一方通行ではない 79
Copyright levii Inc. All rights reserved. ドメインモデルを作って → 実装してみたら →
新しいユースケースを見つけて → ドメインモデルを直して 80
Copyright levii Inc. All rights reserved. ぐるぐるぐるぐる 81
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス ドメインモデル 82
ポイント4 コミュニケーション 83
Copyright levii Inc. All rights reserved. 当たり前を、当たり前にする 師匠と弟子のコミュニケーション 84
Copyright levii Inc. All rights reserved. 師匠の問いかけ力 85
実際にやってみた(現在進行形)
Copyright levii Inc. All rights reserved. 要望箱改善 PJT 87
Copyright levii Inc. All rights reserved. 要望箱=顧客接点 超超超重要! 88
Copyright levii Inc. All rights reserved. しかし、、 ✖ 自分の要望しか見れない ✖
対応がリリースされても分からない 89
Copyright levii Inc. All rights reserved. 変化! 90
Copyright levii Inc. All rights reserved. これはなんとかせねば! 91
Copyright levii Inc. All rights reserved. 全体を見渡せるサイズ感 ユーザーや管理者の行動もある そこまで緊急ではない →
ちょうどいい題材! 92
Copyright levii Inc. All rights reserved. 五十嵐 (弟子) 弓山 (師匠)
やってみよう! 93
意識したこと 94
Copyright levii Inc. All rights reserved. ちゃんと時間を確保する 視点を変えられるようにする ユーザー価値と結びつける 95
やったこと、やってること 96
Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度:
高 抽象度: 低 ソースコード 操作 シナリオ 画面 デザイン クラス ドメインモデル 97
Copyright levii Inc. All rights reserved. すでにある実装を元に ToBe のドメインモデルを作る 98
Copyright levii Inc. All rights reserved. 責務について質問して 自分の言葉で語ってもらう 師匠) アナウンスってど
ういう責務持ってるんで すか? 師匠) アナウンスとリ リースノートってどうい う違いがあるの? 弟子) 自分の言葉で話す と徐々に理解が深まって いく感覚 99
Copyright levii Inc. All rights reserved. 振る舞いやユースケースを 洗い出してみる 100
Copyright levii Inc. All rights reserved. ドメインモデルをもう少し 詳細化 101
Copyright levii Inc. All rights reserved. 実装との対応関係や 実装ロードマップを議論 師匠) 最小限のコアな価
値はなに? それにはどこが必要? 師匠) 既存のクラスとど う乖離してるの? どう近づけていこうか? 弟子) 実際のコードとの 対応や、どう変えていく かを意識できた 102
Copyright levii Inc. All rights reserved. コードに落としてみる 弟子) モデルから実装に 落とすと少し詰まる
師匠) モデルと実装が乖 離している箇所で指摘し 損ねた。。 103
Copyright levii Inc. All rights reserved. 画面を作って改めて確認 弟子) 具体的な画面で認 識が揃うので安心できる
104
Copyright levii Inc. All rights reserved. 実装は続く... 105
良かった点 106
Copyright levii Inc. All rights reserved. • ドメインモデルの上で議論 • 別の視点との行き来
• 継続的なコミュニケーション 107
Copyright levii Inc. All rights reserved. • ドメインモデルの上で議論 • 別の視点との行き来
• 継続的なコミュニケーション 当たり前だけど大事 空中戦にならない! 108
Copyright levii Inc. All rights reserved. • ドメインモデルの上で議論 • 別の視点との行き来
• 継続的なコミュニケーション それ管理者?ユーザー? 具体的な気づきが生まれる 109
Copyright levii Inc. All rights reserved. • ドメインモデルの上で議論 • 別の視点との行き来
• 継続的なコミュニケーション 問いかけ大事 結果だけでなくプロセスを共有 110
改善点 111
Copyright levii Inc. All rights reserved. • 実装とドメインモデルの距離が遠い • 時間変化についての議論が漏れがち
• ValueObject がうまく作れない。。 112
Copyright levii Inc. All rights reserved. • 実装とドメインモデルの距離が遠い • 時間変化についての議論が漏れがち
• ValueObject がうまく作れない。。 作り方や実装での使い方に まだ工夫の余地がありそう 113
Copyright levii Inc. All rights reserved. • 実装とドメインモデルの距離が遠い • 時間変化についての議論が漏れがち
• ValueObject がうまく作れない。。 どこから作っていくか? どう変えていくのか? 114
Copyright levii Inc. All rights reserved. • 実装とドメインモデルの距離が遠い • 時間変化についての議論が漏れがち
• ValueObject がうまく作れない。。 主に Python2 が原因? Python3 を使おうw 115
Copyright levii Inc. All rights reserved. 色々と反省点はあったが 設計の Art を伝えるという意味で
一定の成果はありそう 116
Copyright levii Inc. All rights reserved. 設計力をどう測るか? という別の課題 117
まとめ
Copyright levii Inc. All rights reserved. • 設計人材を育てるのに DDD よい
• 当たり前を促すための問いかけ大事 • まだまだ工夫の余地はありそう 119
Copyright levii Inc. All rights reserved. ご静聴ありがとうございました 120