なぜ人はテストを書かないのか?
「スーパープログラマー」という単語に過敏に反応する人がいたのをきっかけに、プログラマーとして一流であるための条件というのを考えてみたんだけど、難しくてわからんかった。しかし一流じゃない条件ならいろいろ思いつく。
たとえば、今なら「テストを書かないプログラマーは一流でない」ということは言えるだろう。これはどんな凄腕プログラマーだとしても当てはまる条件だ。
そして、これだけテストの重要性が叫ばれている中でもやっぱりテストを書かないプログラマーというのは存在する。これは初心者だろうが上級者だろうが関係なく一定数存在する*1。
で、なぜテストを書かないかということだが、いちばんの大きな理由は、テストを書かないのではなくて、テストが書けないだけなんじゃないかと思ってる。
テストを書いた方がいいなんてのは、誰だって分かっている。でも実際には書かない人が結構な数いて、その人たちは「ロジックは書けるけどテストは書けない」という種類の人たちなわけ。つまりロジックが書けることとテストが書けることは別なんだよな。
で、なぜテストが書けないかということだが、これはやはりテストを書くこと自体が実は難しいということなんだろう。慣れの問題だと言えなくもないけど、慣れが必要とされるくらいにはテストを書くのは難しいともいえる。
テストを書くにはまず、「正しい挙動は何か」を把握しなきゃいけないんだけど、それが難しい。正しいって何よ? というのは、正義って何よ? とか人生って何よ? とかと同じぐらい哲学的で難しいことのように思えるんだけど、考え過ぎだろうか。
たとえば
<ul> <li>foo</li> </ul>
と
<ul><li>foo</li></ul>
は、文字列としては等しくはないけど、HTML的には等しいと見なしてよいだろう。つまり文字列として評価するか、それともHTMLとして評価するかで両者は等しいか等しくないか変わってくる。
あるいは、
<a href=""> <span>click</span> </a>
<a href=""><span>click</span></a>
は文字列としては等しくないし、HTML的にもやっぱり等しくない(少なくとも見た目が変わるのだから)。でもさっきの例ではHTML的に等しかったのに、なぜこっちの例だと等しくないのか。どういう場合が等しくてどういう場合が等しくないのか。こういうのをウダウダ考えだすとなんかもうわけわからくなって、等しいとは何か? 正しい振舞いとは何か? というのばかりが気になって作業がまったく進まない。困った。
(まあ HTML のテストなんて、実際にはそんなに厳密にはやってない。Merb なら have_xpath() や have_selector() で HTML 要素があるかどうかを確かめるだけ。でもこれも要素をひとつずつ指定しなきゃいけないからすごく面倒なんだよな。フォームのコントロールの数だけテストを書くのもなんかばかばかしくて、やってらんない。)
ということをつらつら考えていたら、似たようなことを考えている人がいた。
僕がTDDをやめた理由 - カタチづくりテストしたい部分に限ってテストが難しい
バグは偏在する。変更も偏在する。バグも変更も、ある特定の一部に集中する傾向がある。これは多くの方が語っていることだと思う。そして、バグや変更が集中する箇所に限って、どうもテストが難しいと感じている。
頷きながら読んでしまった。皆さんにはぜひ全文を読んでほしい。