Slide 1

Slide 1 text

Copyright levii Inc. All rights reserved. 設計人材を育てるために DDD をどう使うべきか? 萩原利士成(@hagifoo) 株式会社レヴィ CTO 2019/05/11 レガシーをぶっつぶせ。現場でDDD! #genbadeDDD

Slide 2

Slide 2 text

本セッションのゴール

Slide 3

Slide 3 text

Copyright levii Inc. All rights reserved. 設計って大事ですよね? 3

Slide 4

Slide 4 text

Copyright levii Inc. All rights reserved. 新規開発でも 4

Slide 5

Slide 5 text

Copyright levii Inc. All rights reserved. レガシーでも 5

Slide 6

Slide 6 text

Copyright levii Inc. All rights reserved. 良い設計は人が作り、人が育てる 6

Slide 7

Slide 7 text

Copyright levii Inc. All rights reserved. 設計できる人がたくさんいれば、 大きな絵が描けるようになる 7

Slide 8

Slide 8 text

Copyright levii Inc. All rights reserved. しかし、、 8

Slide 9

Slide 9 text

Copyright levii Inc. All rights reserved. 自分が設計できる != メンバーが設計できるようになる 9

Slide 10

Slide 10 text

Copyright levii Inc. All rights reserved. 良い設計は人が作り、人が育てる ではどうやって良い人=設計人材 を育てればいいのか? 10

Slide 11

Slide 11 text

Copyright levii Inc. All rights reserved. 「考えていること」 「試してみたこと」を そのまんま話します 11

Slide 12

Slide 12 text

Copyright levii Inc. All rights reserved. みなさんの 「こうやってるよ」 「こうしたらいいのでは?」 も教えてください! 12

Slide 13

Slide 13 text

自己紹介

Slide 14

Slide 14 text

Copyright levii Inc. All rights reserved. 萩原 利士成 @hagifoo 株式会社レヴィ 共同創業者兼CTO 14

Slide 15

Slide 15 text

Copyright levii Inc. All rights reserved. 宇宙物理@大学院 15

Slide 16

Slide 16 text

Copyright levii Inc. All rights reserved. 熱量が足りずドロップアウト 16

Slide 17

Slide 17 text

Copyright levii Inc. All rights reserved. cybozu.com のインフラ開発チーム 17

Slide 18

Slide 18 text

Copyright levii Inc. All rights reserved. 契約社数 0 社から 1.5 万社 複雑化する cybozu.com 18

Slide 19

Slide 19 text

Copyright levii Inc. All rights reserved. どうやったら複雑さに 立ち向かえるのか? 19

Slide 20

Slide 20 text

Copyright levii Inc. All rights reserved. そうだ設計だ! 20

Slide 21

Slide 21 text

Copyright levii Inc. All rights reserved. システムモデリングツール 「Balus」を開発 株式会社レヴィを起業 21

Slide 22

Slide 22 text

Copyright levii Inc. All rights reserved. 22

Slide 23

Slide 23 text

Copyright levii Inc. All rights reserved. Balus Mega システム設計 コンサル システム思考 セミナー 複雑さの中に 価値がみつかる 顧客の 頭の中を 変える 顧客の 業務を 変える 顧客の ツールを 変える 23

Slide 24

Slide 24 text

Copyright levii Inc. All rights reserved. 4 社で技術顧問 (設計や組織・人など色々と) 24

Slide 25

Slide 25 text

課題意識

Slide 26

Slide 26 text

Copyright levii Inc. All rights reserved. 案の定 Balus 自体も複雑化 26

Slide 27

Slide 27 text

Copyright levii Inc. All rights reserved. 終わらないリファクタ 27

Slide 28

Slide 28 text

Copyright levii Inc. All rights reserved. 敵は強い。強すぎる。 一人で倒すことはできない。。 28

Slide 29

Slide 29 text

Copyright levii Inc. All rights reserved. さぁどうする? 29

Slide 30

Slide 30 text

Copyright levii Inc. All rights reserved. 自分はなんとなくできるようになった (気がする) → メンバーに設計を振ってみる 30

