バグ

語源

「バグ」は英語からの外来語であるが、この言葉はコンピュータの登場以前から、機械装置の原因不明な不具合をあらわす符牒として技術者の間で使われていた。たとえば1878年にエジソンが同僚に宛てた手紙のなかで、彼は機械の不具合のことを「バグ」と呼んでいる。また、第二次世界大戦中には、レーダーの故障をバグと呼んでいたという記録が残っている。現在の米口語では、バグはコンピュータのバグや虫の意味のほかにも、動詞として「人を悩ませる、いらいらさせる」という意味でよく使われる。
コンピュータのソフトウェアに間違いが入るという概念自体は古く、その起源はチャールズ・バベッジによる解析機関にまでさかのぼる。解析機関のプログラミングを担当したエイダ・ラブレスはすでに1842年に残したメモの中で、計算手順を示したカードの入れ間違いにより誤った計算結果が得られる危険性を示唆していた。
コンピュータに関しては、グレース・ホッパーが、Harvard Mark IIのプロジェクトで働いていた時に、バグとして本物の虫を発見したという話がある。不調になったMark IIを調べたところ、リレーの間に虫（蛾）が挟まっていたのを別の技術者が発見した。彼女はこれを、作業日誌にテープで貼りつけて「本物の虫が『バグ』として発見された最初の例」と書き残した。この日誌は米海軍歴史博物館に保管されている。
他にも、シェイクスピアの『ヘンリー四世』で忌まわしきものという意味で使われていた「バグ」という単語に由来するという説もある。プログラム上の欠陥を虫に見立てて呼ぶようになったという説もあるが、これは誤りとされている。

対策

通例、ソフトウェアが仕様通り正常に動作するかどうかを確認するソフトウェアテストを実施し、その過程でバグが発見されればソフトウェアを修正したうえで再びテストを実施することになる。しかし、エドガー・ダイクストラの格言として、
Program testing can be used very effectively to show the presence of bugs but never to show their absence.
（プログラムテストはバグが存在することを示すには極めて有効だが、バグが存在しないことを示すことはできない）という言葉がある。ソフトウェアに『バグが存在すること』を立証するには何かひとつの手順によって再現させるだけでよいが、「ソフトウェアに『バグが絶対に存在しないこと』を立証する方法」は数学的に存在し得ないので、ある程度の複雑さを持つプログラムにおいて、バグの数を 0 に近付ける以上のことはできない。仮にソフトウェアテストで存在を証明された既知のバグをすべて除去したとしても、そのソフトウェアに他のバグが一切存在しない、ということにはならない。
実際に、近年のOSなど膨大なプログラミングを必要とするものには、「バグのないソフトウェアは無い」と言われている。
もしすべてのバグを完全除去したソフトウェアを作成しようとした場合、製品の開発・デバッグ・テストからリリースまでに膨大な時間とコストがかかってしまい、開発費用を回収できなくなってしまう。このため、多くのメーカーではある程度のバグが残っていたりしても、致命的な不具合や主要機能への影響がなく、また別の回避策があるなどの想定範囲内であれば、既知の問題点としてユーザーに告知したうえでリリースしたりしている。
例えば銀行のオンラインシステム（勘定系システム）などは社会基盤を支える重要度の高いシステムであるが、年に数度ダウンする程度が目安となる。それ以上の品質を確保するよりも、問題が顕在化した時点で対処した方が、費用対効果の点で有益であると判断されるからである。
出荷後は、想定外の操作を行った際にバグが発見されることが多い。メーカーのプログラマやテスト担当者は専門家としての知識・経験があるため、逆に想定外の操作により発生するバグの発見はしばしば困難である。このようなバグは専門知識の無い一般利用者が使用することで発見されることも少なくない。
近年では、バグが残っていることを前提にした上で、最新の機能や修正した機能を搭載したソフトウェアをアルファ版やベータ版として一般利用者に試用してもらい、報告されたバグを正式版までに修正するという手法もよくとられる。また、ゲーム製品などでは、素人の一般人に試用してもらいバグを発見する専門の仕事もある。
また、最近では本来想定していない動作ではあるが、基本動作に影響がない場合に「仕様」としてしまうこともある。
バグ修正や機能追加によってソフトウェアに新たなバグが混入してしまうことを防ぐには、既存機能が仕様通り正常に動作することを保証するための単体テストを自動化してリグレッションテストの機会を増やすことが挙げられる。この開発手法はテスト駆動開発と呼ばれ、リファクタリングやアジャイルソフトウェア開発の要となっている。
AIの発達に伴い、プログラマーの書くコードをAIに監視させ、バグにつながりそうなコードを書いたら警告を与えてバグの発生を未然に防ぐ手法もある。難点としては大量の学習用データとマシンパワーが必要とされている。

バージョン管理システム

