いわゆる「バグ」と、その周りの言葉は、定義が曖昧だったり使う人によったりして、誤解を招きやすいですよね。ちょっと整理してみました。
SQuBOKの定義
JIS X 0014:1999、SQuBOKでの定義は以下の通りです。
誤差・誤り(error)
計算、観測もしくは測定された値または状態と、真の、指定されたもしくは理論的に正しい値または状態との間の相違。
ソフトウェア設計書の記述として、「または」「もしくは」を連発したこんな書きっぷりが蔓延していたら、0.01秒で差し戻しますが。。。
障害(fault)
要求された機能を遂行する機能単位の能力の、縮退または喪失を引き起こす、異常な状態。
「状態」という言葉に違和感がありますが、これは「間違っている」という現実を指すものと理解しています。
故障(failure)
要求された機能を遂行する、機能単位の能力がなくなること。
その間違いがもたらす結果が、failureというわけです。ちょっとわかりづらいですね。
間違い(mistake)
間違い・人的過誤(mistake, human error)
意図しない結果を引き起こす人間の行為。
これが、JSTQBでいうerrorに相当するようですな。で、JSTQBのdefectに当たる言葉は、faultということか。
SQuBOKガイドには、広島私立大学の大場充氏の言葉として、
テストは、Failure を起こさせることで Fault の存在を表面化させるものである。
とあり、これはすんなり納得できるのですが、同氏の
Fault は「記述上に固定されている欠陥」で、第三者にも確認できる。Error は、認識の問題であり、第三者には確認する方法がない。
については理解ができませぬなあ。突然、哲学・・・。
JSTQBの定義
一方、JSTQBの用語集では、もう少しヒトに優しい言葉で記されています。
エラー(error、誤り)
間違った結果を生み出す人間の行為
「10以上」は10を含まないと小学生時代から信じたままコードを書いたとか、そういう「バグを作るキッカケ」と思えばよいでしょうか。
SQuBOKとはまったく立ち位置が違うので、要注意ですね。JSTQBでは「行為」、SQuBOKではその行為によって生じてしまった、あるべき姿との「差異」。
欠陥(defect、バグ、失敗)
要求された機能をコンポーネントまたはシステムに果たせなくする、コンポーネントまたはシステムの中の不備。(中略)実行中に欠陥に遭遇した場合、コンポーネントまたはシステムの故障を引き起こす。
「10以上」は10を含まないという頑なな思いから、また指の激しい滑りから、「if i > 10 then」とコーディングしてしまった・・・。 その結果が、欠陥ですね。JSTQBの「欠陥」は、「中の不備」とあるので、ドキュメント段階での問題点は含まないようにも見えます。
ちなみにわたし(の周りで)は、「バグ」をプログラム内部の問題点、「不良」を、システム/ソフトウェア構築に伴う生産物に含まれる問題点(バグを含む)といった意味で使っております。
故障(failure)
コンポーネントやシステムが、期待した機能、サービス、結果を提供できないこと。
指滑りコードがテストされる日がついにやってきた。境界値テストとして「i=9」と「i=10」を試してみる。この2つは結果が違うはずだが・・・。いや、何故か同じだ!
というように、欠陥がある現象として白日の元にさらされた状態。これが「故障」ですね。SQuBOKの「error」は、どちらかといえば、JSTQBの「故障」に近いように思います。
こんな対応?
微妙ながら、対応はこんな感じかな。
SQuBOK | JSTQB |
---|---|
mistake | error |
error | ? |
fault | defect |
failure | failure |
ついでに・・・
ついでながら、JSTQBの認定試験で、「故障率」と「欠陥密度」の定義に関する問いが出題されていました。
故障率(faiulre rate)
測定単位に発生したあるカテゴリの故障数の率。例えば、単位時間あたりの故障数、トランザクション数あたりの故障数、コンピュータの運用回数あたりの故障数。
欠陥密度(defect density)
コンポーネントまたはシステムの中で特定された欠陥の数をコンポーネントまたはシステムの大きさで割った値。
しっかり覚えていなかったので、故障率の方は間違えた気が。「欠陥」と「故障」の意味をちゃんと覚えていれば、間違いようもないですけどね。
2018年1月13日追記
秋山さんにいただいたコメントを追加します。
SQuBOKのerrorに対応するのはincidentだと思うけど。
— akiyama924🌿 (@akiyama924) 2018年1月6日
あと、faultはdefectよりちょっと広い意味だと思います。
(故障= failureの原因はfaultなんだけど、特に設計上の問題で購入したばかりの商品にも含まれているfaultがdefectだと。ハードウェアの場合は経年劣化などで購入した後にfaultが生まれる)
SQuBOKのと言うよりは大場先生のerrorの定義ですね。
— akiyama924🌿 (@akiyama924) 2018年1月6日
規格(IEEE610など)のerrorの定義は『テスト結果と真値(あるいは真値と、推測した値)が違うこと』だったような覚えがあります。
— akiyama924🌿 (@akiyama924) 2018年1月6日
で、大切なことは、mistake, defect, fault, failure, error, incidentを区別して測定してコントロールすると何が嬉しくなるかです。
— akiyama924🌿 (@akiyama924) 2018年1月7日
例えば『mistakeを分析してコントロールするとdefectが減るから嬉しい』とかそういうことを意識的に行うことが大切です。