バグの症状と原因

記事
IT・テクノロジー

バグの症状と原因

プログラミングにバグ(不具合)は付き物です。プログラミングに限らず、何かの問題には表面的な症状と、その原因があります。バグをきちんと修正する上で原因をきちんと突き止めて修正する事がとても重要です。この記事ではバグへの対処方法のポイントについて紹介します。

症状と原因
プログラムのバグには、「症状」と「原因」があってこの二つは別の物です。 症状は、目に見える問題点で、何かおかしいという直接の問題点です。例えば、計算結果が想定している結果と違っているなど、「計算結果が違う」というのが症状です。

一方で原因は「計算結果が違くなる理由」になります。例えば何かの計算が抜けているとか、計算の順序が違うなど、計算結果が予想通りにならない根本的な理由の事を指しています。

プログラムのバグを修正するには、基本的にはこの「原因」を突き止めて、その原因を取り除くというのが正しい問題の修正方法になります。

根本解決と対処療法
ところが、原因をきちんと突き止めずに、問題点を「抑える(隠す)」ことも可能なケースがあります。例えば、熱を出して体調が悪い場合に、解熱剤を飲んで熱を下げるという処置は対処療法と言われる方法です。ちょっとした熱だと風邪かなという感じでこの様な処置をするケースは多いと思いますが、熱が出る原因は風邪ではなく他の病気という場合もあるわけです。

逆に、風邪ではない場合でも、解熱剤を飲むと熱は下がるわけなので、それで対処してしまうと、隠れている真の原因(別の病気)の発見を遅らせる原因になります。

プログラムの場合でも同じで、実際は処理の過程に何かの間違いがある場合でも、例えば Google 検索をして似たような症状の解決方法を見つけて同じような対処をするという様な治し方の場合、症状がおさまる、つまり見かけ上は正常に動作するように見えても、実は別の原因で動作がおかしくなっている場合には、少し条件が変わると問題が表面化する場合も沢山あるという事になります。

危険な対処療養
以前勤めていた会社にには、「不具合ノウハウ集」というものが作られていて、問題となる症状とその解決方法をまとめたデータベース(当時はファイルに保管)がありました。

設計で何か不具合を出すと、新人や経験が少ない人は、まずはこのノウハウ集を調べて対策するという修正を行うケースが結構ありました。実際、かなりのケースで問題となる様な動作を回避できる場合が多く、問題解決のスピードアップという意味では一定の効果はあったように思います。しかし、きちんと原因を究明せずに対策するケースが当然ですが多くなるので、後になって重大トラブルの原因になるケースもあった様に思います。

また、同じ様な機能の場合、以前の設計(コード)を流用するケースも多くなると思いますが、きちんと原因を見つけてコードを追加している訳ではないので、どのコードが本当に必要なのかが判断できずに、結局全てコピーして一部は、設計者であるエンジニアにもきちんと理解されていないコードというケースも発生していました。

原因を突き止めて理解することが大切!
そうした、将来的なトラブルを避ける意味でも、問題点の修正は「原因」を突き止めた上で、その「原因」を解決する方法を考えて対処するというのがとても重要になります。

上で挙げた例の発熱に対する対処方法として解熱剤を使う方法は、問題(症状)を「回避」する方法という方が近く、問題をきちんと解決していない方法と言えます。理想的な対処は、十分な検査を行なって発熱の原因になる病気などをある程度特定した上で、発熱の原因になっている病気の治療をする事が重要です。

プログラムの場合でも、症状を抑えるという方法ではなく、症状の原因を取り除く対処が必要です。短期的な対策は症状を抑える方法でも良い場合も多いですが、長期的には原因をきちんと突き止めておかないと将来別な大きなトラブルの原因になる場合があります。

まとめ
プログラミングをする上でバグと上手く付き合っていく事はとても重要です。

プログラミングの初心者には、症状とそれに対する対処をまとめた所謂「ノウハウ集」は便利な存在です。しかし、ノウハウ集に頼り過ぎると、自分の理解を超えたコードが増えてしまい、難解なプログラムになることも多くなります。

また、重大な問題の発見を遅らせる原因にもなりますので、バグが発生した場合には、ノウハウ集で書かれているバグの原因は何であって、それをどのような形で解決しているかをしっかり見極める作業が実はとても重要になります。

シリコンバレーで問題点の修正方法を議論していると必ず「何故」というのを聞かれます。この何故にきちんと説明できない場合はその方法が採用されるケースは殆どありません。実は、問題と問題に対する方法をきちんと理解する事が、エンジニアとしての成長に繋がるからです。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す