こんにちは、 id:kano-e です。
幼少時、ホームズの物語を読んで、すっかりホームズに心酔し「名探偵になる!」と言っていたことがあります。
「名探偵」というものは仕事ではなく、ホームズのような冒険も現代日本では難しい、ということに気付いて諦めた道でした。
(そもそも具体的に「名探偵」というものを職業として認識してたかは記憶に定かではないのですが)
ですが、最近仕事でデバッグをしている時にふと思うんですね。
「あ、これ、自分が憧れてたホームズと同じことやってる」
今から、その話をします。
ホームズの有名な台詞に、
不可能なものを全て削除した時、何が残ろうとも、それがいかにありそうでなくとも、真実に違いない。
コンプリート・シャーロック・ホームズ訳 シャーロック・ホームズの事件簿「白面の兵士」より
というものがあります。
自分のデバッグ時の姿勢は、これそのものです。
可能性を切り分け切り分け、どんどん細分化して、最後に残ったものが原因。
最初は、問題の発生箇所の特定とログの確認からやることが多いですね。
発生前後のログを確認することで、どういう状況で何が行われてどこで処理が止まっているかはわかる。
Rails のログで DEBUG ログも出力していれば、SQL のログで想定している処理が行われているかがわかることもある。
それが確認できたら、今度はそのエラーがなぜ発生しているのかを特定します。
ここで nil になっているはずがないのに、なぜか nil でエラーになっている。
なら、そうなる可能性があるとしたら? というのを考え、自分でその可能性に対する反証を見つけていきます。
ここが失敗すれば nil になるけど、そもそもここで失敗してたらその時点で例外になるはず。なら、問題はここよりも後。
こういう状態だとこういう問題が起こるけど、だったらこういうエラーになってるはず。
という感じで切り分けていくと、問題の発生条件はかなり絞られてくるはずです。
それでもなお、特定の行でエラーが出ていることはわかった、でもまだ原因がわからない。
で、あれば。
その行をさらに切り分ける必要がある、ということ。
その 1 行の中で実行されている処理は何?
それらの処理はどこまで進んでいる?
どこで止まってる?
どうしてそのタイミングでは問題になってなくて、こっちで問題になってる?
原因がわかるまで、深く深く潜っていきましょう。
ちなみに、上記のホームズの台詞には続きがあって、
複数の解釈が残る場合があるかもしれない。そういう場合はそのうちのどれかに納得できるだけの証拠が得られるまで何度も検証を繰り返す。
というものですが、それと同じことですね。
すぐにわかることもありますが、なかなかわからないこともあります。
条件は同じに見えるのに、ダメな時とそうでない時がある、みたいなことも。
一見条件が同じに見えるけど、何か違う条件が隠れているはず。
本番でしか発生しない、という恐怖ワードもありますが、「じゃあ開発環境やテスト環境と本番環境との違いは何か?」と考えて絞り込んで突き詰めていくしかないのかなと思っています。
「発生箇所を特定して」「可能性を考えて」「その可能性を否定する証拠を見つける」のが基本なのは、どんなものでも変わらないですね。
そうやって可能性を排除していって、最後に残ったものが原因。
ということ。
当然ホームズにはまだまだ遠く及ばないですが、多少は、できてることもあるんじゃないかなと思えるようになってきました。
最近、ようやく。
そしてやっぱりホームズすごいなと思います。
ほんとかっこいいですよね。
ここが一番大事なところなのでもう一度言います。
ホームズかっこいい……!