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
社内勉強会でOOPとCleanArchitectureとDDDを勉強し始めたというお話
Search
Satoshi Kawashima
October 12, 2019
Technology
7
5.1k
社内勉強会でOOPとCleanArchitectureとDDDを勉強し始めたというお話
BASE, Inc. で社内勉強会を開くときに考えた、僕らの学習アプローチと勉強会設計について話しました。
Satoshi Kawashima
October 12, 2019
Tweet
Share
More Decks by Satoshi Kawashima
See All by Satoshi Kawashima
モジュラモノリスにおけるトランザクション設計の考え方 / transaction design on modular monolith
nazonohito51
17
8.7k
BASE大規模リアーキテクチャリング / base_rearchitecturing
nazonohito51
17
12k
既存サービスに後からR/W Splittingライブラリを入れる時に考えたこと / r-w-splitting
nazonohito51
1
29k
CakePHP2でもPhpStormがコード補完してくれるようにした話 / cakephp2-ide-helper
nazonohito51
1
2.3k
PHPStanでCustomRuleを作る / Make PHPStan CustomRule
nazonohito51
5
3.8k
単方向依存を実現する静的解析ライブラリのご紹介 / Analyze PHP Dependencies
nazonohito51
2
5.6k
「SOLIDの原則って何ですか?」って質問に答えたかった / What's SOLID principle
nazonohito51
5
1.9k
ドキュメントルート配下に全てのPHPファイルが置かれていた環境をindex.phpだけにした話 / document root
nazonohito51
1
3.7k
アジャイル開発でのソフトウェア設計
nazonohito51
0
830
Other Decks in Technology
See All in Technology
表現を育てる
kiyou77
1
210
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
3
1k
Oracle Cloud Infrastructure:2025年2月度サービス・アップデート
oracle4engineer
PRO
1
210
SA Night #2 FinatextのSA思想/SA Night #2 Finatext session
satoshiimai
1
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
110
AndroidXR 開発ツールごとの できることできないこと
donabe3
0
130
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
6.2k
The Future of SEO: The Impact of AI on Search
badams
0
200
抽象化をするということ - 具体と抽象の往復を身につける / Abstraction and concretization
soudai
16
6.8k
【Developers Summit 2025】プロダクトエンジニアから学ぶ、 ユーザーにより高い価値を届ける技術
niwatakeru
2
1.4k
スタートアップ1人目QAエンジニアが QAチームを立ち上げ、“個”からチーム、 そして“組織”に成長するまで / How to set up QA team at reiwatravel
mii3king
2
1.5k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
A Tale of Four Properties
chriscoyier
158
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Building Applications with DynamoDB
mza
93
6.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Agile that works and the tools we love
rasmusluckow
328
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Transcript
© - BASE, Inc. 社内勉強会で OOPと CleanArchitectureと DDDを 勉強し始めたというお話 川島
慧 / BASE, Inc. / / PHPカンファレンス沖縄
© - BASE, Inc. Product Division 川島 慧 @nazonohito
© - BASE, Inc. これは何? • 社内で勉強会とか始めた話 • 何持ち帰れるの? •
弊社のOOP/CleanArchitecture/DDDに対する学習アプローチ と勉強会を設計について考えたことを共有 • OOP/CleanArchitecture/DDDそのものについては話しません • 開催して間もないため結果などはほとんど話せません
経緯
© - BASE, Inc. 「OOPの勉強会したい」
© - BASE, Inc. じゃあやるか
© - BASE, Inc. 翌⽇にカレンダー登録
© - BASE, Inc. ノープランで当⽇
photos by Rick Cogley https://www.flickr.com/photos/rickcogley/ 飲み会の勢いで開始
⽬標設定
© - BASE, Inc. 理論と実践をつなげる ⽬標
© - BASE, Inc. 経緯 • 今年のはじめにオブジェクト 指向設計読書会をやっていた
© - BASE, Inc. 業務で使うイメージがわかない (⼀部の)参加者の感想
© - BASE, Inc. オブジェクト指向設計実践ガイド • 単⼀責任のクラスを設計する • 依存関係を管理する •
柔軟なインターフェースを作る • ダックタイピングでコストを削減する • 継承によって振る舞いを獲得する • その他
© - BASE, Inc. 参加者の感想 • クラスとその依存関係の管理という話の中から実 Webサービスのどこにどう当てはめれば良いのかイ メージがわかなかった •
特にCakePHP には適⽤が難しい • ライブラリを作るときくらいにしか使えなさそう
© - BASE, Inc. ⾃分の感想 • 以前からOOPを頑張って実践していた(つもりの) ⾃分からすると有⽤だと分かっていた • だけど実Webサービスに適⽤するにはもっと多くの
パーツが必要になることも分かっていた(OOPだけ でも勉強⼤変なのにね
じゃあOOPを実践した 開発ってやつをしてみよう
OOPだけで実際の開発は語れない 開発に必要なもの OOP
© - BASE, Inc. たくさんのものに繋がっている CleanArchitecture XP TDD パタン‧ランゲージ DDD
デザインパターン OOP リファクタリング マイクロサービス
おすすめ!!
© - BASE, Inc. 動くシステムが出来るまでに必要なのはここらへんっぽい • ドメインとコードを関係付ける、ドメインを把握す る(DDD、ユースケース駆動) • ドメインモデルを技術的関⼼事から隔離する
(CleanArchitecture) • ドメインモデルをコードに落とし込む(OOP、デザ インパターン)
どれも勉強するめっちゃ⼤変
でもまあ全部やるか
photos by Rick Cogley https://www.flickr.com/photos/rickcogley/ 飲み会の勢い
© - BASE, Inc. とは⾔え、 • 元々個⼈で勉強してる⼈が3⼈いた ࣗশOOPࢥय़ظ ʮũţŪŸŕŧŒţŝũƄţ…ʢಡΈʣʯ ʮCleanArchitectureԿΘ͔ΒΜʯ
© - BASE, Inc. ⼈がたくさん集まると、知識も集まる • ⼀⼈ひとりが部分領域をカバーしあえば、全体としてある程 度の網羅率が獲得できる • 完璧でなくて良い
• OOPだけでは語れない現実の開発を、語れるだけの知識を ⽤いて具体的な開発を1回やってみるという内容なので、広く て薄い感じで良い • 輪読会してから実践だといつ終わるか分からない
Done is better than perfect.
© - BASE, Inc. 5⼈で開始 @hgsgtk @fumikony @tenkoma @nazonohito @fuubit
photos by Rick Cogley https://www.flickr.com/photos/rickcogley/ 飲み会の勢い
勉強の題材
© - BASE, Inc. 勉強の題材 • アジャイルソフトウェア開発 の奥義 • 18章「給与システムのケース
スタディ」
© - BASE, Inc. • 給与システムのケーススタディ • システム開発の例題として、給与システムの要件と ユースケースが書かれている章 •
本当はその後の章でデザインパターンを使って実装 するための題材 • 要件定義やらユースケース分析などをスキップして いきなり開発をスタートできそうだった
© - BASE, Inc. 要件(というかユーザストーリー) • 従業員の⼀部は時給である。彼らの給与は、従業員レコードが持つフィールド項⽬の ⼀つに登録されている時給をベースに⽀払われる。給与は毎週⾦曜⽇に⽀払われる。 • 従業員の⼀部は固定給である。彼らの給与は⽉末に⽀払われる。⽉給の額は、従業員
レコードのフィールド項⽬の⼀つである。 • 固定給の従業員の⼀部は、営業成績に応じて成功報酬を受ける。彼らは、売上⽇と 売上⾦額を記録したレシートを提出しなければならない。成功報酬額は、彼らの従業 員レコードのフィールド項⽬の⼀つに登録されている。彼らの給与は隔週⾦曜⽇に⽀ 払われる。 • ………(続く)
© - BASE, Inc. ユースケース • 新しい従業員を追加する • 従業員を削除する •
タイムカードの処理を要請する • 売上レシートの処理を要請する • 組合サービス料の処理を要請する • 従業員レコードの詳細を変更する(例:時給や組合費) • 当⽇の給与⽀払い処理を⾛らせる
© - BASE, Inc. ユースケース1:従業員を追加する AddEmpトランザクションは新しい従業員を追加する。このトランザクションには必 ず従業員(Employee)の「登録ID(EmpID)」、「名前(name)」、「住所 (address)」が含まれる。このトランザクションには下記に⽰す3つの形式がある: 別記1:トランザクションが正しい形式で記述されていない場合 トランザクションが正しい形式で記述されていない場合は、エラーメッセージを吐き
出す。エラーメッセージを出⼒するだけで、何も処理は⾏わない。 AddEmp <EmpID> “<name>” “<address>” H <hourly-rate> AddEmp <EmpID> “<name>” “<address>” S <monthly-rate> AddEmp <EmpID> “<name>” “<address>” C <monthly-rate> <commission-rate>
ドメインモデリング
© - BASE, Inc. 付箋紙を使ったドメインモデリング
© - BASE, Inc. ユースケース記述
© - BASE, Inc. ⼯夫したこと • ドメインモデリングのやり⽅はわりと⼿探り • ドメインモデルがどうコードに繋がっていくかを最 短でイメージできるように1ユースケースの実装を最
優先とした • 実装とモデリングを何往復もする覚悟は済ませた
photos by Woody Zuill https://www.agilealliance.org/resources/experience-reports/mob-programming-agile2014/ モブプログラミング
© - BASE, Inc. モブプログラミングとは • Hunter Industies社で実施されていた取り組み • 3⼈以上で⾏うペアプログラミングみたいなもの
© - BASE, Inc. 参加者のロール • タイピストの役割 • モブがしてくれと頼んだことを理解すること •
モブを信頼し、⾃分では試さないことも試す • モブの役割 • 問題解決につながる論理的ステップを⾒つける⼒になること • モブ全体の理解の⽔準を上げるため貢献すること
先⾏して勉強してたモブが、 その知識の活⽤場所を ⾒つけた場合は、 積極的に⾔語化してもらう
⾔語化
© - BASE, Inc. ⼈は⾔語にできる以上のことを知っている • 物理化学者で哲学者のMichael Polanyi⽈く、⼈は 語れる以上のことを知っている 引⽤元:エンジニアの知的⽣産術
© - BASE, Inc. 抽象的で分かりづらい本
© - BASE, Inc. 曖昧で点と点でしか無い理解 Specificationύλʔϯ υϝΠϯϞσϧ Entity ValueObject ڥք͚ͮΒΕͨ
ίϯςΩετ ⾔語化出来ない ⾔語化出来る Repositoryύλʔϯ ϢϏΩλεݴޠ
© - BASE, Inc. やりたいこと • 先⾏して勉強していた⼈の学びをより深める機会に したい • それ以外の⼈も学びのスタート地点に⽴てるような
学習をしたい
最も効率的な勉強⽅法は、 ⼈に教えること
© - BASE, Inc. ⾔語化し、⼈に教える • ⼈に教えることで⾔語化が強制される • ⾔語化によって以下の効果が期待できる •
⾃分の知識を体系的に整理 • ⾜りなかった知識の発⾒ • 他の⼈からフィードバックがもらえる =>より深い理解へ
© - BASE, Inc. 教えられた⼈は • おそらく⾔語化されてもそんなに理解できない • 書籍だけでも難しい概念なので •
しかし⽬の前には具象となるコードもあるので、コードと のセットによってある程度の理解が出来る • @nrslibさんのボトムアップDDDに近いアプローチ • 本を読んでなくてもこれまでの⾃分の経験と整合性のある 知識に出会えると感動する(かも)
© - BASE, Inc. 学びのプロセス • 情報収集‧モデル化‧検証の繰り返し 引⽤元:エンジニアの知的⽣産術
© - BASE, Inc. 学びのサイクル 情報収集‧体験 抽象化‧モデル化‧パターンの発⾒ 実践検証 モデル構築 (≒⾃分の中の期待)
体験 書籍 モデル 現実
© - BASE, Inc. 参加者のこれまでの課題と解決 • 先⾏して勉強していた⼈:書籍を通してモデルは出来上がりつつある が、検証されていないため正しさを証明できなかった • それ以外の⼈:書籍を通してもハッキリとしたモデルを脳内に作れな
かった =>検証されることで次の学習ステップへ進める =>具体的なコード+⾔語による情報収集から 精度の⾼いモデル構築
参加者の感想
© - BASE, Inc. 参加者の感想 メンバーと共通の⾔語や知識ができたのでよかったです。 ずっとひとりでやっていたので、学ぶ過程で得られる知識の多さや、 気付きの多さに感動しています。 ⾃分の知識を伝えたり、伝えることで、知識が深まったりしてよいです。 参加者各⼈の⾔語化をフックに、⾃分の中で違う概念とつながり、「あっということはあれはこ
う考えられるのでは」という思考の深みを掘り下げる機会になりました。 ⾔語化した結果を踏まえて、実際のコードベース内でOOPを実践しました。CakePHP の中でや るのはそれなりにフレームワークといかに付き合う必要があるかという考えを深めるきっかけに もなりよかったです ひとの操作を⾒るのはおもろい 仕事でアプリケーション開発したことがほとんどないので、ドメインモデリングみたいなことを 考えたことがそもそもないな みんなの⾔語化能⼒が⾼い ※SRE
モブプロ駆動学習
© - BASE, Inc. モブプロ駆動学習(造語) • みんなで同じコードに向き合う • コードが問題に衝突するたび書籍の知識を使⽤し、 参加者の学習のサイクルが回る
• 先⾏者は⾔語化とコーディングによるモデル検証 • それ以外の⼈はコードとセットになった情報収集と モデル化が促進される
© - BASE, Inc. 課題 • 先⾏者ばかりが話をしてしまうことが多い • スケールしない(たぶん5⼈までが限界) •
たぶんその分野である程度学習済みの⼈がいないと 成⽴しない
© - BASE, Inc. 課題 • 参加者が互いに信頼してないと成⽴しない(重要) • 曖昧な知識のまま実践している、という前提でやって いるのでお互い技術的な弱みを⾒せあっている状態
• ⼈の気持ちや状況を汲み取らない⼈が仮に1⼈いるとし たら、それだけ全てが根本から崩壊してしまう • 今はいません
ご清聴 ありがとうございました!
We are hiring!!!