消費者向けアプリケーションソフトウェアの場合、一般的にはバージョン管理システムと呼ばれる数値で行うことが多い。バージョンの数値が大きいほど、バグの修正や機能の追加が行われていることを表す。コンシューマ向けOSなどの場合、メーカーではこれらを定期的に修正した修正プログラムを提供している。既知の問題の修正箇所を、個別に修正の実施と未実施を調べる。近年ではバグ管理システムなどに移行している。
マイクロソフト では毎月第二火曜日（日本ではその翌日で、単なる第二水曜日ではないことに注意）に自社製品のバグの対策プログラムを発表するようになった。以前は修正プログラムが完成した都度に発表していたが、ユーザが頻繁に修正プログラムの発表を調べなくてはならず、修正が行われずに放置されてしまう場合が逆に増えてしまっていた反省によるものである。ただし、既に実害が発生している場合などは即時の発表が行われている。他社もマイクロソフトに倣って第二火曜日近辺に発表することが多くなった。

バグ管理システム

近年、ソフトウェアの開発においてはバグの修正が重要な作業と考えられている。バグを漏らさず修正し、再発を防ぐには、バグの発見日時や発見者、再現方法、修正担当者、修正履歴、修正方法、重要度、テスト状況などの多くの情報を残し管理する必要がある。開発によっては数千という数のバグが発生し、また多数のテスト担当者や修正担当者が関わっていることを考慮すると、従来のファイルレベルの管理では追いつかなくなっている。このような背景から、バグを管理するソフトウェアであるバグ管理システムが生まれた。バグトラッキングシステム (BTS) とも呼ぶ。
バグ管理システムは、ウェブサーバ上で動作し、ウェブブラウザ経由でアクセスできるようになっている。また電子メールとも連動し、修正時にテスト担当者やバグ報告者にメールが送信されるものもある。
主なバグ管理システムにはBugzillaや影舞などがある。また、最近ではウェブサーバを必要としないP2Pアーキテクチャによるバグ管理システムのPapilioといったものも登場した。
バグ管理システムは、バージョン管理システムと同様、ソフトウェアを開発する上での必須ツールになりつつある。

バグとソフトウェア工学

ソフトウェアでバグを出さない最も良い方法は、そもそもバグが起こりにくい開発を心がけることだといえる。バグが起こりにくい環境では、その分工数に余裕が持てる上、ソフトウェア自体の性能も良好になりやすいという、正の相関性が見られる。正しい環境の追求は非常に重要な問題なのである。
どのような方法論をとれば開発過程にひずみを産まないか、安全なプログラムを書くにはどのような言語を用いるべきか、適切な人員配置とコミュニケーションはどのように行われるべきか、等々、そのような知見を扱う分野はソフトウェア工学と呼ばれる。

コンピュータゲームにおけるバグ

コンピュータゲームにおいてもバグは生じうる。進行やセーブデータ保全に影響するようなものの場合はゲーム雑誌などで告知されたり、影響力が大きい人気ゲームの場合は新聞でも取り上げられたり重大なバグだとメーカーが判断した場合は対策がなされる。本体にインストールするパソコンソフトならば公式ウェブサイト上で修正パッチを配布する事でも対応できるが、メディアから直接起動するのが原則であるパッケージ販売の家庭用ゲームソフトのバグは以前はアップデートが困難あるいは不可能であったため、無償で修正版との交換が行われることもあった。近年ではほとんどの家庭用ゲーム機がネットワーク機能に対応するようになったため、パッケージ販売のソフトでもパソコンソフトと同様にネットワークを通じて修正パッチを配布して対応されるようになった。しかし、発売後に発覚したバグは再出荷の際にも放置されるゲームもあり、ユーザ同士の情報交換が対策となりうる。
また、ユーザがバグを裏技や小技として利用することがある。中には『スペースインベーダー』の「名古屋撃ち」等のように、元々はバグにより発生した作成者の意図しない現象であったものが、後に正式な仕様の裏技として認知されるケースもある。
さらに、画面表示が異常になった状態を俗に「バグる」と呼ぶことがあるが、本来はバグ（もしくは他の要因）の結果、表示が異常になったものである。ほかにも、意図的に動作不良を起こさせた状態をバグと呼んだり、異常な形で現れた要素を「バグキャラ」「バグアイテム」等ということもある。本来、これらをバグと表現するのは適切ではなく、英語ではこのような現象を指す場合はbugではなくglitchを用いる。
非電子系ゲームをコンピューター上で再現する類のゲームの場合、実際のゲームと異なる動きをする場合にバグと呼ばれることがある。多くの場合そういったものはメーカーは「バグ」という表現を避け、「異なる仕様がある」という説明にとどめる傾向にある。
3Dグラフィックを使った作品は、ポリゴンとポリゴンに挟まり、移動できなくなる、本来表示されるものが表示されなくなるなどの現象が発生する場合がある。
オンラインゲームでは、バグを引き起こすと何らかの措置がとられる。オンラインゲームの中には、利用規約でバグを発生させる行為を禁止しているものもある。これらは不正行為と言われる。
バグによって引き起こされた裏技（バグ技）についてはバグ技も参照。