Slide 31

Slide 31 text

Copyright levii Inc. All rights reserved. 全然できない → 苛立つ自分 → メンバーも萎縮 31

Slide 32

Slide 32 text

Copyright levii Inc. All rights reserved. 負のスパイラル 32

Slide 33

Slide 33 text

Copyright levii Inc. All rights reserved. 設計と実装て似てるようで違う 33

Slide 34

Slide 34 text

Copyright levii Inc. All rights reserved. どうしたらいいのか。。 34

Slide 35

Slide 35 text

Copyright levii Inc. All rights reserved. 35

Slide 36

Slide 36 text

Copyright levii Inc. All rights reserved. これは良さそう! 36

Slide 37

Slide 37 text

Copyright levii Inc. All rights reserved. DDD を使って もっと「設計」力を ダイレクトに育てられないか? 37

Slide 38

Slide 38 text

そもそも設計って?

Slide 39

Slide 39 text

Copyright levii Inc. All rights reserved. ここまで「設計」という言葉を 割と雑に使って来ました 39

Slide 40

Slide 40 text

Copyright levii Inc. All rights reserved. 改めて設計とは? 40

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 42

Slide 43

Slide 43 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 利用者の 関心ごとを 43

Slide 44

Slide 44 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 利用者の 関心ごとを システムに 落としこむ ための 44

Slide 45

Slide 45 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 利用者の 関心ごとを システムに 落としこむ ための Art or Action 45

Slide 46

Slide 46 text

Copyright levii Inc. All rights reserved. システムが単純なら(さほど) 難しさはない 46

Slide 47

Slide 47 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード FizzBuzz 表示させて 47

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Copyright levii Inc. All rights reserved. システムが複雑だと 49

Slide 50

Slide 50 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード AI x 人材で 何かやろう 50

Slide 51

Slide 51 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー サービス AI x 人材で 何かやろう 51

Slide 52

Slide 52 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ ペーパー プロト パッケージ サービス AI x 人材で 何かやろう 52

Slide 53

Slide 53 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 53

Slide 54

Slide 54 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 様々な抽象度で モデルが必要になる 54

Slide 55

Slide 55 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス AI x 人材で 何かやろう ドメインモデル 実装上の制約がコン セプトレベルで影響 を与えたりすること もある = 下から上もある 55

Slide 56

Slide 56 text

Copyright levii Inc. All rights reserved. 改めてやりたいこと = この Art を 師匠から弟子へと伝える 56

Slide 57

Slide 57 text

Copyright levii Inc. All rights reserved. なぜ DDD か? 57

Slide 58

Slide 58 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード クラス ドメインモデル 58

Slide 59

Slide 59 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード クラス ドメインモデル ドメインモデルが システムの外 (ユーザーの関心) と システムの中 (クラス設計) を繋ぐ 59

Slide 60

Slide 60 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード クラス ドメインモデル 実装とも無理なく 繋がる & ドメイン層を 隔離できる 60

Slide 61

Slide 61 text

Copyright levii Inc. All rights reserved. 設計の Art を体験しやすい 61

Slide 62

Slide 62 text

Copyright levii Inc. All rights reserved. とはいえ、 「DDD でやって」 だけだとやっぱり難しい 62

Slide 63

Slide 63 text

試してみて分かってきたポイント

Slide 64

Slide 64 text

ポイント1 ドメインモデルで議論する 64

Slide 65

Slide 65 text

Copyright levii Inc. All rights reserved. 当たり前やん 65

Slide 66

Slide 66 text

Copyright levii Inc. All rights reserved. が、意外とできない 66

Slide 67

Slide 67 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード クラス ドメインモデル 67

Slide 68

Slide 68 text

Copyright levii Inc. All rights reserved. 実装圧力に負けずに 責務をちゃんと考える 68

Slide 69

Slide 69 text

Copyright levii Inc. All rights reserved. 責務の分割と組み合わせ = 設計の基礎となる力 69

Slide 70

Slide 70 text

