デバッグの進め方について個人的に意識したいことをまとめてみた


はじめに

仕事をしているなかで、不具合のデバッグを担うことは多々あると思います。最近個人的に難しいデバッグを担当し、社内の先輩と相談しながら進めたのですが、その時どうやってデバッグを進めるのかをふりかえって話しました。その内容を備忘も兼ねてまとめようと思います。

tl;dr

この記事のサマリです。

  • 闇雲に調べても解決には近づかない
  • ゴールから逆算する進め方は解決に近づきづらい
  • マイルストンを細かく置き、仮説・検証・理解を繰り返しながら進める
  • 理解を得るための情報を網羅的に、正確に収集する

闇雲に調べても解決には近づかない

デバッグを始めるときの状況は様々です。ユーザーからの不具合報告ですぐに修正する必要があったり、修正までの期限が設定されていたりすることもあります。

その上で、自分の開発していない外部ライブラリに問題が発生しているような難易度の高い問題だと、いつ解決するかすぐに見積もることができずに焦ることもあると思います。

そんな状況だと、早く解決してしまいたいという気持ちがはやってしまい、闇雲に原因を調べてしまうという行動に陥りがちです。自分の経験上、この状態に陥ったときに、デバッグがうまく行ったことはほとんどありません。

闇雲に調べている状態は、次にどんな情報を集める必要があるか、どこを調べる必要があるかといった、次のアクションがわからない状態とも言い換えられると思います。

新装版 達人プログラマー 職人から名匠への道 にも、デバッグは「単なる問題解決」であり、「パニックに陥らないこと」が大切だと書いてあります。闇雲になっているなと自分自身で気づいたら、進め方を再考してみると良いかもしれません。

ゴールから逆算する進め方は解決に近づきづらい

また、早く原因を特定して解決したいという気持ちがあると、真っ先にソースコード修正箇所を読んで探すということが起きがちです。

一見解決に近そうですが、原因がはっきりしないままソースコードを読みに行くことは、簡単なデバッグであれば解決することもあるかもしれませんが、根の深い難しいデバッグの場合は解決することは難しいと思います。

開発タスクではゴールから逆算してタスクを分解していくことができますが、デバッグの場合は原因というゴールが不明確であるため、ゴールから逆算するということが難しいのかなと考えています。

マイルストンを細かく置き、仮説・検証・理解を繰り返しながら進める

それではどうデバッグを進めればいいかを社内の先輩と話したのですが、まとめると以下のような進め方になるのではという話になりました。

  • 現時点ではわからないが、調べればすぐにわかりそうな仮説をマイルストンとして置く
  • マイルストンとしておいた仮説について検証し、わかった情報を集めて整理・考察・理解する
  • 次の仮説をマイルストンとして置く、再度検証・考察・理解する

ゴールからではなく、現時点というスタートからマイルストンを細かく置き、徐々に情報や理解を積み重ねていく進め方となります。一見面倒で時間がかかりそうではありますが、確実に解決には近づく進め方だと思います。

マイルストンを細かく置くことで、これから何を調べようとしているかがより明確になります。また、現時点で自分が得た情報や気づいたことについても理解が伴った状態で進めることができます。アジャイル開発の進め方とも似ていると思います。

理解を得るための情報を網羅的に、正確に収集する

よくデバッグでは、再現条件を明確にすることがまず大切だと言われます。そのために様々なユーザー操作やパラメータを変更したテストによって、情報を収集し、理解をしていくことが必要になってきます。細かくマイルストンを置いた形で進めたとしても、各マイルストンで得た情報で理解を進めることが出来なければ、次のアクションに移ることが出来ません。

そこで必要になることとしては、理解を得るための情報を網羅的に、正確に集めるということです。ここでも闇雲にユーザー操作やパラメータを操作するのではなく、例えばスプレッドシートで網羅的にユーザー操作パターンをテストしたり、パラメータを場合分けして変更しつつ調べたりすることで、理解を得るための新たな情報や気づいたことを得られる可能性が高くなります。

情報を得るための手段は様々です。ブラウザの開発者コンソールやデバッガはもちろんですが、単純に画面を操作するだけでも理解を得るための情報が得られることがあります。その時々のマイルストンにおいて、適切な手段が何かを考えてみると良さそうです。

おわりに

この話をするなかで、デバッグは化学実験や大学の研究、競技プログラミングの問題を解くことなどに似ていると思いました。現状から理解をしつつ解決に近づくことが大切だと思います。

自分のデバッグ力はまだまだですが、この記事でまとめたことを活かしてデバッグに取り組みたいと思います。

参考文献