10時間以上困惑させ続ける、本当に奇妙なエラーにどのように取り組みますか?[閉まっている]


29

あなたはそれらを知っています、意味をなさないエラー。グレムリンがチップの奥深くに飛び込んで、何かを台無しにしたように思えます。散歩して、物を書いて、おじさんに電話しますか?


3
説明が正しい可能性があります-再起動して再試行してください!
-NoChance

5
もちろん、stackoverflowに投稿してください:)
ウィリアム

5
なぜ10時間というしきい値を決めたのですか?それは長すぎます-1〜2時間以内に予期しない動作を引き起こしているものがよくわからない場合、問題が発生します。
ベクトル

5
「状況が厳しくなると、その人は眠りについて、潜在意識がそれに取り組むようになります。」-アノン
マイケルイースター

2
1.誰かを助けてください。二人は必須です。2.大量のデバッグステートメントを使用して絞り込みます。セグメンテーション違反を特定するためのデバッグマクロがすべての単一行の前にあるファイルがありました。
SF。

回答:


9

これらの本当に恐ろしい問題については、私の戦略は通常次のようになります。

  • 実験とグーグル。問題を解決しようとしてください。ほとんどの場合、これは1時間以内に問題を解決します。

  • それでうまくいきませんでした。休憩する。コーヒーを飲み、同僚と関係のない何かについて話します。問題を頭から押し出します。5分または10分後に問題を見ると、わずかに異なる視点から問題を見ています。ほとんどの場合、これは機能します。

  • この場合はそうではありません。そのため、さらに10〜30分を見てください。その後、同僚を呼び出します。ただし、実行する前にメモを作成してください。問題を実証し、再現してから、試したことのリストを表示し、最も重要なことは、試したことを証明することです。最初にドライランを実行してください。コードにブックマークを設定し、余分な開いているドキュメントなどを閉じます。この方法で問題を自分で解決するか、問題を実証するときに時間を無駄にしないようにします。

  • 同僚にあなたの仮定をすべて証明してもらってください。そのセッターは実際に呼び出されていますか?そのメソッドは、あなたが主張するものを本当に返していますか?あなたはオブジェクトがnullではないと思う-それがnullではないことを見せてください。

  • ほとんどの場合、問題を実証することで、すべての可能性を試したわけではないことに気付くか、同僚があなたの間違いを見ることになるでしょう。

  • それがうまくいかない場合は、深刻になるまでの時間です。実行しようとしていること、試行したこと、およびなぜ機能しなかったのかを正確に文書化します。これをすべての同僚にメールで送信します。SOに投稿してください。この時点で、ドキュメントは完璧なSO質問になっているはずです。

  • 応答を待っている間、グーグルグーグルグーグル。質問のあらゆる組み合わせを試してください。たくさんのタブを開きます。おそらくこの時点で答えを得ることはできませんが、アイデア、可能性、問題へのアプローチのさまざまな方法を探しています。

  • 問題に5時間を費やした場合は、別のことをしてください。たぶんあなたは有用な応答を得るでしょう。たぶん、翌日問題を攻撃するとき、それは明らかでしょう。

  • それでもうまくいかない場合は、別の解決策を探しましょう。たぶん、あなたは異なる方法、異なる技術を使うことができます。たぶん、この機能を放棄することを検討する必要があります。時間単位でクライアントに請求していますか?社内アプリで会社に勤めていますか?これを所有者にエスカレートして、「見て、これにx時間を費やしたが、何も進歩しなかったので、費用対効果はそれだけの価値があるか」と伝える必要があります。あなたは上司のところに行き、問題に16時間を費やしたことを伝えて、彼らが好転して、このリリースではそれをスキップすることを言いたくありません。あなたはより早くそれを見つける必要があります。

  • そして、それがうまくいかない場合は?さて、あなたの唯一の選択肢は、問題に打ち勝ち続けるか、業界の専門知識を探すことです。Twitterでテクノロジーの専門家に尋ねてください。テクノロジープロバイダーにメールを送信します。


