関連記事
プログラマーはデバッグスキルを磨け!
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
プログラミングには「バグ」はつきものです。
プログラマーは、常に何かを作っているイメージがあるかもしれませんが、実際には作ったものが上手く動かずバグの原因を調べたり、直したりしている時間もかなり多いです。
プログラマーはバグと上手く付き合っていく必要があります。
あなたはバグが嫌いですか?
僕はバグが出ると「さあ、見つけてやるぜ!」とむしろワクワクします。
今日はそんな「バグ」についてお話します。
システムの中に実際に「虫」がいた!?
バグとは、プログラムの中に潜む「欠陥」のことです。
語源は「bug(虫)」
プログラムの中で悪さをする虫という意味で、コンピュータに限らず機械の不調を表す言葉として昔から使われてきました。
1947年にハーバード大学の大型コンピューターで誤動作が起こり、原因を調べてみると、中に本物の虫(蛾)が入り込んでいました。その虫を取り除いたところ、動作が正常に戻ったという話があります。(虫を取り除く=デバッグ)
これが語源ではないのですが、実際にコンピュータの中に「バグ」がいた例として有名な話です。
プログラムの中には実際の虫はいませんが(笑)、バグ(欠陥)は常に存在しています。
そして、これを生み出しているのは他でもない「プログラマー自身」です。
プログラマーの仕事の半分は「バグを潰す」こと
なぜ、バグが発生するのか?
原因は、単純なコードの打ち間違いやスペルミスもあれば、設計上のミスやサーバーやプログラミング言語自体のバグもあります。
開発時やテスト時に気付くバグもあれば、Webサービスを実際に公開し、運用してみて初めて発覚するバグもあります。
バグが発生すると、プログラムが期待通りに動かないだけでなく、プログラムが無限ループしてしまったり、最悪の場合、サーバーのリソースをどんどん食い潰してクラッシュさせてしまったり、個人情報が流出してしまったりと、様々な危険性があります。
怖いですね。
このバグを発見し、潰すために、開発ワークフローの中には「検証フェーズ」があります。
このフェーズでは「検証仕様書」というテストシートを使用しながら、作ったプログラムを様々な角度でテストしてバグを洗い出します。
しかし、バグを潰すためにソースコードに手を入れれば、また新たなバグが生まれたりします。
デバッグスキルは超重要
プログラムを作れば作るほど発生する「バグ」
プログラマーは常にバグを潰しながらプログラムを作っています。
すぐ解決するバグもあれば、いくら直しても解決せず「丸1日ハマった」なんてこともザラです。
なので、バグを早く解決できる「デバッグスキル」はプログラマーにとってかなり重要です。
デバッグが速いプログラマーは結果的に開発スピードが速い。
プログラミングの学習では、コーディングスキルの説明がほとんどですが、デバッグスキルもそれと同じくらい「超重要」なんです。
デバッグスキルを高めるにはどうすれば良いのか?
正直なところ「経験」が大事です。
多くのバグを経験することで、「あ、これは〇〇が原因だな」「これはここが怪しい」といったように勘所が分かるようになってきます。
ただ、これで終わってしまうと寂しいので、デバッグのコツを1つ書いておきます。
デバッグのコツ
デバッグとは、数多くある可能性の中から「原因を特定していく作業」です。
ここを意識しないでやっていると、何から手を付けて良いか分からずパニックになります。
可能性を1つずつ排除しながら、原因を狭めて特定していくということが大事
例えば、Webサービスの画面でボタンをクリックした際に上手く動かない場合を見てみましょう。
このとき、いきなり全体を見ようとせず、まずは以下のように「ボタンをクリックした直後の処理」から1つずつ追っていくことが大切です。
①ボタンをクリックした後のスクリプトが正常にコールされているか。
↓
②コールされたスクリプトに全てのパラメーターが正しく渡っているか。
↓
③スクリプトは正しくPHPを呼び出しているか。
↓
④PHP側では正しくパラメーターを受け取っているか。
↓
⑤PHPの処理は正しく行われているか(ここも1ステップずつ見ていきます)
↓
⑥PHPからの結果は正しく受け取っているか。
↓
⑦後処理は正しく行われているか。
このように「頭から1つずつ」正常動作を確認していきます。
すると、必ずどこかで上手くいっていない箇所にぶつかります。
そこにバグがあります。
上手く動かないからと、闇雲に修正を試していくのではなく、まずは落ち着いて、原因を絞り込みましょう。
プログラマーは「ポジティブに自分を疑うこと」も重要
経験上、プログラムが上手く動かない原因のほとんどは「自分の打ち間違え」です。
丸1日悩んだ結果、単純なスペルミスで「原因これ!?」みたいなことも多いです。
何か問題が起こると、真っ先に他人や外部を疑ってしまいがちですが、プログラミングで上手く動かないことがあったら、まずは自分のスペルミスを疑いましょう。
結果、デバッグが速くなると思います。
真のプログラマーはバグを未然に回避する
経験を積んでくると、「この辺はバグを生みそう」というのが、コードを書いている段階で分かるようになってきます。
変数名の付け方だったり、スコープの考慮や条件分岐処理のマッチ順序の工夫など、バグの匂いがする部分を嗅ぎ分けて、本能的にバグを未然に防ぐコーディングが出来るようになっていきます。
とはいえ、バグがないプログラムは存在しません。
人間はミスをする生き物である以上、必ずバグは存在します。
その「前提」を認識しているかどうかも重要です。
プロのプログラマーは「バグがある前提」「事故が起こる前提」に立ち、それが起こったときに最小限の被害で済むようにコーディングしていくことが大切なんです。
バグを少なくするための第1歩は「分かりやすいソースコードを書くこと」です。
以下の記事も是非参考にしてみてください。