正しいバグの治し方!

記事
IT・テクノロジー

正しいバグの治し方!

プログラムには殆どの場合、「バグ」があるものです。余程規模の小さなプログラムを除けば、小さなバグはどうしても残ってしまう場合も多くなります。プログラムを作ったら、まずは動作確認やテスト(検証)をして、意図しない動作の修正を行います。この記事では、正しいバグの治し方について考えてみました。


バグとは何か?

プログラムで意図しない動作をする場合がありますが、これをバグと呼んでいます。少なくても検証をきちんとしていないプログラムには基本的にバグは存在する場合が殆どです。テストをしながらこうしたバグを修正する作業をデバッグと呼んでいますが、プログラム開発では重要な作業になります。

ところで、バグを修正する際はどのように修正しますか?

シンプルに言えば悪いところを見つけて、それを直すという作業になりますが、実は意外に簡単ではありません。

バグの原因はいろいろ考えられますが、よくあるケースを例に挙げると:

* 変数などの書き間違い
* 処理の条件の間違い (プログラムの論理の間違い)
* 想定外の条件の発生
* タイミングに関連した不具合
などがあります。バグの原因はこれ以外にもたくさんありますが、この辺りが良くあるバグの原因です。

プログラムを書く人や書き方にもよりますが、書き間違いはよくあるミスです。最近は、プログラムを入力するエディタの機能が向上しているので、ある程度のミスはプログラムを入力する段階で気づく機会も増えているので比較的少なくなってきています。

ところが、プログラムの論理的なミスは発見するのが少し難しくなります。 プログラムの書き方自体には問題がなくても、処理の条件や想定外の条件が起きたりすると意図したのとは違う動作になることは良くあります。こうした問題は、デバッガを使ってデータの流れを確認したり、デバッグ用のメッセージを何らかの方法で表示させて、処理やデータの流れを確認しながら問題点を絞っていきます。こちらも、ある程度経験を積むと、データの流れや処理の流れを確認する方法がわかってくるので時間をかければ解決しやすい問題だと言えます。

Google 検索で解決できるか?
厄介な問題は、実行する度に結果が変わってしまう場合や、扱うデータなどによって想定通りに動いたり、動かなかったりする場合です。もう一つは、何らかの原因で「良くわからないエラーが出る」と言う場合も厄介です。

こうしたケースの問題点の原因を特定するのは実は結構難しいものです。

最近はインターネットが発達しているので、こうした不具合の情報もインターネット上で共有されている場合が多くなっています。同じようなプログラムを書くと、同じような問題にぶつかる人も多く、そうした問題の場合、解決方法がインターネットで共有されていて、解決の糸口として助けられる場合がたくさんあります。

そう考えると、インターネット普及以前に比べるとデバッグも短時間でできるようになってきています。

特に、インターネットで公開されているモジュールを自分のプログラムに組み込んで利用したりする場合、モジュールの中身は他人が書いたプログラムで良くわからない(ブラックボックスの)場合が多く、エラ〜メッセージが頼りになります。良く利用されるモジュールの場合、エラ〜メッセージを使って検索すると解決法が見つかる場合が殆どです。

問題点が見つかったら、まずは「検索」で解決方法を見つけることができるのはプログラム開発では大きな助けになります。

本当に治っているのか?
インターネットで検索して対処方法を見つけて直す場合には実は注意が必要です。 この方法で修正できる大前提は「原因が同じ」場合だからです。原因が同じでない場合には、問題がきちんと修正されていない場合があると言うことを認識することが大切です。

簡単な例を挙げると、お医者さんの診断に似ています。例えば、「お腹が痛い」と言う症状があったとします。しかし、お腹が痛くなる原因には一つではありません。お腹が痛くなった場合でも、痛み止めを飲めば一時的には凌げる場合も多くあると思います。しかし、痛み止めでは根本の原因には対処していないので、何か病気が原因でお腹が痛い場合には、薬がキレたりした場合や、将来またお腹が痛くなる可能性があると言うのは医者でなくてもわかる話かと思います。医者の仕事は、こうしたお腹が痛い原因を突き止めて治療することです。こうすることで、痛みのない原因を取り除いて行くことが根本的な治療ということになります。

プログラムの場合も似ていて、同じような症状やエラーメッセージが表示されても原因が同じとは限らないという事です。

きちんと対処するには、原因を突き止めてきちんと対処するのが正しいバグの治し方です。

インターネットの情報もきちんと原因を説明している情報もありますが、対処方法のみが書かれていて原因はきちんと説明されていない情報もたくさんあります。中には不必要な処置を行っている場合も多く、こうした不必要な処置(パッチワーク)を重ねると何をやっているのか分からなくなってしまう場合も少なくありません。これが、インターネットで検索して安易に対処する場合の弊害になります。

以前勤めていた会社では「ノウハウ集」のような事例が沢山記録されていて、過去に起きた問題点とその対処法がまとめられた物がありました。不具合が起きた場合には、その中から似たような事例を見つけて対処すると大抵の問題は解決できたのも事実です。そうした経験が積み重なると、「この場合はこの対策」というパターンに当てはめられるようになるので、見かけ上は円滑に問題を解決できるようになった気がしてしまいます。

ところが、アメリカの会社で同じようなことをすると、必ず聞かれるのは「どうして?」ということです。何が問題で、その処置をすることでなぜそれが解消されるのかを聞かれます。そんな時、きちんと説明できないことも沢山ありました。改めて考えてみると、良くわからないまま、対処療法で対応していたことに気づきました。

きちんと原因を知ることが大切
このように、きちんとした対策を取るためには、問題の原因をしっかり理解して対策を行うことが、「正しいバグの対処方法」です。 原因を特定せずに、上部だけの対策をすると多くの場合、2次的、3 次的な問題が起きるケースがかなりあります。

原因をきちんと見つけて、理解するにはそれなりの知識と経験が必要です。最初は難しいかもしれませんが、上部だけの学習ではなかなか問題の原因となる「証拠」を見つけるのは困難です。プログラミングの場合、簡単なプログラムでも、問題は発生する物です。その一つ一つの原因と対策をきちんと理解することを積み重ねることで、複雑なプログラムの問題も扱えるようになります。

簡単に見える問題でも、きちんと原因を特定して説明するのは意外に難しい物です。しかし、原因を特定して理解することで、そうした問題がおこならないプログラムを書く事が可能になります。小さなな問題にきちんと向き合って対策することでプログラミングの能力は確実に向上します。

まとめ
プログラムにバグはつきものですが、大切なのはバグを「見えなく」することではありません。問題が見かけ上起きなくなっても、実際に問題が解決したかどうかは、きちんと原因を突き止めないとわかりません。不用意に対策を行うとプログラムの見通しが悪くなってしまいます。 プログラムの実力をつけるためには、小さな問題でも、きちんと原因を特定して対処することで、より上級のプログラマーとしてステップアップできます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す