Emergent Design - ObLove 2009 summer

Preview:

DESCRIPTION

Emergent Design, at Object Club 2009 summer

Citation preview

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

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

自己紹介

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

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

メール: takuto.wada@towersquest.jp

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

スタイル名前道具

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

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

自動化

バージョン管理

テスティング

自動化自働化

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はスキルです。つまり…• 才能ではなく、習得可能です• 量は質に転化します• 写経!!

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

Recommended