実装がまったく思いつかないバグを見つけました。来週「◯◯のように直したら(バグが)出なくなりました」なんて言ったら「えー」て言うからね♡
— miwa (@miwa719) 2016年9月16日
テスターが見つけるバグには、狙い通りに見つかる(またはそれに近い)ものと、そうでないものがありますよね。
前者の「狙い通りに見つかるバグ」というのは、例えば、プログラマーが「いつも動く」を前提に作っていることを想定して、テスターは「動かないときもある」を起こして見つかるものです。
- 使用するファイルをリネームしてみる
- データベースのサービスを停止してみる
- ネットワークケーブルを引き抜いてみる
同期処理なら、こんなことを考えながら、手を動かしていきます。
- 何をしたら二人は永遠に待ち続けてしまうだろうか
- お互いの状態を変数でフラグ管理しているのだとしたら、それらが正しく更新されないのはどんな時か
- その更新が遅れる時はあるのだろうか、実際の状態と変数の値が矛盾してしまうとしたらどんな時か
そうやって見つかるバグは、その原因が何となくですけど、想像できます。
後者は「狙ってないけど出会ってしまったバグ」です。わたしたちのチームは、おかしな状況はプログラマーに見せることが一番喜ばれるのですが、すぐに見てもらえないときは、再現試験も兼ねながら、与えるパラメータを変えたり、怪しそうだなと思う操作のタイミングをずらしながら、同じバグが発生するのか、しないのかを確認します。
ここでも、原因が想像できるものと、そうでないものに分かれます。
何となく原因が想像できるものは(おそらくテスターならみなさんそうだと思いますけど)そこからさらに対象を変えるなどして、似たようなバグを見つけに行こうとします。
でも、原因が全く想像できないものは、それができません。テスターも(どんな実装をしたらこうなるんだろう?)と興味がありますし、バグの原因にもつながる実装寄りの事情(←コードそのものではありません)を知ると、さらにそこをついたようなテストができるようになります。見た目は大したことをやっているようには見えないのに、そんな複雑なことをしてたのかーーと知ったら、いじめ方も変わっていきますよね。
はじめのツイートに戻りますが、わたしがこれまでに遭遇した「実装がまったく思いつかないバグ」は、プログラマーにとっても厄介であることが多いように感じます。ですので「◯◯のように直したら(バグが)出なくなりました」と言われても「おお、よかったー」で終わりにせず、「なにがまずかったの?」と、チームの話題にしてあげるのがよいと思います。*1
*1:練度があがると「なにがまずかったの?」は「えー」で通じるようになります