PR


合理的に,そして効率的に

 では,どうすればバグを効率よく合理的に探し出せるのか。そこで登場するのが,オペレーションズ・リサーチの探索理論である。

この記事は,「日経エレクトロニクス」と「日経バイト」が刊行した別冊『組み込みソフトウエア2006---品質管理と開発技法の実践的改革A to Z』の掲載記事を抜粋したものです。詳細はこちら

 探索理論が考えられたのは,今から60年ほど前の第2次世界大戦のときである。米国海軍がドイツの潜水艦Uボートを探すために用いた。当時Uボートは,米国から欧州に物資を送る輸送船団を片っ端から沈めていた。米国の世論は「Uボート憎し」と沸騰し,米国海軍にプレッシャーをかけたのだ。ところが現場は混乱を極めた。Uボートを探そうと頑張るが,やみくもに探し回っても効率は高まらない。いわゆる「ランダム探索」と呼ぶ手法で,重複して探したり,未探索の個所があってもよく分からなかったりする。探す効率からすると最悪の探し方といえる。要するに,スキル不足を工数で補うようなことが米国海軍で起こっていた。「品質が悪い。テストをちゃんとやれ」と圧力がかかっている組み込みソフトウエア開発の現場と似た状況が60年ほど前に起こったのである。

 「ランダム探索」と対照的なのが「平行探索」。複数の駆逐艦が,探索範囲が重ならないようにして,対象領域を端から端まで探す方式である(図2)。こんな方式は当たり前のように思えるが,多くの駆逐艦の艦長は実施していなかった。現場とは,そんなものである。平行探索でくまなく探すと,有限の時間に全部探しきることができる。一方のランダム探索だとUボートはなかなか見つからない。こうしたところから探索理論が生まれ,米国は戦況を一変させたのである。

平行探索で効率的に“敵”を探す
図2 平行探索で効率的に“敵”を探す
平行探索を行うことで,探索の重複をなくすとともに,未探索の個所を特定できる。一方,ランダム探索では,探索の重複が発生するうえに,未探索の個所を特定できない(駆逐艦は鋭角に曲がることができないので,実際には8の字を描いて探索する「8の字航法」を利用していた)。

 平行探索を行うときに重要なのは,どこを探したのか,これからどこを探さなければいけないのかを指し示す「地図」である。地図があれば探索した所を消し込んでいけばよい。地図のもう1つの効用は,チームでの意思疎通に使える点である。もちろんチームのメンバーが地図の読み方についてコンセンサスを持っており,地図を正しく読めなければ話にならない。つまりテストにおいては,技法の標準化が不可欠である。

 ここで,ソフトウエアの品質管理というと必ず登場する「バグの成長曲線」について触れておきたい。バグの成長曲線とは,横軸にテストの時間(労力),縦軸に見つかるバグの件数を取った場合の曲線である(図3)。ソフトウエア分野では「ソフトウエアの信頼度成長曲線」とも言われ,「バグが飽和してきたから,この辺で出荷しようか」といった判断に使われてきた。しかし,よく考えてほしい。バグの成長曲線をもたらす探索方法は,先に出てきた最も効率の悪い「ランダム探索」と同じである。探すところが同じだから飽和しただけで,未探索の個所は残っている。

信頼度成長曲線
図3 信頼度成長曲線
横軸にテストの時間(労力),縦軸に見つかるバグの件数をとった曲線である。飽和の度合いを見て,製品出荷の判断に使われてきた。しかし本質的に「ランダム検索」と同じである。

実践で重要なのは,いかに手を抜くか

 組み込みソフトウエアのテストに探索理論は有効そうである。では具体的にどのように探索理論を使えば,合理的にテストができるのだろうか。ここで言う合理的には,大きく2つの意味が含まれる。「テストを効果的に行う」と「テストを効率的に行う」だ。

 しかし,少し考えれば分かるようにこの2つは相矛盾する。テストの効果とは,バグを除去できる能力を指す。入っているバグを9割取れるか,6割取れるかといった議論である。つまり効果を高めようと思えば,テスト項目を増やし,網羅性は上げることになる。一方のテストの効率は,時間や工数,コストといったリソースを,できるだけ少なくしてバグを見つけ出すことを意味する。つまり合理的なテストとは,少ない工数で網羅性を高めることを意味する。

 これまでテストの研究というと,網羅性を高めるところに焦点が当たっていた。全パス・テストやマトリックス・テストなど「こうすれば網羅できる」といった研究は進んでいたが「どのようにすれば手を抜けるか」という観点は希薄だった。ここに実践的なテスト技法と理論的なテスト技法のギャップがある。現場で求めているのは実践的な方法だ。「全部やれば何千項目も必要となりテストが収束しない。それを3日で済ますにはどうすればいいのか」という現場の悩みに応えるのが,実践的で合理的なテスト技法である。

 テストには大きく分けて,2つの方法がある。1つはブラック・ボックス・テスト。もう1つはホワイト・ボックス・テストである。

 ブラック・ボックス・テストとは,探索にソフトウエアの内部構造を用いない手法である。ブラック・ボックスの入力に注目してマトリクスを作る。事前条件(入力)を与えて,所望の事後条件(出力)になっているかを確認する。少し考えれば分かるように,テストに必要な項目数はすぐに爆発してしまう。そこでマトリックスの数を減らそうという技術がどんどん進んでいる。合理的にテスト項目を間引くわけである。昔からあるのは実験計画法。直交表という表を使って,サンプリングする。これよりも効率が高いと言われているのがオールペア法。日本ではあまり知られていないが,古くから使われている。(つづく