バグの潰し方

バグ潰してますか?僕は毎日3個ぐらいは踏み潰してます
Android2.xでしかでないバグを死んだ魚のような目をして潰してます。

まぁ、バグは出さないほうがいいです。
TDDだったりDDDだったりCIだったりはバグを出さない、
出してもすぐ見つけるための仕組みですね。


ですが、どうしてもバグは出ます。
というか、バグがないシステムを保証することは出来ません。
人生は有限なので、無限にテストは出来ないですから。

ではどうやってバグを潰すか。


再現できるバグは潰しやすいですよね。

A B C D E という手順を経るバグがあったとします。

A B C D E のどれかにあるわけです。

ここで僕がやる手法は、
可能なのであれば、
ABC と DE をわけてテストします。
2分探索ですね。

で、Aに原因があるとわかったら、
A を α という単純な手法に変えられないか考えます。
純化したほうがバグは見つけやすいですね。

Aという手順の中にも複数行にわたってプログラムなどがあるはずなので、
それをさらにだんだん簡略化、二分探索します。

はい。バグ見つかりましたね。
潰そう。


再現できないバグは難しいですね。
再現できないバグは、経験上以下の種別があります。

  • 並列実行の問題
  • メモリリーク
  • 高負荷時の問題
  • すごく複雑な手順
  • 人間の問題

最後の人間の問題は、多くの場合、
バグ報告の情報が不足してることで起こります。

再現できないバグの修正は難しいので、
是非、エンジニア以外も、
OSのバージョンだとか、再現手順などの報告のしかたを覚えて欲しいものです。

まぁ、こういう再現できないバグは諦めるというのも手です。

せめてログが残ってたりするといいんですが、
ログ出すのもコストであったりするのでトレードオフですね。

さて、駄文を書き終わったので、
Android2.x 系のバグを潰す仕事に戻るぉ…