148
テスト駆動開発者は 3周目に死ぬのか 和田 卓人 (a.k.a id:t-wada) Jul, 7th 2009 @ object club

Emergent Design - ObLove 2009 summer

Embed Size (px)

DESCRIPTION

Emergent Design, at Object Club 2009 summer

Citation preview

Page 1: Emergent Design - ObLove 2009 summer

テスト駆動開発者は3周目に死ぬのか

和田 卓人 (a.k.a id:t-wada)Jul, 7th 2009 @ object club

Page 2: Emergent Design - ObLove 2009 summer

自己紹介

Page 3: Emergent Design - ObLove 2009 summer

自己紹介名前: 和田 卓人 (わだ たくと)

ブログ: http://d.hatena.ne.jp/t-wada

メール: [email protected]

Twitter: http://twitter.com/t_wada

タワーズ・クエスト株式会社 取締役社長

Page 4: Emergent Design - ObLove 2009 summer

これまで書いたものWEB + DB PRESSvol.35 「実演! テスト駆動開発」vol.37 「実演! リファクタリング」vol.42 「REST特集」vol.49 「DRY特集」LifeHacks PRESSオープンソースマガジン(リレーコラム)他いろいろ

Page 5: Emergent Design - ObLove 2009 summer

gihyo.jpの連載『[動画で解説]和田卓人の“テスト駆動開発”講座』http://gihyo.jp/dev/serial/01/tdd/全20回すべて動画付き解説ニコニコ動画でも見れます

WEB+DB過去記事の特設サイトと動画も

Page 6: Emergent Design - ObLove 2009 summer

デベロッパーテスティング・ライブ - 自信を持ってコードを書くための心・技・体 -

【徹底討論】テストなんていらない?! -テストを、どこまでやるべきか?

パネルディスカッション:テストを行うこと、テストを続けること

デブサミ

Page 7: Emergent Design - ObLove 2009 summer
Page 8: Emergent Design - ObLove 2009 summer

よろしくおねがいします

Page 9: Emergent Design - ObLove 2009 summer

今日喋ること

•ピラミッドを組み上げる•ピラミッドの中に入る(戻る)•黄金の回転について

Page 10: Emergent Design - ObLove 2009 summer

“TDD done strictly from the YAGNI principle leads to an

architectural meltdown around iteration three.”

TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ

が破綻するであろう

Page 11: Emergent Design - ObLove 2009 summer

“TDD done strictly from the YAGNI principle leads to an

architectural meltdown around iteration three.”

TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ

が破綻するであろう

Jim CoplienBob Martin

Page 12: Emergent Design - ObLove 2009 summer

第一部ピラミッドを組み上げる

Page 13: Emergent Design - ObLove 2009 summer
Page 14: Emergent Design - ObLove 2009 summer

Emergent Design

Test Driven Development

Refactoring

Pattern Driven Development

Code Qualities

Principles Practices PathologiesWisdom

Unit Testing Patterns

Page 15: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 16: Emergent Design - ObLove 2009 summer
Page 17: Emergent Design - ObLove 2009 summer

Emergent Design is the process of evolving systems in response to changing requirements, better understanding of existing requirements, and in response to new opportunities that arise from new technology, better ideas, and a changing world.

創発的設計とは仕様の変更や、既存の仕様のより深い理解、また新たな技術、よりよいアイデア、環境の変化などに適応してシステムを進化させるプロセスである

創発的設計とは

Page 18: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 19: Emergent Design - ObLove 2009 summer

Code Quality解析容易性変更容易性安定性テスト容易性

Page 20: Emergent Design - ObLove 2009 summer
Page 21: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 22: Emergent Design - ObLove 2009 summer

Pathologies

Page 23: Emergent Design - ObLove 2009 summer

名前を付けるのが難しい長いテストコード長いプロダクトコード/メソッド

(例)凝集度不足

Page 24: Emergent Design - ObLove 2009 summer

•パターンへ昇華•Anti-Patterns•リファクタリングの兆し•Code Smells

Pathologies

Page 25: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 26: Emergent Design - ObLove 2009 summer

Wisdom先人の知恵“巨人の肩”c2.comFLOSS

Page 27: Emergent Design - ObLove 2009 summer

藤野さん平鍋さん天野さん懸田さん矢崎さん小井土さん福井さん井上樹さん河合さん佃さん

