Slide 1

Slide 1 text

約30年の時を超えたデザインパターンの価値 -現代のスクラムチームの開発者がGoFのデザインパターンを学び直し得たもの- えわ (Yusuke Uchida) @ewa_mobile 2024/01/11 Regional Scrum Gathering Tokyo 2024

Slide 2

Slide 2 text

⾃⼰紹介 • えわ (Yusuke Uchida) • X(旧Twitter): @ewa_mobile • Cybozu • モバイルエンジニア • iOS / Android 2

Slide 3

Slide 3 text

GoFのデザインパターンについて 3

Slide 4

Slide 4 text

4 名前は知ってる 理解してる 使ったことがある Singletonとか! … GoFのデザインパターン

Slide 5

Slide 5 text

5 名前は知ってる 理解してる 使ったことがある 古い Singletonとか! … GoFのデザインパターン

Slide 6

Slide 6 text

GoFのデザインパターンとは GoF (Gang of Four) 本で紹介された23個の設計カタログ 建築家Christopher Alexanderからの影響 “オブジェクト指向システムにおいて重要でかつ 繰り返し現れる設計を、それぞれ体系的に名前づけし、 説明を加え、評価したものである。我々の⽬的は ⼈びとが効果的に利⽤できるような形式で設計経験を 整理することである。そのために、もっとも重要な デザインパターンをいくつか⽂書化し、カタログの 形で表⽰した。” 『オブジェクト指向における再利⽤のためのデザインパターン』より ※強調は発表者による 6

Slide 7

Slide 7 text

よく⾔われるメリット • 解決策を再利⽤できる • 共通⽤語を確⽴できる ※今⽇の発表で「パターン」「デザインパターン」と⾔った場合 基本的にはこのGoFのデザインパターンのことを指します 7

Slide 8

Slide 8 text

原著出版から約30年 原著出版は1995年 技術の移り変わりが激しい世界で2024年に • どれだけ役に⽴つ? • 学ぶ価値がどれだけある? 8

Slide 9

Slide 9 text

原著出版から約30年 原著出版は1995年 技術の移り変わりが激しい世界で2024年に • どれだけ役に⽴つ? • 学ぶ価値がどれだけある? 様々な意⾒、批判的なものも ※否定・反論したい話ではないので具体的に 触れませんが、⾃分⾃⾝過去に批判的な意⾒を 聞いて重要なものではないと思っていました 9

Slide 10

Slide 10 text

転機: Certified Scrum Developer (CSD) 研修 10 https://www.jp.agilergo.com/online-csd-bernstein-202306 David Bernstein • RSGT 2023 Keynote Speaker • 『レガシーコードからの脱却』著者 研修の半分がデザインパターン 様々な問いで理解を揺さぶられ 学び直しへ

Slide 11

Slide 11 text

実感したGoFのデザインパターンの価値 GoFのデザインパターンは設計原則を⽤いて適切に 抽象化している例 • 設計原則を適⽤するバリエーションを学べる • デザインパターンだけでなく設計原則の理解も同時に促進される 11

Slide 12

Slide 12 text

実感したGoFのデザインパターンの価値 GoFのデザインパターンは設計原則を⽤いて適切に 抽象化している例 • 設計原則を適⽤するバリエーションを学べる • デザインパターンだけでなく設計原則の理解も同時に促進される 実務の問題に働いている⼒を⾒極める能⼒が⾼まり、 デザインパターン以外の⽅法でも設計原則を適⽤して コードを適切な箇所で分割できるようになる 12

Slide 13

Slide 13 text

Target Audience & Learning Outcome 13

Slide 14

Slide 14 text

Target Audience / Learning Outcome Target オブジェクト指向⾔語で開発を⾏ってる スクラムチームの開発者で • GoFのデザインパターンをこれから学ぼうか悩んでいる • GoFのデザインパターンを学んだが活かし⽅に悩んでいる • 設計原則の適⽤⽅法に悩んでいる 14

Slide 15

Slide 15 text

