Copeが教えてくれた、TDD否定派論文の紹介

来日中の James O. Coplien と話をする機会があり、いまTDDをクライアントに推薦していると話したら目を剥いて "Are you still doing TDD!?" と詰め寄られ、TDDの問題について大変熱烈に語ってくれました(ディスカッションをした体ではあるんだけど、だいたい10対0くらいで押されてました)。

Cope はその後、丁寧にfacebook上にもTDDの話を書いてくれました。ここで読めます。

さらにメールで、TDDの問題を指摘した論文などをいくつか教えてくれたのでした。そこで紹介してもらった論文を、自分の理解の整理も兼ねて、サマリをしてみようと思います。とりあえず1つだけですけど。

"A Comparative Case Study on the Impact of Test-Driven Development on Program Design and Test Coverage" Maria Siniaalto and Pekka Abrahamsson, Empirical Software Engineering and Measurement, 2007.

論文はこちらですが、有料です。

内容について誤解や勘違いをしている部分もあるかもしれません。ご了承ください。

大きく2つの研究をしている論文です。1つめは、TDDに関する既存の15の研究を整理して、まとめるというもの。もう1つは、TDDと非TDDでそれぞれ実験プロジェクトを実施し、書かれたプログラムの設計とテストカバレッジを評価して、TDDの効果を測定するものです。

この研究をおこなった背景として、TDDの効果はいろいろ謳われているが、定量的に測定して比較しているものが少ないと述べられています。2つめの研究で、そうした定量的な結果を出しているのが重要な点です。

前半では既存の研究の評価をしています。個々の研究結果としては、TDDに好意的な結果が出ているものが多いものの、一般化できるのか、意味があるほど大きな効果なのかは明らかでないと結論しています。品質については確かな効果があります。一方生産性についてはポジティブ、ネガティブどちらの結果もあります。

後半では、TDDが設計に寄与する効果について、定量的な評価をおこなっています。ここからがこの論文の本当に面白いところです。実ユーザー向けのプロジェクトを3つ、2つ(Case1, 2)は非TDD、1つ(Case3)はTDDで実施し、結果をメトリックスで評価しています。

プロジェクトはそれぞれ4〜5名の開発者がおり、いずれもJavaで、9週間の期間(同時ではない)、アジャイル開発プロセスで実施しました。非TDDの2つは実務経験者ですが、TDDは学生です。論文では、TDDのメンバーも非TDDのメンバーと同等のスキルがあると考えられると補足しています。

肝心の結果ですが、LCOM* (Lack of Cohesion in Methods)についてTDDのほうが悪い結果が出ています。CBO (Coupling between Object Classes)ではTDDが若干良い結果を出しているものの、大きな違いはありません。さらに他に4つのメトリックス(WMC, DIT, NOC, RFC)を計測していますが、こちらも特に差がありません。またテストのカバレッジはTDDのほうが良い結果が出ています。

LCOM*でTDDのほうが悪い結果が出ていることについて、論文では、TDDさえ使えば自動的に凝集度の高い設計になるわけではなく、経験の浅い開発者がTDDだけを使っても良い結果が得られるとは限らないと述べています。また同時に、実験そのものと分析にも、まだ不十分な点があることも認めています。

感想

TDDさえ実践すれば素晴らしい設計ができるとは言えません。論文はそのことを示していますし、実際の経験とも合っています。リファクタリングしなきゃ、というのはもちろん言えますけれど、リファクタリングだって上手下手があるし、前提知識は重要です。同時に、TDDを使ってもメトリクス上はほとんどメリットを示さないというのも、興味深いところです。

TDDだけではだめで、レッド-グリーン-リファクタリングを地道にやるだけでもだめかもしれなくて、じゃあ何が必要なのか。TDDでよい結果を出すには、他にどんな知識やスキルやノウハウがあるといいのか。そのへんを含めた「よいTDD」とはどんなものなのか。そこを探究しないといけないなあと思うのです。(おっと、TDD研究会の話の戻ってきそうだぞ。)

研究としては、TDDを1プロジェクトでしか実施しておらず、メンバーの構成も均等とは言えず、結果を一般化することはできないように思います。複数のプロジェクトでメンバーを「均等」にするというのは、いくら実験でもあまり期待できないですし。Copeが別に教えてくれたブログでは、TDDには(少なくとも)4種類あると言っています。「TDDやってます」と言っても、何をしてるのか実はわからない、人によって違うことになります。

で、読んでみたらTDDをそれほど否定している論文ではなかったので、ちょっと拍子抜けしているところです。ほかにもあるので、ちゃんと読まなくちゃ。