Slide 1

Slide 1 text

© DMM © DMM 『改訂新版 良いコード/ 悪いコードで学ぶ設計入門』 活用方法 爆速でスキルアップする! 効果的な学習アプローチ 2025/01/17(金) 合同会社DMM.com ミノ駆動

Slide 2

Slide 2 text

© DMM 自己紹介 ミノ駆動 ( @MinoDriven ) 合同会社DMM.com プラットフォーム開発本部 第3開発部 DeveloperProductivityGroup DMMプラットフォームの設計を改善し 開発生産性向上を図るのがミッション 2

Slide 3

Slide 3 text

© DMM もうちょっと具体的な仕事の内訳 サービス全体で共通利用されるDMMプラットフォーム (アカウント管理、不正対策、決済、DMMポイント etc..) の設計品質改善 ● 設計ガイドライン策定 ● チームへの設計指導 ● プラットフォーム所属のエンジニア(約120人!)に対する設計勉強会 ワークショップ形式の実践講習(←本日説明する内容です) ● リファクタリング体制整備 3

Slide 4

Slide 4 text

© DMM 著書紹介 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 変更容易性の高い設計を学ぶ、 初級〜中級向け入門書 初版は12刷重版 ITエンジニア本大賞2023技術書部門大賞受賞 台湾版、韓国語版でも翻訳出版 4

Slide 5

Slide 5 text

© DMM 本日のおしながき ● 第1部: 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 改訂内容の解説 ● 第2部: 効率的に設計スキルを高める学習方法(←本日のメインはこちら) ● 補足: ワークショップに伴うあれこれ 5

Slide 6

Slide 6 text

© DMM 第1部 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 改訂内容の解説

Slide 7

Slide 7 text

© DMM 7つのリニューアル! 1. 【変更】凝集度、結合度からカプセル化、関心の分離へ 2. 【加筆】インターフェースと実装の分離 3. 【変更】interfaceの解説を改善 4. 【加筆】インターフェースと実装の分離にもとづいたinterface設計 5. 【加筆】アンカリング効果 6. 【加筆】ジョシュアツリーの法則 7. 【加筆】説明による設計スキルアップ 7

Slide 8

Slide 8 text

© DMM 【変更】凝集度、結合度からカプセル化、関心の分離へ 凝集度と結合度を一切使わない説明に書き直しました。 凝集度を高めたり、結合度を下げても、 変更容易性が高いとは言えないケースがあるからです。 凝集度、結合度で解説していた内容は、 カプセル化と関心の分離へ全面的に置き換えました。 8

Slide 9

Slide 9 text

© 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; // 通貨単位 }

Slide 10

Slide 10 text

© DMM 結合度を下げると変更容易性が悪化するケース 10 DDDにおける集約構造

Slide 11

Slide 11 text

© DMM 結合度を下げると変更容易性が悪化するケース 11 杓子定規に依存を減らすと変更容易性や整合性維持に問題が生じる

Slide 12

Slide 12 text

© DMM カプセル化と関心の分離で一貫性のある解説に 強く関係し合うものどうしをカプセル化する、 関係の弱いものどうしを分離する、これで一貫性のある内容に改善! 12

Slide 13

Slide 13 text

© DMM 【加筆】インターフェースと実装の分離 関心の分離に関する追加コンテンツです。 トランザクションスクリプトパターンで書かれた長大なメソッドは、 多くの関心が混在しており、保守や変更が困難です。 こうした問題の解決に有用なのがインターフェイスと実装の分離。 モジュールをインターフェイスパートと実装パートに分ける考え方です。 この考え方に基づいて設計することで、関心を上手く分離できます。 13

Slide 14

Slide 14 text

© DMM 【変更】interfaceの解説を改善 switch文の弊害を解消するため interfaceをぜひ使いこなせるように なってほしいと思い、初版でinterface 設計ノウハウを記述しました。しかし反 応がイマイチだった感触。 「interfaceで機能を取り換える」とい う表現を用いて、より理解しやすい内容 に改善しました。 14

Slide 15

Slide 15 text

© DMM 【加筆】インターフェースと実装の分離にもとづいたinterface設計 interfaceを使いこなせるようになるには、やはりイチからinterfaceを 使って機能開発できるようになるのがポイント。 interface設計でも有用なのが、前述したインターフェイスと実装の分離 です。この考え方に基づいて、イチからinterfaceを設計するノウハウを加 筆しました。 15

Slide 16

Slide 16 text

