Download - Emergent Design - ObLove 2009 summer
テスト駆動開発者は3周目に死ぬのか
和田 卓人 (a.k.a id:t-wada)Jul, 7th 2009 @ object club
自己紹介
自己紹介名前: 和田 卓人 (わだ たくと)
ブログ: http://d.hatena.ne.jp/t-wada
メール: [email protected]
Twitter: http://twitter.com/t_wada
タワーズ・クエスト株式会社 取締役社長
これまで書いたものWEB + DB PRESSvol.35 「実演! テスト駆動開発」vol.37 「実演! リファクタリング」vol.42 「REST特集」vol.49 「DRY特集」LifeHacks PRESSオープンソースマガジン(リレーコラム)他いろいろ
gihyo.jpの連載『[動画で解説]和田卓人の“テスト駆動開発”講座』http://gihyo.jp/dev/serial/01/tdd/全20回すべて動画付き解説ニコニコ動画でも見れます
WEB+DB過去記事の特設サイトと動画も
デベロッパーテスティング・ライブ - 自信を持ってコードを書くための心・技・体 -
【徹底討論】テストなんていらない?! -テストを、どこまでやるべきか?
パネルディスカッション:テストを行うこと、テストを続けること
デブサミ
よろしくおねがいします
今日喋ること
•ピラミッドを組み上げる•ピラミッドの中に入る(戻る)•黄金の回転について
“TDD done strictly from the YAGNI principle leads to an
architectural meltdown around iteration three.”
TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ
が破綻するであろう
“TDD done strictly from the YAGNI principle leads to an
architectural meltdown around iteration three.”
TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ
が破綻するであろう
Jim CoplienBob Martin
第一部ピラミッドを組み上げる
Emergent Design
Test Driven Development
Refactoring
Pattern Driven Development
Code Qualities
Principles Practices PathologiesWisdom
Unit Testing Patterns
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
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.
創発的設計とは仕様の変更や、既存の仕様のより深い理解、また新たな技術、よりよいアイデア、環境の変化などに適応してシステムを進化させるプロセスである
創発的設計とは
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Code Quality解析容易性変更容易性安定性テスト容易性
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Pathologies
名前を付けるのが難しい長いテストコード長いプロダクトコード/メソッド
(例)凝集度不足
•パターンへ昇華•Anti-Patterns•リファクタリングの兆し•Code Smells
Pathologies
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Wisdom先人の知恵“巨人の肩”c2.comFLOSS
藤野さん平鍋さん天野さん懸田さん矢崎さん小井土さん福井さん井上樹さん河合さん佃さん
中谷さん平澤さん梅澤さん友野さん長瀬さん金澤さん浅海さん原田洋子さん萩本さん伊藤さん
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Principles
Single ResponsibilityOpen-ClosedLiscov SubstitutionInterface SegregationDependency Inversion
SOLID Principle
Don’t Repeat YourselfLaw of Demeter
Principles
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Practices
スタイル名前道具
バージョン管理テスティング
自動化
バージョン管理
テスティング
自動化自働化
XFD
詳しくは小井土さんセッションで
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
バージョン管理テスティング
自動化
テストの分類
DeveloperTesting
開発者
開発促進
CustomerTesting
顧客(のロール)
進捗管理
QATesting
品質保証担当者
(のロール)
品質保証
「テスト」
Developer Testingとは
•プログラマの•プログラマによる•プログラマのための•プログラムとしてのテストを書きながら•開発を行っていく手法
xUnit
バグ発見とコスト
•即座にフィードバックを得るため•書いたコードに自信を持つため•これから書くコードに自信を持つため
Developer Testing にソフトウェア工学的なメリットはいろいろあるけれど、最大の理由は工学的なものではない。最大の理由は心理的なもの
どこをテストすべき?
デバッガじゃだめなの?
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
リファクタリング(名)
外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること
リファクタリング(動)
一連のリファクタリングを行って、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること
理解や修正のために•コードを理解しやすく•コードを修正しやすく•コードをシンプルにすることが、シンプル設計への道
リファクタリング•ボトムアップ設計の核•全ての中でリファクタリングだけが、物事を後から改善できる•「向き」が大事
リファクタリングに終わりはあるのか?
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
Patterns
語彙形式共有
(例)Facade
Context外部要因に依存する複雑なサブシステ
ムがある
Force複雑化する内部実装に依存しないよう
にしたい
SolutionFacade Patternを導入し、シンプルな
interfaceの背後に複雑な内部を隠蔽する
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
TDDとは1. テストを書き2. そのテストを実行して失敗させ(Red)3. 目的のコードを書き4. 1で書いたテストを成功させ(Green)5. テストが通るままでリファクタリングを行う(Refactor)
6. 1~5を繰り返す
• 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
TDDのこころ
一つずつ少しずつ
ひとりずつ対処する。
複数を相手にしない。
動作する、きれいなコードへ
きれい
汚い
(すぐには)動かない 動作する
二つの道がある
すばやくまわす
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
TDDと黄金の回転
自分が最初のユーザ
不安をテストに
ボールはひとつ
TDDはテスト技法では
ない
TDDは品質を
保証しない
TDDは品質を向上する
TDDは設計技法です
テストは目的ではなく手段
TDDの真の目的
健康
変化に対応するのは健康体のコード
変化に対応するのは健康体のチーム
不安の克服健康の維持
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
“TDD done strictly from the YAGNI principle leads to an
architectural meltdown around iteration three.”
TDD を YAGNI 原則に則って厳格に行うならば、3イテレーション目でアーキテクチャ
が破綻するであろう
Jim CoplienBob Martin
誤解を解く•全てのコードをゼロから書くわけではない•BDUF - ENUF - YAGNI•スタートでもゴールでもある
見えているのに?•「目配せ」と「快晴」•Simple と Naive•経験と叡知•内なる声を聴く
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
私たちが気付くのはいつ?
何が変わる?•外が変わる•市場•技術
•内が変わる•学び•よりよいアイデア
フィードバック学びを
否定しない
計画する計画し続ける
設計する設計し続ける
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.
創発的設計とは仕様の変更や、既存の仕様のより深い理解、また新たな技術、よりよいアイデア、環境の変化などに適応してシステムを進化させるプロセスである
創発的設計とは
第二部ピラミッドに入る/戻る
Emergent Design
Test Driven Development
Refactoring
Pattern Driven Development
Code Qualities
Principles Practices PathologiesWisdom
Unit Testing PatternsReality Bites現実は厳しい
Reality bites•スタート地点の違い•テストが無い•データが既に入っている
•量、記憶、変化、プレッシャー
既にテストのないコードが沢山ある
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
パターン
プラクティス 病理学
Edit and Pray
Cover and Modify
既にデータの入ったデータベースがある
データと戦う•データベースもリファクタリングする•本気度が高い•長いリファクタリング期間
テストのParadox
テストが増えるとリファクタリングが面倒くさくなる
FragileTests
実装に依存しすぎ
コード変えたらテストが真っ赤
Slow Tests
テストが遅すぎる
なぜかテストが足枷に
テストがリファクタリング支えるのではなかったのか?
テストの量と戦う
•減らす•速くする•関連を明らかにする
テストの価値の軸•速さ•実装との距離•コードの重複率•ドキュメントとしての価値
自分の記憶力と戦う•意図を伝えるコード•意図を伝える名前•意図を伝える構造•コメント(Why / Why not)
テストの資産価値
攻め続けるためのテスト
なるべく実装に
依存しない
リファクタリングを支えるテストが
良いテスト
TDDと黄金の回転
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
テストの資産運用
役割と寿命
1.価値の低いテストの価値を高める
テストのリファクタリング
2.価値の低いテストを捨て、高いテ
ストを残す
テストを減らす
そこでカバレッジ
AのカバレッジがBのカバレッジを内包するとき、テストB は消せる
まとめ
創発的設計
テスト駆動開発
リファクタリング
パターン駆動開発
コードの質
原則叡知
ユニットテスト パターン
プラクティス 病理学
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
TDDと黄金の回転
おわりに
TDDはスキルです• テストやTDDはスキルです。つまり…• 才能ではなく、習得可能です• 量は質に転化します• 写経!!
ご清聴ありがとうございました