TDDの経験と現状のアンケート

「TDD(テスト駆動開発)ってどのくらい使われてるんですか?」と聞かれることがあります。それはですね、俺だって知りたいわー!というわけで、「TDDの経験と現状について」というアンケートを作りました。

10/23の段階で83件の回答がありました。ありがとうございます。TDD人気ありますね。中間報告として、これまでの回答を公開したいと思います。始めた時期と現在の状況のグラフです。

回答全体のサマリはこちらで見られます(回答したときに見られるのと同じです)。なお、こちらは随時更新されるので、本エントリの内容と一致しないかもしれません。
https://docs.google.com/forms/d/1pb29VBqO-kd10ks_x9oqvkMUy5rDW4nMoDnBPVM85yc/viewanalytics
※アンケートはまだまだ受付中です。こちらからどうぞ→ http://goo.gl/forms/fbWsZmH3El

分析してみる

2年以上やっている人が50%以上、最近始めた人は意外と少ない(1年以内が10%)という印象です。現状は、「よく使っている」は「以前ほどではない」も含めると約50%です。大雑把に言えば、長く使っている、使い続けている人が相当数いると言えそうです。(ただしアンケートに回答してくれた方が、業界全体(母集団)を偏りなく代表しているという根拠はないので、「いるね」という以上のことは言えませんけれど。)

今回このようなアンケートを採っているのは、TDD本当に使ってるの?意外と辞めちゃってたりしない?と思ったためです。TDDについて(特に今年は)議論がありますが、議論は議論として、現場はどうなのか。

もうひとつ、自分のことを振り返ると、以前ほどTDDしてないなあと思います。それは、コード書いてないから……ごめんなさいごめんなさい。でも書くときでも、やっぱり以前のような100%TDDはやってない。なぜだろうか。思いついた理由は2つです。

  1. 何でもかんでもTDDではなく、効果的に使うポイントがわかるようになった。
    • 例: Webアプリはエンドツーエンドでテストするよね(Selenium Driverとか)
    • 例: 静的データ構造はTDDあんまり意味ないよね
  2. TDDは実は学習のツールだった。今は学習することが減った(コーディングについて)。
    • 例: TDDのおかげでデザインパターンが使えるようになったが、今はTDDなくても使える
    • 例: SQLAlchemyってどう使うんじゃ。TDDスタイルで実験してみよう。

他の人はどうだろう?特に2番の理由ってあり得るんだろうか?この検証が、アンケートのもう一つの狙いです。

期間と使用度合いの相関は?

TDDを始めてからの期間と、現在の使用度合いの関係を調べてみました。こちらが結果のグラフです。

注目したいのはオレンジと赤の部分です。「たまにしか使わない」「以前ほどではない」が、2〜5年のところで増えています(1年以内はデータ数が8件と少ないのでとりあえず無視)。5年以上では「現在もよく使う」が増えていますが、オレンジの「たまにしか使わない」も増えています(グラフだと見難いが、18%→24%→26%)。TDDの経験年数が長いと、「たまにしか使わない」人が増える傾向があるようです(わりと乱暴ですけど)。

さらに、理由も簡単に見てみました。「実装しなくなった」「今の仕事ではTDD困難」など環境要因を除くと、TDDを使う・使わない理由が少し見えてきます。2年以上の回答から、代表的なものをいくつか紹介します。

  • 現在もよく使っているが、以前ほどではない
    • 自明である事とそうでないものの区分けができるようになった。
    • コーディングを進めていき、不安な箇所をTDDする等TDDとのつきあいかたが変わった。
    • 言語スイッチが増え、他言語のユニットテストを調べなければ使えず、コストが高くなった。
    • 最初は勉強や技能の向上を意図して、意識的にTDDを行うようにしていたため使用機会が多かった。現在はではTDDの得意な所、不得意な所がわかるようになり、使い所のみで使うようになっている。
    • 教科書通りにやると疲れるから、最低限のテストコードで、最大限の効果を出すようになっただけ
  • 現在はたまにしか使わない
    • 概ね"TDD is Dead"に書かれている通りです。Railsで開発(略)という事情もあるかもしれませんが、以前ほどUnitTestをTestFirstで書くといったことはなくなりました。今は、(略)UnitTestを書くのは仕様が複雑なModelの処理の場合のみ(略) ただ、教育的な意味合いで、初めはしっかりUnitTestを書いてください、と指導することはあるので、スキルの土台としてのTDDは必要という認識です。
    • TDDを用いたときの設計の勘所が自然と意識できるようになったこと
    • 統合テストを重視するようになり、そちらにテストを書くというコストをかけるようになったため
    • 全てをTDDのサイクルに乗せるとスケジュール的な無理が生じる場合が有る。
    • ソフトウェアの寿命が短くなって頻繁に変更しない部分にまでテストを書くメリットがなくなったので抜き気味にやっている。
    • TDDが有効な場ではTDDで開発しますし、そうでないなら別のアプローチを使います。適材適所。
  • 現在はまったく使わない
    • どんなクラスのI/Oにすれば良いか定まらないまま実装を始めてしまうため。区切りがよくなるまで(I/Oが定まるまで)xUnitは書いていない。
    • いざ製造を始めると設計不備による仕様変更が多発するため、テストを先に作っておくと手戻りが多すぎる。
    • モックの記述が非常に面倒。モジュール中のどのメソッドが何回目に呼ばれて何を返すとか、製造終了まで分かる訳がない。
    • テストが動けばいいやというコーディングスタイルが蔓延し、バグが多発した。

