「仮説の誤り」 != 「無駄」

難しいことをしていた人が、それがうまくいかなかったときに「自分の立てた仮説は間違っていた、丸一日無駄にした」などといって落ち込んでしまうことがあります。しかし、それは違うよという話をします。別に物珍しい話ではないのですが、知らない人がかなり多いので、あえて書きます。

話を簡単にするために、「何らかの問題の原因を明らかにするために仮説を立てて検証したものの、うまくいかなかった」という場合をここでは考えます。たしかにこれは「仮説が間違っていた」*1とは言えるんですが、決して無駄ではありません。なぜかというと、これは原因を特定するためのたくさんある仮説の中の一つが誤りだとわかっただけで、その次は残った仮説の中から一つを選んで調査を継続すればいいだけだからです。つまり問題の絞り込みには成功して、調査は着実に先に進んでいるといえるのです。

過去事例をもとに具体的な話をしましょう。わたしはかつて、プログラムをコンパイルするとコンパイラがランダムに異常終了するという問題に遭遇したことがありました。このときに問題を起こした原因として考えられる容疑者は、疑わしさが高いもの順にコンパイラカーネル、そしてハードウェアでした。トラブルシューティングをするときの王道は確率が高いものから調査することなので、まずはコンパイラがおかしいという仮説を立てました。しかし検証の結果、この問題はユーザプロセスではまず起こしえないことがわかりました。これでコンパイラがおかしいという仮説は誤りだとわかりました。続いてカーネルがおかしいという仮説を立てて検証した結果、この仮説も誤りだったとわかりました。最終的にはハードウェアの問題だと明らかになりました*2

さて、ここでコンパイラがおかしいという仮説、および、カーネルがおかしいという仮説を立てたこと、および、それらを検証をしたこと、誤っていたとわかったことは無駄だったのでしょうか。いいえ、それは違います。これら複数ある仮説を可能性が高いものから順番につぶしていくという全体の流れの中で起こるべくして起こったことなのです。むしろ最初に立てた仮説がいきなり正しいというのは珍しいくらいに考えたほうがいいかもしれません。なお、世界は広いので最初の仮説が誤っていた時点で怒りだす人がいるのですが、そういうのは狂犬が吠えていると思って無視しましょう。

ここまでに述べたような考え方ができると、具体例に挙げたデバッグに限らず、仮説検証を繰り返す任意のことをする際に、ずいぶんと気持ちが楽になると思います。ぜひこの考え方を会得してみてください。

*1:検証方法が間違えていた場合もこうなりえますが、省略

*2:この問題についてさらに詳しく知りたいかたはこの記事の「問題2」をごらんください