中谷さん平澤さん梅澤さん友野さん長瀬さん金澤さん浅海さん原田洋子さん萩本さん伊藤さん

Page 28: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 29: Emergent Design - ObLove 2009 summer

Principles

Page 30: Emergent Design - ObLove 2009 summer

Single ResponsibilityOpen-ClosedLiscov SubstitutionInterface SegregationDependency Inversion

SOLID Principle

Page 31: Emergent Design - ObLove 2009 summer

Don’t Repeat YourselfLaw of Demeter

Principles

Page 32: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 33: Emergent Design - ObLove 2009 summer

Practices

スタイル名前道具

Page 34: Emergent Design - ObLove 2009 summer

三本柱©Artek ( http://www.artek.fi/ )

Page 35: Emergent Design - ObLove 2009 summer

バージョン管理テスティング

自動化

Page 36: Emergent Design - ObLove 2009 summer

バージョン管理

Page 37: Emergent Design - ObLove 2009 summer
Page 38: Emergent Design - ObLove 2009 summer

テスティング

Page 39: Emergent Design - ObLove 2009 summer

自動化自働化

XFD

詳しくは小井土さんセッションで

Page 40: Emergent Design - ObLove 2009 summer
Page 41: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 42: Emergent Design - ObLove 2009 summer

バージョン管理テスティング

自動化

Page 43: Emergent Design - ObLove 2009 summer

テストの分類

DeveloperTesting

開発者

開発促進

CustomerTesting

顧客(のロール)

進捗管理

QATesting

品質保証担当者

(のロール)

品質保証

「テスト」

Page 44: Emergent Design - ObLove 2009 summer

Developer Testingとは

•プログラマの•プログラマによる•プログラマのための•プログラムとしてのテストを書きながら•開発を行っていく手法

Page 45: Emergent Design - ObLove 2009 summer

xUnit

Page 46: Emergent Design - ObLove 2009 summer

バグ発見とコスト

Page 47: Emergent Design - ObLove 2009 summer

•即座にフィードバックを得るため•書いたコードに自信を持つため•これから書くコードに自信を持つため

Developer Testing にソフトウェア工学的なメリットはいろいろあるけれど、最大の理由は工学的なものではない。最大の理由は心理的なもの

Page 48: Emergent Design - ObLove 2009 summer

どこをテストすべき?

Page 49: Emergent Design - ObLove 2009 summer
Page 50: Emergent Design - ObLove 2009 summer

デバッガじゃだめなの?

Page 51: Emergent Design - ObLove 2009 summer
Page 52: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 53: Emergent Design - ObLove 2009 summer
Page 54: Emergent Design - ObLove 2009 summer

リファクタリング(名)

外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること

Page 55: Emergent Design - ObLove 2009 summer

リファクタリング(動)

一連のリファクタリングを行って、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること

Page 56: Emergent Design - ObLove 2009 summer

理解や修正のために•コードを理解しやすく•コードを修正しやすく•コードをシンプルにすることが、シンプル設計への道

Page 57: Emergent Design - ObLove 2009 summer

リファクタリング•ボトムアップ設計の核•全ての中でリファクタリングだけが、物事を後から改善できる•「向き」が大事

Page 58: Emergent Design - ObLove 2009 summer

リファクタリングに終わりはあるのか?

Page 59: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 60: Emergent Design - ObLove 2009 summer

Patterns

語彙形式共有

Page 61: Emergent Design - ObLove 2009 summer

(例)Facade

Context外部要因に依存する複雑なサブシステ

ムがある

Force複雑化する内部実装に依存しないよう

にしたい

SolutionFacade Patternを導入し、シンプルな

interfaceの背後に複雑な内部を隠蔽する

Page 62: Emergent Design - ObLove 2009 summer
Page 63: Emergent Design - ObLove 2009 summer
Page 64: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 65: Emergent Design - ObLove 2009 summer
Page 66: Emergent Design - ObLove 2009 summer

TDDとは1. テストを書き2. そのテストを実行して失敗させ(Red)3. 目的のコードを書き4. 1で書いたテストを成功させ(Green)5. テストが通るままでリファクタリングを行う(Refactor)

6. 1~5を繰り返す

Page 67: Emergent Design - ObLove 2009 summer

• a test driven developer does not write a line of production code until he has written a failing unit test, and no production code can be written until there is a failing unit test

• you do not write more of a unit test than is sufficient to fail, and “not compiling” is failing. So you cannot write very much of the unit test before you must write production code;

• you cannot write more production code than is sufficient to pass the currently failing test. So you cannot write a little bit of a unit test and then run off and write a whole bunch of production code.

Discipline

Page 68: Emergent Design - ObLove 2009 summer

TDDのこころ

Page 69: Emergent Design - ObLove 2009 summer

一つずつ少しずつ

Page 70: Emergent Design - ObLove 2009 summer

ひとりずつ対処する。

複数を相手にしない。

Page 71: Emergent Design - ObLove 2009 summer

動作する、きれいなコードへ

きれい

汚い

(すぐには)動かない 動作する

二つの道がある

Page 72: Emergent Design - ObLove 2009 summer

すばやくまわす

Page 73: Emergent Design - ObLove 2009 summer

きれい

汚い

(すぐには)動かない 動作する

Red

Green

Refactoring

TDDと黄金の回転

Page 74: Emergent Design - ObLove 2009 summer

自分が最初のユーザ

Page 75: Emergent Design - ObLove 2009 summer

不安をテストに

Page 76: Emergent Design - ObLove 2009 summer

ボールはひとつ

Page 77: Emergent Design - ObLove 2009 summer

TDDはテスト技法では

ない

Page 78: Emergent Design - ObLove 2009 summer

TDDは品質を

保証しない

Page 79: Emergent Design - ObLove 2009 summer

TDDは品質を向上する

Page 80: Emergent Design - ObLove 2009 summer

TDDは設計技法です

Page 81: Emergent Design - ObLove 2009 summer

テストは目的ではなく手段

Page 82: Emergent Design - ObLove 2009 summer

TDDの真の目的

Page 83: Emergent Design - ObLove 2009 summer

健康

Page 84: Emergent Design - ObLove 2009 summer

変化に対応するのは健康体のコード

Page 85: Emergent Design - ObLove 2009 summer

変化に対応するのは健康体のチーム

Page 86: Emergent Design - ObLove 2009 summer

不安の克服健康の維持

Page 87: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 88: Emergent Design - ObLove 2009 summer

“TDD done strictly from the YAGNI principle leads to an

architectural meltdown around iteration three.”

TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ

が破綻するであろう

Jim CoplienBob Martin

Page 89: Emergent Design - ObLove 2009 summer

誤解を解く•全てのコードをゼロから書くわけではない•BDUF - ENUF - YAGNI•スタートでもゴールでもある

Page 90: Emergent Design - ObLove 2009 summer

見えているのに?•「目配せ」と「快晴」•Simple と Naive•経験と叡知•内なる声を聴く

Page 91: Emergent Design - ObLove 2009 summer
Page 92: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 93: Emergent Design - ObLove 2009 summer

私たちが気付くのはいつ?

Page 94: Emergent Design - ObLove 2009 summer

何が変わる?•外が変わる•市場•技術

•内が変わる•学び•よりよいアイデア

Page 95: Emergent Design - ObLove 2009 summer

フィードバック学びを

否定しない

Page 96: Emergent Design - ObLove 2009 summer

計画する計画し続ける

Page 97: Emergent Design - ObLove 2009 summer

設計する設計し続ける

Page 98: Emergent Design - ObLove 2009 summer

Emergent Design is the process of evolving systems in response to changing requirements, better understanding of existing requirements, and in response to new opportunities that arise from new technology, better ideas, and a changing world.

創発的設計とは仕様の変更や、既存の仕様のより深い理解、また新たな技術、よりよいアイデア、環境の変化などに適応してシステムを進化させるプロセスである

創発的設計とは

Page 99: Emergent Design - ObLove 2009 summer

第二部ピラミッドに入る/戻る

Page 100: Emergent Design - ObLove 2009 summer

Emergent Design

Test Driven Development

Refactoring

Pattern Driven Development

Code Qualities

Principles Practices PathologiesWisdom

Unit Testing PatternsReality Bites現実は厳しい

Page 101: Emergent Design - ObLove 2009 summer

Reality bites•スタート地点の違い•テストが無い•データが既に入っている

•量、記憶、変化、プレッシャー

Page 102: Emergent Design - ObLove 2009 summer

既にテストのないコードが沢山ある

Page 103: Emergent Design - ObLove 2009 summer
Page 104: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

パターン

プラクティス 病理学

Page 105: Emergent Design - ObLove 2009 summer
Page 106: Emergent Design - ObLove 2009 summer

Edit and Pray

Page 107: Emergent Design - ObLove 2009 summer

Cover and Modify

Page 108: Emergent Design - ObLove 2009 summer

既にデータの入ったデータベースがある

Page 109: Emergent Design - ObLove 2009 summer
Page 110: Emergent Design - ObLove 2009 summer
Page 111: Emergent Design - ObLove 2009 summer

データと戦う•データベースもリファクタリングする•本気度が高い•長いリファクタリング期間

Page 112: Emergent Design - ObLove 2009 summer

テストのParadox

Page 113: Emergent Design - ObLove 2009 summer

テストが増えるとリファクタリングが面倒くさくなる

Page 114: Emergent Design - ObLove 2009 summer

FragileTests

Page 115: Emergent Design - ObLove 2009 summer

実装に依存しすぎ

Page 116: Emergent Design - ObLove 2009 summer

コード変えたらテストが真っ赤

Page 117: Emergent Design - ObLove 2009 summer

Slow Tests

Page 118: Emergent Design - ObLove 2009 summer

テストが遅すぎる

Page 119: Emergent Design - ObLove 2009 summer

なぜかテストが足枷に

Page 120: Emergent Design - ObLove 2009 summer
Page 121: Emergent Design - ObLove 2009 summer

テストがリファクタリング支えるのではなかったのか?

Page 122: Emergent Design - ObLove 2009 summer
Page 123: Emergent Design - ObLove 2009 summer
Page 124: Emergent Design - ObLove 2009 summer

テストの量と戦う

•減らす•速くする•関連を明らかにする

Page 125: Emergent Design - ObLove 2009 summer

テストの価値の軸•速さ•実装との距離•コードの重複率•ドキュメントとしての価値

Page 126: Emergent Design - ObLove 2009 summer

自分の記憶力と戦う•意図を伝えるコード•意図を伝える名前•意図を伝える構造•コメント(Why / Why not)

Page 127: Emergent Design - ObLove 2009 summer

テストの資産価値

Page 128: Emergent Design - ObLove 2009 summer

攻め続けるためのテスト

Page 129: Emergent Design - ObLove 2009 summer

なるべく実装に

依存しない

Page 130: Emergent Design - ObLove 2009 summer

リファクタリングを支えるテストが

良いテスト

Page 131: Emergent Design - ObLove 2009 summer

TDDと黄金の回転

きれい

汚い

(すぐには)動かない 動作する

Red

Green

Refactoring

Page 132: Emergent Design - ObLove 2009 summer

テストの資産運用

Page 133: Emergent Design - ObLove 2009 summer

役割と寿命

Page 134: Emergent Design - ObLove 2009 summer

1.価値の低いテストの価値を高める

Page 135: Emergent Design - ObLove 2009 summer

テストのリファクタリング

Page 136: Emergent Design - ObLove 2009 summer
Page 137: Emergent Design - ObLove 2009 summer

2.価値の低いテストを捨て、高いテ

ストを残す

Page 138: Emergent Design - ObLove 2009 summer

テストを減らす

Page 139: Emergent Design - ObLove 2009 summer

そこでカバレッジ

Page 140: Emergent Design - ObLove 2009 summer

AのカバレッジがBのカバレッジを内包するとき、テストB は消せる

Page 141: Emergent Design - ObLove 2009 summer

まとめ

Page 142: Emergent Design - ObLove 2009 summer

創発的設計

テスト駆動開発

リファクタリング

パターン駆動開発

コードの質

原則叡知

ユニットテスト パターン

プラクティス 病理学

Page 143: Emergent Design - ObLove 2009 summer

きれい

汚い

(すぐには)動かない 動作する

Red

Green

Refactoring

TDDと黄金の回転

Page 144: Emergent Design - ObLove 2009 summer
Page 145: Emergent Design - ObLove 2009 summer
Page 146: Emergent Design - ObLove 2009 summer

おわりに

Page 147: Emergent Design - ObLove 2009 summer

TDDはスキルです• テストやTDDはスキルです。つまり…• 才能ではなく、習得可能です• 量は質に転化します• 写経!!

Page 148: Emergent Design - ObLove 2009 summer

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