79

終了する。いいえ、あなたの仕事ではありません!起きて家に帰るだけです。あなたは一日または週末に終わりました。次に問題に戻ったとき、20回のうち19回は、1時間以内に解決策が提示されます。


17
また、ゴムをダッキングすることもできます。en.wikipedia.org/wiki/Rubber_duck_debugging
デイブいや

2
20のうち19、はい。私の最悪のものは解決されず、回避されただけでした。テスト環境はまったく表示されず、稼働中の完全な実稼働環境のみが表示されました。数時間後でも再現することはできませんでした。
ローレンペクテル

3
あなたをいらいらさせるものから逃れることは本当に難しいことができます-しかし、私は長年にわたってそれが常に最善のことであることを発見しました。潜在意識は、食事中、睡眠中、お休み中、テレビを見ている間、問題に取り組むことができます。しかし、警告の一言:立ち去る前に情報を収集する...立ち去ることは、それを無視してそこにいないふりをすることと同じではありません。あなたはまだハードワークが必要です!
すぐに

1
私は1時間について知りません。私は通常、朝起きたときのシャワーのこれらのタイプの問題のほとんどを解決します。2番目に多いのは、夜寝そうになり、ついにそれについて考えるのをやめることです。
-SoylentGray

3
Neil deGrasse Tysonが主催する魅力的なNOVA Science NOWで、睡眠の科学について話しました。その中で、数時間問題に頭をぶつけ、眠りについて、目を覚ましてすぐに解決する現象について議論しました。眠ると、脳は日々の出来事を何度も繰り返し、さまざまな角度から分析します。残されているのは、無意識のうちにまったく新しい方法で問題を確認し、実際に問題を解決するのに役立つ新しい神経経路です。めっちゃすごい。
バーンリース

44

10時間が経過する前に、私は助けを得るでしょう。

  1. 問題を他の誰か、他の誰か、あなたのゴム製のアヒルにまで説明してください。
  2. 他の人にコードを見てもらうか、コードをステップスルーしてもらいます。
  3. それを隔離します。大量のものを削除し、問題が再発するまで少しずつ戻します。
  4. 眠りにつく!

12
問題がなくなるまですべてを削除するための+1。
ジョナ

4
1時間経過する前に、これらのいずれかを実行する必要があります。じっと見つめるほど、ひらめきを達成する可能性は低くなります。私は通常、誰かと話し合うだけで問題を解決します。
ベン

スポットオン。多くの場合、最初に問題を説明することで問題を把握します(またはそれに近づきます)。StackOverflow質問の問題の説明を書いているときに、これが頻繁に発生します。また、削減(分離)が必要で、それから失敗します。問題から離れてSOの回答が
入り込む

17

ある言葉はtimebox、何かに取り組むための限られた時間を設定し、それが解決されない場合、別の何かに進み、新鮮な視点で翌日に戻ってきます。

それと別の目は、あなたが何かを見つめて無駄にすることができるときよりも常に価値があります。

私は一度に何かを解決しようとして45分以上1時間以上費やすことはありません。


ありがとうございました-ウィキペディアのタイムボックスの記事を読みました。非常に便利です。
アデル

7

問題を他の誰かに説明してください。

問題を他の人に説明することで、それを明確にする必要があります。これにより、多くの場合、解決策を見ることができます。

(英国のプロのコンピューター雑誌の1つは、かつてこの目的のためにシニアプログラマーの実物大の段ボールの切り抜きを販売することを提案したことがあります。)

問題で寝ることもあります(数日間)こともあります。


1
「他の誰か」は人間である必要はありません。時々私は猫に物事を説明し、そしてああ!問題が見つかりました。
DarenW

私も猫を買うべきです。必要に応じて頭を掻くようにトレーニングします。
アデル

