テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf ·...

41
テスト駆動開発の導入 ーペアプログラミングによる学習効果ー 2012.10.26 JaSST 北海道 渡辺修司 (@shuji_w6e) 1 121012日金曜日

Transcript of テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf ·...

Page 1: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発の導入ーペアプログラミングによる学習効果ー

2012.10.26 JaSST 北海道渡辺修司 (@shuji_w6e)

112年10月12日金曜日

Page 2: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

自己紹介

12年10月12日金曜日

Page 3: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

渡辺 修司Javaプログラマ

株式会社エスプラニング所属

ウェブアプリやデスクトップアプリの開発

テスト駆動開発、ユースケース駆動開発

アジャイル開発

最近の趣味はロードバイクとフットサル

12年10月12日金曜日

Page 4: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

@shuji_w6e札幌 Javaコミュニティ

TDD Boot Camp

やさしいデスマーチ(Blog)

執筆活動

WEB DB Press vol.69

JUnit実践入門(Soon!)CommingSoon!

12年10月12日金曜日

Page 5: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発

12年10月12日金曜日

Page 6: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発とは?テストコードをプロダクションコードより先に記述するテストファーストを実践し、インクリメンタルにソフトウェアを開発する開発手法(TDD: Test Driven Development)

12年10月12日金曜日

Page 7: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発のサイクル1.設計する

2.テストを書く

3.コードを書く

4.テストを成功させる

5.リファクタリング

Heuristics

12年10月12日金曜日

Page 8: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発の目的明確で検証可能な仕様

テスタビリティの高い設計

常にリファクタリング可能

素早いフィードバック

12年10月12日金曜日

Page 9: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ペアプログラミング

12年10月12日金曜日

Page 10: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ペアプログラミングとは?ペアで1つの作業を行うプラクティス

コードを書くドライバーと、ドライバーのサポートをするナビゲーター

定期的な役割の交代

12年10月12日金曜日

Page 11: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ペアプログラミングの効果すべてのコードを2人以上が理解している状態

曖昧な状態でコードが書かれない

ツールの使い方やコードの書き方を学べる

12年10月12日金曜日

Page 12: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

問題

12年10月12日金曜日

Page 13: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

典型的なプロジェクトの流れ(1) 遅れる実装

(2) とりあえずシステムテスト

(3) デバッグ地獄

(4) 後からユニットテスト

(5) 追加開発でリグレッションの発生

12年10月12日金曜日

Page 14: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ぐだぐだになる原因仕様が複雑でなかなか決まらない

納期のプレッシャー

ユニットテストの工数がない

12年10月12日金曜日

Page 15: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ぐだぐだになる本当の原因完成の基準が実装者によって異なる

理解不足のままで実装している

変更に対して脆い

スキル不足

担当機能以外に興味が無い

結合すると動かない

12年10月12日金曜日

Page 16: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

事例

12年10月12日金曜日

Page 17: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

プロジェクトの概要Java のデスクトップアプリケーション

解析エンジン + GUI(Swing)

5-6名で3ヶ月程度の規模

ミッションクリティカルなシステムのデータを解析するツール

12年10月12日金曜日

Page 18: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

導入前カオスなコード

GUIとビジネスロジックが相互依存

シングルトンパターンの乱用

価値のないテストコード

privateメソッドのテスト

少しの変更で通らなくなるテスト

12年10月12日金曜日

Page 19: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

開発手法の改善Tracによるissue管理

外部設計にユースケースを導入

自動化(SVN + Maven + JenkinsCI)

ペアプログラミング

テストファースト(テスト駆動開発)

リファクタリング

12年10月12日金曜日

Page 20: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ペアプログラミングの運用初心者同士ではペアを作らない

2週間を目安にペアを変更

担当個所が偏らないように作業を配分

12年10月12日金曜日

Page 21: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テストファーストの導入必須とはしない

書ける個所はテストを先に書いてみる

「どうテストするか?」を意識する

イメージが沸かない場合は軽く実装する

