TDDやってるとバカになりませんか

偉いプログラマとは、仕様書を一読して内容を完璧に把握し、沈思黙考して完璧な設計を脳裏に描き、神速のキーボードさばきで一気にコーディングを終えると、ノーエラーでコンパイルが通り期待通りに動作する完璧なプログラムが完成する、デバッガなんてのは女子供が使うもんだ。

TDD以前はそんなふうに思っていました。オブジェクト指向とかデザインパターンとかDbC(契約による設計)とか、そういうツールを使いこなせば「偉いプログラマ」の域に近づけると思ってました。

いま考えると、偉いプログラマじゃなくて偉そうなプログラマですね。

とはいえ、10年前と今の自分のプログラミング能力を比べると、劣化したなあと思うところがたくさんあります。歳は取りたくない...というのでなく(それもあるけど)、TDDをやっている直接間接の結果として、「バカになっちゃった」と感じることが少なからずあります。

なんといっても、一発で間違いなく書き上げるというのは、もうまず無理ですね。書け! って言われたら書くけど、300行くらいで「テ、テストが足らない...」と窒息死しそうです。それだって文法エラーとかtypoとかフェンスポストエラーとか、もりもりやらかす自信があります。

ライブラリやAPIも、以前はIDEの補完より早く打つ! という気概がありましたが、今はちゃんと憶えるつもりもないし、使い方も「なんかこんな感じだったかなあ...あれテスト実行したらぬるぽだ。サンプルサンプル...先にこっちを呼ぶのね。あ、Greenになった。なるほどなるほど」という感じで、しかも同じようなことを2ヶ月前にもやっていたりする。

人からよく指摘されるのは、コメントの少なさです。事前設計ありきでコーディングすると、どうしても設計の意図をコメントで残しておかないと、なにをやってるのかわからない(下手すると書いてる自分でもわからない)。なのでコメントはわりと入れていました。TDDで書いていると、1行1行、1メソッドずつ、書いている意図とコードの形がピッタリ一致するので、コメントなんて書かなくてもわかるだろー、という気分になります。結果、自分で書いた部分にはほとんどコメントがありません。もうちょっとコメント入れてもいいんじゃないかと反省もしますが、コメントすることが逆に思いつかなかったりもします。

とはいえプログラマとして生産性が悪くなったのかというと、そうでもないと思っています。

世の中には、TDDしているかどうかを問わず優秀なプログラマがいっぱいいて、というか今の職場にもわさわさいて、彼らと勝負して勝てるつもりはさらさらありません。とはいえTDD以前とTDD以降では、自分自身の中で比較すると「よりよいプログラマ」になっています。なぜそう思うのか。

  • 理解しやすいコードベース(テストも含む)を書ける
  • 過剰設計にならない、理解しやすく変更に耐える設計ができる
  • 自分のプログラミングのやり方、進め方を人に伝えられる
  • 自分自身の失敗を認められる
  • デバッグが効率的にできる

いずれもプログラマとして仕事をする上では大事なことと思っています。これらすべてを完璧にできるとは言いませんが(到底言えない)、前より上手になっているのは確かです。TDDを学んでプログラマとして成長できていると、まあ言っちゃって大丈夫じゃないかなあ。

こう考えると、前半で書いた「ミスなしで書ける」や「APIを熟知してる」といったスキルは、TDDを実践する中ではあまり重要ではない。重要ではないので、あり使わない、あまり使わないから能力が退化してきたと言えそうです。「偉いプログラマ」にはなれそうにないけれど、それはなる必要がなくなったからなんですね。コンパイルエラーなんか出しちゃうと自分がすごくバカな気がしちゃいますが、まあそこはバカでもいいんだよと、バカを受け入れると、そういうことになりますでしょうか。

ところで、大事なこととして「早くプログラムを書ける」ってのが抜けている気がしてきました。TDDでプログラミングは「早く・速く」なったのか? 自分としての回答は、こうです。

  • TDDを使うべきかどうか判断できる

TDDのほうが常にプログラムが早くできるかどうかは、わかりません。ですが自分が作業するとき、自分として最速で、必要な結果を出すためにどんな手段を使うべきか。その判断をするとき、TDDを使った方がよさそうか使わない方がよさそうか、見通しはつけられます。

本当に使い捨てのコード、ワンライナーHello World並みに簡単な処理、こういうときはTDDは不要です。また、作るものの見当がつかず、試行錯誤しながらやりたいことを探すようなときにも、TDDはうまく働きません。

いっぽう新しい機能を実現するとき、複雑なロジックを書くとき、適切な設計を構築したいとき、こうしたときにはTDDがとても大事です。

TDDという道具を使いながら(ときには使わないという選択をしながら)、自分としての最高速度を向上していければいいかなあと思います。