ジョン・スキートの実物大のボール紙の切り抜きを誰かが本当に作るべきです。
ドンロビー

5

私は3つのステップの計画があります:

  1. コーヒーまたは他のおいしい飲み物を入手してください。
  2. 残りの時間は何か他のことに取り組みます。
  3. 「友人に電話する」とホワイトボードに落書き。

前のステップが失敗した場合、各段階はエスカレーションです。ほとんどの場合、ステージ2で作業できる生産的な何かがあります。


いいアドバイスです!ミリオネアのように、60秒に制限する必要があるため、「友人に電話する」という言葉が引用されています。ホワイトボードのアイデアも好きです。
アデル

1
ホワイトボードは、体系的に考えるのに非常に役立ちます。引用は、しばしば友人が同じオフィスにいるので、実際に電話をかけるのは奇妙だからです。しかし、それはテレビ番組のライフラインのように感じられました。
フレキソ

4

寝て

それ以外の場合は、近くの人に電話して、コードを簡単に確認するように依頼します。

多くの場合、あなたのコードを見つけるのに長い時間がかかるエラーは、他の人によって非常に簡単に見つけられます


3

起きて、歩き回り、問題について考えることで解決策を見つけることができるかどうかを確認できます。あなたが実際に立っているか歩き回っているかどうかにかかわらず、考えている間はコンピューターから離れてみてください。


3

通常、次の3つのいずれかを実行します。

  1. 散歩/自転車に乗って...コンピュータからあなたを遠ざけるものもあります。
  2. 犬や猫と遊ぶ
  3. 趣味があれば、しばらくの間、それに取り組んでください。

3人はいずれも、目の前の状況から気を散らすのに良い仕事をしています。気が散ることで、私の潜在意識の脳がしばらくの間何かを噛むようになります。この1時間ほどで、bam、解決策があります:-)。


3

テストハーネスを構築して、その正確な欠陥をターゲットにし、それを分離します

欠陥を再現しながら、良いコードを削除し続けるだけです。エラーをカバーする正確なコードを対象とするまで。次に、コードをトレースします。

推奨読書: 実用的なプログラマー特に第10章:トレーサーの箇条書き


これはすべて良いことですが、バグが再現されていることは当然のことです。これまでに費やした19時間が、それまで...決定論的かつ体系的な方法で問題を再現する手段を見つけようとしていたとしたらどうでしょう?私にとっては、それがここでの質問の本質です!
ニュートピア

実用的なプログラマーは優秀です
アデル

2

これらの提案はすべて素晴らしいです。しかし、私は言及されていないテクニックを頻繁に使用します。リストを作成して、問題に関する考えを整理します。特に厄介な問題がある場合、私は通常、次のような複数のリストを書きます:事実、仮定、質問、症状など。しばしば間違っていることがわかります)、私が気づかなかった質問をする必要がある、私が確認できる他の順列など


2

編集:

短い答え:

Q:10時間以上困惑させ続ける、本当に奇妙なエラーにどのように取り組みますか?

A:決して起こらないようにしてください。設計を理解し、コードを理解し、デバッガの使用方法を学びます。


説明:

「グレムリンがチップの奥深くに飛び込んで、何かを台無しにしたようだ」

これは決して起こらないはずです。それがあなたのコードである場合、それを修正する前に、エラーの原因を非常によく理解している必要があります。

さらに、コードを記述するときは、どこで、なぜ失敗する可能性があるかをすでに知っている必要があります。

そうは言っても-ピアに質問し、SOに投稿し、手順を遡ってロールバックし、休憩を取って-上記のすべての提案が役立ちます。

もう1つは、ツール、つまりデバッグツールキットを知っている必要があるということです。コード内の疑わしいポイントでメッセージを記録し、コールスタックを慎重に調べ、条件付きブレークポイントやウォッチなどを使用します。デバッグスキルは余分なものではなく、プログラミングの一部です。


自分のステップをたどることができることが重要です。ありがとうございました!
アデル

