自動テストの目的が「効率化のため」とか「コストダウンのため」といわれることに、筆者は違和感があります。この違和感の正体を明らかにし、企業の目的、エンジニアの人生論にまで深めてみます。
企業の目的は利益か?
まず「会社の目的は利益を得ること」と言われたらどう感じますか? やはり似た違和感があります。そもそも会社の「目的」は「社会貢献」であるはずで「利益」はその「結果」に過ぎません。
わかりにくいですよね。では次に、「家の手伝いは小遣いを得るためだ」とわが子に言われたらどうですか?
親の視点からすれば、あまりに自分本位です。小さいうちならまだいいでしょう。しかし、親が子に生活費や教育費を投じていくからには、ある程度成長した子供には「自分ができる範囲で家族の役に立ってほしい」「感謝を行動で表してほしい」「その行動を通じてついでに将来、自活する力を高めてほしい」と願いますよね。ただ働きでは手伝いを継続できないので、小遣いで動機づけるにすぎません。
話を戻すと、すべての企業活動は、直接・間接的に社会に提供する「価値」につながっているべきものです。それを継続できるように企業は見返りに「利益」を得るのです。
自動テストの価値は何か?
では、自動テストがもたらす価値は何でしょうか?
それは、人間ではできない速さでテストを実行できること。手動の場合と違って、気軽にテストを繰り返し実行できること。変更が発生するたびに自動で回帰テストをかければ品質を保証できるので、ためらわずに変更をどんどん受け入れ、そのたびにソフトウェアを価値あるものに進化させて、継続的に顧客に届けることができます。
それが自動テストの価値です。
はやりのカタカナで書くと「ビジネスアジリティ」。
自動テストでコストダウンできるのか?
自動テストで本当にコストダウンできるかは疑問です。
むしろコストアップ要因として以下のものがあります:
自動テストを実行するためのコンピュータ。そしてそれを保守するエンジニア。変更要求が入るたびにテストケースを更新するエンジニア。
専門スキルを求めるわけですから、人件費ないし学習費も高くつくでしょう。
コストダウンというからには比較対象が必要ですが、それは自明ではありません。たとえば、自動テストは繰り返し実行しやすいので、ある期間に実行した回数を数え、それを手動で実行した場合の工数と比べたら、大きな投資対効果があるように見せることはできるでしょう。しかしそれにどれほどの意味があるでしょう? 大量に同じものを作る工場の生産ラインと、一品ものを作るソフトウェア開発現場では、こういう点では同じに扱えません。
工数比較の論理の裏にあるのは、「より長い時間をかけた作業ほどより大きな価値がある」とする「工数」の概念です。しかし、これこそが生産性向上の障害であり、忌むべき概念です。なぜなら「生産性が高い」というのは「より短時間でより大きな価値を生み出す」ことだからです。
エンジニアの本望
そもそも「コストダウンのための仕事」にやる気を出すソフトウェアエンジニアなどいるでしょうか?
自分の時間が「コスト」とみなされる感覚は受け入れがたいものです。
ただ言い方の問題なのかもしれませんが、むしろ自動テストに費やす時間と金銭は、ソフトウェアの価値を高めるための「投資」です。こう言ったほうが共感しやすいです。なぜなら「人はパンのみにて生くるものにあらず」だからです。
エンジニアがしたいのは「専門性を生かして、文明の進化につながる、世の中にない価値を創出すること」のはずです。
豊田佐吉が自動織機を発明した動機は、夜なべするお母さんの機織り仕事を楽にしたいという思いでした。効率化とか生産性は結果ではあっても目的ではありませんでした。参考:トヨタイムズの記事: "トヨタ生産方式" 豊田章男の解釈
そういう意味で、ソフトウェアの自動テストは、エンジニアのテスト実行を楽にして、ソフトウェアの価値を高めることに集中させることともいえます。