SlideShare a Scribd company logo
1 of 30
Download to read offline
レガシーコードで
TDD力を高めよう!!
Agile Samurai Base Camp Re:TDD
2014/4/20
@PoohSunny
● 海外チームと新サービスの立ち上
げに奮闘中。
● 『レガシーコード改善ガイド』が座
右の書
● 「テストがないコードはレガシー
コードだぁっ!!」ってのがちょっ
と前まで口癖
はじめに
今日一日おつかれさまー!
挙手!
今日TDDを体感してみて
「明日からTDDやってみたい
なー」
って思った人!
挙手!
今日TDDを体感してみて
「明日から現場でTDDできそう
だ!」
って思った人!
実践できる?
現場でいきなり
使うのは
なかなか難しい
なんで?
レガシーコード
● 一部の変更が全てに影響
○ ジェンガ / スパゲッティ
○ 動いているコードに触るな!
○ Edit & Pray(変更して祈る)
● テストが書きにくい構造
○ 実践しようにも...
このままではイベントの目的が...
テスト駆動開発はソフトウェアの質を確
実に向上させ、日々の成果に直結し
ています。これもエンジニアひとりから
明日から始めることができます。
Agile Samurai Base CampのHP
というわけで今日は
レガシーコードでもTDDの実践するに
はどうしたらいいのか、
という最初の一歩の話しまーす
(経験談)。
今日の話の対象
✕ レガシーコードをTDDで
改善しよう
○ レガシーコードで自分の
TDD力高めよう
○ 実現までの時間が結構かか
る
○ 仲間が必要
○ 「TDDから」が最適解とは限り
ません
レガシーコードって?
私の出会ったレガシーコード
● これはEclipseの画面の右端です。
● 行数を想像してみてください
○ Javaです。
○ ざっと数万行です(てへぺろ)
● 青→とある変数にカーソルを当ててみた
○ 長寿の変数
私の出会ったレガシーコード(フィクションです)
public void legacyMethod(boolean flag1, boolean flag2, HttpServletRequest request){
String code = (String) request.getAttribute("code");
String action = (String) request.getAttribute("action");
List<TargetData> datas = new TargetDataDAO().getTargetData(code);
if (action == "1") {
if (datas != null && datas.size() != 0) {
for (TargetData data : datas) {
if ((data.getId() != null && !data.getName() == "") || data.getId == null)
{
request.setAttribute("data", data);
}
}
引数が多い!
DBアクセスが近
い
ワイド画面でも足
りないifネスト
継ぎ足しされた秘
伝のif条件
一体どうTDDしろと...
● どこからテスト書く?
● いつテスト書く?
● テストが先かリファクタが先か問題
○ テストがしやすいように内部構造を変える
私が(当時)考えたこと
● テスト書こうとしてバグるのはダメ!
○ モチベーション下がる
○ 変更が怖くなる
○ 痛みを伴うのはしんどい!
● まずは小さいところから
○ 大胆な構造改革は仲間が増えてからやろう
● 美味しそうなところをやる
オススメパターン
不具合に
テストを書いて
立ち向かう
和田 卓人
手順(引用)
1. 手元で不具合を再現させる。
2. コードを注意深く調べ、不具合を発生させている
最小の部分を絞り込む。
3. 最小レベルで不具合を再現させ、不具合が修
正されたら通るような自動テストコードを書く。
4. 3.で書いたテストコードを実行し、落ちることを確
認する。
手順(引用)
5. 不具合を修正する。
6. 3で書いたテストコードが通ることを確認する。
7.既存の全てのテストを実行し、不具合修正が他
の部分を壊していないことを確認する。
手順(対レガシーコード)
1. 手元で不具合を再現させる
2. コードを注意深く調べ、不具合を発生させている
最小の部分を絞り込む
3. 最小部分をくくりだす。
4. くくりだした部分にテストを書く。
5. テストを書いたところをリファクタリングする。
6. 最小レベルで不具合を再現させ、~以下同じ
TDDしたい箇所をくくりだす。
● スプラウトメソッド、とか呼ばれる手法
○ メソッドの抽出リファクタを実行してみる
○ そこにテストを書く
最初はif条件文にやるとやりやすい
if ((data.getId() != null && !data.getName() == "") || data.getId
== null) {
if (shouldSetAttribute(data)) {
(略)
public void shouldSetAttribute(TargetData data){
return (data.getId() != null && !data.getName() == "") || data.
getId == null;
}
テストを書いてリファクタリング
if (shouldSetAttribute(data)) {
public void shouldSetAttribute(TargetData data){
return (data.getId() != null && !data.getName() == "") || data.getId == null;
}
public void shouldSetAttribute(TargetData data){
if (data.getId == null) return true;
return !"".equals(data.getName())
}
効果
● 多くのフィードバックを得られる
○ 名付けはメソッド名は適切?
○ もっとテストしやすい引数にできない?
○ もっと読みやすくできない?
● バグったところはまたバグりやすい
○ 「あなたのこのまえの修正、デグレ起こしてるっぽ
いですよ(ドヤッ)」
悩ましいポイント
● 大きいメソッドだと難しい
○ 本当に不安な部分にテコ入れできない
● モチベーション管理が難しい
○ 誰かが地雷を踏むまでは一定時間かかる
○ それまで効果があるのかが見えにくい
対策:もっと大くくりでテストできない?
● DBアクセスがいっぱいあってしんどい?
=> DBアクセスしてテストしてみたら?
● 画面からの情報が多くてしんどい?
=> 画面の自動テストしてみたら?
結果
● 頑張ればテストは書ける!状態
○ 安心・健康
○ 仲間が増える(社内)
○ より大きな構造改革
● スキルアップ
○ 知らないことをもっと知りたい!という好循環
○ 仲間が増える(社外)
まとめ(言いたかったこと)
● レガシーコードでも、工夫次
第でTDDできるよ!
● もし悩みがあれば、みんなで
共有しよう!
駆け足すぎた?
質問お待ちしてます!
(もっと突っ込んで話したいこともあったし、質
問してもらえるとそういうのにも答えられたりす
るかと。)
みんな無理せずレガシーコード改善やろうぜ!
おしまい。
質問お待ちしていますー!

More Related Content

What's hot

TddカンファレンスLT
TddカンファレンスLTTddカンファレンスLT
TddカンファレンスLTkyon mm
 
ペアプログラミング ホントのところ
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところTakuto Wada
 
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜Keisuke Utsumi
 
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたTakuya Kawabe
 
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめKei Sawada
 
Ninja Testing at XP Matsuri
Ninja Testing at XP MatsuriNinja Testing at XP Matsuri
Ninja Testing at XP MatsuriNakajima Shigeru
 
俺とInstant team building
俺とInstant team building俺とInstant team building
俺とInstant team buildingMasayuki KaToH
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前にYasui Tsutomu
 
CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料Yasui Tsutomu
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころTakuto Wada
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2Masashi Shibata
 
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会Keisuke Utsumi
 
Hey It's Not My TDD!
Hey It's Not My TDD!Hey It's Not My TDD!
Hey It's Not My TDD!Yasui Tsutomu
 
GDDでPlayNを見てゾクっとしたなど
GDDでPlayNを見てゾクっとしたなどGDDでPlayNを見てゾクっとしたなど
GDDでPlayNを見てゾクっとしたなどTakao Sumitomo
 
俺のインセプションデッキ【Remaster版】
俺のインセプションデッキ【Remaster版】俺のインセプションデッキ【Remaster版】
俺のインセプションデッキ【Remaster版】Takao Oyobe
 
単体テストのすゝめ
単体テストのすゝめ単体テストのすゝめ
単体テストのすゝめLi Satoshi
 
20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devloveTakao Oyobe
 

What's hot (20)

TddカンファレンスLT
TddカンファレンスLTTddカンファレンスLT
TddカンファレンスLT
 
ペアプログラミング ホントのところ
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところ
 
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
プロト〜サービスアウトまでの開発支援ツールの作り方〜CrystalFantasia〜
 
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみましたぐるぐるDDD(ドメイン駆動設計)に参加してみました
ぐるぐるDDD(ドメイン駆動設計)に参加してみました
 
Ciecleci
CiecleciCiecleci
Ciecleci
 
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめTDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
TDDを実践してわかったTDDつまづくあるあると自分なりの乗り越え方まとめ
 
Ninja Testing at XP Matsuri
Ninja Testing at XP MatsuriNinja Testing at XP Matsuri
Ninja Testing at XP Matsuri
 
俺とInstant team building
俺とInstant team building俺とInstant team building
俺とInstant team building
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前に
 
CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2テスト駆動開発入門 - C4K Meetup#2
テスト駆動開発入門 - C4K Meetup#2
 
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
 
簡単!Groovy入門
簡単!Groovy入門簡単!Groovy入門
簡単!Groovy入門
 
Hey It's Not My TDD!
Hey It's Not My TDD!Hey It's Not My TDD!
Hey It's Not My TDD!
 
GDDでPlayNを見てゾクっとしたなど
GDDでPlayNを見てゾクっとしたなどGDDでPlayNを見てゾクっとしたなど
GDDでPlayNを見てゾクっとしたなど
 
はじめてのTDD
はじめてのTDDはじめてのTDD
はじめてのTDD
 
俺のインセプションデッキ【Remaster版】
俺のインセプションデッキ【Remaster版】俺のインセプションデッキ【Remaster版】
俺のインセプションデッキ【Remaster版】
 
単体テストのすゝめ
単体テストのすゝめ単体テストのすゝめ
単体テストのすゝめ
 
20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove20141108 俺のエンジニアリング #devlove
20141108 俺のエンジニアリング #devlove
 

Similar to レガシーコードでTDD力を高めよう #agilesamurai

TDD、ペアプログラミングのすすめ
TDD、ペアプログラミングのすすめTDD、ペアプログラミングのすすめ
TDD、ペアプログラミングのすすめKyota Yasuda
 
新人がTDDを学ぶ方法
新人がTDDを学ぶ方法新人がTDDを学ぶ方法
新人がTDDを学ぶ方法Ito Kunihiko
 
Dev love関西 レガシーコードへの取り組み 20140325
Dev love関西 レガシーコードへの取り組み 20140325Dev love関西 レガシーコードへの取り組み 20140325
Dev love関西 レガシーコードへの取り組み 20140325Seiichi Sugahara
 
ゆるLTのススメ+α
ゆるLTのススメ+αゆるLTのススメ+α
ゆるLTのススメ+αjoker1007
 
20150715 『続・断捨離』TDDの心得編
20150715 『続・断捨離』TDDの心得編20150715 『続・断捨離』TDDの心得編
20150715 『続・断捨離』TDDの心得編nackypon
 
nseg第5回勉強会
nseg第5回勉強会nseg第5回勉強会
nseg第5回勉強会ko ty
 
20141213 俺のインセプションデッキ #agilesamurai
20141213 俺のインセプションデッキ #agilesamurai20141213 俺のインセプションデッキ #agilesamurai
20141213 俺のインセプションデッキ #agilesamuraiTakao Oyobe
 
my-spirit-of-tdd
my-spirit-of-tddmy-spirit-of-tdd
my-spirit-of-tddYu Asano
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Koichiro Matsuoka
 
OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島Tomohiko Himura
 
改善したほうがいい私の7つの開発習慣
改善したほうがいい私の7つの開発習慣改善したほうがいい私の7つの開発習慣
改善したほうがいい私の7つの開発習慣Noriaki Kadota
 
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-nishio
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
DevRel Meetupのおかげで転職した話
DevRel Meetupのおかげで転職した話DevRel Meetupのおかげで転職した話
DevRel Meetupのおかげで転職した話Daizen Ikehara
 
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!Takuya Sato
 
May the team be with you(episode2)
May the team be with you(episode2)May the team be with you(episode2)
May the team be with you(episode2)Koutarou Ishizaki
 
Pull Request & TDD 入門
Pull Request & TDD 入門Pull Request & TDD 入門
Pull Request & TDD 入門ESM SEC
 
いつでも聞けるTDD入門 #TDDBC_NAGOYA
いつでも聞けるTDD入門 #TDDBC_NAGOYAいつでも聞けるTDD入門 #TDDBC_NAGOYA
いつでも聞けるTDD入門 #TDDBC_NAGOYAkyon mm
 

Similar to レガシーコードでTDD力を高めよう #agilesamurai (20)

TDD、ペアプログラミングのすすめ
TDD、ペアプログラミングのすすめTDD、ペアプログラミングのすすめ
TDD、ペアプログラミングのすすめ
 
新人がTDDを学ぶ方法
新人がTDDを学ぶ方法新人がTDDを学ぶ方法
新人がTDDを学ぶ方法
 
Dev love関西 レガシーコードへの取り組み 20140325
Dev love関西 レガシーコードへの取り組み 20140325Dev love関西 レガシーコードへの取り組み 20140325
Dev love関西 レガシーコードへの取り組み 20140325
 
ゆるLTのススメ+α
ゆるLTのススメ+αゆるLTのススメ+α
ゆるLTのススメ+α
 
20150715 『続・断捨離』TDDの心得編
20150715 『続・断捨離』TDDの心得編20150715 『続・断捨離』TDDの心得編
20150715 『続・断捨離』TDDの心得編
 
nseg第5回勉強会
nseg第5回勉強会nseg第5回勉強会
nseg第5回勉強会
 
Sue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hackSue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hack
 
20141213 俺のインセプションデッキ #agilesamurai
20141213 俺のインセプションデッキ #agilesamurai20141213 俺のインセプションデッキ #agilesamurai
20141213 俺のインセプションデッキ #agilesamurai
 
my-spirit-of-tdd
my-spirit-of-tddmy-spirit-of-tdd
my-spirit-of-tdd
 
Gunmaweb #9 LT
Gunmaweb #9 LT Gunmaweb #9 LT
Gunmaweb #9 LT
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
 
OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島
 
改善したほうがいい私の7つの開発習慣
改善したほうがいい私の7つの開発習慣改善したほうがいい私の7つの開発習慣
改善したほうがいい私の7つの開発習慣
 
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
DevRel Meetupのおかげで転職した話
DevRel Meetupのおかげで転職した話DevRel Meetupのおかげで転職した話
DevRel Meetupのおかげで転職した話
 
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!
 
May the team be with you(episode2)
May the team be with you(episode2)May the team be with you(episode2)
May the team be with you(episode2)
 
Pull Request & TDD 入門
Pull Request & TDD 入門Pull Request & TDD 入門
Pull Request & TDD 入門
 
いつでも聞けるTDD入門 #TDDBC_NAGOYA
いつでも聞けるTDD入門 #TDDBC_NAGOYAいつでも聞けるTDD入門 #TDDBC_NAGOYA
いつでも聞けるTDD入門 #TDDBC_NAGOYA
 

More from Youtarou TAKAHASHI

Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Youtarou TAKAHASHI
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbYoutarou TAKAHASHI
 
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornightYoutarou TAKAHASHI
 
ペアプロデモの裏話 #tddbc
ペアプロデモの裏話 #tddbcペアプロデモの裏話 #tddbc
ペアプロデモの裏話 #tddbcYoutarou TAKAHASHI
 
TDDでレガシーコードに立ち向かう
TDDでレガシーコードに立ち向かうTDDでレガシーコードに立ち向かう
TDDでレガシーコードに立ち向かうYoutarou TAKAHASHI
 
Db unitを使って なれる! レガシーコードメンテナー
Db unitを使って なれる! レガシーコードメンテナーDb unitを使って なれる! レガシーコードメンテナー
Db unitを使って なれる! レガシーコードメンテナーYoutarou TAKAHASHI
 

More from Youtarou TAKAHASHI (8)

Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorb
 
すし × TDD #sushiruit
すし × TDD #sushiruitすし × TDD #sushiruit
すし × TDD #sushiruit
 
What makes Geb groovy?
What makes Geb groovy?What makes Geb groovy?
What makes Geb groovy?
 
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight
普通のエンジニアがテストエンジニアに助けてもらいたかったこと #automatornight
 
ペアプロデモの裏話 #tddbc
ペアプロデモの裏話 #tddbcペアプロデモの裏話 #tddbc
ペアプロデモの裏話 #tddbc
 
TDDでレガシーコードに立ち向かう
TDDでレガシーコードに立ち向かうTDDでレガシーコードに立ち向かう
TDDでレガシーコードに立ち向かう
 
Db unitを使って なれる! レガシーコードメンテナー
Db unitを使って なれる! レガシーコードメンテナーDb unitを使って なれる! レガシーコードメンテナー
Db unitを使って なれる! レガシーコードメンテナー
 

レガシーコードでTDD力を高めよう #agilesamurai