>自分のステップをたどることができることが重要です。SourceControlソフトウェアは、ロールバック/リトレースを行うための鍵です。それについてANALになり、可能であれば、チェックイン時にコメントを残すように設定してください。
ベクトル

3
残念ながら、コードをどれだけよく知っていても、問題は誰かの(クローズドソース)コードとの相互作用である場合があります。
ネイトCK

2
+1 @Nate CK-非常に正しい。最悪のタイプのバグは、依存しているWebサービスからある種の意味不明なものを取り戻すときに発生します。しばらく前に、サースベンダーに、Webサービスで警告なしにいくつかの機能を微妙に変更してもらいました。開発者に電話で自分のバグを修正する方法を説明する必要がありました。彼は自分のコードがどのように見えるかを説明してくれました。
モーガンハーロッカー

1
何を決定するには?サードパーティのコードに問題があるということですか?その部分は比較的簡単です。難しいのは、どの条件がそれを引き起こすのか、そしてそれをどのように回避するのかを把握することです。あなたのコードがあなたのためにそれらすべてを解決しようとしていると思うなら、私はあなたがたぶんそれに対処する必要がなかったことを提案します。
ネイトCK

1

同様の問題、Objective-Cでの明らかなメモリ破損があり、何時間も苦労しました。しかし、その後、私と同僚は昼食のために散歩し、問題(およびそのinitメソッドでのオブジェクトの逆シリアル化に関係する特定のビット)を説明し、基本的に問題全体を自分に説明しました。

(技術的な詳細:基本的に、私はオブジェクトを初期化して自分以外のものに返したので、2つのallocがありましたが、1つのオブジェクトだけが返されました。メモリがシフトし、狂ってクラッシュしました。どちらか)。


1
「初期化して、オブジェクトをself以外のものに戻しました」-そのようなバグはタフです!あなたはそれを100回以上見ることができ、それを捕まえません。しかし、デバッガーでトレースして2つの割り当てを確認できませんでしたか?
ベクトル

1

ここに画像の説明を入力してください

風呂に入る。

どれロドニーマッケイファン?

しかし、真剣に、これらすべての答えに共通点がある場合は、休憩を取って何か他のことをすることです

私はそれをあなたの潜在意識に問題を委ねると考えています。気づいていない場合でも、入浴など他のことをしているときでも、私たちの心は問題に取り組んでいるようです。


素晴らしいアイデア....今、私はボスにオフィスに半ダースの浸水浴槽を入れるようにする必要があります。
デイブネイ

キュービクル労働者の大部分だけがそのような部屋を持っていたら。
アデル

1

それをステップバイステップで、アセンブリにステップダウンします。誰が何を呼ぶのか、メモリアクセスのブレークポイント。それは通常、バグを本当に素早くキャッ​​チします。

そうでない場合は、散歩してください。


1

これらすべての組み合わせ:

  • バックバーナーに座れるようにしばらく離れてください。睡眠、休息、食事、散歩など、何でも。

  • 調べ、より多くの問題を、それは間違って他に何をするのか、あなたは他にどのような症状を見つけることができますか?

  • 問題を調査し、見つけられるものを確認してください。別のキーワードを試してください

  • 別の何かを試してください。回避策。別のデバッグ手法。バリデーター。別のコンピューター。

  • 誰かと話してください。たとえ彼らが助けられなかったり、プログラマーでさえなかったとしても、時々話すことはアイデア電球を引き起こします

  • 再起動!必要に応じて、コンピューター、サーバーなどを再起動してみてください。それ以外の場合は、時間をかけて考えてください。

  • StackOverflowに聞いてください!私たちは助けるためにここにいます


1

