プログラミングをやっていると、動くはずなのになぜか動かない、動作がおかしいという事が多々ある。そんな時、プログラマーとしての自分がどのように原因を突き止め、解決するかを記載する。
今回はPHPでのwebサイトを想定。
再現性の確認
まずは、事象の確認を行う。
本番リリース後のプログラムでは利用者やテストチームなど外から不具合の報告が上がってくる。まずは自分でその事象を確認するのが最優先となる。
再現性の分類は下記になる。
1.100%再現
2.特定の条件下(ブラウザ等)で100%再現
3.再現したりしなかったり
4.再現しない
「1」の場合は原因特定が一番やりやすい、現象を見るか、ちょっとデバッグを入れるだけで代替原因がつかめる。
「2」の環境依存は解決が難しい。問題のある個所を違う実装方法で実装したり、不具合の発生する条件下では機能を非表示にするなどの対応がある。影響範囲が限定されるので軽微な不具合であれば修正しないこともある。
「3」の場合、たいていの場合サーバ等ハード側の問題であることが多くプログラマーでは手も足も出ないことが多い。ハード側の問題であることを言えるだけの材料を集めたらそちらに投げてしまう。
「4」これが一番厄介かもしれない。不具合報告者にさらにヒアリングが必要になる。どうしても再現できなくて、他に同様の不具合報告がなければ「再現なし」で終了することもある。
この後は、「1」の再現はしたが原因が全く分からない場合の対応を進める。
原因箇所を特定
まずは、デバッグ文を入れてプログラムのどの部分で問題が発生しているかを調査する。ここではだいたいどのあたりに問題がありそうか仮説を立てながら行うので、経験のあるプログラマーだと早い。
コントローラ、モデル、ビューなどにデバッグを入れて、大きい塊から少しずつ範囲を狭めて問題のあるプログラムの1行を特定する。
問題の解消
問題個所を見つけたら修正を行う。ほとんどの場合、問題個所が特定できれば修正方法はすぐにわかる。だが、たまにどうしておかしくなっているのか分からない場合もある。その場合はなるべくシンプルにするという事を考える。
原因がわからないという事は一見うまくいきそうに見えるという事なので、そのうまくいきそうな1行だけを残すようにソースコードを削っていく。
ソースコードを削って(なぜかはわからないが)、不具合が発生しなくなれば、手元に不具合の発生するソースAと発生しなくなったソースBが出来上がる。あとは、ソースBを少しづつAに近づけてどこで不具合が発生するかを見れば原因の特定ができる。
このような状況になる場合は、自分が何か勘違いをしているか、問題個所とは別の部分が悪さをしている場合がある。
今まで、再現性が100%であれば原因を特定できなかった不具合は無い。