Target Audience / Learning Outcome Target オブジェクト指向⾔語で開発を⾏ってる スクラムチームの開発者で • GoFのデザインパターンをこれから学ぼうか悩んでいる • GoFのデザインパターンを学んだが活かし⽅に悩んでいる • 設計原則の適⽤⽅法に悩んでいる Learning Outcome GoFのデザインパターンは単なる実装例のカタログではなく、 設計原則を学ぶための最⾼の教材だと感じた学び⽅を伝え、 GoFのデザインパターンを学んでみよう、学び直してみよう と思ってもらえる 15

Slide 16

Slide 16 text

今⽇の発表内容 16 GoFのデザインパターン

Slide 17

Slide 17 text

今⽇の発表内容 17 GoFのデザインパターン CSD研修 その後の学習 学び直しにつながる問い 効果的な学習⽅法

Slide 18

Slide 18 text

お断り • 個別のデザインパターンの詳細な説明は省略します • 知らなくても話の趣旨は理解してもらえるはず • 出てきたパターンを学んだ後⾒返すと新しい発⾒があるかも 18

Slide 19

Slide 19 text

アジャイル開発で なぜ設計原則が重要なのか 19

Slide 20

Slide 20 text

アジャイル開発での設計原則の重要性 20 短いサイクルで 開発・リリース

Slide 21

Slide 21 text

アジャイル開発での設計原則の重要性 21 サイクル毎に 回帰試験 短いサイクルで 開発・リリース

Slide 22

Slide 22 text

アジャイル開発での設計原則の重要性 22 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 短いサイクルで 開発・リリース

Slide 23

Slide 23 text

アジャイル開発での設計原則の重要性 23 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 短いサイクルで 開発・リリース 🙏

Slide 24

Slide 24 text

アジャイル開発での設計原則の重要性 24 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 🙏

Slide 25

Slide 25 text

アジャイル開発での設計原則の重要性 25 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 💥 🙏

Slide 26

Slide 26 text

アジャイル開発での設計原則の重要性 26 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース より⼩さく テスト可能な設計 💥 🙏

Slide 27

Slide 27 text

アジャイル開発での設計原則の重要性 27 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース より⼩さく テスト可能な設計 設計⼒ 設計原則の適⽤ 💥 🙏

Slide 28

Slide 28 text

アジャイル開発での設計原則の重要性 28 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 💥 🙏 設計⼒ 設計原則の適⽤

Slide 29

Slide 29 text

アジャイル開発での設計原則の重要性 29 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 リファクタリング 💥 🙏 設計⼒ 設計原則の適⽤

Slide 30

Slide 30 text

アジャイル開発での設計原則の重要性 30 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 リファクタリング 💥 🙏 💸 設計⼒ 設計原則の適⽤

Slide 31

Slide 31 text

アジャイル開発での設計原則の重要性 31 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 リファクタリング 💥 🙏 💸 設計⼒ 設計原則の適⽤

Slide 32

Slide 32 text

アジャイル開発での設計原則の重要性 開発のサイクルを健全に保ち開発速度を維持するために 設計原則とその使い⽅が重要 32 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 リファクタリング 💥 🙏 💸 設計⼒ 設計原則の適⽤

Slide 33

Slide 33 text

33 GoFのデザインパターン CSD研修 その後の学習 学び直しにつながる問い 効果的な学習⽅法

Slide 34

Slide 34 text

34 GoFのデザインパターン アジャイルで設計原則が重要 CSD研修 その後の学習 設計原則を学ぶための 最⾼の教材 学び直しにつながる問い 効果的な学習⽅法

Slide 35

Slide 35 text

CSD研修での 学び直しにつながった問い 35

Slide 36

Slide 36 text

講師からの問い 似ているパターン同⼠を⽐較して • そのパターンの意図は何なのか? • そのパターンは何をカプセル化しているのか? 36

Slide 37

Slide 37 text

