システム開発では、プログラムが想定どおりに動作しない「バグ」が発生することがあります。
バグが発生した際、重要なのは、すぐにコードを修正することではありません。まずは発生状況を整理し、原因を特定したうえで、適切な修正を行うことが大切です。
本記事では、IT初心者や新人エンジニアに向けて、バグが発生した際の基本的な調査手順を解説します。
1. バグの発生状況を整理する
最初に、どのような問題が発生しているのかを確認します。
例えば、Webシステムで「ログインボタンを押しても画面が切り替わらない」という問題が発生したとします。
この場合、次の情報を整理します。
- 発生した事象: ログインボタンを押しても画面が切り替わらない
- 発生日時: いつ発生したのか
- 発生条件: 特定のユーザーや操作で発生するのか
- 再現性: 同じ操作で何度も発生するのか
- エラーメッセージ: 画面やログにエラーが出力されているか
発生状況を整理することで、調査対象を絞り込みやすくなります。
2. エラーメッセージやログを確認する
次に、エラーメッセージやログを確認します。
ログには、プログラムの実行状況やエラーの発生箇所などが記録されている場合があります。
例えば、Javaのプログラムで次のようなエラーが発生したとします。
java.lang.NullPointerException
at com.example.LoginService.login(LoginService.java:25)このログから、LoginService.java の25行目で、NullPointerException が発生したことが分かります。
NullPointerException は、null の値に対してメソッドを呼び出すなど、適切に扱われていない場合に発生する例外です。
ただし、エラーが発生した行が必ずしも根本原因とは限りません。変数に値が設定されていない原因を、呼び出し元の処理までさかのぼって調査する必要があります。
3. バグを再現する
原因を調査するためには、同じ問題を再現できるか確認することが重要です。
例えば、ログイン処理で問題が発生している場合、次のような条件を変えて確認します。
| 確認条件 | 確認内容 |
|---|---|
| 正常なユーザー情報 | ログインできるか |
| 誤ったパスワード | 適切なエラーが表示されるか |
| 存在しないユーザー | 想定した動作になるか |
| 必須項目が未入力 | 入力チェックが動作するか |
特定の条件でのみ問題が発生する場合、その条件が原因を特定する手がかりになります。
なお、本番環境で調査する場合は、データの変更やサービスへの影響に注意し、必要に応じて検証環境を利用します。
4. 原因を切り分ける
発生状況とログを確認したら、問題がどの処理で発生しているのかを切り分けます。
例えば、ログイン処理は次のような流れで実行されるとします。
- ユーザーがログイン情報を入力する
- 入力値をチェックする
- データベースからユーザー情報を取得する
- パスワードを検証する
- ログイン結果を画面に返す
この場合、各処理を確認し、どこまで正常に動作しているかを調べます。
- 入力値は正しく取得できているか
- データベースから想定したデータを取得できているか
- パスワードの検証処理は正常か
- エラーが発生する前に、必要な値が設定されているか
デバッガーで変数の値や処理の流れを確認することも有効です。
原因を切り分けることで、関係のない処理まで調査することを防げます。
5. 原因を特定して修正する
原因が特定できたら、問題を解消するための修正を行います。
例えば、ユーザー情報を取得できなかった場合に、取得結果が null になる可能性を考慮していなかったとします。
修正例は次のとおりです。
修正前
String userName = user.getName();user が null の場合、NullPointerException が発生します。
修正後
if (user == null) {
throw new IllegalArgumentException(
"ユーザー情報が取得できませんでした。"
);
}
String userName = user.getName();修正後は、user が null の場合に、明示的にエラーを扱えるようになります。
ただし、実際のシステムでは、例外の種類やエラーの返し方を設計方針に合わせる必要があります。ログイン処理であれば、適切なエラー応答を返す設計も検討します。
6. 修正後にテストを実施する
修正が完了したら、問題が解消されたことを確認します。
確認するのは、バグが発生していた条件だけではありません。修正によって、これまで正常だった処理に影響が出ていないかも確認します。
例えば、次の項目をテストします。
- 正常なユーザー情報でログインできること
- 存在しないユーザー情報を適切に扱えること
- 不正な入力で想定したエラーが返ること
- 関連する既存機能が正常に動作すること
必要に応じて単体テストや結合テストを実施し、修正による影響を確認します。
7. 調査結果を記録し、再発防止につなげる
バグの修正後は、調査内容や原因、対応内容を記録します。
記録しておくと、同じ問題が発生した際に、過去の調査結果を参考にできます。
記録する項目の例は次のとおりです。
- 発生した事象
- 発生条件
- 原因
- 修正内容
- テスト結果
- 再発防止策
また、必要に応じて、テストケースの追加やコードレビューの観点の見直しなどを行います。
バグを修正するだけでなく、同じ問題が繰り返し発生しないように改善することも、エンジニアの重要な役割です。
まとめ
バグが発生した際は、上記の手順で調査を進めることが基本です。
調査を効率よく進めるためには、最初から原因を決めつけず、確認できた事実をもとに一つずつ可能性を絞り込むことが大切です。
新人エンジニアのうちは、原因をすぐに特定できないこともあります。そのような場合でも、確認した内容や試したことを整理しておけば、先輩エンジニアへの相談やチーム内での情報共有がスムーズになります。
バグ調査は、単に不具合を直す作業ではなく、システムへの理解を深め、開発者として成長するための重要な機会です。
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK