バグが発生する原因とバイアスについて考えてみた

なぜシステムでバグが発生するのかを考えてみました。

例えば二つの値を加算した結果を返す処理を書きたいとします。

const add = (a, b) => a + b

add(1,2) //3
add(2,10) //12

このadd関数は正しく動きます。

問題なさそうに見えますが、見方を少し変えるとバグをもっているとも考えられます。

もし、add関数に渡される引数がnumber以外だった場合は戻り値がnumberにはならないので、add関数の結果をnumberだと思って使っているところでは想定外の動きが生じます。

add(undefined, NaN)

これはシンプルなケースなので気がつきますが、実際のシステムはより複雑です。

  • ネットワークが途中で切れた場合に正しく動くか
  • 一連のトランザクションの途中でサーバーやDBが停止した場合に正しく動くか
  • 人が入力した値に想定されていないものが含まれることはないか

このような異常系のケースを考えることは、正常系のケースを考えることより難しいです。

これにはバイアス(偏見、偏りなどというい)が関連していて、人間はある予想をしているときに、その予想が正しいことを証明するものを選択することを好む、という習性があります。

先ほどの例であれば、加算した結果が正しくなるケースばかりを確認して、そうならないケースを確かめようとしないのです。

どのような異常系があるかは経験によって学ぶことも多いですが、日頃から考えるようにしたいと思います。