私は実際には最も投票された答えが好きではありませんでした。なぜなら、それはいつかは機能しますが、時にはその同じ日を把握する必要があるため、この順序でお勧めするのは:

  1. それがあなただけに起こっているのではないことを確認してください。これにより、時間を大幅に節約できます。必要なコンポーネントをアンインストールしたか、環境に変更を加えたために、コードのどこかに例外が飲み込まれている可能性があります。それがあなただけに起こっている場合、環境比較ツールを使用します。最近、Envyというソフトウェアについて読んだことがあります。このソフトウェアを使用すると、フリーウェアではありませんが、10米ドルの費用がかかります。

  2. みんなに起こっている?それでは、コードで履歴の表示を行い、エラーを引き起こした可能性のある最近の変更を直接または間接的に確認してください。

  3. 最近の変更はありませんか?非常に特定のエラー(例外)の場合は、「stackoverflow it」。今では「グーグル・イット」よりも音が良くありませんが、グーグルよりもプログラミング研究のために最初にstackoverflowを検索すると言って良いと思います。それが本当に既知の問題である場合、ここで解決策を見つける可能性が非常に高いです。そうでない場合は、関連するstackexchangeサイトに質問を投稿してください。あなたは非常に迅速な答えを得るかもしれません、あるいはあなたがそうしなくても、あなたはより多くの研究をしている間あなたの質問がそこにあるでしょう。それは利点です。

  4. オンラインで回答が見つからなかった場合、または一般的なエラーではない場合は、ステップごとにコードを調べて、各ステップで得られた結果が期待する結果に対して意味があるかどうかを確認します。各方法で始めから終わりまで、そして階層型ソリューションで下から上へと進みます。(つまり、パフォーマンスのトラブルシューティングを行う場合、レコードを取得するコードから開始します。最初のステップが問題かどうかをすばやく判断できる場合、UIで開始しても意味がありません)。

  5. コードを何度か調べた後、まだ何がおかしいのかわからない場合は、誰かに電話して相談してください。誰かが既に述べたように、それについて大声で話すと電球が点灯します。さらに、ペアプログラミングは非常に便利です。

  6. この時点で、可能であれば、しばらくの間、またはその日のうちに立ち去ってください。昨日、「本当のことを考えて寝て、「もちろん」と思って目が覚めた」という本当のツイートを読んだ。仰るとおり。

  7. それでも答えが見つからない場合は、より小さなタスク/メソッド/関数にリファクタリングしてみてください。ヘンリー・フォードは、「それを小さなタスクに分割することで達成できないほど複雑なタスクはない」というようなことを言った。この時点で、ソリューションが複雑すぎて、自分でも他の誰かの助けを借りてもわからない場合は、コードを小さなタスクにリファクタリングします。コミットしなくても、理由を見つけるのに役立ちます。

  8. コードにインスツルメンテーションを追加します。

  9. それについてツイートする?


1

ステップバックする必要があります。私のモットーは、「問題があまりにも難しい場合、間違った問題を解決している」ということです。あなたの仮定は何ですか?何も信用しないでください。

その結果として、「問題が奇妙になればなるほど、解決策は奇妙になります」。コンピューターの強みはそのロジックであるため、ロジックに勝てません。あなたには脳があり、それを考え抜く必要があります。

現代では、システム上でやり取りを行う他の多くのものがあります-ファイアウォール、AV、スパイウェア対策、毎晩行われる自動更新-移動するターゲットに対処する必要があります。


だから、本当か「の問題奇妙、解決奇妙」は
アデル

-1

Google it。Stackoverflowそれ。フォーラムに投稿してください。基本的に一人で解決できない場合は、人々に助けてもらいましょう。


-1
  1. 問題を書き留めます。
  2. 真剣に考える。
  3. ソリューションを実装します。

簡潔でとても良い!
アデル

1
実は違う。同じトラックに沿って一生懸命に考えることは、できる限り最悪のことです。「体系的な方法で、各仮定に挑戦し、列挙し、再訪し、テストする」ことがここでの解決策です。人々はそれを達成するためのさまざまな戦術を議論しています。
-smci
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.