初心者に贈る エラー文の出ないバグを潰す方法


プログラマーとは調査分析力が群を抜いたツワモノどものことである
〜 プログラマーについて コレ=ナン=ノバグ (1936~1965)

迷える羊たちへ

プログラミングをはじめたばかりの初心者やプログラミングを苦手と感じている情報学徒たちに、テストコードを作ってくださいとかブレークポイントを活用してくださいという様な高度なテクニックは要求しません。デバッグというワードも知らないかもしれないですしね...
本記事では初心者プログラマーにぜひやってほしいバグ潰しの方法をまとめます。

下ごしらえ

バグ潰しをする前に、確認すべきことがあります。

  • 参考資料ちゃんと読めていますか?
  • 課題の意味ちゃんと理解できていますか?
  • 要件をちゃんと把握できていますか?

実はプログラミングが下手な人って高確率でそもそも日本語が読めないんです!まずは日本語の勉強をしっかりしましょう。ボキャブラリーを増やしましょう。意味のわからない単語との遭遇は貴重です。確実に調べて覚えていきましょう。次に英語の勉強をしましょう。参考資料の行き着くところはだいたい英語です。プラットフォームの公式リファレンスとかも英語です。
そして、実装に使用するプログラミング言語の勉強をしましょう。何か参考書を持っている場合は、とやかく言わずにまず最初のページから最後のページまで舐めるように読んでください。一冊くらい読破したと言える参考書を持っておきましょう。

バグ発見編

  1. 実装要件を明確にする
    何をしなければならないのか正確に把握してください。

  2. 処理の流れ(ストーリー)を全て追ってみる
    イベントの発火から最終結果出力までの全てを追ってみてください。プログラムは処理の順序が何より重要なので、そこを意識しながら行なってください。

  3. バグ箇所を絞る
    どこでダメになっているのかを特定します。printデバッグを上手に使いましょう。おススメは挟み撃ちprintデバッグです。2で押さえた処理の流れの最初と最後にprintデバッグを仕掛け、徐々にその間隔を狭めていきます。自ずとバグ箇所が追い詰められて炙り出せるという戦法ですね。この時printデバッグで出力する内容はその処理に関わっている変数の中身にしましょう。nullなのか負の値なのかなどとにかく吐き出すことで原因を見つけやすくなります。

断言できますが、どこら辺にバグの原因があるのか、この手法で範囲を狭められないことはありません。解決できるかどうかは別ですが...

バグ解決編

最近のIDEで開発をしている場合、エラー文が出力されない/コンパイルが通ってしまうバグというのは基本的にロジックのミスしかありえません。なにかの処理が不足しているか、処理の順番を間違えているか、計算が間違っているか、そもそも理論が間違っているか以外考えられません。そうでないなら、もしかしたら使用しているライブラリやフレームワークのメソッドは期待する処理を行わないものかもしれません。

  1. 何ができていないのかを明確に言語化する
    例えば「うまく動かない」のではなく「クリックしても反応しない」とか「クリックができない」とか「図形が動かない」とか「図形が表示されない」とかより具体的な表現にしましょう。

  2. 本当にそうなのかチェックする
    例えば「キャンバスになにも表示されない」とバグを言語化したとします。本当にそうでしょうか?もしかしたらキャンバスの見えている範囲外に描画されているかもしれないし、見えない色で描画されているかもしれません。常に疑問を抱き、バグの可能性の芽を見捨てないでください。

  3. 要件達成の原理に立ち返る
    原理を考えて、何がなければいけないのか、どの順番で行わなければならないのかなどを理詰めで確認してください。理詰めが苦手という人はプログラマーに向いていないので諦めてください。大丈夫、きっと他にもっと向いていることがありますよ(知らんけど

    例:当たり判定の実装
    当たり判定をするためには、矩形と点あるいは矩形同士の領域を比較する必要があります。つまり比較するための領域が設定されており、最新状態に更新されていなければなりません。状態の更新処理がなく、当たり判定がうまく行かないということがあります。

    例 図形描画の実装
    オリジナルの図形インスタンスを作って満足しているパターン結構あります。概念的・内部処理的には良いのですが、キャンバスに描画されなければ意味がありません。インスタンスをキャンバスに追加する処理、再描画をかける処理が抜けているということもあります。

  4. 図を描いてみる
    頭を整理するためにも、人に説明するためにも図を描いてください。(上手な絵をかけとは言ってません。)図が描けないなら実装要件や状態遷移を完璧に把握できていないのと同義です。

  5. 同じ症状に陥った人が過去にいないかググる
    自分の理解を超える様な、「ぜってぇそんなの気づかねぇよ💢」という様なバグというのもあります。そんなバグは自力で見つけることはできません。先人に頼りましょう。