トラック3・🔍人間がコンピュータになる訓練

バグを見つける思考法——仮説と検証

読む目安 約12分・ゴール:バグの原因を絞り込む手順(再現→範囲を狭める→仮説→1つずつ検証)を身につける

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

プログラムが思い通りに動かない。これは失敗ではなく、通常運転です。プロでも1日に何度も起こります。違うのは、その後の動き方です。

バグとは何か

バグとは、プログラムが期待と違う動きをすることです。ここで一つ、大事な確認を。

プログラムは、あなたが思った通りには動きません。書いた通りに動きます。

つまりバグがあるとき、機械は正常です。ずれているのは、頭の中の想定と、実際に書いた文字のほうです。これをデバッグ(虫取り)と呼びます。

師範「なぜ動かん」と嘆く前に、「何が起きておるか」を見よ。順序を逆にする者が多い。

やってはいけないこと

まず、やりがちな失敗から。

正しい手順は4つ

  1. 現象を正確につかむ — 「動かない」ではなく「入力に5を入れると、10と出るべきところが0と出る」。ここが曖昧なままだと、この先の全部が曖昧になります
  2. 確実に再現させる — 毎回同じ操作で同じ結果が出ることを確認する。再現できないバグは直せません
  3. 範囲を狭める — ここが本題です(次で説明)
  4. 仮説を1つ立て、1つだけ変えて確かめる — 予想と結果を必ずセットで記録する

範囲を狭めるは、二分探索でやる

前のトラックで学んだ「半分に割る」がここで効きます。

プログラムの真ん中あたりで、変数の値を表示させてみます。そこまで正しければ、バグは後半にあります。おかしければ前半です。これを繰り返せば、100行のプログラムでも7回ほどで原因の行にたどり着きます。

トレース表と組み合わせる

狭められたら、その範囲を紙の上でトレースします。そして、実際の実行結果と突き合わせます。

この「最初に食い違った行」を見つけたら、勝ちです。第3トラックでトレース表を練習してきたのは、この瞬間のためだと言ってもいいくらいです。

バグには3つの種類がある

種類が分かると、探し方も決まります。

3つ目には、機械は何も言ってくれません。だからトレース表が要るのです。「動いているのに間違っている」を見つけられる道具は、今のところ人間の目と表しかありません。

記録を残す

試したことと結果は、必ずメモしてください。「これを試した→変わらなかった」の積み重ねが、犯人を追い詰めます。記録がないと、同じことを3回試して、3回とも気づかない、という事態が普通に起こります。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

バグについての説明として、最も適切なものはどれでしょう。

  1. プログラムは思った通りではなく書いた通りに動くので、ずれているのは自分の想定か書いた内容のほうである
  2. コンピュータの気まぐれなので、同じ操作でも結果が変わる
  3. コンパイラの故障が原因なので、入れ直せば直る
  4. プログラムが長くなるにつれて自然に消えていく
答えを見る

正解:A(プログラムは思った通りではなく書いた通りに動くので、ずれているのは自分の想定か書いた内容のほうである)

バグがあるとき、機械のほうは正常に動いています。ずれているのは、頭の中の想定と実際に書いた文字のどちらかです。だから直すべき対象がはっきりします。なお、同じ入力なら結果は必ず同じになるので、再現しないバグに見えるときは、条件のどこかが毎回変わっていると考えます。

確認問題 2

バグを直すときの進め方として、最も適切なものはどれでしょう。

  1. 怪しいところをまとめて3か所直し、動いたら完了とする
  2. 再現できるかを確かめないまま、思いついた順に変更を重ねる
  3. 仮説を1つ立て、1か所だけ変えて結果を確かめる
  4. 原因が分からないので、最初から全部書き直す
答えを見る

正解:C(仮説を1つ立て、1か所だけ変えて結果を確かめる)

一度に2か所以上変えると、どちらが効いたのか永遠に分かりません。直ったとしても理由が残らないので、また同じバグを作ります。手順は「現象を正確につかむ→確実に再現させる→範囲を狭める→仮説を1つずつ検証」。試したことと結果はメモに残すと、同じことを3回試す事故を防げます。

「人間がコンピュータになる訓練」の目次

  1. トレース表とは——実行を目で見る道具
  2. 代入をトレースする
  3. 分岐をトレースする
  4. ループをトレースする
  5. バグを見つける思考法——仮説と検証
  6. ラバーダック・デバッグ
  7. エラーメッセージは敵ではない
  8. 総仕上げ——紙上プログラム実行

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版