ユーニックス総合研究所

  • home
  • archives
  • programming-bug

プログラミングのバグの直し方を考える

プログラミングのバグの直し方を考える

この記事ではプログラミングのバグの直し方を考えてみたいと思います。
筆者は個人開発者でついさっきもバグと格闘していました。

バグを直すのはプログラミングでは宿命、もはや切っても切れない作業と言えます。
バグを効率的に直せればそれだけ時間を節約することができます。
ですが困難なバグは時間ドロボーで熟練者でも手間取ることがあります。

このようなバグにはどうやって対応したらいいのでしょうか?
考えていきましょう。

関連記事

魔法の壺、プログラミングのライブラリ(Library)とは
頭悪い人にプログラミングは可能か?可能です
開発を3倍速にするプログラミングの考え方4つ
英語できないけどプログラミングはしたい。そんな人はこの方法がおすすめです
意味のないプログラミングの特徴3つ

バグはなぜ生まれるか?

バグはなぜ生まれるのでしょうか?
バグというものが出てしまうとプログラムはちゃんと動かなくなってしまいます。
ちゃんと動かないプログラムというものはつまらないものです。

ユーザーの体験も低下するし開発のモチベーションも下がってしまいます。
このようなバグはなぜ出てしまうのか?

その理由は↓の2つです。

  • プログラムを作ればバグが出る
  • 人間はバグを生む生き物

プログラムを作ればバグが出る

プログラムを作ればバグが出ます。
これは防ぎようのない通過儀礼です。

プログラミングをしていく上でこのことは避けては通れないことです。
バグのないプログラムはないしプログラムを作ればバグが出ます。

  • プログラミングにバグはつきもの

なぜならプログラムは人間が作るものだからです(いまのところ)。
人間というのはミスをするし不完全な生き物です。
ですのでバグを出してしまいます。

人間はバグを生む生き物

人間はバグを生みます。
バグを生まない人間はおそらくこの世にはいないでしょう。
いたとしたらそれは神に近い存在です。

普通の人間はプログラムを組めばバグを作ってしまいます。
そのことは恥じることではないしむしろ当然のことです。

  • 人間ならバグを作って当然

バグのないプログラムを作れ」なんて命令してくる上司がいたらこう言ってやりましょう。
それは99%不可能です」と。

🦝 < 1%はいけるのかい

🐭 < うーんプログラマーやな

バグが生まれたらまず何をするべきか?

バグが生まれたらまずは何をするべきでしょうか?
バグというものが生まれたときにしなければならないことは?

言ってしまうと再現するバグは天からの贈り物です。
天が「もっと良いプログラムにしろ」とバグをよこしてくれるのです。
ですのでそのありがたいバグを手に入れたらまずはしなければならないことがあります。

それは↓の2つです。

  • バグが再現する環境をキープする
  • 具体的にどんなバグなのかメモする

バグが再現する環境をキープする

バグが再現する環境を保持する、キープするのがまず第一です。
むやみにコードを書き換えずに現在のコードを保護しましょう。

そのコードはバグが再現する貴重なコードです。
バグが埋め込んであるアホコードと言うこともできます。

  • それはアホコードであり貴重なコード

しかしその状態のコードをまずは保持するのが第一です。
コードを適当に書き換えてバグが複雑化することもあります。
そうすると仕事が増えてしまいます。

現在の状態の保持。現場を守る。
これは調査の基本です。

具体的にどんなバグなのかメモする

バグをメモしましょう。
いったいどういう感じのバグなのか。メモ帳にメモをします。

再現性はあるのか? それとも偶発的か?
重症度はどれぐらいか? クリティカルか鼻で笑うレベルか?

  • 再現性
  • 重症度の確認

などなどバグを見て調べて分析します。
どういったバグなのかその肌ざわりを確認することは重要です。

他人にどういうバグが出たか説明できるレベルでメモを取りましょう。

バグを潰すための道具は?

バグを直すための道具を用意します。
これからバグをやっつけるための頼もしい仲間です。

バグを1人でやっつけるのは骨の折れる仕事です。
初心者プログラマーなら一大事、大きな仕事と言えます。

  • バグをやっつけるのは一仕事
  • プログラミングの醍醐味を味わおう

しかしバグを修正するのを助けてくれる頼もしいツールはたくさんあります。
そういったツールを活用すれば時間を節約することもできます。

人間と猫の違いは道具を使うかどうかです。
あなたは猫ですか? それとも人間?

🦝 < ……

🐭 < 種族差別ハンタイ

テスト

バグをぶっつぶす!
そのためにはテストが一番です。

テストをろくに書いてないプロダクトはバグの巣窟と言えます。
(そんなことない! という人もいるかもしれません)

  • テストを書いてないアプリは潜在的な問題を抱えていることが多い

テストでバグを潰すコツは細かい小さなテストを沢山書くことです。
バグが発生するコードの周辺にテストを書いて細かい仕様をテストで確定させておきましょう。

  • 小さなテストで外堀を埋める

