「時代はそこまで来たか…」
「時代はそこまで来たか…」スマホを持った若者からのとある質問に、心底驚かされた話
http://buzzmag.jp/archives/111971
「時代はそこまで来たか…」スマホを持った若者からのとある質問に、心底驚かされた話
http://buzzmag.jp/archives/111971
新人などに教える場合。実際にこうやっているかといわれると・・・
■手順
1.(報告者)再現できるか確認する
・何々のとき(環境→前画面、入力されているデータなど)
何をすると(操作内容→入力値、入力方法など。「なにもしなくても」もありえる)
どうなる(結果→ここに問題があるから、障害と報告)
の形で、報告できるようになるまで、再現方法をチェックする
→操作は、できるだけ少なくて再現できるように・・・
→100%再現できるか、100%でないけど再現するか、1回きりかを確認する
2.(報告者)報告する
・上記「何々のとき、何をすると、どうなる」を報告
→結果が画面の場合は、ハードコピーをとると吉の場合多し
3.(偉い人)担当者に割り当てる
4.(担当者)報告内容の確認
→再現できるかを確認。出来ない場合は、報告者に問い合わせ
→自分では再現できない場合、報告者に操作をしてもらい、
以下の5、6の資料を集める
5.(担当者)状況の確認
(1)以下のデータをあつめる
・障害が起こるケースの
ケース開始時のデータ(DB等)、
ケース時の入出力画面、通信データ
障害時のデータ(DB等)
なお、あつめるべきケース開始時のデータ(DB等)は、
障害時のデータを作成するのに必要な関連データ
・(可能であれば)開始時から障害が発生するまでの、
実行した関数・メソッド
障害時のスタックトレース
・(可能であり、かつ意味があれば)障害が起こらないケースの
ケース開始時のデータ(DB等)、
ケース時の入出力画面、通信データ
障害時と同じ時点のデータ(DB等)
つまり、障害が起きるときに対応するもの
・(可能であり、かつ意味があれば)障害がおこらないときの
開始時から障害が発生するときと同じ時点までの、
実行した関数・メソッド
その時のスタックトレース
→Javaの場合、Runtime Exceptionで取れる
(2)障害時と正常時を見比べる
→(1)で収集したデータの差分をみる。違いが有るか?
違いが有れば、その違いが障害を引き起こすか考える
(3)障害が起こったときから逆にさかのぼり、
こちらが想定しているデータが入っているか、
通信を行っているかを確認する
→データが入っているかは、デバッグログに値を入れて確認する
ケース開始時のデータは、正常データのはず
(ここが異常なら、まず、ここのバグをなおすべき)
↓
障害時は異常データのはず
(ここが正常なら、これはバグでない)
ということは、正常から異常に変わるところがあるはずだから、
そこをさがす。この点が見つかったら、どうして、異常に変わったか
考える。
6.仮説を立てて、確認
5の(2)ないし(3)で問題箇所を見つけ、問題を引き起こす原因の
仮説を考える。その仮説が正しいかどうか、適当に直して確認したり、
その仮説を支持する値をログで収集する
→6でソースを直す場合は、ソースはもとより、環境全体が復元できることを
確認してから。
■手順
1.(報告者)再現できるか確認する
・何々のとき(環境→前画面、入力されているデータなど)
何をすると(操作内容→入力値、入力方法など。「なにもしなくても」もありえる)
どうなる(結果→ここに問題があるから、障害と報告)
の形で、報告できるようになるまで、再現方法をチェックする
→操作は、できるだけ少なくて再現できるように・・・
→100%再現できるか、100%でないけど再現するか、1回きりかを確認する
2.(報告者)報告する
・上記「何々のとき、何をすると、どうなる」を報告
→結果が画面の場合は、ハードコピーをとると吉の場合多し
3.(偉い人)担当者に割り当てる
4.(担当者)報告内容の確認
→再現できるかを確認。出来ない場合は、報告者に問い合わせ
→自分では再現できない場合、報告者に操作をしてもらい、
以下の5、6の資料を集める
5.(担当者)状況の確認
(1)以下のデータをあつめる
・障害が起こるケースの
ケース開始時のデータ(DB等)、
ケース時の入出力画面、通信データ
障害時のデータ(DB等)
なお、あつめるべきケース開始時のデータ(DB等)は、
障害時のデータを作成するのに必要な関連データ
・(可能であれば)開始時から障害が発生するまでの、
実行した関数・メソッド
障害時のスタックトレース
・(可能であり、かつ意味があれば)障害が起こらないケースの
ケース開始時のデータ(DB等)、
ケース時の入出力画面、通信データ
障害時と同じ時点のデータ(DB等)
つまり、障害が起きるときに対応するもの
・(可能であり、かつ意味があれば)障害がおこらないときの
開始時から障害が発生するときと同じ時点までの、
実行した関数・メソッド
その時のスタックトレース
→Javaの場合、Runtime Exceptionで取れる
(2)障害時と正常時を見比べる
→(1)で収集したデータの差分をみる。違いが有るか?
違いが有れば、その違いが障害を引き起こすか考える
(3)障害が起こったときから逆にさかのぼり、
こちらが想定しているデータが入っているか、
通信を行っているかを確認する
→データが入っているかは、デバッグログに値を入れて確認する
ケース開始時のデータは、正常データのはず
(ここが異常なら、まず、ここのバグをなおすべき)
↓
障害時は異常データのはず
(ここが正常なら、これはバグでない)
ということは、正常から異常に変わるところがあるはずだから、
そこをさがす。この点が見つかったら、どうして、異常に変わったか
考える。
6.仮説を立てて、確認
5の(2)ないし(3)で問題箇所を見つけ、問題を引き起こす原因の
仮説を考える。その仮説が正しいかどうか、適当に直して確認したり、
その仮説を支持する値をログで収集する
→6でソースを直す場合は、ソースはもとより、環境全体が復元できることを
確認してから。