あなたはそれらを知っています、それらは意味をなさないエラーです。グレムリンがチップの奥深くに飛び込んで何かを台無しにしたように見える場所。散歩したり、書き物をしたり、叔父に電話したりしますか?
これらの本当に恐ろしい問題の場合、私の戦略は通常次のようになります。
実験とグーグル。問題の解決に努めてください。ほとんどの場合、これは1時間以内に問題を解決します。
だからそれはうまくいきませんでした。休憩する。コーヒーを飲み、同僚とは無関係のことについて話します。問題を頭から押し出します。 5分後または10分後の問題を見ると、少し異なる視点から問題を見ています。ほとんどの場合、これは機能します。
この場合はそうではありません。だからそれを見てさらに10〜30分を費やす。次に、同僚を呼びます。ただし、その前に、いくつかのメモを作成してください。問題を実証し、それを再現してから、試行したことのリストを作成し、最も重要なことに、試行したことを証明したいとします。したがって、最初に予行演習を行ってください。コードにいくつかのブックマークを設定し、余分な開いているドキュメントなどを閉じます。このようにして、自分で問題を解決するか、問題を実証するときに時間を無駄にすることはありません。
すべての仮定を証明するように同僚に依頼してください。そのセッターは実際に呼び出されていますか?そのメソッドは本当にあなたが主張しているものを返していますか?あなたはオブジェクトがnullではないと思います-nullではないことを彼らに見せてください。
ほとんどの場合、問題をデモンストレーションすると、すべての可能性を試していないことに気付くか、同僚があなたの間違いを目にするでしょう。
それがうまくいかない場合は、深刻になる時間です。何をしようとしているか、何を試したか、なぜうまくいかなかったかを正確に文書化します。これをすべての同僚に電子メールで送信します。 SOに投稿してください。この時点で、ドキュメントは完全なSO質問になります。
あなたが応答を待つ間、グーグルグーグルグーグル。あなたが持っている質問のあらゆる順列を試してください。たくさんのタブを開きます。この時点ではおそらく回答を得られないでしょうが、アイデア、可能性、問題へのさまざまなアプローチ方法を探しています。
問題に5時間費やした場合は、別の日のためにそれを残す時間です。多分あなたは有用な応答を得るでしょう。多分あなたが翌日に問題を攻撃するとき、それは明白でしょう。
それでもうまくいかない場合は、別のソリューションを探す時間です。多分あなたは別の方法、別のテクノロジーを使用することができます。多分あなたは今のところ機能を放棄することを検討する必要があります。時間単位でクライアントに請求しますか?会社の社内アプリで働いていますか?これを所有者にエスカレーションして、「見たところ、私はこれにx時間費やしていて、何の進歩もありませんでした。費用対効果はそれに見合うものですか?」と伝える必要があります。上司のところに行って、問題に16時間を費やして彼らが好転し、言うのはそれほど重要ではないので、このリリースではそれをスキップすることを伝えたくないでしょう。あなたはそれをもっと早く見つける必要があります。
そして、それがうまくいかない場合?さて、あなたの唯一の選択肢は、問題に手を出さないようにするか、業界の専門知識を探すことです。 Twitterでテクノロジーの専門家に質問してください。テクノロジープロバイダーにメールを送信します。
終了する。いいえ、あなたの仕事ではありません!起きて家に帰るだけです。あなたはその日か週末に終わりました。次に問題に戻ったときに20回のうち19回、ソリューションは1時間以内に現れます。
10時間経つ前に、私はいくつかの助けを得るでしょう。
1つの単語timebox
は、何かに取り組むための限られた時間を設定し、それが解決されない場合は、別の何かに進み、次の日に新鮮な視点でそれに戻ります。
それと別の目は、何かを見つめて無駄にできる時間よりも常に価値があります。
私は一度に何かを解決するために45分から1時間以上費やすことは決してしません、それは還元の減少の法則に違反します。
問題を他の人に説明してください。
問題を他の人に説明することにより、それを明確にする必要があります。これにより、多くの場合、解決策を見ることができます。
(かつて英国の専門コンピュータ雑誌の1つが、この目的のために特別に上級プログラマーの等身大の厚紙カットアウトを販売することを提案していました。)
問題が発生したときに(場合によっては数日間)寝ることも役立ちます。
私には3つのステップの計画があります。
前のステップが失敗した場合、各ステージはエスカレーションです。ほとんどの場合、ステージ2で作業できる他の生産的なものがあります。
寝て
それ以外の場合は、近くの誰かに電話して、コードをざっと見てみるように頼みます。
多くの場合、(コードが原因で)見つけるのに長い時間がかかるエラーは、他の人が簡単に見つけられます
私は通常、次の3つのいずれかを行います。
3人とも、目の前の状況から自分の注意をそらすのに優れています。気が散ることで、潜在意識の脳がしばらく何かを噛んでしまいます。 1時間ほど経つと、解決策があります:-)。
その正確な欠陥を対象とするテストハーネスを構築し、それを特定します
欠陥を複製しながら、適切なコードを排除し続けるだけです。エラーをカバーするコードの正確な部分をターゲットにするまで。次に、コードをトレースします。
おすすめの読み:The Pragmatic Programmer 特に第10章:トレーサーの箇条書き
立ち上がって歩き回り、問題について考えることが、解決策を見つけるのに役立つかどうかを確認できます。実際に立っている、またはペースを合わせているかどうかに関係なく、考えている間はコンピュータから離れてください。
編集:
短い答え:
Q:10時間以上も戸惑う本当に奇妙なエラーにどのように取り組みますか?
A:それらが起こらないようにしてください:デザインを理解し、コードを理解し、デバッガーの使用方法を学びます。
説明:
「グレムリンがチップの奥深くに飛び込んで何かを台無しにしたように見えるところ」
これは決して起こらないはずです。それが自分のコードである場合は、修正を試みる前に、エラーの原因をよく理解している必要があります。
さらに、コードを書くときは、どこで、なぜ失敗する可能性があるのかをすでに知っている必要があります。
そうは言っても-同僚に質問し、SOに投稿し、ステップを遡ってロールバックし、休憩を取ること-上記のすべての提案が役立ちます。
もう1つは、自分のツール(デバッグツールキット)を知っている必要があることです。コードの疑わしいポイントでメッセージをログに記録し、コールスタックを注意深く調べ、条件付きブレークポイントやウォッチなどを使用します。デバッグスキルは特別なものではなく、プログラミングの一部です。
これらの提案はすべて素晴らしいです。しかし、私は言及されていないテクニックをかなり頻繁に使用しています。問題についての考えを整理するためのリストを作成します。私が特に厄介な問題を抱えている場合、私は通常、事実、仮定、質問、症状などの複数のリストを書きます。このように物事を整理する過程で、私が気付いていなかった仮定を発見することがよくあります(それはしばしば間違っていることがわかります)、私が気づかなかった質問、尋ねられる必要があること、確認できる他の順列など.
お風呂に入ります。
Rodney McKay ファンはいますか?
しかし真剣に、これらすべての答えに共通点が1つある場合は、休憩を取って何か他のことをすることです。
私はそれをあなたの潜在意識に問題を追いやることと考えたいです。他に気づいていない場合でも、 風呂に入る など、何か他のことをしているときでも、心は(引き続き)問題に取り組み続けます。
これらすべての組み合わせ:
逃げるそれからしばらくの間、それをバックバーナーに置くことができます。睡眠、休息、食事、散歩など。
調査問題の詳細、それ以外に何が悪いのですか、他にどのような症状が見られますか?
Research問題、あなたが見つけることができるものを見てください。別のキーワードを試すことを忘れないでください
別の方法を試してください。回避策。別のデバッグ手法。バリデーター。別のコンピューター。
誰かと話す。彼らが役に立たない、またはプログラマでさえない場合でも、時々話すことはアイデアの電球をトリガーします
Restart!必要に応じて、コンピュータやサーバーなどを再起動してみてください。それ以外の場合は、時間を使って考えることができます。
StackOverflowに質問してください!お手伝いします
一歩一歩、アセンブリに進みます。誰が何を呼び出すか、メモリアクセスのブレークポイント。これは通常、バグを非常に迅速にキャッチします。
そうでない場合は、散歩してください。
同様の問題、Objective-Cでの明らかなメモリ破損があり、何時間も苦労しました。しかし、それから私と同僚は昼食のために散歩をしました、そして私は問題を説明し(そして、そのinitメソッドでのオブジェクトの逆シリアル化に関係している特定のビットの1つ)、基本的に問題全体を私に説明しました。
(技術的な詳細:基本的に、オブジェクトを初期化して自分以外の何かにオブジェクトを返したので、2つの割り当てがありましたが、1つのオブジェクトしか返されませんでした。メモリがシフトし、異常な状態になり、クラッシュしました。デバッガはどうすればよいかわかりませんそれのどちらか)。
私は本当に最も投票された回答が好きではありませんでした。なぜなら、それがうまくいくときも、同じ日にそれを理解する必要があるときもあるので、この順序でお勧めします。
それがあなただけに起こっているのではないことを確認してください。これにより、多くの時間を節約できます。必要なコンポーネントをアンインストールしたか、環境に変更を加えた可能性があり、例外がコードのどこかに飲み込まれています。もしそれがあなただけに起こっているのなら、私は環境比較ツールを使うでしょう。私は最近、Envyと呼ばれるソフトウェアについて読みました。それはあなたがそれだけを行うことを可能にします、それはフリーウェアではありませんが、それは10 USDかかります。
みんなに起こっていますか?では、コードの履歴を表示して、直接または間接的にエラーを引き起こした可能性のある最近の変更を確認してください。
最近の変更はありませんか?非常に具体的なエラー(例外)の場合は、「stackoverflow it」です。さて、それは「グーグル・イット」より良く聞こえませんが、私は最初にグーグルよりもプログラミング研究のためにスタックオーバーフローを検索すると言って良かったと思います。それが本当に既知の問題である場合は、ここで解決策を見つける可能性が非常に高いです。そうでない場合は、関連するstackexchangeサイトに質問を投稿してください。あなたは非常に迅速な答えを得るかもしれませんし、そうでない場合でも、より多くの研究をしている間、あなたの質問はそこにあります。それはメリットです。
オンラインで回答が見つからなかった場合、または一般的なエラーではない場合は、コードを1ステップずつ実行し、各ステップで取得した結果が期待どおりの結果になるかどうかを確認します。各方法を最初から最後まで行って、階層型ソリューションを下から上に進みます。 (つまり、パフォーマンスのトラブルシューティングを行う場合は、レコードを取得するコードから始めます。最初のステップが問題であるかどうかをすばやく判断できる場合は、UIで開始しても意味がありません)。
コードを数回試しても問題が見つからない場合は、誰かに電話して話してもらいます。誰かがすでに述べたように、大声でそれについて話すことは電球を照らすことができます。さらに、ペアプログラミングは本当に便利です。
この時点で、可能であれば、しばらくの間、またはその日のうちに立ち去ります。私は昨日、「どうやってfckなのか」と考えて就寝し、「もちろん」と考えて目を覚ましたという非常に真のツイートを読みました。仰るとおり。
それでも答えがわからない場合は、より小さなタスク/メソッド/関数にリファクタリングしてみるといいでしょう。ヘンリー・フォードは、「それほど複雑なタスクはありませんが、より小さなタスクに分割することで達成することはできません」のようなものを言いました。この時点で、ソリューションが複雑すぎて、自分でも他の人の助けでも理解していない場合は、コードを小さなタスクにリファクタリングします。コミットしなくても、理由を見つけるのに役立ちます。
コードにインストルメンテーションを追加します。
それについてつぶやく?
後退する必要があります。私のモットーは「問題が難しすぎる場合は、間違った問題を解決することです」です。あなたの仮定は何ですか?何も信用しないでください。
その当然の結果は、「奇妙な問題、奇妙な解決策」です。コンピュータの強みはそのロジックであり、ロジックで勝つことはできません。あなたには頭脳があり、それを考え直す必要があります。
現代では、ファイアウォール、AV、アンチスパイウェア、自動更新が毎晩行われているシステム上で相互作用する他の多くのものがあり、移動するターゲットに対処する必要があります。