© DMM 【加筆】アンカリング効果 クラスやメソッドへの命名は可読性だけではなく、 構造も大きく左右します。 適切に名前を設計することで構造が改善します。 この名前設計のノウハウに、 アンカリング効果に関するトピックを追加しました。 アンカリング効果とは認知バイアスの一種。 思い込みによって上手く名前を改善できないケースがあります。 アンカリング効果から抜け出し、適切な名前を設計する方法を解説します。 16

Slide 17

Slide 17 text

© DMM 【加筆】ジョシュアツリーの法則 名前設計には、ジョシュアツリーの法則についても加筆しました。 ジョシュアツリーの法則とは、名前を知って初めて存在を知覚できるよう になるという認知法則です。 名前を知っているか、知らないかで、構造はガラリと変わります。 ジョシュアツリーを踏まえた名前設計のノウハウを解説します。 17

Slide 18

Slide 18 text

© DMM 【加筆】説明による設計スキルアップ 設計スキルを高めるには、単に本を読むだけでなく、 実際に手を動かすなど試行錯誤が必要です。 こうした試行錯誤で重要なのが、人に設計を説明することです。 人に説明すると学びが深まります。 ただ闇雲に説明するのではなく、 設計スキルを効率的に高めるための説明の仕方や、 背景にある考え方を解説します。 18

Slide 19

Slide 19 text

© DMM 第2部 効率的に設計スキルを高める 学習方法

Slide 20

Slide 20 text

© DMM どんな学習方法? 実際にコードを書くワークショップ形式の勉強会。 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 をテキストとして使います。 普段開発で扱っているソースコードを使います。 ● 問題のあるコードを探す ● 変更容易性の高い構造へ再設計し、実装する ● 何が問題で、設計でどう解決したかを説明する(←ココ超重要) という学習方法です。 20

Slide 21

Slide 21 text

© DMM Q. 講義や輪読会形式じゃダメなの?

Slide 22

Slide 22 text

© DMM A. 効果が薄いです

Slide 23

Slide 23 text

© DMM 23 https://career-ed-lab.mynavi.jp/career-column/707/ より引用 講義や読書は学習定着率が低く、 非効率。 自転車の乗り方を本で読んでも乗れ ません。実際に自転車に乗り、バラン スの取り方を身体で覚える必要があ ります。 設計も同様に、実際に手とクチを動か し試行錯誤することで、実践レベルの スキルを効率よく獲得できます。 だからワークショップ形式の勉強会を 採用しています。

Slide 24

Slide 24 text

© DMM Q. 実際に効果あるの?

Slide 25

Slide 25 text

© DMM A. あります

Slide 26

Slide 26 text

© DMM 実践レベルのスキル習得 変更容易性の、実践的な基礎スキルが身につきます。 何をもって「身についた」と言えるのか ● 変更容易性に問題のあるコードを認識できている (スキルが未熟だと問題コードを目にしても問題だと認識できない) ● 泥臭く複雑なプロダクションコードを改善できている ● 変更容易性の高い構造の要件を満たしている ● 何が問題で、設計でどう解決したのかについて、 筋道の通った説明ができている 26

Slide 27

Slide 27 text

© DMM 短時間で高効率なスキルアップ 弊社DMMのプラットフォーム開発本部では、 1チームに対し以下の学習時間をかけています。 (予習1時間 + 実習2時間) x 5回 = 15時間 たった15時間で、実践的な基礎スキルが身についています。 27

Slide 28

Slide 28 text

© DMM 高い再現性 弊社DMMのPF開発本部、エンジニアは120人以上。 各開発チームを持ち回りで本勉強会を開催。 どの開発チームでも、ほとんどのエンジニアが問題なくスキルを習得。 この学習方法は弊社DMMだけでなく、 ミノ駆動がこれまで所属していた会社でも同様に実施してきたもの。 どの会社でもスキル向上できていました。 再現性の高い学習方法であると言えます。 28

Slide 29

Slide 29 text

© DMM 学習メニューと 取り組み方の紹介

Slide 30

Slide 30 text

© DMM 学習メニュー ミノ駆動本のうち次の5項目を 特に重要な基礎スキルとして位置付けています。 1日1項目ずつ学習します。 1. カプセル化 2. 関心の分離 3. 単一責任原則 4. interface設計 5. 目的駆動名前設計 詳しくは『改訂新版 良いコード/悪いコードで学ぶ設計入門』を参照 30

Slide 31

Slide 31 text

