2010-06-06

自動化がいつも優れていると思ったら大間違い

我が家の冷蔵庫の自動製氷機が数ヶ月前に壊れた。もう7年も使っているから壊れても不思議ではない。一通り調べてみたがどこが悪いのか分からなかったのであきらめて使わないことにした。

持ち運びできる家電なら修理に出す選択肢もあったが冷蔵庫ではそうはいかない。サービスマンを呼べばそれなりに修理代もかかる。

氷は必要なので昔ながらの氷の型枠を使って手動で作ることにした。型枠は100円ショップで2個買った。そうしたら、いっぺんに42個の氷ができる。

冷蔵庫の自動製氷機はタンクに水を入れておくと型枠に水が流れ、氷ができると型枠が回転して落ちるのだか、この方式よりも手動方式の方がはるかに短時間にかつ大量に氷ができる。

慣れとは恐ろしいものだ。自動でできているとそれが最善の方法な錯覚に陥る。氷を作る手順は自動製氷機も手動でやるのも実は全く同じだから、急いで氷が欲しいときは手動でやればよかったのに急速製氷モードに設定してイライラしながら「早くできないかな」と待っていた。

冷蔵庫の自動製氷機はタンクに水を入れておくしくみになっており、説明書には二週間に一回はタンクを掃除するように書いてある。実際一ヶ月ぐらい放っておくとちょっとぬるっとしたものがタンクの中に付くようになる。一方手動の場合は常にフレッシュな水を水道から注ぐから、定期的に洗うべきタンクがない。

自動製氷機が壊れたおかげで手動で氷を作るメリットが改めてわかった。

このできごとに似たことをソフトウェア開発にあることをふと思いついた。それは、たまにソフトウェアのテストを自動化したいので、いいツールはないかと相談を受けるときのことだ。

そういうときは、半自動でいいから少し時間がかかっても自分自身でテストをやりきってみなさいとアドバイスする。何人かは、その時点で先に進むことをやめ、何人かは自分でやってみて「ああ、自分でできるじゃないか」と気づきツールが欲しいとはいわなくなる。

前者は本当にテストを自動化したいのではない。自分がやるべき検証の作業をツールという他人にやらせて自分の責務を回避したいだけなのだ。そのような技術者は「自分で作ったプログラムのバグを自分で見つけることはできない」などとのたまう。そんなことはない。それを言うのなら「自分はカバレッジの高いテストの技法、バグが入り込みにくい設計のスキルを持ち合わせていないので、それらの技術を教えて下さい」と言いなさいと言いたい。

テストツールは(期待どおりの)テストケースを自動には作ってくれない。効率的なテストをやりたいのならテストケースは設計しなければいけない。テストツールは一度作ったテストケースのセットを自動で通すことはできる。また、テストツールを使わなくても自動で自分の作ったテストケースを自動で通す仕組みは作れる。

だから、テストの自動化を実現する前には多くの場合手動で一通りのテストを通す作業は必要になる。何回も同じテストを通さなくてもいい場合は、手動のテストをできるだけ効率的に実施する方法を考えた方がいい。

自動化がいつも優れていると思ったら大間違い、そんなことを自動製氷機の故障がきっかけで思い出した。また、エンジニアなら自動でできていることのしくみはどうなっているのだろうと考える習慣をつけないといけないとも思った。それが分かるようになると、どうやったらもっとうまくできるか見えるようになる。

1 件のコメント:

imz さんのコメント...

リファクタリングの技術を整理してます。
テストツールには注目してるんですが、開発者にとって都合の良いツールはないですね。
今、リファクタリング前後のコードの同一性を保証するため、ツールを使っています。でも、もし、テストを開発の管理下に置くなら、自前で考えたテストケースを管理してもらいます。ツールが作ったケース数は、膨大です。というより、開発者がケースを出せないほど複雑なコードを作ってしまっていて、お手上げ状態なのです。
開発者の方には、自分でテストできるコードを書いてくださいとお願いしております。
この辺り、いろいろと考えるべきネタが多く、もうすこし整理する必要があります。