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