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
『改訂新版 良いコード/悪いコードで学ぶ設計入門』活用方法−爆速でスキルアップする!効果的な学...
Search
MinoDriven
January 17, 2025
Programming
16
850
『改訂新版 良いコード/悪いコードで学ぶ設計入門』活用方法−爆速でスキルアップする!効果的な学習アプローチ / effective-learning-of-good-code
このイベントの登壇資料です
改訂新版「ミノ駆動本」の活用方法 〜設計勉強会による効果的な学習アプローチ〜
https://findy.connpass.com/event/339191/
MinoDriven
January 17, 2025
Tweet
Share
More Decks by MinoDriven
See All by MinoDriven
破壊せよ!データ破壊駆動で考えるドメインモデリング / data-destroy-driven
minodriven
17
4.9k
アーキテクチャレベルで考える開発生産性 / architecture-and-productivity
minodriven
22
12k
見えないものに着目すると上手くいく、モデリングの勘所 / invisible-driven-design
minodriven
24
6.9k
クソコード動画『カプセル化 Mk-II』 で考える 上手くカプセル化できない理由 / encapsulation2
minodriven
22
16k
技術的負債の怨霊と除霊方法 / ghosts-of-technical-debt
minodriven
11
4.3k
分岐を低減するinterface設計と発想の転換 / interface_design_idea.pdf
minodriven
18
6.8k
目的と抽象化の関係性から分かる、システムの設計精度を高める考え方 / purpose abstraction design
minodriven
22
8.9k
『良いコード/悪いコードで学ぶ設計入門』を一歩深める読み方 / deepen good code bad code
minodriven
18
7.1k
風刺動画「一枚岩モデル」で考える、DDDの境界付けられたコンテキスト / huge model vs bc
minodriven
19
39k
Other Decks in Programming
See All in Programming
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
130
GitHub CopilotでTypeScriptの コード生成するワザップ
starfish719
26
5.9k
return文におけるstd::moveについて
onihusube
1
1.4k
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
400
103 Early Hints
sugi_0000
1
330
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
2
7.7k
Androidアプリの One Experience リリース
nein37
0
900
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
370
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
8
1.8k
HTML/CSS超絶浅い説明
yuki0329
0
180
AppRouterを用いた大規模サービス開発におけるディレクトリ構成の変遷と問題点
eiganken
1
420
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築
sumiyae
3
560
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
116
7.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
860
Mobile First: as difficult as doing things right
swwweet
222
9k
The Invisible Side of Design
smashingmag
299
50k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Agile that works and the tools we love
rasmusluckow
328
21k
Into the Great Unknown - MozCon
thekraken
34
1.6k
Thoughts on Productivity
jonyablonski
68
4.4k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
19
2.3k
jQuery: Nuts, Bolts and Bling
dougneiner
62
7.6k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Transcript
© DMM © DMM 『改訂新版 良いコード/ 悪いコードで学ぶ設計入門』 活用方法 爆速でスキルアップする! 効果的な学習アプローチ
2025/01/17(金) 合同会社DMM.com ミノ駆動
© DMM 自己紹介 ミノ駆動 ( @MinoDriven ) 合同会社DMM.com プラットフォーム開発本部 第3開発部
DeveloperProductivityGroup DMMプラットフォームの設計を改善し 開発生産性向上を図るのがミッション 2
© DMM もうちょっと具体的な仕事の内訳 サービス全体で共通利用されるDMMプラットフォーム (アカウント管理、不正対策、決済、DMMポイント etc..) の設計品質改善 • 設計ガイドライン策定 •
チームへの設計指導 • プラットフォーム所属のエンジニア(約120人!)に対する設計勉強会 ワークショップ形式の実践講習(←本日説明する内容です) • リファクタリング体制整備 3
© DMM 著書紹介 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 変更容易性の高い設計を学ぶ、 初級〜中級向け入門書 初版は12刷重版 ITエンジニア本大賞2023技術書部門大賞受賞 台湾版、韓国語版でも翻訳出版
4
© DMM 本日のおしながき • 第1部: 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 改訂内容の解説 • 第2部: 効率的に設計スキルを高める学習方法(←本日のメインはこちら)
• 補足: ワークショップに伴うあれこれ 5
© DMM 第1部 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 改訂内容の解説
© DMM 7つのリニューアル! 1. 【変更】凝集度、結合度からカプセル化、関心の分離へ 2. 【加筆】インターフェースと実装の分離 3. 【変更】interfaceの解説を改善 4.
【加筆】インターフェースと実装の分離にもとづいたinterface設計 5. 【加筆】アンカリング効果 6. 【加筆】ジョシュアツリーの法則 7. 【加筆】説明による設計スキルアップ 7
© DMM 【変更】凝集度、結合度からカプセル化、関心の分離へ 凝集度と結合度を一切使わない説明に書き直しました。 凝集度を高めたり、結合度を下げても、 変更容易性が高いとは言えないケースがあるからです。 凝集度、結合度で解説していた内容は、 カプセル化と関心の分離へ全面的に置き換えました。 8
© DMM 凝集度が高くても変更容易性が低いケース 9 class Util { // このaddメソッドは機能的凝集の構造 //
しかしMoneyクラスに定義されていないので変更容易性は低い static Money add(Money money1, Money money2) { if (!money1.currency.equals(money2.currency)) { throw new IllegalArgumentException("通貨単位が違います。"); } Money added = new Money(); added.amount = money1.amount + money2.amount; added.currency = money1.currency; return added; } } // 金額を表現するクラス class Money { int amount; // 金額値 Currency currency; // 通貨単位 }
© DMM 結合度を下げると変更容易性が悪化するケース 10 DDDにおける集約構造
© DMM 結合度を下げると変更容易性が悪化するケース 11 杓子定規に依存を減らすと変更容易性や整合性維持に問題が生じる
© DMM カプセル化と関心の分離で一貫性のある解説に 強く関係し合うものどうしをカプセル化する、 関係の弱いものどうしを分離する、これで一貫性のある内容に改善! 12
© DMM 【加筆】インターフェースと実装の分離 関心の分離に関する追加コンテンツです。 トランザクションスクリプトパターンで書かれた長大なメソッドは、 多くの関心が混在しており、保守や変更が困難です。 こうした問題の解決に有用なのがインターフェイスと実装の分離。 モジュールをインターフェイスパートと実装パートに分ける考え方です。 この考え方に基づいて設計することで、関心を上手く分離できます。 13
© DMM 【変更】interfaceの解説を改善 switch文の弊害を解消するため interfaceをぜひ使いこなせるように なってほしいと思い、初版でinterface 設計ノウハウを記述しました。しかし反 応がイマイチだった感触。 「interfaceで機能を取り換える」とい う表現を用いて、より理解しやすい内容
に改善しました。 14
© DMM 【加筆】インターフェースと実装の分離にもとづいたinterface設計 interfaceを使いこなせるようになるには、やはりイチからinterfaceを 使って機能開発できるようになるのがポイント。 interface設計でも有用なのが、前述したインターフェイスと実装の分離 です。この考え方に基づいて、イチからinterfaceを設計するノウハウを加 筆しました。 15
© DMM 【加筆】アンカリング効果 クラスやメソッドへの命名は可読性だけではなく、 構造も大きく左右します。 適切に名前を設計することで構造が改善します。 この名前設計のノウハウに、 アンカリング効果に関するトピックを追加しました。 アンカリング効果とは認知バイアスの一種。 思い込みによって上手く名前を改善できないケースがあります。
アンカリング効果から抜け出し、適切な名前を設計する方法を解説します。 16
© DMM 【加筆】ジョシュアツリーの法則 名前設計には、ジョシュアツリーの法則についても加筆しました。 ジョシュアツリーの法則とは、名前を知って初めて存在を知覚できるよう になるという認知法則です。 名前を知っているか、知らないかで、構造はガラリと変わります。 ジョシュアツリーを踏まえた名前設計のノウハウを解説します。 17
© DMM 【加筆】説明による設計スキルアップ 設計スキルを高めるには、単に本を読むだけでなく、 実際に手を動かすなど試行錯誤が必要です。 こうした試行錯誤で重要なのが、人に設計を説明することです。 人に説明すると学びが深まります。 ただ闇雲に説明するのではなく、 設計スキルを効率的に高めるための説明の仕方や、 背景にある考え方を解説します。
18
© DMM 第2部 効率的に設計スキルを高める 学習方法
© DMM どんな学習方法? 実際にコードを書くワークショップ形式の勉強会。 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 をテキストとして使います。 普段開発で扱っているソースコードを使います。 • 問題のあるコードを探す •
変更容易性の高い構造へ再設計し、実装する • 何が問題で、設計でどう解決したかを説明する(←ココ超重要) という学習方法です。 20
© DMM Q. 講義や輪読会形式じゃダメなの?
© DMM A. 効果が薄いです
© DMM 23 https://career-ed-lab.mynavi.jp/career-column/707/ より引用 講義や読書は学習定着率が低く、 非効率。 自転車の乗り方を本で読んでも乗れ ません。実際に自転車に乗り、バラン スの取り方を身体で覚える必要があ
ります。 設計も同様に、実際に手とクチを動か し試行錯誤することで、実践レベルの スキルを効率よく獲得できます。 だからワークショップ形式の勉強会を 採用しています。
© DMM Q. 実際に効果あるの?
© DMM A. あります
© DMM 実践レベルのスキル習得 変更容易性の、実践的な基礎スキルが身につきます。 何をもって「身についた」と言えるのか • 変更容易性に問題のあるコードを認識できている (スキルが未熟だと問題コードを目にしても問題だと認識できない) • 泥臭く複雑なプロダクションコードを改善できている
• 変更容易性の高い構造の要件を満たしている • 何が問題で、設計でどう解決したのかについて、 筋道の通った説明ができている 26
© DMM 短時間で高効率なスキルアップ 弊社DMMのプラットフォーム開発本部では、 1チームに対し以下の学習時間をかけています。 (予習1時間 + 実習2時間) x 5回
= 15時間 たった15時間で、実践的な基礎スキルが身についています。 27
© DMM 高い再現性 弊社DMMのPF開発本部、エンジニアは120人以上。 各開発チームを持ち回りで本勉強会を開催。 どの開発チームでも、ほとんどのエンジニアが問題なくスキルを習得。 この学習方法は弊社DMMだけでなく、 ミノ駆動がこれまで所属していた会社でも同様に実施してきたもの。 どの会社でもスキル向上できていました。 再現性の高い学習方法であると言えます。
28
© DMM 学習メニューと 取り組み方の紹介
© DMM 学習メニュー ミノ駆動本のうち次の5項目を 特に重要な基礎スキルとして位置付けています。 1日1項目ずつ学習します。 1. カプセル化 2. 関心の分離
3. 単一責任原則 4. interface設計 5. 目的駆動名前設計 詳しくは『改訂新版 良いコード/悪いコードで学ぶ設計入門』を参照 30
© DMM 学習ステップ 1項目あたり、以下に示すステップで学習します。 • ステップ1:予習 • ステップ2:概要確認、目線合わせ • ステップ3:問題のあるコードを探す
• ステップ4:何が問題かをメモに起こす • ステップ5:問題コードについて説明する • ステップ6:再設計、実装 • ステップ7:どう設計したかをメモに起こす • ステップ8:成果発表 31 実習2時間 1時間
© DMM 受講者数 受講者数は、最大4〜5人までとします。 受講者ひとりずつ設計の成果を発表してもらうためです。 質疑応答の時間も含まれるので、 それ以上の人数になると実習が2時間で終わらなくなります。 32
© DMM 【超大事な前提】技術は問題解決の手段 設計も含め、技術は問題解決の手段です。 何が問題なのか正しく把握することで、 その問題を解決する手段として的確な設計ができます。 逆に問題を正しく把握できないと設計がチグハグになります。 当然問題解決には至りません。 とかく技術は、使い方ばかり着目されがち。 解決したい問題を把握することがより重要です!
このワークショップでは、 受講者が問題をしっかり言語化できることをキモとしています。 33
© DMM ステップ1:予習 【所要時間】1時間程度 テキストとしてミノ駆動本を利用します。 指定した章を、受講者に予習してもらいます。 ミノ駆動本は1章につき多くても40ページ程度。 1時間もあれば読めます。 ただ漫然と読むのではなく、 「解決したい問題は何か」を意識します。
34
© DMM ステップ2:概要確認、目線合わせ 【所要時間】約15分 このステップから、ワークショップで実施する内容です。 このステップでは、ワークショップで取り扱う設計技術について、解決した い問題やおさえておきたいポイントについて簡単に目線合わせします。 例えばカプセル化を学ぶ場合、カプセル化が解決する問題や、設計上おさ えておきたいポイントについて話し合って目線合わせします。 技術は問題解決の手段なので、問題が的外れだと設計も的外れになりま
す。解決したい問題をしっかり認識します。 35
© DMM ステップ3:問題のあるコードを探す 【所要時間】20〜25分 普段の開発で扱っているソースコードを練習題材に使います。 設計を適用できそうな、問題のあるコードを探します。 例えばカプセル化の場合、データとそのデータを操作するロジックがバラ バラに実装されいるコードを探します。 このステップからは、受講者それぞれがソロで実施します。 ペアやモブで実施すると、
人任せになってしまうことがあるためです。 それでは問題コードを認知するスキルや 設計スキルが十分に養われません。 36
© DMM ステップ3:問題のあるコードを探す 問題コードはソロで探してもらいますが、 一方でどの辺に問題がありそうか、 チームで積極的に話し合うことは おおいに推奨します。 話し合うこと自体がアウトプットだからです。 この話し合いが活発であるほど 設計の正確さが向上する傾向が見られます。
37
© DMM ステップ4:何が問題かをメモに起こす 【所要時間】5分 極めて重要なステップです。 見つけた問題コードについて、 何が問題なのかをメモに起こします。 人が頭の中で考えていることは意外なほどぼんやりしています。 文字に書き起こすことで矛盾に気付いたり、新たな発見があったり、 何が問題なのかをより正確に認識できるようになります。
ここを的確に言語化することで設計の正確性が向上します。 逆に言語化が不十分だと、的外れな設計になってしまいます。 38
© DMM ステップ5:問題コードについて説明する 【所要時間】15-20分 ひとりずつ問題コードを画面共有し、 前ステップでまとめたメモの内容を説明します。 1人あたり1-2分程度。 説明後、チームで質疑応答やフィードバックをします。 問題の言語化が不十分だったり、 問題がテーマに沿っていない場合、
問題を修正します。 39
© DMM ステップ6:再設計、実装 【所要時間】20-25分 問題コードを、変更容易性の高い構造に再設計します。 再設計したコードをゼロから書き上げます。 ファイルを新規作成し、まっさらな状態から書きます。 リファクタリングではありません。 リファクタリングすると 再設計箇所以外のコードも考慮しなければならなくなり
学習効率が悪くなります。 40
© DMM ステップ7:どう設計したかをメモに起こす 【所要時間】5分 重要なステップです。 次のステップで、再設計した内容について成果発表します。 このステップでは、発表内容を準備します。 以下を説明できるようにメモを書きます。 • 問題解決のためにどのように設計したのか
• なぜそのような設計をしたのか • 設計によって問題は解決できたか 41
© DMM ステップ8:成果発表 【所要時間】20-25分 ひとりずつ再設計したコードを画面共有し、 前ステップで準備した内容を発表します。 1人あたり2-3分程度。 発表内容について、 チームで質疑応答やフィードバックをします。 42
© DMM 以上がワークショップの一連の流れとなります
© DMM 補足: ワークショップに伴うあれこれ
© DMM 問題把握が不正確だと設計も不正確 上手く設計できない人がまれにいます。 共通する傾向があります。 • 何が問題かを正しく把握できていない、上手く説明できない • テーマとは別の問題を問題視してしまう •
フレームワークや実装技術ばかりを気にしている (そのため解決したい問題にまで頭が回らない) 問題把握が不正確だと、解決手段としての設計もチグハグになります。 当然問題解決できません。 テーマとなる問題に集中するようファシリする必要があります。 45
© DMM 46 現状構造 変更容易性の高い 理想構造 現状と理想のギャップが 技術的負債 バグをなるべく埋め込まず 素早く正確にコード変更できる度合い
変更容易性
© DMM 47 変更容易性 現状構造 変更容易性の高い 理想構造 理想構造を知らないとギャップを 認識できない! 技術的負債を認識できない!
「このコードの一体どこが負債な んですか?これが普通でしょ?」 問題の認識には、理想構造を知る 必要があります! バグをなるべく埋め込まず 素早く正確にコード変更できる度合い
© DMM プロダクションコードだからこそ身につく プロダクションコードは複雑で泥臭く、問題の度合いが大きいので、 それだけ問題解決の旨味が大きいです。 また、実際の泥臭いコードを再設計することが、 仕事ですぐ使える実践レベルの設計スキル獲得につながります。 ミノ駆動も設計を覚えたての頃、泥臭いプロダクションコードを リファクタリングし続けたことで大幅にスキルアップしました。 ミノ駆動が知る限り、他の設計有識者も同様の経験があるとのことです。
48
© DMM 受講者の感想 • ミノ駆動本は以前から持っていて読了済み。 でも実際にワークショップをやってみて、 理解したつもりになっていたことに気付かされた。 • 普段の開発でしんどいと思ってた箇所を ワークショップで綺麗に再設計できたので、
そのまま開発に採り入れたい。 • 今まで認識できなかった問題コードを認識できるようになって、 ソースコードに対する見方、向き合い方が変わった。 49
© DMM 問題のあるコードが見つからない場合は? 実際たまにそのような状況になります。 その場合は、やむを得ないのですが 生成AIに作らせた教材用のコードを使います。 生成AIはさまざまなドメイン知識を知っているので、 なんらかのドメイン知識をベースにしたコードを作らせます。 (例:決済、スマホの料金計算、注文 etc..)
ただし、問題の度合いはプロダクションコードに及ばないので、 なるべくプロダクションコードを用いた方が良いです。 50
© DMM 設計の学習にミノ駆動本をすすめる理由 この学習方法では、ミノ駆動本の利用を強くオススメします。 • 何が問題なのかを分かりやすく解説しています。 そのため、問題を認識しやすくなるメリットがあります。 • 「問題のあるコードを探してください」と言われても、 慣れていない人にとっては見つけるだけで一苦労です。
ミノ駆動本では、問題のあるコードを豊富に取り揃えています。 そのため「(進研ゼミっぽいノリで)あっ、これミノ駆動本で見たやつ だ!」みたく、問題コード発見の手助けになります。 これらはミノ駆動本ならではの特徴です。 51
© DMM 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 をぜひお手に取り本学習方法を試してみてください 効果はバツグンです
© DMM 弊社DMM.comのプラットフォーム開発本部では 一緒に働く仲間を募集しています 入社するとミノ駆動の設計勉強会を受講できます https://dmm-corp.com/recruit/search/?jobtype=1&tags=56
© DMM ご清聴ありがとうございました