バグを見つけることをデバッグと言いますが、この作業はとても大切です。
バグのないプログラムはないと言えるほど、プログラムには必ずバグは発生します。
そのため逆をいえばデバッグの方法や考え方はスキルになるということです。
バグとエラーの違い
バグとエラーは違います。
バグ:思った通りの動きをしていないプログラム
エラー:プログラムが実行されない状態
どちらもプログラムとしては完成品とは言えない状態ですが、状況が違うのです。
エラーはプログラムが実行されないので動かないですが、バグが潜んでいてもプログラムは動いてしまうのです。このちがいは重要です。ふたつは分けて考えましょう。
エラーの対処方法
上記でもいったとおり、エラーが出ているプログラムは動きません。
また、WEBの場合だとエラー内容がブラウザに表示されていたり、ブラウザ表示が真っ白になります。エラーが表示されていないと何が起きているのかわからない状態です。
原因がわからない状態で、あれこれとプログラムを変更してしまうのは浅はかです。
原因を確認しましょう。方法としては「ログ」を確認することが一番です。
WEBプログラムの場合だとHTTPサーバーのApacheなどがアクセスの際やエラーが起きた時にログファイルに記録を残すようになっています。
そのログを確認すれば、何が起きているかはわかります。
バグの対処方法
バグを見つけるためにはテストを行います。
テストには2種類あります。
プログラムの動きが正しいか確認するためのテストとバグを見つけるためのテストです。
バグを見つけるためのテストとは?
通常「テスト」というと、プログラム自体が正しく動くかどうかを想定してテストが行われます。一般的なユーザーが使ったときにエラーとなったり、動かなくなったりしないように正常性の確認をします。
プログラム開発終盤では、ほぼほぼエラーは出ないように作られているのですが、思いもよらない動きがけっこうな確率であったりします。
ユーザーが通常とはちがった操作を行ったときにバグが発生したり、ハッカーやクラッカーなどがバグから脆弱性を突いてハッキングをしかけてきたりします。
このような意図しない使われ方でもプログラムの正常性が保たれるかをテストするのが「バグを見つけるためのテスト」です。
バグを見つけるためのテストの準備
ログを記録するような機能をプログラムに実装しておきましょう。
ログを入力する機能が元々ありますが、HTTPサーバープログラムのApacheなどが行ってくれます。
また、PHPなどの言語であっても構文エラーや関数の使われ方が違っていてプログラムが動かないというエラーなどもログファイルに記録されます。
しかし、自分で作ったプログラムにバグが含まれているかどうかはログに記録されません。エラーにならなければプログラム自体は正常に動いていると認識されるからです。
ログ出力機能の実装
プログラムは変数や分岐判定が多く、入力されたデータがどこでどのような値に変化して結果を出力するかわかりづらい仕組みです。
そのためログを出力機能は必須なのです。
わかりづらい部分をログ出力することで見えるものにしておく必要があります。
見える状態になったら項目を追ってテスト
ここでやっとテスト項目を作成して、テストを行っていく流れとなります。
見えないものを見えるようにして、ルートや入力値の変化を確認すると、仕様と意図しない変化をしている値が見つかったりします。
プログラム作成時に細かくチェックしておくと後が楽
「もうすぐプログラムが完成」という状況でバグを発見した時のプログラマーは地獄です。
作成したプログラムが大規模なものほど大変なものになるでしょう。
一部を修正すると関連するプログラムが対応できなくなったり、連携がとれなくなったりするのです。
オブジェクト指向の場合、機能を分割してプログラムを作成しますが、うまく動かない場合もあります。
そうならないために、一定の単位ごとにチェックをしながら作成をすることです。そうすればバグを潜ませないプログラムを作成することができます。
プログラムを難しくしすぎないこともバグを防ぐ方法
またプログラム作成に注ぐ力をセーブすることも大切です。
これは手を抜くということではなく、簡単な方法で実現できるのであれば、外部の仕組みでもなんでも使って機能を実現するということです。
複雑なプログラムはテストも細かくなり、ログの出力も難しくなります。それだけ思考を巡らす時間が必要になり、処理時間がかかるのですね。
プログラムを複雑に作りこまないこともバグを発生させないための大切な要素なのです。
難しいことを簡単にするスキルがプログラム制作では大事
難しいことを簡単な仕組みで作成するにはスキル、発想、経験などいろいろな要素が必要です。
自分ひとりで考えているだけでは斬新な思考は生まれてきません。
誰かに教えてもらってもいいですね。
他の人がどんなコードを書いているか興味をもち、どんどんインプットしていきましょう。
経験を積み重ねることや、人のコードを見たり教えてもらうことから、新しい発想や気づきが生まれ、プログラマーとしての成長を加速させます。