はじめに
開発者にとって、トラブルシューティングは日常的な業務の一部であり、全部です。
しかし、その根本原因にアタリがつかない、つまりは予期せぬ問題がしばしば発生します。
そんな時、シャーロック・ホームズの名言「全ての不可能を消去して、最後に残ったものが如何に奇妙な事であっても、それが真実となる」に倣ったアプローチが非常に有効です。
最近これを実感したのでここに書いておこうと思います。
トラブルシューティングのプロセス
-
問題の把握
- 問題が発生している現象を具体的に記録、把握します
- この際後から見返せるように、スクリーンショットやログを残すことが重要です
- 問題が発生している現象を具体的に記録、把握します
-
システム構成の理解
- 問題に関わるシステムやコンポーネントの全体像を理解します
- いわゆる「メンタルモデル」と言われるやつを作る(、ないしは再確認する)作業ですね
-
仮説の立て方
- 問題の原因として考えられる仮説を立てます
- この段階では、一件ありえなさそうなものも含めて全ての可能性をリストアップすることが重要です
-
検証項目のリストアップ
- 立てた仮説に基づき、それぞれを検証するための項目を洗い出します
- あくまで一例ですが、以下のような項目が考えられます
- システム(プログラム)のロジック
- データの整合性
- 設定ファイルの確認
- 通信の正常性
- ユーザー権限の確認
-
優先順位の設定
- 検証項目に対して、問題の状況やシステム構成から考えて最も原因となりそうなものから順に検証を開始します
-
逐次検証
- 各項目を一つずつ検証し、不具合が存在するかどうかを確認します
- この過程で、問題がない項目は除外していきます
-
原因の特定
- 最後に残った要因が問題の原因であると特定します
- はじめに疑ったものが原因であることもあれば、意外なものが原因であることもあります
- これこそが「全ての不可能を消去して、最後に残ったものが如何に奇妙な事であっても、それが真実となる」の真髄です
最近あった実際の例
問題の具体例
とあるシステムの検証環境を作成した際、新規テストユーザーでアクセスできないという問題が発生しました。
解決にいたるまでのアプローチ
-
問題の把握
- 「テストユーザーでアクセスできない」という状況を詳しく調査します
- ほかのユーザーでも発生しうる問題か?
- エラー発生時どのような画面やレスポンスが返ってくるのか?
- その事象が起きた際サーバーのログはどのようになっているのか?
- ...etc
- 「テストユーザーでアクセスできない」という状況を詳しく調査します
-
システム構成の理解
- ログインやユーザー設定に関する全ての要素を洗い出します
-
仮説の立て方
- データベースの不整合、APIの通信不具合、設定ミスなど複数の仮説を立てリストアップします
-
検証項目のリストアップ
- DBでデータ不整合などが起きていないか確認します
- このデータを確認する部分でも、実際にはさらにテーブルごとなどの粒度で細分化してリストアップすることができますが、今回は割愛します
- 設定内容の見直し
- APIのレスポンス確認
- DBでデータ不整合などが起きていないか確認します
-
優先順位の設定
- 直近でDBに手を加えていたこともあったので、問題が発生していそうなDBのデータ確認から調査開始します
-
逐次検証
- 各項目を一つずつ検証していきます
- ここで特にDBに問題があるわけではないということがわかりました
- 各項目を一つずつ検証していきます
-
原因の特定
- 設定漏れによって権限が正しく反映されていないことを特定し、設定を修正することで問題を解決しました
まとめ
今回紹介したのは、問題の根本原因を突き止めるためのプロセス、あくまでその一例です。
その際、シャーロック・ホームズのアプローチを参考に、全ての可能性を排除していくことが重要だということを強調しました。
というのも人間は、皆どうしても先入観によって物事を判断してしまいがちですし、(熟練した開発者ならば)多くの場合、それで解決できてしまうのでしょう。
なぜならば過去の経験、あるいはその経験によって研ぎ澄まされた直感から問題の原因を素早く特定できるからです。
しかしながら、先入観によって隠されてしまった問題の根本原因を見逃さないためにも、このようなアプローチを意識することも有用なのではないかと、最近起きた事象を振り返りながら感じたのでした。
参考文献
-
シャーロック・ホームズ曰く「全ての不可能を消去して、最後に残ったものが如何に奇妙な事であっても、それが真実となる」
- この記事を書こうとした際、同じようなことを書いてるひとが既にいないか調べたところ、だいたい自分が言いたいこと全部書いてくださっている方がいらっしゃいました
- 内容かぶってしまうので自分はもう書かなくてもいいかなと思いましたが、トラブルシューティングに焦点を当てることで、何とか自ら書く意義が出せたかなと思ってます
-
祖母が就寝するとDBインサートができなくなる
- 全く同じアプローチをとっているわけではないですが、似たエッセンスを感じられます
- あとITミステリーとしてめっちゃ面白い