- デバッグは事実上、開発者にとって必須の能力
- デバッグでは、どのようにアプローチするかというマインドセットが重要
- デバッグとは、与えられた状況とデータをもとに問題の原因を探っていく過程
- 筆者はこれを直感と表現している
- 直感とは、自分が知っている知識を問題と結び付けること
- 経験は、知識が直感につながるショートカットの役割をする
- 開発者は、予期しない動作の原因を見つけるために、本能的に可能性を絞り込んでいく行為としてデバッグを行うことになる
- 筆者は、原則を持って一つずつ絞り込んでいくことが効率的だと考えている
- 問題を見つけるための4つの段階を紹介
- 1つ目、疑う
- コード、ログ、エラーメッセージ、モニタリングデータ、要件、ハードウェアなど、あらゆるものが問題解決のための情報収集対象になる
- チェックリストを作成するとよい
- 2つ目、分類する
- 収集した情報のうち、分かっていることと、よく分からないことを分けること
- 情報を収集する段階でその場でふるい落とされる情報は、小さな直感によるもの
- 筆者は、論理的欠陥、依存技術の欠陥、基盤技術の欠陥、物理的欠陥の4つに分類している
- 3つ目、学習する
- 収集した情報をもとに知識の空白を見つけて学習すること
- 4つ目、つなげる
- 情報をもとに問題に対する仮説を立て、実験すること
- この過程で新たな洞察が生まれたら、再び4つの段階を回るフィードバックループを使うこと
- 先に紹介した内容は、前述の直感を鍛えるのに役立つ方法
- 自分なりのデバッグ原則がないなら、この文章をもとに作ってもよいし、新しく作ってもよい。よいヒントを共有するなら、なおよい
7件のコメント
とても共感します。そして、デバッグに関する一般的なアプローチをうまく整理して提案してくださっているように思います。
実際にデバッグを進めていく過程には、非常に多様な原因や背景知識が複雑に絡み合っているため、その中で必要な手がかりを見つけるためにフォーカスを絞っていくプロセスが本当に重要だと思います。
本文では、その過程で直感と洞察力を磨くべきだとされていましたが、感覚的にどこが原因なのか、どこを中心に調べるべきなのかという出発点を定めるうえで、経験と勘によって培われた直感がここで大きな役割を占めているように感じます。
共感します。おっしゃっている感覚をうまく表現したかったのですが、文章全体としては直感よりも洞察力で統一したほうがよさそうだと思いました。
推論できる人はできるし、できない人はできない、という考え。
30年くらい前だったでしょうか。
ITは3年くらいやれば実力はみんな同じになる、と先輩たちがよく言っていました。
今考えてみると……
情報を結び付けることは、直観の領域というよりも、推論や論理的証明として捉えるほうが自然ではないでしょうか。証明を反復して習熟すると、九九を覚えるように中間過程を省略して答えがすぐに出るため、直観のように見えることはあるでしょうが、両者は区別するのが適切ではないかと思います。
残りの疑念、分類、学習については、経験と背景知識が蓄積されることで向上するのを実感してきたため、同意します。
もう一度文章を読み返して、補足します
筆者が主張されている「直感」の定義は、社会的に一般に通用している直感の定義とは異なるように思えます。思考の過程なしに問題を理解することが、一般的な直感の定義だと理解しているのですが。文章を読んでいるうちに、一瞬、自分が直感の意味を誤解していたのかと思って、改めて確認したくなりました。デバッグには思考の手順が必要だという全体的な論旨とも矛盾するのではないかと思います。もしデバッグが本当に完全に直感だけで遂行できる作業なのであれば、デバッグ時にログやデータの確認、構成管理がまったく不要だという主張も成り立たなければならないのではないでしょうか?
こんにちは。記事に関心をお寄せいただきありがとうございます。
ご指摘のとおり、一般的に直感とは、直接的な思考活動なしに対象を把握することを意味します。とはいえ、本当にまったく知識のない状態から正解にたどり着けるわけではないとも考えています。
まず、直感という言葉についての私の考えを書くと、デバッグの話をしていると「急に思い浮かんだ」「なぜかその部分が問題のように思えた」といったことを同僚から聞いたり、自分でもそう話したりすることがよくあります。私はこの部分を直感だと考えました。急に思い浮かんだことをそのまま流さず、一つひとつ確認していくと、結局その部分に関する経験があったり、関連知識をよく理解していたりすることに気づけました。そこで直感という言葉を使い、誤解があり得るので「自分の知っている知識を問題と結びつけることが直感だ」という一文を追加しました。
ですので、ご指摘いただいたいくつかの疑問について私の考えを述べると、
「デバッグに思考の手順が必要だという全体的な論旨とも矛盾する」については、私が文章で表現した直感とは、すでに経験したことや知っている事実によって、大きく考えずに省略できるものとして描写しました。したがって、思考の手順が不要という意味ではなく、思考を速く行うための道具として表現したかったのです。
次に、「デバッグが本当に完全に直感だけで遂行できる作業なら、デバッグ時にログやデータ確認、構成管理がまったく必要ないという主張も成り立つのではないでしょうか?」については、完全に直感だけで遂行できるとは表現していません。むしろ「デバッグとは、与えられた状況とデータをもとに問題の原因を見つけていく過程である」という一文を追加しました。ただ、デバッグのたびに文章で主張している4段階の推論過程を経る開発者はほとんどいないだろうとも思います。ある程度の経験と知識があれば、自分の判断で省略する場合もあるでしょう。ご指摘のログやデータなどは、経験や知識があればそれを想起させる役割を果たし、経験や知識がなければ推論を助ける役割を果たす、この二つの役割を持っていると考えています。したがって、文章で述べた直感のためであっても、なくてはならない重要な情報です。
この文章で使った直感という言葉自体が曖昧模糊としている可能性はあると思います。もしかすると、私の考えを表すには文章の構成やビルドアップが良くなかったのかもしれません。ひとまず、具体性に欠けていた部分は修正しようと思います。ただ、直感という言葉を置き換えるのがよいかどうかは、まだ判断がつきません。文章を書くときから直感という言葉を核心に据えていたので、代わりになる別の言葉が思い浮かびません。もしよいご意見があれば、お聞かせいただけるとうれしいです。 :)
デバッグには直観と推論の両方が必要であるという背景説明を序論に、問題を見つける方法と直観/推論の関連性を本論に加えると、文章の完成度を高められると考えます
変更前
変更後
序論
本論(デバッグ手順)