最近人に教える機会が多いのだけど、そもそもこの方法についてちゃんと文章立てて説明できてなかった気がして、反省してこの文章を書いている。
どのような順序で問題を発見するか
いろいろな問題があるけども基本は同じである。
- 発生した事象から問題を把握する
- 発生した事象の原因が何か特定する。これが解決すべき問題である
- 既知のパターンから問題の解決策を考える
- 問題の解決策を実装する
- 発生した事象が変化した場合
- 良い方向に進展しているかどうか判断する
- 良い方向に進展した場合: 2に戻って他の原因がないか特定する
- 悪い方向に進展した場合: 4に戻り、実装を確認し、問題なければ3、解決策も間違っていなければ2、……といった感じで1つずつもどっていく
発生した事象から問題を把握する
まず第一に問題の把握に努めよう。問題の解決策を実装してしまった段階で、同じ問題を発生させるのは難しくなってしまう。現場の保存に努め、問題の解決策を発見しやすくしよう。仮想マシンであれば、この時点でのスナップショットをとると良い。
だいたい間違えるのはここだし、これが間違っていたらいつまで経っても問題が解決することはないので、心して懸かろう。問題を把握するためのツールはたくさんある。
ネットワークが問題になっている場合
ネットワーク関連の問題の場合はngrep
、tcpdump
を使って実際の通信内容を把握しよう。通信内容を元に、クライアント/サーバ側どちらに問題があるか特定することが先決である。
負荷が問題になっている場合
負荷が問題になっている場合はtop
、dstat
を使い何が負荷の原因かを把握しよう。ボトルネックになっているのはIOなのか、CPUなのか確認しよう。
プロダクトの挙動がおかしい場合
DB、Webサーバなど複数のミドルウェアが組み合わさっているプロダクトの場合、どのミドルウェアがおかしいのかをまず確認しよう。まず、第一はログの確認である。ログを出力しているアプリケーション自体、つづいてそのアプリケーションが実行時に通信するアプリケーションを確認していこう。連携手段がTCP/IPである場合は、先ほども出てきたngrep
、tcpdump
も便利である。どのアプリケーションがポートを使用しているかnetstat
を用いて調査しよう。
解決策を考えるときは順番に注意しよう
どのような解決策を行うか考えるときは、基本的に非破壊的な解決策から行うと実行しやすい。次の様な感じだ。
- まず、解決策を実装せずに、問題が再現するか確認する
- 問題が再現した場合、一番変更が少ない解決策を実装してみる
再起動、設定ファイルの変更、コードのモンキーパッチの順に破壊的になっていく。前述したように、大抵の場合は問題を取り違えているので、現場の保存に努めるようにしよう。仮想マシンはすごく便利だ。
解決策を実装し、問題が変化した場合
問題が変化した場合、それは解決策を実装した場合の挙動が確認できた訳で、1つヒントが与えられたものだと理解しよう。仮想マシンであれば、解決策を実装する前に戻れば、その挙動を踏まえて解決策を実装できる。
良い方向に変化したか、悪い方向に変化したかを見極めるのは場合によっては非常に難しい。その際はとりあえず良い方向にとらえて問題ないと思う。あとで、悪い方向だと思った場合は、実装前に戻れば良い。
陥り安い間違いの例
何度やっても結果が変わらないのは当たり前である
プロダクトは記述されたプログラムに従って処理をおこなっているだけで、間違っているのは自分であることを忘れてはいけない。何度も行うことで、何が問題なのか検証するのは良いが、単に何度も行っただけでは、結果が変わらないのは当たり前である。
ネットの情報を安易に信用して、それと同じ問題だと見間違わない
ネットには情報があふれているが、それと同じだけ違う環境があることを理解しておこう。あなたがその情報を書き込んでいない時点で、まったく同じ環境というのは存在しない。
プロダクトの理解に努める
ドキュメント通りにやって動かないのは、自分のプロダクトに対する理解度が足りていないだけである。基本に立ち返り公式ドキュメントを読み、設定ファイルのコメントを読み、コードのコメントを読もう。
ドキュメントを書いている人間は、プロダクトに対する深い理解を持っている場合が多く、自分にとってはあまり重要でない情報を書かれないので、プロダクトに対する深い理解が必要になる。
プロダクトに対して誠実に向き合おう
常に、プロダクトに対する誠実さを忘れないようにしよう。プロダクトに対して誠実に向き合い、エラーログを解釈しよう。バグがあれば、コミットしよう。プロダクトは決して間違っていないし、責めるのは、それを解決できない自分である。コードに対する深い理解をもち、プロダクトにコミットしていこう。
ここまで書いてふと思ったけど、プロダクトがうまくうごかないのと、自分の子供が泣いてどうしようもないときの状況は非常によく似ていることに気がついたので、その気持ちを忘れないようにすると良い。
それでは、良い週末を、Happy Hacking!