バグとは何か

「仕様と違う結果」が起きる原因をバグと云う。バグはエラーとは異なる概念だ。 
ログイン画面を考えてみよう。 
ユーザーIDとパスワードを正しく入力し、ログインボタンを押すとトップ画面に移る。これは正常系というログインの本来の事象だ。 
これに対し、ユーザーIDかパスワードを間違って入力しログインボタンを押すとエラーとなる。これは異常系というユーザーの想定外の事象である。また
ある事象が異常系である条件は

・エラー画面に遷移する 
・エラーメッセージが出力される 
のどちらか若しくは両方が満たされることと云える。
ではバグとは何か。 
正常系であれ異常系であれ、テストに於いてその事象が設計通りの結果にならない時、そこにはプログラマの想定外の何らかの問題があると云える。この問題をバグと云う。バグを発見した場合プログラマはテスト後に直ちに故障票を書いて直す必要がある。 
バグはテストだけでは捕捉できない。レビューが必要である。レビューをしなければ問題のあるシステムをリリースしてしまうリスクが高くなる。 
次のメソッドをみて欲しい。 
void e2j(String english){ 
return "我輩は猫である"; 

このメソッドの機能は本来和訳であるが入力値を 
I am a cat. 
とせねば正しい結果は得られない。まさにこのメソッドにはバグがあると云える。だがこのバグはテストでの捕捉が難しい。入力値を 
I am a cat. 
とすればテストOKとなってしまうからだ。OKとなればもうその同類のテストはやらない。バグは二度と見つからなくなる。 
この問題の解決方法はレビューである。レビューをすれば簡単にバグを捕捉できる。 
検証とは本来、テストとレビューのダブルチェックにより行うべきである。ダブルチェックをしなければバグはなくならない。だがコストがかかるという理由からダブルチェックをやらないというシステム開発もある。もちろんそんな開発は
論外である。