デバッグするにはdiffを見つけるといいと思うよ

僕はここ1ヶ月ほどデバッグばかりしています。で、僕がデバッグする際に結構使う手法があります。
それはdiffを見つけるということ。ちょっと抽象的で説明が難しいのですが、とにかく書いてみます。

例えばAという機能にバグがあったとします。AはじつはBという機能と結構似ていてBは正しく動いています。
似ているといっても共通化できるほどではなく、処理の流れがだいたい同じとか、使っているライブラリ、フレームワークAPIがだいたい同じというぐらいの意味です。

で、こうしたときにAとBのdiffをさがします。そうすると例えばライブラリのメソッドの呼び方が違うとか、バッチが実行されるときのフォルダ構成が違うとかが見つかったとします。diffが見つかればそのdiffはAとBの機能上の違いなのかそうでないのかを調べます。機能上の違いでない場合はそのdiffがバグの原因である可能性が高いので、そこを集中的に調べることによってバグが解決できたりします。エンハンスの場合は既存のコードをコピペしてつくっていたりする(そこまでいかなくとも既存のコードは高い確率で参考にされている)のでdiffを見つけるのはそんなに難しくないです。もちろん使われている言語なりフレームワークの知識は必要ですし、そのシステムの仕様に関する知識も必要です。まあこれは当然ですね。

ソースをひたすら見てうなったり、ブレークポイントをあちこちに仕掛けてひたすらデバッグ実行してみて、神が降臨するのを待つのもいいですが、上記のようにdiffを見つけるのは有効だと思います。diffだけみればいいので調べる範囲がしぼれますしね。

過去の似たようなバグとのdiffを探すのも有効です。そのためにも構成管理ツールと連携したバグトラッキングシステム(例:Trac)は必須です。

この手法は僕が入社3年目のときに外注として入ったときに2年目のプロパーの人から指導してもらったものです。以来僕はこの手法で多くのバグを直してきました。

ただこの手法についての話を聞いたことがいままでなかったので書いてみました。他の人はもっと超絶なデバッグ手法をもってるのでしょうか。だとしたら知りたいです。でもできる人に限ってフォースを感じたとか言うんだよなあw