講師からの問い 似ているパターン同⼠を⽐較して • そのパターンの意図は何なのか? • そのパターンは何をカプセル化しているのか? 印象的だった例 • Template MethodとStrategyの⽐較 • Decoratorと Chain of Responsibility (CoR)の⽐較 37

Slide 38

Slide 38 text

Template MethodとStrategyの⽐較 どちらもアルゴリズムの再利⽤を可能にする ⾊んな本で⽐較されていて、いわば鉄板の⽐較 38 Template Method Strategy

Slide 39

Slide 39 text

実装⽅法の違い: 継承か委譲か “ Template Methodパターンは継承を使って問題を解決し、 Strategyパターンは問題解決に委譲を使う。” 『アジャイルソフトウェア開発の奥義』より ※強調は発表者による 39 継承 委譲 Template Method Strategy

Slide 40

Slide 40 text

意図の違い “StrategyとTemplate Methodの違いの⼀つの⾒⽅は、 Strategyがアルゴリズムを変化させるために使われるのに対し、 Template Methodはアルゴリズムは共通で、そのステップを 変化させるために使われる” by David Bernstein ※強調は発表者による 40 アルゴリズムのステップ アルゴリズム Template Method Strategy

Slide 41

Slide 41 text

パターンの意図が重要 重要なのはクラス構造ではない 継承を使っていても意図を満たしていればTemplate Method 41

Slide 42

Slide 42 text

なぜ説明が異なるのか “template methodでは、アルゴリズムの⼀部を変更するために継承を 利⽤している。それに対してStrategyパターンでは、アルゴリズム全体を 変更するために委譲を利⽤している。” 『オブジェクト指向における再利⽤のためのデザインパターン』より ※強調は発表者による 42

Slide 43

Slide 43 text

なぜ説明が異なるのか “template methodでは、アルゴリズムの⼀部を変更するために継承を 利⽤している。それに対してStrategyパターンでは、アルゴリズム全体を 変更するために委譲を利⽤している。” 『オブジェクト指向における再利⽤のためのデザインパターン』より ※強調は発表者による 説明相⼿・⽬的に合わせた切り⼝の違い • 実装の違い: パターンを説明する⼊り⼝としてわかりやすいので着⽬ • 意図の違い: 設計原則をどう適⽤しているか理解をするために着⽬ 43

Slide 44

Slide 44 text

なぜ説明が異なるのか “template methodでは、アルゴリズムの⼀部を変更するために継承を 利⽤している。それに対してStrategyパターンでは、アルゴリズム全体を 変更するために委譲を利⽤している。” 『オブジェクト指向における再利⽤のためのデザインパターン』より ※強調は発表者による 説明相⼿・⽬的に合わせた切り⼝の違い • 実装の違い: パターンを説明する⼊り⼝としてわかりやすいので着⽬ • 意図の違い: 設計原則をどう適⽤しているか理解をするために着⽬ 意図に着⽬すると、設計原則を理解する教材として デザインパターンが機能することを実感 44

Slide 45

Slide 45 text

DecoratorとCoRの⽐較 どちらも複数の処理を連続で 呼び出すが、その違いは何か? 45

Slide 46

Slide 46 text

DecoratorとCoRの⽐較 どちらも複数の処理を連続で 呼び出すが、その違いは何か? GoF本では⾔及されてないが、 ⾔われてみると似ている 46 『オブジェクト指向における再利⽤のためのデザインパターン』より

Slide 47

Slide 47 text

本質的な違いを考える 浮かぶ実装例は違うが、本質的には何が違うのか…? 47 https://uxdaystokyo.com/articles/glossary/dunning-kruger-effect/

Slide 48

Slide 48 text

DecoratorとCoRの違い Decoratorは確実に全ての処理を実⾏するが、 CoRは1つ1つの処理ごとに検査し途中で⽌まり得る点が違う 48

Slide 49

Slide 49 text

CSD研修での学び パターンの意図や、どう設計原則が適⽤されているかを 考えることで、パターンに加えて設計原則の理解も促進される 49

Slide 50

Slide 50 text