そうするとより問題が明確になる場合があります。
外堀から埋めるのは戦の基本です。

本丸めがけて一騎掛けもロマンがありますがたいてい弓矢でやられます。
外堀から徐々に埋めてバグをやっつけていきましょう。

メモリチェックツール

C/C++などの言語を使っている場合はメモリチェックツールも活用します。
Linux系の環境ではValgrindというメモリチェックツールが使えます。

Ubuntuなら↓のコマンドでインストールできます。

$ sudo apt install valgrind  

動的なメモリの確保ではメモリの解放し忘れでメモリリークが起こることがあります。
そういう時はメモリチェックツールで検出できます。

あるいは境界線のエラーなどもこういったツールで検出できます。
運が良いとツールだけでバグを見つけることも出来るときがあります。

分割統治

バグを潰すのに役立つアプローチに分割統治というものがあります。
これは大きな問題を小さな問題に分割して解決していくというものです。

バグは複雑なことが多いです。
そのため普通にやってもらちがあかないこともあります。

  • バグは複雑である

そういうときはバグの問題を小さく分割できないか考えます。
大きな問題を小さくするのです。

そして小さくした問題に自分のリソースを使います。
こうすると効率よく問題を解決できます。

バグを直すにはどうするのがいいか?

バグを直すにはどうしたらいいのでしょうか?
にっくきバグをやっつけるには。
あるいは解決の達成感を味わえるバグという課題を片づけるには。

今回は↓の方法を解説します。

  • バグが複数ある場合は1つのバグに絞る
  • バグが再現する最小コードを見つける
  • バグの検証を自動化する(テスト)
  • 二分探索でバグを見つける
  • 論理的に考えてバグをあぶり出す
  • ひらめきを大事にする
  • 修正できなければ休憩する
  • 辛抱強くバグを調べる

バグが複数ある場合は1つのバグに絞る

バグは1つでしょうか複数でしょうか。
バグは複数の問題を抱えてる場合もあります。

そういうバグは1つの問題を直しても他の問題のせいで直らないことがあります。
こういうバグは1つの問題に絞るのが大事です。

テストを書きどのようにバグが再現するか把握しましょう。

バグが再現する最小コードを見つける

バグが再現する最小のコードを見つけるのが第一と言えます。
大きなコードでバグが発生してもそのコードを調べるのはとても大変です。

ですのでバグが再現する最小のコードになるまでコードを削ってみましょう。
そうすると問題がシンプルになることがあります。

  • 最初のコードでバグを発生させる

問題をシンプルにすればそれだけ解決が楽になります。
不要なコードは捨ててしまいましょう。

バグの検証を自動化する(テスト)

最小のコードが見つかったらそのバグの検証を自動化しましょう。
テストを書いて自動でバグをチェックできるようにします。

  • テストを書いて検証を自動化する

そのテストには何度もお世話になるでしょう。
自動化して楽をするのはとても大事なことです。
バグの解決は持久力が求められることがあるからです。

二分探索でバグを見つける

二分探索とは1/2を1/2に。さらにそれを1/2に……というふうに調べていく方法です。

「1,2,3,4,5,6,7,8,9,10」という数列から「3」を見つける場合、まず全体の半分の位置を調べます。
半分の位置には「5」がありますがこれは「3」より上なので今度は1~5を半分にした位置を調べます。
その半分の位置は2になりますがこれは「3」より下です。ですので次は2~5の半分を探します。
そうすると「3」が見つかります。

このように調べる範囲を半分にしながら探索していくのが二分探索です。
アルゴリズムではバイナリサーチがこれにあたります。

論理的に考えてバグをあぶり出す

論理的に考えましょう。
論理とは「A」が「B」なら「C」であるはずである。というのが論理です。
Aの状態を確認してBならCが期待値です。

その期待値を満たしていればOK.
満たしていなければバグの影響が考えられます。

ひらめきを大事にする

バグの解決は直感力、ひらめきも大事になります。
自分の中で生まれるひらめきを常に大事にしましょう。

  • ひらめきを大事にしよう

「あ! そうかぁ!」
というアハ体験は脳を活性化させ身体を若返らせます。

バグも潰せて脳も活性化できる、一石二鳥ですね。

修正できなければ休憩する

修正できなければ休憩をしましょう。
頭の使い過ぎは禁物です。

  • 作業しすぎは禁物

疲れは思考力を低下させ判断力も失わせます。
そのような事態になったらバグの解決は夢のまた夢です。

適度に休憩を入れてじっくり取り組みましょう。

辛抱強くバグを調べる

辛抱強さこそが最大の武器です。
バグの解決は長い時は数日から数週間かかることもあります。

気長にバグに取り組むのがバグ解決の基本です。
腰をすえてじっくりと取り組んでみましょう。

おわりに

今回はプログラミングのバグについて考えてみました。
バグはプログラミングをしていく上で永遠に付き合っていくものの1つです。
バグを憎まずバグを飼いならしバグを制圧しましょう。

🦝 < バグをやっつけよう

🐭 < バグのライフ