問題解決の力が

落ちてる気がするなあ。最近はそういう仕事は余りやって無かったなあ、そういや。俺がそういう力を最も良く使ったのは 2005 年頃かなあ。取り敢えず思った事を色々と書いて置こう。早く寝たいけど。

  • 結果を見る。画面表示。ログ。終了ステータス。プロセスの状態。標準出力と標準エラー出力。その他の全てのファイルや DB への出力。そこからスタックバックトレースで特定したり、トレースログで特定したり、キーワードの Grep で特定したりする。結果じゃないけど入力も見る。
  • 途中の結果を見る。どの時点で失敗しているのか。proxy を使わないとか sniff するとか。ブラウザを使わずに telnet コマンドを使うとか。デバッガでアタッチしてメモリをダンプするとか。ネットワーク障害なら ping とかその他の色々なコマンド…。データベースならデッドロックとかを Oracleデータディクショナリとかで見る。
  • 差分を見る。正常に動いていた時と現在の差分を見る。環境の差分を見る。ソースの差分を見る。ログの差分を見る。元に戻してみる。正常に動いている類似ソフトを考える。違うマシンで似た環境を作って動かしてみる。入力パラメータやファイルや DB の差分を見る。動作前後の入出力項目の差分を見る。
  • High and Low 的に部分的に機能を無効にしたり差分を作り出したりして、絞り込んで行く。
  • まっさらにする。限りなくシンプルな状態から始める。少しずつ進める。
  • 初期化してみる。何かゴミがあるかも知れない。
  • デバッガを使ってステップ実行する。ログを仕込む。デバッグモードにする。ログ設定を変える。非同期系のメモリ破壊やハンドルの二重解放の対処なら、ベリファイアを使ったり、デバッグスクリプトを組んだりもしてみる。
  • Google とかで検索する。更新日時や名前でファイルシステム検索。Grep
  • リファレンスを見る。man。--help。インターネット。/?。
  • サポートサイトを見る。サポートに訊く。トラブルシューティングを探す。
  • 関連する設定ファイル等々の設定を調べる。存在を調べる。パスが通っているか。権限はあるか。ロックされていないか。
  • 現在のログイン環境等々を調べる。ユーザ。環境変数。権限。
  • 今目指している物が本当に必要な物か問い直す。妥協案を探る。現時点ではここまでやれば良いという物を探す。
  • 有識者に質問する。先ずは簡潔に質問する。最終的にダメなら全てをお願いする。
  • 現状の未知な部分を調べる。このファイルには何が設定されるのだろう。このログファイルには何が出力されるのだろう。このサーバは何処まで弄って良いのだろう。私の権限は何処まであるのだろう。今はどんな状況なんだろう。定義書を見てみよう、ソースを見てみよう、データの中身を見てみよう、動きを見てみよう…。
  • 思い込みを無くす。このポートは普通は閉じられている筈だ。この設定はココじゃないと無効な筈だ。この値はコレじゃないとダメな筈だ。コレに失敗しても処理は継続している筈だ。このファイルの存在が動作に影響する筈が無い。この変更が動作に影響する筈が無い。
  • 掛けても良い時間と取るべき手段を考える。
  • 過去の類似の解決事例を思い出す。基本を思い出す。
  • ソースコードを解析する。すっ飛ばさずに愚直に 1 ステップずつ思考実験してみる。
  • 答えを先に思い浮かべる事が出来る場合は思い描いてみる。この問題に答えがあるとしたらこの形しか有り得ない、という物を思い描く。その後に間の過程を埋める。
  • 諦める前にする事。ここに書かれている事を全て思い出して試してみる。考えられる全ての要因を並べてみる。アラートを出した後も気を緩めない事。
  • 何れかの方法で結果を出したら、それに満足せず、得られた結果を入力として更なる結果を求める。得られた結果の他にも結果が無いかを考える。最適解を求めるのなら。
  • 思考の死角に気を付ける。当初は色々な案を考えていたのに、一度ある案に決まってしまうと、他の案が思考の死角に入って思い浮かばなくなってしまい易い。

風呂上がりにゆっくり時間を掛けて捻り出してみたけど、未だ未だ足りないでしょう。これを仕事中に実践出来るかっていうと、はっきり言って出来ないよ。0 点な行動を取る事も無いけど。50 点ぐらいは平均して行けてるかなあって思ってるけど。
新記事を書くと纏まらないから、この一文を書いている 2012 年時点に於いても、この記事を編集していますよ。今後もそうします。