Copyright levii Inc. All rights reserved. プロパティだけでなく メソッドについて議論を振ると 責務が見えてくる(ことが多い) 70

Slide 71

Slide 71 text

ポイント2 別の視点で見てみる 71

Slide 72

Slide 72 text

Copyright levii Inc. All rights reserved. とはいえドメインモデルだけでも 見えてこないものも多い 72

Slide 73

Slide 73 text

Copyright levii Inc. All rights reserved. そんな時は、 73

Slide 74

Slide 74 text

Copyright levii Inc. All rights reserved. 視点を変えてみる! 74

Slide 75

Slide 75 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 操作 シナリオ 画面 デザイン クラス ドメインモデル 価値 75

Slide 76

Slide 76 text

Copyright levii Inc. All rights reserved. クラスに落としてみたらどう? 画面はどうなるかな? それをユーザーはどう操作する? 価値はあるかい? 76

Slide 77

Slide 77 text

Copyright levii Inc. All rights reserved. ドメインモデルの中だけで議論しても 見えてこないこともある → 蒸留する感覚を身につける 77

Slide 78

Slide 78 text

ポイント3 全体が連動する感覚を体験する 78

Slide 79

Slide 79 text

Copyright levii Inc. All rights reserved. 設計は一方通行ではない 79

Slide 80

Slide 80 text

Copyright levii Inc. All rights reserved. ドメインモデルを作って → 実装してみたら → 新しいユースケースを見つけて → ドメインモデルを直して 80

Slide 81

Slide 81 text

Copyright levii Inc. All rights reserved. ぐるぐるぐるぐる 81

Slide 82

Slide 82 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード コンセプト カスタマー ジャーニー 操作 シナリオ 画面 デザイン ペーパー プロト パッケージ サービス クラス ドメインモデル 82

Slide 83

Slide 83 text

ポイント4 コミュニケーション 83

Slide 84

Slide 84 text

Copyright levii Inc. All rights reserved. 当たり前を、当たり前にする 師匠と弟子のコミュニケーション 84

Slide 85

Slide 85 text

Copyright levii Inc. All rights reserved. 師匠の問いかけ力 85

Slide 86

Slide 86 text

実際にやってみた(現在進行形)

Slide 87

Slide 87 text

Copyright levii Inc. All rights reserved. 要望箱改善 PJT 87

Slide 88

Slide 88 text

Copyright levii Inc. All rights reserved. 要望箱=顧客接点 超超超重要! 88

Slide 89

Slide 89 text

Copyright levii Inc. All rights reserved. しかし、、 ✖ 自分の要望しか見れない ✖ 対応がリリースされても分からない 89

Slide 90

Slide 90 text

Copyright levii Inc. All rights reserved. 変化! 90

Slide 91

Slide 91 text

Copyright levii Inc. All rights reserved. これはなんとかせねば! 91

Slide 92

Slide 92 text

Copyright levii Inc. All rights reserved. 全体を見渡せるサイズ感 ユーザーや管理者の行動もある そこまで緊急ではない → ちょうどいい題材! 92

Slide 93

Slide 93 text

Copyright levii Inc. All rights reserved. 五十嵐 (弟子) 弓山 (師匠) やってみよう! 93

Slide 94

Slide 94 text

意識したこと 94

Slide 95

Slide 95 text

Copyright levii Inc. All rights reserved. ちゃんと時間を確保する 視点を変えられるようにする ユーザー価値と結びつける 95

Slide 96

Slide 96 text

やったこと、やってること 96

Slide 97

Slide 97 text

Copyright levii Inc. All rights reserved. システムの外 システムの中 (ユーザー)インターフェース 抽象度: 高 抽象度: 低 ソースコード 操作 シナリオ 画面 デザイン クラス ドメインモデル 97

Slide 98

Slide 98 text

Copyright levii Inc. All rights reserved. すでにある実装を元に ToBe のドメインモデルを作る 98

Slide 99

Slide 99 text

