TDD と IDE~コンパイラとQuick Fixは厳しい上司と有能な部下~
Eclipse を使って、TDD(テスト駆動開発)をしたときに、感じたこと。これを、エディタとコンパイラの組み合わせでやった場合と比べてみたい。
コンパイラのエラーメッセージは否定的だ。
- ~が未定義です
- ~が存在しません
ぼくは否定的な人間と会話するのを苦痛に感じることが多い。
- ~がありませんが、作りますか?
「うんうん、作る作る」と思う。仕事はこういう提案ベースで行こうよ。
こういうIDEがあると、先に「そういう提案を出させるようなテストを書こう」という気になる。これが重要。つまり、
- 作った→ミス→怒られる
という「コンパイラ=きびしい上司」パターンから抜けて、
- ボケる→提案される→おう、それで行こう
という「IDE=有能な部下」パターンに持ち込むのだ。
自分:assertEquals(3, add(1, 2));
IDE : add がありません。作る?
自分:うんうん、できるとこまで作っといて。
これは、ボケとツッコミだ。うまくボケて、IDEに突っ込ませる。
これ、TDDの極意。
※かための書き物が2つ続いたので、ちょっとやらかいのを書きました。
書いた後で、ちょっと考えてみた。IDEとコンパイラの関係について。この2つのツールは、ソースコードという書き物を挟んで、人間とマシンの間にある。昔から、「マシンに対してコーディングするな。人が読めるようにコーディングせよ」などと言われていることからも、ソースコードというメディアは、「人間に読めて、かつ、マシンに読める」というちょっと面白い書き物である。(これがプログラミング言語という領域の面白さだ。)
コンパイラは、ソースコードに対してはReadonlyで、オブジェクトコードを出す。IDEは、ソースコードに対してReadWriteだ。ここが決定的な違い。上に書いたように、プログラマに対してQuickFixの「提案」ができるのも、場合によってはソースコードを編集する、という能力があるからだ。
IDEは、コンピュータに対してのソースコードではなく、「人間に対するソースコード」のあり方に対してアプローチできる!
ぼくが今開発に携わっているJUDE(http://jude.esm.jp/)というUMLエディタも、今後の方向性について考えるこおとがある。MDAのように、ソースコードをジェネレートする、という方向がある。しかし、これは、「マシンに対してのコード」を吐くことであり、先のコンパイラーと同じだ。ひたすら未定義だとか、シンタクスがずれている、とかの警告を発して、モデルを強制的にExecutableにすることになるだろう。JUDEは、そうではなく、MDAをあきらめても、「人間に対してのモデル」を優先し、人間に対してやさしく提案する方向に行きたい。つまり、マシンが読むコードに近い部分はほっておいて、人間のコミュニケーションと「考具」として。(これについては、長くなるので、また別の機会に)