(なお回答の生データのリンクを末尾に載せています。ここにない理由含め、全回答がそのまま見られます。)

また、理由をカテゴリに分類して分布を調べてみました。

理由 2〜5年前 5年以上前
環境 6 (75%) 2 (25%) 8 (100%)
適所 4 (40%) 6 (60%) 10 (100%)
棄却 1 (50%) 1 (50%) 2 (100%)
不明 6 (100%) 0 (0%) 6 (100%)

対象は、現状が「以前ほどは使わない」「たまにしか使わない」「まったく使わない」の回答です。表のパーセント表記は、横方向に加えると100%になるような計算です。分類は以下の定義で、主観で判断しました。

環境
TDDができない製品、職場環境である。実装をしなくなった。など
適所
いつ、どういうときにTDDをするか判断する(結果TDDしないこともある)。
棄却
TDDを理解した上で、現状では役に立たないと判断している。
不明
それ以外、分類できない、回答なし

以上、中間報告でした。アンケート自体はまだまだ回答を受け付けています。データが増えればまたお知らせしたいと思います。

※アンケートはまだまだ受付中です。まだの方はぜひどうぞ!→ http://goo.gl/forms/fbWsZmH3El

またTDDの現状について情報やコメントがあれば、教えてください。

詳細なアンケート結果(閲覧のみ; 随時更新)
https://docs.google.com/spreadsheets/d/1jJX102o7i46WT1TF7TsQwcvAM4EHLNqOhlpBboTAikk/pubhtml?gid=1987591198&single=true
※今回の報告は、10/23までのぶんを対象に分析しました。

Survey of TDD - experience and current usage

This is an interim report of a survey of TDD - experience and current usage. The survey asks only 3 questions.

  1. When you started to do TDD?
  2. How often do you use TDD now?
  3. Please tell us your reason about the answer for question 2.

Here is the summary from about 90 responses.

You can access more detailed summary here. Raw responses are also available.

Next chart shows an analysis across experience and current usage.

Orange part (seldom / occasionally) increase beyond 1 year (18%→24%→26%) as experience extends.

We picked up a few reasons from responses. (Translation from Japanese by the author.)

  • regularly but not much as before
    • changed how to use TDD. e.g. I write code non-TDD and when in doubt I try TDD.
    • I have to use many new languages and cost to examine each language's unit testing increased.
    • At first I used TDD as a method to learn and earn excellent skills. Currently I know pros and cons of TDD and only use TDD when it's good.
    • Doing TDD to the letters exhausts me. I gain maximum value with minimum effort.
  • seldom / occasionally
    • Same as "TDD is Dead" dictates. I write unit tests only for complicated models. Others are covered with end-to-end tests. For newbies I ask them to learn TDD as a basic skill.
    • I learned good designs TDD produces. Now I can do good design without TDD.
    • I write integration tests.
    • Doing everything TDD takes too much time to be on schedule.
    • Longevity of software has been shortened. No much gains in writing tests for code which rarely changes. I do TDD but not for everything.
    • I do TDD when it works and don't when not.
  • no usage now
    • Because I start implementation before deciding what I/O the class will have. I don't use xUnit until I/O are fixed.
    • Test-first costs too much because there are many spec changes after starting implementation.
    • Writing mocks are too cumbersome. It's impossible to foretell which methods in which module is called in what order.
    • People write code that just pass tests. Many bug ensues. So I stopped using TDD.


We categorized the reason for responses with more than 2 years experience AND less than "regularly" used (= regularly but not much, seldom / occasionally, none.)

reason 2-5 years > 5 years total
environment 6 (75%) 2 (25%) 8 (100%)
only when effective 4 (40%) 6 (60%) 10 (100%)
discarded 1 (50%) 1 (50%) 2 (100%)
unknown 6 (100%) 0 (0%) 6 (100%)
environment
products or working environment are unsuitable to TDD. I no longer code. etc.
only when effective
I choose to do TDD only when it's effective and I know how to choose.
discarded
I understand TDD but I found it not having significant value, so I don't do TDD
unknown
no answer, others.