Copyright levii Inc. All rights reserved. 責務について質問して 自分の言葉で語ってもらう 師匠) アナウンスってど ういう責務持ってるんで すか? 師匠) アナウンスとリ リースノートってどうい う違いがあるの? 弟子) 自分の言葉で話す と徐々に理解が深まって いく感覚 99

Slide 100

Slide 100 text

Copyright levii Inc. All rights reserved. 振る舞いやユースケースを 洗い出してみる 100

Slide 101

Slide 101 text

Copyright levii Inc. All rights reserved. ドメインモデルをもう少し 詳細化 101

Slide 102

Slide 102 text

Copyright levii Inc. All rights reserved. 実装との対応関係や 実装ロードマップを議論 師匠) 最小限のコアな価 値はなに? それにはどこが必要? 師匠) 既存のクラスとど う乖離してるの? どう近づけていこうか? 弟子) 実際のコードとの 対応や、どう変えていく かを意識できた 102

Slide 103

Slide 103 text

Copyright levii Inc. All rights reserved. コードに落としてみる 弟子) モデルから実装に 落とすと少し詰まる 師匠) モデルと実装が乖 離している箇所で指摘し 損ねた。。 103

Slide 104

Slide 104 text

Copyright levii Inc. All rights reserved. 画面を作って改めて確認 弟子) 具体的な画面で認 識が揃うので安心できる 104

Slide 105

Slide 105 text

Copyright levii Inc. All rights reserved. 実装は続く... 105

Slide 106

Slide 106 text

良かった点 106

Slide 107

Slide 107 text

Copyright levii Inc. All rights reserved. ● ドメインモデルの上で議論 ● 別の視点との行き来 ● 継続的なコミュニケーション 107

Slide 108

Slide 108 text

Copyright levii Inc. All rights reserved. ● ドメインモデルの上で議論 ● 別の視点との行き来 ● 継続的なコミュニケーション 当たり前だけど大事 空中戦にならない! 108

Slide 109

Slide 109 text

Copyright levii Inc. All rights reserved. ● ドメインモデルの上で議論 ● 別の視点との行き来 ● 継続的なコミュニケーション それ管理者?ユーザー? 具体的な気づきが生まれる 109

Slide 110

Slide 110 text

Copyright levii Inc. All rights reserved. ● ドメインモデルの上で議論 ● 別の視点との行き来 ● 継続的なコミュニケーション 問いかけ大事 結果だけでなくプロセスを共有 110

Slide 111

Slide 111 text

改善点 111

Slide 112

Slide 112 text

Copyright levii Inc. All rights reserved. ● 実装とドメインモデルの距離が遠い ● 時間変化についての議論が漏れがち ● ValueObject がうまく作れない。。 112

Slide 113

Slide 113 text

Copyright levii Inc. All rights reserved. ● 実装とドメインモデルの距離が遠い ● 時間変化についての議論が漏れがち ● ValueObject がうまく作れない。。 作り方や実装での使い方に まだ工夫の余地がありそう 113

Slide 114

Slide 114 text

Copyright levii Inc. All rights reserved. ● 実装とドメインモデルの距離が遠い ● 時間変化についての議論が漏れがち ● ValueObject がうまく作れない。。 どこから作っていくか? どう変えていくのか? 114

Slide 115

Slide 115 text

Copyright levii Inc. All rights reserved. ● 実装とドメインモデルの距離が遠い ● 時間変化についての議論が漏れがち ● ValueObject がうまく作れない。。 主に Python2 が原因? Python3 を使おうw 115

Slide 116

Slide 116 text

Copyright levii Inc. All rights reserved. 色々と反省点はあったが 設計の Art を伝えるという意味で 一定の成果はありそう 116

Slide 117

Slide 117 text

Copyright levii Inc. All rights reserved. 設計力をどう測るか? という別の課題 117

Slide 118

Slide 118 text

まとめ

Slide 119

Slide 119 text

Copyright levii Inc. All rights reserved. ● 設計人材を育てるのに DDD よい ● 当たり前を促すための問いかけ大事 ● まだまだ工夫の余地はありそう 119

Slide 120

Slide 120 text

Copyright levii Inc. All rights reserved. ご静聴ありがとうございました 120