BASE, Inc. で社内勉強会を開くときに考えた、僕らの学習アプローチと勉強会設計について話しました。
© - BASE, Inc.社内勉強会でOOPとCleanArchitectureとDDDを勉強し始めたというお話川島 慧 / BASE, Inc./ / PHPカンファレンス沖縄
View Slide
© - 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 Cogleyhttps://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.たくさんのものに繋がっているCleanArchitectureXPTDDパタン‧ランゲージDDDデザインパターンOOPリファクタリングマイクロサービス
おすすめ!!
© - BASE, Inc.動くシステムが出来るまでに必要なのはここらへんっぽい• ドメインとコードを関係付ける、ドメインを把握する(DDD、ユースケース駆動)• ドメインモデルを技術的関⼼事から隔離する(CleanArchitecture)• ドメインモデルをコードに落とし込む(OOP、デザインパターン)
どれも勉強するめっちゃ⼤変
でもまあ全部やるか
photos by Rick Cogleyhttps://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
勉強の題材
© - BASE, Inc.勉強の題材• アジャイルソフトウェア開発の奥義• 18章「給与システムのケーススタディ」
© - BASE, Inc.• 給与システムのケーススタディ• システム開発の例題として、給与システムの要件とユースケースが書かれている章• 本当はその後の章でデザインパターンを使って実装するための題材• 要件定義やらユースケース分析などをスキップしていきなり開発をスタートできそうだった
© - BASE, Inc.要件(というかユーザストーリー)• 従業員の⼀部は時給である。彼らの給与は、従業員レコードが持つフィールド項⽬の⼀つに登録されている時給をベースに⽀払われる。給与は毎週⾦曜⽇に⽀払われる。• 従業員の⼀部は固定給である。彼らの給与は⽉末に⽀払われる。⽉給の額は、従業員レコードのフィールド項⽬の⼀つである。• 固定給の従業員の⼀部は、営業成績に応じて成功報酬を受ける。彼らは、売上⽇と売上⾦額を記録したレシートを提出しなければならない。成功報酬額は、彼らの従業員レコードのフィールド項⽬の⼀つに登録されている。彼らの給与は隔週⾦曜⽇に⽀払われる。• ………(続く)
© - BASE, Inc.ユースケース• 新しい従業員を追加する• 従業員を削除する• タイムカードの処理を要請する• 売上レシートの処理を要請する• 組合サービス料の処理を要請する• 従業員レコードの詳細を変更する(例:時給や組合費)• 当⽇の給与⽀払い処理を⾛らせる
© - BASE, Inc.ユースケース1:従業員を追加するAddEmpトランザクションは新しい従業員を追加する。このトランザクションには必ず従業員(Employee)の「登録ID(EmpID)」、「名前(name)」、「住所(address)」が含まれる。このトランザクションには下記に⽰す3つの形式がある:別記1:トランザクションが正しい形式で記述されていない場合トランザクションが正しい形式で記述されていない場合は、エラーメッセージを吐き出す。エラーメッセージを出⼒するだけで、何も処理は⾏わない。AddEmp “” “” H AddEmp “” “” S AddEmp “” “” C
ドメインモデリング
© - BASE, Inc.付箋紙を使ったドメインモデリング
© - BASE, Inc.ユースケース記述
© - BASE, Inc.⼯夫したこと• ドメインモデリングのやり⽅はわりと⼿探り• ドメインモデルがどうコードに繋がっていくかを最短でイメージできるように1ユースケースの実装を最優先とした• 実装とモデリングを何往復もする覚悟は済ませた
photos by Woody Zuillhttps://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ύλʔϯυϝΠϯϞσϧEntityValueObjectڥք͚ͮΒΕͨίϯςΩετ⾔語化出来ない⾔語化出来る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!!!