© DMM 学習ステップ 1項目あたり、以下に示すステップで学習します。 ● ステップ1:予習 ● ステップ2:概要確認、目線合わせ ● ステップ3:問題のあるコードを探す ● ステップ4:何が問題かをメモに起こす ● ステップ5:問題コードについて説明する ● ステップ6:再設計、実装 ● ステップ7:どう設計したかをメモに起こす ● ステップ8:成果発表 31 実習2時間 1時間

Slide 32

Slide 32 text

© DMM 受講者数 受講者数は、最大4〜5人までとします。 受講者ひとりずつ設計の成果を発表してもらうためです。 質疑応答の時間も含まれるので、 それ以上の人数になると実習が2時間で終わらなくなります。 32

Slide 33

Slide 33 text

© DMM 【超大事な前提】技術は問題解決の手段 設計も含め、技術は問題解決の手段です。 何が問題なのか正しく把握することで、 その問題を解決する手段として的確な設計ができます。 逆に問題を正しく把握できないと設計がチグハグになります。 当然問題解決には至りません。 とかく技術は、使い方ばかり着目されがち。 解決したい問題を把握することがより重要です! このワークショップでは、 受講者が問題をしっかり言語化できることをキモとしています。 33

Slide 34

Slide 34 text

© DMM ステップ1:予習 【所要時間】1時間程度 テキストとしてミノ駆動本を利用します。 指定した章を、受講者に予習してもらいます。 ミノ駆動本は1章につき多くても40ページ程度。 1時間もあれば読めます。 ただ漫然と読むのではなく、 「解決したい問題は何か」を意識します。 34

Slide 35

Slide 35 text

© DMM ステップ2:概要確認、目線合わせ 【所要時間】約15分 このステップから、ワークショップで実施する内容です。 このステップでは、ワークショップで取り扱う設計技術について、解決した い問題やおさえておきたいポイントについて簡単に目線合わせします。 例えばカプセル化を学ぶ場合、カプセル化が解決する問題や、設計上おさ えておきたいポイントについて話し合って目線合わせします。 技術は問題解決の手段なので、問題が的外れだと設計も的外れになりま す。解決したい問題をしっかり認識します。 35

Slide 36

Slide 36 text

© DMM ステップ3:問題のあるコードを探す 【所要時間】20〜25分 普段の開発で扱っているソースコードを練習題材に使います。 設計を適用できそうな、問題のあるコードを探します。 例えばカプセル化の場合、データとそのデータを操作するロジックがバラ バラに実装されいるコードを探します。 このステップからは、受講者それぞれがソロで実施します。 ペアやモブで実施すると、 人任せになってしまうことがあるためです。 それでは問題コードを認知するスキルや 設計スキルが十分に養われません。 36

Slide 37

Slide 37 text

© DMM ステップ3:問題のあるコードを探す 問題コードはソロで探してもらいますが、 一方でどの辺に問題がありそうか、 チームで積極的に話し合うことは おおいに推奨します。 話し合うこと自体がアウトプットだからです。 この話し合いが活発であるほど 設計の正確さが向上する傾向が見られます。 37

Slide 38

Slide 38 text

© DMM ステップ4:何が問題かをメモに起こす 【所要時間】5分 極めて重要なステップです。 見つけた問題コードについて、 何が問題なのかをメモに起こします。 人が頭の中で考えていることは意外なほどぼんやりしています。 文字に書き起こすことで矛盾に気付いたり、新たな発見があったり、 何が問題なのかをより正確に認識できるようになります。 ここを的確に言語化することで設計の正確性が向上します。 逆に言語化が不十分だと、的外れな設計になってしまいます。 38

Slide 39

Slide 39 text

© DMM ステップ5:問題コードについて説明する 【所要時間】15-20分 ひとりずつ問題コードを画面共有し、 前ステップでまとめたメモの内容を説明します。 1人あたり1-2分程度。 説明後、チームで質疑応答やフィードバックをします。 問題の言語化が不十分だったり、 問題がテーマに沿っていない場合、 問題を修正します。 39

Slide 40

Slide 40 text

© DMM ステップ6:再設計、実装 【所要時間】20-25分 問題コードを、変更容易性の高い構造に再設計します。 再設計したコードをゼロから書き上げます。 ファイルを新規作成し、まっさらな状態から書きます。 リファクタリングではありません。 リファクタリングすると 再設計箇所以外のコードも考慮しなければならなくなり 学習効率が悪くなります。 40

Slide 41

Slide 41 text

© DMM ステップ7:どう設計したかをメモに起こす 【所要時間】5分 重要なステップです。 次のステップで、再設計した内容について成果発表します。 このステップでは、発表内容を準備します。 以下を説明できるようにメモを書きます。 ● 問題解決のためにどのように設計したのか ● なぜそのような設計をしたのか ● 設計によって問題は解決できたか 41

