訳の分からない問題に対処するには
プログラマなら、訳の分からない問題に頭を悩ませた経験も少なくないでしょう。動くはずなのに、なぜか期待通りの結果にならない。エラーになるのだけど、何が原因なのか見当もつかない。確実な再現手順がない。そんな時、あなたならどうしますか!?
一般論については以前述べたので、今回は現象に着目して解決方法を探ってみようかと。当たるも八卦、当たらぬも八卦。:)
訳の分からない問題に対処する
環境を変えたら動く・動かなくなった
- 初期化されてない変数やメソッドはないか
- APIなどで仕様にない動作を仮定していないか
予期しないデータや数値が現れる
- ロックなどの排他制御に抜けがないかチェック(特にマルチタスク・共有メモリ・ファイル共有などを扱うプログラム)
- 値の範囲チェックはされているか
意図しないタイミングで値が書き換えられている
- バッファオーバーランやメモリリークを疑う
- 可能ならばトレースログを取ってみる
ループから抜けない
- 値の範囲チェックは?
- リンクリスト作成時と参照時の排他制御は大丈夫?
- そもそも抜ける条件は安全なもの?
なぜかAPIがエラーになる
- 初期化や呼び出しのタイミングは大丈夫?
- サンプルアプリなどで動作を確認
CPU使用率が異常に高い
- ほとんどは無限ループ
- プロファイラ等を使い、CPU使用率の高いところを探す
まずは基本を疑え
訳の分からない問題に対処しなければならない時、私は難しく考えずに基本を疑えということを心掛けています。
原因究明にとても時間のかかった問題。分かってみれば、すごく単純なバグだった。そんな経験はないですか?いえ、むしろそんな時の方が多いのでは!?
とても難しそうに見える問題でも、ほとんどの場合は単純なミスから発生していることがほとんどなのです。だからまずは基本をチェック。「こんな基本部分は動いてるはず」「ここでエラーが起きることは考えにくい」そう言わず、単純なところからバグチェックをしてみよう。わりと単純なところでしくじってたりするんだよね。
難しいトラブルも嫌がらず
でも一番大事なこと。それは難しいトラブルも嫌がらず受けるってこと。
原因が単純なものであったにせよ、難しいトラブルは調査が難しい。誰かに聞いても対処方法は分からない。誰だって、そんなトラブルに巻き込まれたくはないよね。けど、そんなトラブル解析を重ねていくうち、どのへんから手をつけていけばいいかポイントが分かるようになっていく。
難題を解決しても、感謝されることは少ない。けど、人はちゃんと見ているものなんだ。難解なトラブルに対処するたび、人からに頼られる存在になっていることに気がつくはずだよ。
過去の関連記事:
yasuhoの隠れ家 - デバッグを想定しながらコードを書こう
yasuhoの隠れ家 - デバッグは最高に面白いパズルゲーム