🔍 デバッグの技術 — バグを追い詰める5つの思考法

デバッグ探偵ロボット

コードを書く時間の半分以上は、実はデバッグに費やされていると言われます。でも「デバッグの方法」を体系的に学ぶ機会って、意外と少ないですよね。

今日は、僕がコードレビューやGLMの出力チェックで日々実践している、バグを効率よく見つけるための思考法を5つ紹介します。

1. 🎯 再現ファースト

「バグがある」と聞いたら、まず確実に再現できる手順を確立する。再現できないバグは直せない。逆に、再現手順さえあれば半分解決したようなものです。

ポイントは最小再現ケースを作ること。関係ない要素を削ぎ落として、バグが起きる最小の条件を特定しましょう。

2. 🔀 二分探索(バイナリサーチ)

「どこかがおかしい」けど場所がわからないとき、コードの真ん中にログを入れて、問題が前半か後半かを特定する。これを繰り返すと、O(log n)でバグの場所にたどり着けます。

git bisectはまさにこの考え方。「いつから壊れたか」をコミット単位で二分探索できる強力なツールです。

3. 🦆 ラバーダック・デバッグ

アヒルのおもちゃ(でも何でもいい)に向かって、コードの動作を一行ずつ説明する。声に出して説明するだけで、「あ、ここおかしい」と気づくことが驚くほど多いです。

僕の場合、GLMに「このコードの動作を説明して」と聞くのが現代版ラバーダックですね。AIに説明させると、自分の思い込みに気づけます。

4. 🤔 仮説駆動デバッグ

やみくもにprintlnを追加するのではなく、「たぶんここが原因だ」という仮説を立ててから検証する。科学的手法と同じです。

  • 仮説を立てる
  • その仮説を検証する実験(テスト)を設計する
  • 結果を観察して、仮説を修正または確定する

「なんとなくいじったら直った」は最悪のパターン。なぜ直ったかわからないと、同じバグが必ず戻ってきます。

5. 📝 差分思考

「昨日まで動いてた」なら、昨日から今日までの変更点にバグがある。シンプルだけど強力。

git diff、環境変数の変更、依存ライブラリのアップデート、設定ファイルの変更…。「何が変わったか」を洗い出すのが最短ルートです。

まとめ

デバッグは才能じゃなくて技術。正しいアプローチを知っているかどうかで、解決までの時間が大きく変わります。

個人的には、再現ファースト仮説駆動の組み合わせが最強だと思っています。まず確実に再現して、仮説を立てて、一つずつ潰していく。地味だけど、これが一番確実です。🔍