CSD研修での学び パターンの意図や、どう設計原則が適⽤されているかを 考えることで、パターンに加えて設計原則の理解も促進される 少ない実装例を理解するだけで⾜を⽌めてしまうと、 狭く不正確な理解になることさえあると実感 50

Slide 51

Slide 51 text

CSD研修での学び パターンの意図や、どう設計原則が適⽤されているかを 考えることで、パターンに加えて設計原則の理解も促進される 少ない実装例を理解するだけで⾜を⽌めてしまうと、 狭く不正確な理解になることさえあると実感 学び直しへ… 51

Slide 52

Slide 52 text

何か1つ、GoF以外のでパターンでもいいので • そのパターンの意図 • どんな設計原則がどう適⽤されているか • 何をカプセル化している? • 何に影響を与えず、どんな責務を拡張できる? を考えてみてください 52 ◯◯パターン △△原則 ××原則 □□原則

Slide 53

Slide 53 text

GoFのデザインパターンの 効果的な学び⽅ 53

Slide 54

Slide 54 text

各書籍での⾔及 54 ※は本編後の付録などで⾔及されているもの パターン名 分類 CSD研修 by David Bernstein オブジェクト 指向のこころ アジャイル ソフトウェア 開発の奥義 パターン指向 リファクタリング ⼊⾨ Head First デザイン パターン 第2版 採⽤率 Abstract Factory ⽣成 ◯ ◯ ◯ 60% Builder ⽣成 ※ ◯ ※ 20% Factory Method ⽣成 ◯ ◯ ◯ ◯ ◯ 100% Prototype ⽣成 ※ ※ 0% Singleton ⽣成 ◯ ◯ ◯ ◯ ◯ 100% Adapter 構造 ◯ ◯ ◯ ◯ - 80% Bridge 構造 ◯ ◯ ◯ ※ 60% Composite 構造 ◯ ◯ ◯ 60% Decorator 構造 ◯ ◯ ◯ ◯ 80% Façade 構造 ◯ ◯ ◯ ◯ 80% Flyweight 構造 ※ 0% Proxy 構造 ◯ ◯ ◯ 60% Chain of Responsibility 振る舞い ◯ ※ 20% Command 振る舞い ◯ ◯ ◯ 60% Interpreter 振る舞い ◯ ※ 20% Iterator 振る舞い ◯ 20% Mediator 振る舞い ◯ ※ 20% Memento 振る舞い ※ 0% Observer 振る舞い ◯ ◯ ◯ ◯ 80% State 振る舞い ◯ ◯ ◯ ◯ 80% Strategy 振る舞い ◯ ◯ ◯ ◯ ◯ 100% Template Method 振る舞い ◯ ◯ ◯ ◯ ◯ 100% Visitor 振る舞い ◯ ◯ ※ 40%

Slide 55

Slide 55 text

実感した効果的な学び⽅ 1. 似ているパターンを⽐較する 2. さまざまな設計原則の適⽤⽅法を学ぶ 3. 同じパターンの異なる実装例を学ぶ 4. パターンを適⽤していく過程を学ぶ 5. ⾃分の理解を⼈に説明する 55

Slide 56

Slide 56 text

1. 似ているパターンを⽐較する パターンと設計原則の理解が深まる ⽐較する際の着⽬点 • 責務・実現していることが似てる • クラス構造が似てる 56 Template Method Strategy 実現していることが 似ている

Slide 57

Slide 57 text

1. 似ているパターンを⽐較する パターンと設計原則の理解が深まる ⽐較する際の着⽬点 • 責務・実現していることが似てる • クラス構造が似てる 57 Template Method Strategy State 実現していることが 似ている クラス構造が 似ている

Slide 58

Slide 58 text

