9.1 バグの発生
ソフトウェアのデバッグは、プログラム内のエラーやバグを見つけて修正するプロセスだよ。これは、プログラムを正しく動かすのを手助けする、ソフトウェア開発の中で一番面白い部分だよね。
「バグ」という用語の誕生の歴史
コンピュータプログラムにおいて「バグ」という用語が使われ始めたのは1940年代のこと。でも、この「バグ」という概念は、コンピュータが登場する前から、様々な機械装置の機械的な故障を意味していたんだ。
コンピュータ界で「バグ」が使われ始めた最初の記録は、1947年にハーバード大学のMark IIコンピュータで働いていたチームによるもの。チームは、機械のリレーの一つが虫(具体的には蛾)のせいで動作しなかったことを見つけたんだ。それを取り除いて、「実際に発見された初のバグ」として記録したそうだよ。
これは「バグ」という用語が初めて誤りを意味したケースではないかもしれないけど、この事件のおかげで「バグ」という用語が広く知られるようになったんだ。

プログラムのデバッグ
デバッグは、ソフトウェア内のバグを探し、診断し、修正するプロセス。このプロセスにはいくつかのステップが含まれるよ:
- エラーの発見: プログラム内のエラーの兆候を特定すること。
- エラーの再現: エラーを再現する条件を作り出し、その性質をよりよく理解すること。
- 問題の診断: コードを分析し、エラーの原因を探すためにさまざまなツールや方法を使うこと。
- エラーの修正: エラーを解消するためにコードを変更すること。
- テスト: 修正をチェックし、プログラムをテストしてエラーが解消され、新たな問題が発生していないことを確認すること。
だから バグ(bug) はプログラムの中の任意のエラーの総称で、デバッグ(de-bug) はそれを見つけて取り除くプロセスなんだよね。
9.2 デバッグのツールと手法
ロギング
プログラムコードにログを追加することで、プログラムの実行を追跡し、プログラムのさまざまなポイントで変数や操作の状態に関する情報を得ることができるんだ。JavaScriptでロギングするには、winstonっていう便利なライブラリがあるよ。
ロギングの使用例:
const { createLogger, format, transports } = require('winston');
// デバッグレベルでロガーを作成
const logger = createLogger({ level: 'debug' });
// 割り算の関数
function divide(a, b) {
logger.debug(`割り算 ${a} から ${b}`);
if (b === 0) {
logger.error("ゼロでの割り算を試みた!");
return null;
}
return a / b;
}
// 関数の使用例
const result = divide(10, 2);
console.log(result); // 出力: 5
デバッガーの使用
デバッガーは、プログラムをステップごとに実行し、ブレークポイントを設定し、変数の値を確認し、その実行中に変更することができるツールだよ。
JavaScript向けの人気デバッガー:
- Chrome DevTools: Google Chromeブラウザに組み込まれたデバッガー
- Firefox Developer Tools: Mozilla Firefoxブラウザに組み込まれたデバッガー
- Node.js Debugger: サーバーサイドJavaScript向けNode.jsに組み込まれたデバッガー
- Visual Studio Code Debugger: エディターVisual Studio Codeに埋め込まれたデバッガー
Node.jsでのデバッガーの使用例:
// 組み込みデバッグモジュールをインポート
const { inspect } = require('util');
// エラーのある関数の例
function faultyFunction(a, b) {
debugger; // ブレークポイントの設定
let result = a / b;
return result;
}
// エラーのある関数の呼び出し
console.log(faultyFunction(10, 0));
プログラムが debugger に到達すると、そこでプログラムが止まり、ステップオーバー、ステップイン、ステップアウト、変数の値の確認などのデバッガーコマンドを利用できるんだよ。
これから、Intellij IDEAに組み込まれたデバッガーを使ってプログラムのデバッグを勉強するよ(Ultimate Editionが必要だよ)。
9.3 debugの使い方
一般的にdebugは、エラーを見つけて解消するためにデバッグツールやプラクティスを積極的に活用することを含むものだよ。
デバッグのステップ:
- ブレークポイントの設定: コード内の興味のある場所でプログラムの実行を止めるために、ブレークポイントを設定する。
- ステップ実行: プログラムを1ステップごとに実行し、プログラムの状態や変数の値の変化を観察する。
- 変数の分析: プログラムの実行のさまざまな段階で変数や式の値を調べ、誤ったデータや論理的エラーを見つける。
- エラーの修正: 見つけたエラーを解消するためにコードを変更する。
- 再テスト: エラーを修正した後、プログラムをテストして、エラーが解消され、新たな問題が発生していないことを確認する。
簡単そうに見えるでしょ? 次の講義では、これらのステップを詳しく見ていくよ :)
GO TO FULL VERSION