Bug’s life
コードにバグはつきものである。バグを出さないでコードを書くことはできるが、コード自体が大きくなればなるほどバグを出してしまう確率は増える。いかにバグと向き合うかがコードを書く上でポイントになる。バグの発見はエラーという形で表される。実行時もしくはコンパイル時に、エラーメッセージと共にバグが発生している箇所が行番号で表示されるのが一般的である。
バグの原因で一番多いもの
バグの多くはタイプミスが原因である。エラーが発生した行番号の前後をチェックすればわかることが多い。だが、問題はそれだけではない。構文のタイプミスであれば、Lintパッケージを導入していれば、チェックされるのでバグは起きないんじゃない?と考えるかもしれないが、変数名までチェックしてくれるわけではない。たとえば、関数への引数が、本来渡す変数名と違っていてもエラーにはならない。そこまでチェックしてくれないからである。ただ、構文のタイプミスは、万が一見逃しても、実行時やコンパイル時にSyntax Errorとして表示されるので、わかりやすい。
バグのタイプ
バグには2つのタイプがある。ひとつは、先に述べたようにエラーメッセージが表示されるタイプ、もうひとつは、エラーメッセージもなにも表示されないが、実行結果が正しくないタイプである。厄介なのは後者である。前記事の「if:もし、もし?あたしリカちゃん」のところで述べたが、以下のようなコードを書いてしまうと、きれいにパスしてしまい、エラーも何も表示されない。
<?php
$msg = ""
$a = 9
if (0 < $a) {
if ($a < 10) {
$msg = "入力されている数値は正しいです。\n";
}
} else {
$msg = "数値は1から9までの範囲で入力してください。\n";
}
echo $msg;
エラーがでないからといって、正しいコードとは限らないのがプログラミングである。
エラーメッセージがあるからといって必ずしも解決しない
また、エラーメッセージが表示されたからといって簡単に解決しないこともある。併せて行番号が表示されるが、その行のコードについて、なにが悪いのかエラーメッセージを読んで理解しないとダメなのである。構文エラーやタイプエラーといった簡単なエラーメッセージであればいいが、そうでない場合は調べることになる。
エラーメッセージは英語表記であり、英語が苦手な方にはハードルが高い。たとえ日本語に翻訳したところで、プログラミング初心者にとって理解不能なエラーメッセージだったりする。エラーメッセージをGoogleで検索しても大抵は英語サイトが表示される。日本語サイトがあったとしても、エラーメッセージは同じであるものの、発生した状況が自分と同じとは限らない。なので調べても解決しないこともある。調べ方がいい悪いという問題ではないのである。
バグの解決は根気である
いずれにしろ時間はかかるが、デバッガーを使って変数名や値は正しいか、構文的には合っているが、書き順が正しいかどうかなど、とにかく事細かくコードをチェックしていくしかない。また、精神的にはカッカしていることが多いので、一休みしたり、時間を開けてチェックするなど、気持ちを落ち着かせることも重要になる。そう簡単に解決させてくれないのがバグなのである。
コードなきところにバグはなし、バグなきところにコードはなし。自分ではいいこといったつもりだが、意味がわからないのでこれで終わる。