2008年8月13日水曜日

テストの難しさ

最近システムトラブルを起こした会社がバッシングされることが多いです。

人のミスをあげつらうのはあまり趣味のいいこととは思えませんね。それから、プロとしてはあまり大きな声では言えないのですが「おいおいシステム作るのってそんな簡単じゃねーんだよ。分かってるのかね」とも思ってしまいます。

だからそれを何とかするのがプロだろ?システム屋だろ?と言われると悔しいのですが。

一応反論してみましょう。

例えばコーディング。簡単な仕事ではありません。ウソだと思うならAjaxで何か組んで見てください。JavaやPHPでWeb掲示板でも作って見てください。なかなか簡単には作れないものです。
最近プログラマがの売値が安いですが、その結果優秀なプログラマが減っているような気がしてなりません。実際にモノを作るのはプログラマなのに。(というかプログラマに限らずよい人材が減ってる?)
自動でコードを生成するツールもありますが、そのツールを操作/設定するのも簡単ではないですし、そもそもプログラミングの知識が前提されている場合が多いのです。

システムのテストが難しいことは理論的にも説明できます。

例えば5つのメソッドを持つプログラムが一つあるとします。
それらのメソッドはそれぞれ4個のif文を含むとします。

するとif文の数は20個。if分岐のテストに関して言えば、2の20乗=100万以上の選択肢が存在するのです。

さらにそのプログラムに20個の変数が存在するとします。そしてその変数が、それぞれ4つの値を取る可能性があるとしましょう。言い換えると、それぞれが0,1,2,3いずれかの値を持つとします。

すると、変数の組み合わせは20の4乗=16万ケースが考えられます。

次に変数の組み合わせとif文の組み合わせです。変数の組み合わせ一つに対して、100万以上のif文組み合わせがあるので、可能性としては1700億弱のテストケースが存在します。

一ケーステストを行うのに2ミリ秒(2/1000秒)掛かるとしても、970日ぶっ通しでテストする必要があります。

それに変数の状態が4通りしかないことは普通あり得ません。例えばint型だって4億以上のパターンありますらかね。

つまり簡単なプログラムですら完ぺきにテストすることは不可能なのです。

そしてプログラマはほとんど無限といってもいいテストの可能性からいくつかを選び、テストしなければならないのです。

最近、この業界で長く仕事をしているはずの偉い人たちですら「試験は全パス通します」などと軽々しく言うことが多い気がします。だからムリだって。
まあ、大抵の場合、偉い人たちが考えているのは順列組み合わせではなくてif文個別に見てその両方の分岐を通す程度なのですが。(つまり20個のif文で40ケース)

それにしても、昨今システムに関する無理解が進んでいるような気がしてならないのは私だけでしょうか。

0 件のコメント: