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
5k
社内勉強会で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.5k
BASE大規模リアーキテクチャリング / base_rearchitecturing
nazonohito51
17
11k
既存サービスに後からR/W Splittingライブラリを入れる時に考えたこと / r-w-splitting
nazonohito51
1
28k
CakePHP2でもPhpStormがコード補完してくれるようにした話 / cakephp2-ide-helper
nazonohito51
1
2.2k
PHPStanでCustomRuleを作る / Make PHPStan CustomRule
nazonohito51
5
3.7k
単方向依存を実現する静的解析ライブラリのご紹介 / Analyze PHP Dependencies
nazonohito51
2
5.4k
「SOLIDの原則って何ですか?」って質問に答えたかった / What's SOLID principle
nazonohito51
4
1.8k
ドキュメントルート配下に全てのPHPファイルが置かれていた環境をindex.phpだけにした話 / document root
nazonohito51
1
3.6k
アジャイル開発でのソフトウェア設計
nazonohito51
0
800
Other Decks in Technology
See All in Technology
Nix入門パラダイム編
asa1984
2
200
Figma Dev Modeで進化するデザインとエンジニアリングの協働 / figma-with-engineering
cyberagentdevelopers
PRO
1
430
生成AIの強みと弱みを理解して、生成AIがもたらすパワーをプロダクトの価値へ繋げるために実践したこと / advance-ai-generating
cyberagentdevelopers
PRO
1
180
大規模データ基盤チームのオンプレTiDB運用への挑戦 / dpu-tidb
cyberagentdevelopers
PRO
1
110
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
27
12k
サイバーエージェントにおける生成AIのリスキリング施策の取り組み / cyber-ai-reskilling
cyberagentdevelopers
PRO
2
200
IaC運用を楽にするためにCDK Pipelinesを導入したけど、思い通りにいかなかった話
smt7174
1
110
Vueで Webコンポーネントを作って Reactで使う / 20241030-cloudsign-vuefes_after_night
bengo4com
4
2.5k
端末が簡単にリモートから操作されるデモを通じて ソフトウェアサプライチェーン攻撃対策の重要性を理解しよう
kitaji0306
0
170
CAMERA-Suite: 広告文生成のための評価スイート / ai-camera-suite
cyberagentdevelopers
PRO
3
270
いまならこう作りたい AWSコンテナ[本格]入門ハンズオン 〜2024年版 ハンズオンの構想〜
horsewin
9
2.1k
omakaseしないための.rubocop.yml のつくりかた / How to Build Your .rubocop.yml to Avoid Omakase #kaigionrails
linkers_tech
3
730
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
243
12k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Unsuck your backbone
ammeep
668
57k
Visualization
eitanlees
144
15k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
1.9k
Scaling GitHub
holman
458
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
32
2.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.2k
Become a Pro
speakerdeck
PRO
24
5k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
A better future with KSS
kneath
238
17k
Building Your Own Lightsaber
phodgson
102
6k
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!!!