Slide 42

Slide 42 text

© DMM ステップ8:成果発表 【所要時間】20-25分 ひとりずつ再設計したコードを画面共有し、 前ステップで準備した内容を発表します。 1人あたり2-3分程度。 発表内容について、 チームで質疑応答やフィードバックをします。 42

Slide 43

Slide 43 text

© DMM 以上がワークショップの一連の流れとなります

Slide 44

Slide 44 text

© DMM 補足: ワークショップに伴うあれこれ

Slide 45

Slide 45 text

© DMM 問題把握が不正確だと設計も不正確 上手く設計できない人がまれにいます。 共通する傾向があります。 ● 何が問題かを正しく把握できていない、上手く説明できない ● テーマとは別の問題を問題視してしまう ● フレームワークや実装技術ばかりを気にしている (そのため解決したい問題にまで頭が回らない) 問題把握が不正確だと、解決手段としての設計もチグハグになります。 当然問題解決できません。 テーマとなる問題に集中するようファシリする必要があります。 45

Slide 46

Slide 46 text

© DMM 46 現状構造 変更容易性の高い 理想構造 現状と理想のギャップが 技術的負債 バグをなるべく埋め込まず 素早く正確にコード変更できる度合い 変更容易性

Slide 47

Slide 47 text

© DMM 47 変更容易性 現状構造 変更容易性の高い 理想構造 理想構造を知らないとギャップを 認識できない! 技術的負債を認識できない! 「このコードの一体どこが負債な んですか?これが普通でしょ?」 問題の認識には、理想構造を知る 必要があります! バグをなるべく埋め込まず 素早く正確にコード変更できる度合い

Slide 48

Slide 48 text

© DMM プロダクションコードだからこそ身につく プロダクションコードは複雑で泥臭く、問題の度合いが大きいので、 それだけ問題解決の旨味が大きいです。 また、実際の泥臭いコードを再設計することが、 仕事ですぐ使える実践レベルの設計スキル獲得につながります。 ミノ駆動も設計を覚えたての頃、泥臭いプロダクションコードを リファクタリングし続けたことで大幅にスキルアップしました。 ミノ駆動が知る限り、他の設計有識者も同様の経験があるとのことです。 48

Slide 49

Slide 49 text

© DMM 受講者の感想 ● ミノ駆動本は以前から持っていて読了済み。 でも実際にワークショップをやってみて、 理解したつもりになっていたことに気付かされた。 ● 普段の開発でしんどいと思ってた箇所を ワークショップで綺麗に再設計できたので、 そのまま開発に採り入れたい。 ● 今まで認識できなかった問題コードを認識できるようになって、 ソースコードに対する見方、向き合い方が変わった。 49

Slide 50

Slide 50 text

© DMM 問題のあるコードが見つからない場合は? 実際たまにそのような状況になります。 その場合は、やむを得ないのですが 生成AIに作らせた教材用のコードを使います。 生成AIはさまざまなドメイン知識を知っているので、 なんらかのドメイン知識をベースにしたコードを作らせます。 (例:決済、スマホの料金計算、注文 etc..) ただし、問題の度合いはプロダクションコードに及ばないので、 なるべくプロダクションコードを用いた方が良いです。 50

Slide 51

Slide 51 text

© DMM 設計の学習にミノ駆動本をすすめる理由 この学習方法では、ミノ駆動本の利用を強くオススメします。 ● 何が問題なのかを分かりやすく解説しています。 そのため、問題を認識しやすくなるメリットがあります。 ● 「問題のあるコードを探してください」と言われても、 慣れていない人にとっては見つけるだけで一苦労です。 ミノ駆動本では、問題のあるコードを豊富に取り揃えています。 そのため「(進研ゼミっぽいノリで)あっ、これミノ駆動本で見たやつ だ!」みたく、問題コード発見の手助けになります。 これらはミノ駆動本ならではの特徴です。 51

Slide 52

Slide 52 text

© DMM 『改訂新版 良いコード/悪いコードで学ぶ設計入門』 をぜひお手に取り本学習方法を試してみてください 効果はバツグンです

Slide 53

Slide 53 text

© DMM 弊社DMM.comのプラットフォーム開発本部では 一緒に働く仲間を募集しています 入社するとミノ駆動の設計勉強会を受講できます https://dmm-corp.com/recruit/search/?jobtype=1&tags=56

Slide 54

Slide 54 text

© DMM ご清聴ありがとうございました