2.さまざまな設計原則の適⽤⽅法を学ぶ 設計の幅が広がり、語彙が増え設計意図の説明⼒が⾼まる 58 書籍 取り上げている設計原則 オブジェクト指向のこころ オープン・クローズドの原則、依存関係逆転の原則、 リスコフの置換原則、流動的要素のカプセル化、 インターフェースに対するプログラミング アジャイルソフトウェア 開発の奥義 SOLID原則、パッケージ設計の原則 Head Firstデザインパターン 第2版 カプセル化、インターフェースに対するプログラミング、 継承より委譲、疎結合設計、 オープン・クローズドの原則、依存関係逆転の原則、 デメテルの法則、Tell Donʻt Ask、単⼀責任の原則

Slide 59

Slide 59 text

3.同じパターンの異なる実装例を学ぶ パターンの意図に注⽬した学び⽅ • 複数の実装例に共通する本質は何か • 最低限どこを満たせば良いのか、満たさなくても良い部分はどこか 59

Slide 60

Slide 60 text

3.同じパターンの異なる実装例を学ぶ パターンの意図に注⽬した学び⽅ • 複数の実装例に共通する本質は何か • 最低限どこを満たせば良いのか、満たさなくても良い部分はどこか 難しいパターンも様々な実装例を通して理解する 少ない実装例だけだと狭い理解になるが、 多く学ぶとパターンの意図の理解が深まる 60

Slide 61

Slide 61 text

4.パターンを適⽤していく過程を学ぶ 既存のコードを要求変更に適応するようリファクタリングする際 デザインパターンを⽅向性としコードを進化させる⼿順を学ぶ 61 サイクル毎に 回帰試験 テスト⾃動化 CI/CD 実⾏時間を抑える テスト戦略 短いサイクルで 開発・リリース 要求変更 より⼩さく テスト可能な設計 リファクタリング

Slide 62

Slide 62 text

4.パターンを適⽤していく過程を学ぶ ⼿順の写経がおすすめ • アジャイルソフトウェア開発の奥義 • パターン指向リファクタリング⼊⾨ 設計原則へ理解が深まり、 実務でもそのまま役⽴つ 62

Slide 63

Slide 63 text

5.⾃分の理解を⼈に説明する • 発表資料にまとめる • ブログにまとめる • ⼈とわいわいする • 「このパターンってアレのことかも?」など 63

Slide 64

Slide 64 text

番外編: GoF本を読む 難しいので最初から全てはわからないかも しれないが、理解した上で読むと味わいが 深まりそう 64

Slide 65

Slide 65 text

実感した効果的な学び⽅ 1. 似ているパターンを⽐較する 2. さまざまな設計原則の適⽤⽅法を学ぶ 3. 同じパターンの異なる実装例を学ぶ 4. パターンを適⽤していく過程を学ぶ 5. ⾃分の理解を⼈に説明する 6. (GoF本を読む) 65

Slide 66

Slide 66 text

GoFのデザインパターンを 現代で学ぶ価値 66

Slide 67

Slide 67 text

67 GoFのデザインパターン アジャイルで設計原則が重要 CSD研修 その後の学習 設計原則を学ぶための 最⾼の教材 学び直しにつながる問い 効果的な学習⽅法

Slide 68

Slide 68 text

68 GoFのデザインパターン アジャイルで設計原則が重要 CSD研修 その後の学習 設計原則を学ぶための 最⾼の教材 学び直しにつながる問い 効果的な学習⽅法 GoFのデザインパターン を現代で学ぶ価値

Slide 69

Slide 69 text

重要ではないと考えること 各パターンを厳密に定義すること パターンを⽐較して意図を理解するのは、中⼼を⾒定めるためで 境界をはっきりさせるためではない 69

Slide 70

Slide 70 text

重要ではないと考えること 各パターンを厳密に定義すること パターンを⽐較して意図を理解するのは、中⼼を⾒定めるためで 境界をはっきりさせるためではない パターンの特定の実装例を暗記すること • 実装例はわかりやすいのでそこから⼊るのは⼤賛成だが、 そこで⾜を⽌めたり、実装例に引っ張られすぎないことが⼤事 • パターンの意図を理解した上で、 ⾔語に合った実装(例えばクラス以外の⽅法を使うなど) を考えるのが良いのでは 70

