バグ
バグ (英: bug) とは、英語で「虫」の意である。コンピューター業界ではプログラムの誤りや欠陥を表す用語として使われる。
ソフトウェア・ハードウェア開発における契約文書など、法的な文書ではバグのことを「瑕疵」(かし)と記述する。原因や責任の所在などが不明なものを特定性の低い表現の「不具合」と呼ぶことがある。また、セキュリティ面に関わる脆弱性や欠陥は「セキュリティホール」などと呼ばれることもあり、バグはこれらの原因のひとつになりうる。
多くのバグが含まれ、機能的に正常な役割を果たさないものを、バギー・プログラムと呼ぶことがある。
なお、発生したバグを探して修正する作業はデバッグと呼ばれる。
ソフトウェアでバグを出さない最も良い方法は、そもそもバグが起こりにくい開発を心がけることだといえる。バグが起こりにくい環境では、その分工数に余裕が持てる上、ソフトウェア自体の性能も良好になりやすいという、正の相関性が見られる。正しい環境の追求は非常に重要な問題である。
どのような方法論をとれば開発過程にひずみを産まないか、安全なプログラムを書くにはどのような言語を用いるべきか、適切な人員配置とコミュニケーションはどのように行われるべきか、等々、そのような知見を扱う分野はソフトウェア工学と呼ばれる。
それ以上の品質を確保するよりも、問題が顕在化した時点で対処した方が、費用対効果の点で有益であると判断されるからである。
出荷後は、開発元が想定・考慮していない操作を行なった際にバグが発見されることが多い。メーカーのプログラマやテスト担当者は専門家としての知識・経験があるため、無意識のうちに危険な操作や負荷のかかる操作を避けてしまうことも多く、逆に想定外の操作により発生するバグの発見はしばしば困難である。このようなバグは専門知識の無い一般利用者が使用することで発見されることも少なくない。
近年では、バグが残っていることを前提にした上で、最新の機能や修正した機能を搭載したソフトウェアをアルファ版やベータ版として一般利用者に試用してもらい、報告されたバグを正式版までに修正するという手法もよくとられる。特にセキュリティ上の脆弱性や致命的なバグの発見者に対して報奨金を支払うベンダーもある。また、ゲーム製品などでは、素人の一般人に試用してもらいバグを発見する専門の仕事もある。
また、最近では本来想定していない動作ではあるが、基本動作に影響がない場合に「仕様」としてしまうこともある。
バグ修正や機能追加によってソフトウェアに新たなバグが混入してしまうことを防ぐには、既存機能が仕様通り正常に動作することを保証するための単体テストを自動化してリグレッションテストの機会を増やすことが挙げられる。この開発手法はテスト駆動開発と呼ばれ、リファクタリングやアジャイルソフトウェア開発の要となっている。
AIの発達に伴い、プログラマーの書くコードをAIに監視させ、バグにつながりそうなコードを書いたら警告を与えてバグの発生を未然に防ぐ手法もある。難点としては大量の学習用データとマシンパワーが必要とされている。