12年10月12日金曜日

Page 22: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

開発の流れ(1)ナビゲータに実装することを説明する

(2) ナビゲータからの質問に答える

(3) 合意したならば、実装を進める

(4) 適宜ツッコミを受ける

(5) 一区切りついたならば役割をチェンジする

12年10月12日金曜日

Page 23: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

効果

12年10月12日金曜日

Page 24: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

作業時間実装完了時間はほぼ2倍

デバッグ時間は半減

システムテスト後の修正時間は半減

トータルで2-3割増えた程度※慣れてくれば同程度の時間になる可能性

12年10月12日金曜日

Page 25: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

品質不具合の質が変化

システムテスト時の不注意的な欠陥が激減

プロジェクト中盤でも安定して動作

開発期間

欠陥

12年10月12日金曜日

Page 26: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

教育的効果ツールの使い方

コーディングの技報

他人の「考え方」を知ること

多くの事を学べるが、プログラミングを作業と考えていると効果は薄い

12年10月12日金曜日

Page 27: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

考察

12年10月12日金曜日

Page 28: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発とペアプロの効果効果的なユニットテスト

ユニットテストの強制

考えたことを相手に伝えるプロセス

プロジェクトナレッジの共有

プログラマのスキルアップ

12年10月12日金曜日

Page 29: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

効果的なユニットテストCIの導入による素早いフィードバック

プロジェクト終盤での「辻褄合わせ」の減少

「無駄なユニットテスト」の減少

privateメソッドのテスト

インターフェイスを意識したテスト

12年10月12日金曜日

Page 30: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ユニットテストの強制面倒なテストを先に書く

後から書くのはもっと面倒

「動くことを確認するテスト」から「動かすためのテスト」へ

12年10月12日金曜日

Page 31: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

考えたことを相手に伝えるプロセスバグのあるコードは「不安なコード」

自信が無いのでコメントで誤魔化す

コードに落とす前に言語化して伝える

考えが曖昧なままで書かれたコードが減少

コピペするにも考える

会話が増える

12年10月12日金曜日

Page 32: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

プロジェクトナレッジの共有「この機能はXXさんが担当したから解らない」がほとんどなくなる

知見をチームに伝搬させる

担当ではない機能にも興味を持たせる

12年10月12日金曜日

Page 33: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

プログラマのスキルアップコーディング上のテクニック

ツールの使い方

デザインパターン

リファクタリング

問題に対する「考え方」

12年10月12日金曜日

Page 34: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

課題

12年10月12日金曜日

Page 35: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

基礎体力は必要プログラミングスキル

リファクタリング

設計パターン

テストスキル

12年10月12日金曜日

Page 36: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

教育的コスト初心者にとって学べることは多い

プロジェクトのリソースと教育コスト

当然のように教育コストを払ってくれない

余裕のないプロジェクトでは難しい

一時的なメンバーでは効果が薄い

12年10月12日金曜日

Page 37: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

実績と経験者経験者がいないと難しい

ワークショップなどで「素振り」が必要

初心者は経験者と組むことで楽

経験者は思った以上に疲れる

12年10月12日金曜日

Page 38: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

ワークショップのススメ半日から数日のワークショップ

テストファーストとペアプロに慣れる

小さなアプリを作成できると良い

必ずリファクタリングまで回すこと

12年10月12日金曜日

Page 39: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

まとめ

12年10月12日金曜日

Page 40: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

テスト駆動開発( テストファースト)

先に振る舞いを考えることの効果

テスタビリティの高いシンプルな設計

動作するきれいなコード/リファクタリング

ペアプログラミング

スキルの伝搬

プロジェクトナレッジの共有

コミュニケーション

12年10月12日金曜日

Page 41: テスト駆動開発の導入 - JaSSTjasst.jp/symposium/jasst12hokkaido/pdf/S2-3.pdf · 2012-10-31 · テスト駆動開発の導入 ーペアプログラミングによる学習効果ー

質疑応答

12年10月12日金曜日