Slide 71

Slide 71 text

重要だと考えること 各パターンがどんな問題を、どんな意図で、 どのように設計原則を適⽤し解決しているか学ぶこと • 設計原則を理解し活⽤できるようになる • 設計意図を⾔語化できるようになる 71

Slide 72

Slide 72 text

重要だと考えること 各パターンがどんな問題を、どんな意図で、 どのように設計原則を適⽤し解決しているか学ぶこと • 設計原則を理解し活⽤できるようになる • 設計意図を⾔語化できるようになる GoFのデザインパターンは⽂書化され多くの⼈が 議論しているから、学ぶと良い設計のための訓練になる 似たものが他にあるなら必ずしもGoFのパターンでなくても良いが、 GoFのパターンは1つの最適解なのでは 72

Slide 73

Slide 73 text

デザインパターンの時を超えた価値 GoFのデザインパターンを学ぶことで 実務の問題に働いている⼒を⾒極める能⼒が⾼まり、 デザインパターン以外の⽅法でも設計原則を適⽤して コードを適切な箇所で分割できるようになり、 開発速度を維持できる 73

Slide 74

Slide 74 text

デザインパターンの時を超えた価値 GoFのデザインパターンを学ぶことで 実務の問題に働いている⼒を⾒極める能⼒が⾼まり、 デザインパターン以外の⽅法でも設計原則を適⽤して コードを適切な箇所で分割できるようになり、 開発速度を維持できる デザインパターンはあらかじめ変化に備えて 適応しておくものではなく、要求変更が起きた時に 既存のコードを進化させる⼒を磨くために学ぶもの 74

Slide 75

Slide 75 text

次の沼へ: Christopher Alexanderの⾔葉 “逆説的だが、現実に役⽴っているパタンそのものを否定できるほど⾃由に なってこそ、⽣き⽣きとした建物ができることが分かる。 そして結局、ランゲージを⽤いる⼈⾃⾝が⾃由で無我である場合に限って、 ⽣き⽣きとした建物になる。そのような場合のみ、⾃分のイメージに 驚かされることなく、現実にあるがままの⼒を認識できるのである。 だが、その時点ではもうランゲージを必要としない。⾃分のイメージに 影響されたり歪められたりせず、現実に存在するさまざまな⼒を⾒ぬく ことができ、それらの⼒だけを頼りに建物をつくることができる- そこまで⾃分⾃⾝を解放しさえすれば、もはや完全にパタンなしで⾃由に 建物をつくることができる-つまり、パタンに込められた知識、さまざまな ⼒が現実にどう作⽤するかについての知識が、すでに⾃分⾃⾝のものに なっているからである。” 『時を超えた建設への道』より ※強調は発表者による 75

Slide 76

Slide 76 text

まとめ • GoFのデザインパターンは設計原則を学ぶための最⾼の教材 • 学ぶことで実務の問題に働いている⼒を⾒極める能⼒が⾼まり、 デザインパターン以外の⽅法でも設計原則を適⽤してコードを 適切な箇所で分割できるようになり、開発速度を維持できる • 実感した効果的な学び⽅は 1. 似ているパターンを⽐較する 2. さまざまな設計原則の適⽤⽅法を学ぶ 3. 同じパターンの異なる実装例を学ぶ 4. パターンを適⽤していく過程を学ぶ 5. ⾃分の理解を⼈に説明する 76

Slide 77

Slide 77 text

参考書籍 (1) 77 『オブジェクト指向における再利⽤のためのデザインパターン』 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 『アジャイルソフトウェア開発の奥義』 Robert C. Martin

Slide 78

Slide 78 text

参考書籍 (2) 78 『オブジェクト指向のこころ』 Alan Shalloway, James Trott 『パターン指向リファクタリング⼊⾨』 Joshua Kerievsky

Slide 79

Slide 79 text

参考書籍 (3) 79 『時を超えた建設の道』 Christopher Alexander 『Head Firstデザインパターン 第2版』 Eric Freeman, Elisabeth Robson