web-dev-qa-db-ja.com

バグ修正が過剰になった場合はいつですか?

JavaScriptでビデオプレーヤーを作成しているとします。このビデオプレーヤーは、再帰関数を使用してユーザーのビデオを繰り返しループします。そのため、ブラウザはいつかtoo much recursionRangeErrorをトリガーします。

おそらく誰もループ機能をそれほど使用しないでしょう。アプリケーションがこのエラーをスローすることは決してありません。たとえユーザーが1週間ループを終了したとしても、それはまだ存在します。問題を解決するには、アプリケーションでのループの動作を再設計する必要があり、かなりの時間がかかります。職業はなんですか?どうして?

  • バグを修正する

  • バグを残す

人々が遭遇するバグだけを修正すべきではありませんか?バグ修正が過剰になるのはいつですか?

編集:

実際のバグを引き起こさない再帰的なアプローチが問題になる場合は、プレーヤーがビデオをループするたびに、変数が1ずつ増加するとします。 2の後53 ループすると、この変数はオーバーフローし、プログラムはそれを処理できなくなり、例外がスローされます。

129
Tiago Marinho

あなたは実用的でなければなりません。

エラーが現実の世界で発生する可能性が低く、修正するためのコストが高い場合、多くの人がそれを修正するためのリソースの適切な使用と考えるのではないでしょうか。これに基づいて、私はそれを残しますと言いますが、ハッキングが数ヶ月以内にあなたまたはあなたの後継者のために文書化されることを確認してください(最後の段落を参照)。

とはいえ、この問題は「学習体験」として使用する必要があり、次にループを実行するときには、不必要に再帰ループを使用しないでください。

また、そのバグレポートに備えてください。優れたエンドユーザーが限界に挑戦し、欠陥を発見するのに驚かれるでしょう。それがエンドユーザーにとって問題になる場合は、修正する必要があります。ハッキングを文書化できてうれしいです。

164
mcottle

Windows 95にも同様のバグがあり、 コンピューターが49.7日後にクラッシュしました 。とにかくそのように長く続いたWin95システムはほとんどないので、リリースから数年後に気づかされました。したがって、1つのポイントがあります。バグは、他のより重要なバグとは無関係に表示される可能性があります。

あなたがしなければならないことは、プログラム全体のリスク評価影響評価個々のバグ。

  • このソフトウェアはセキュリティ境界にありますか?
  • もしそうなら、このバグはエクスプロイトを引き起こす可能性がありますか?
  • このソフトウェアは対象ユーザーにとって「ミッションクリティカル」ですか? ( Java EULAが に使用することを禁止している)のリストを参照)
  • バグによりデータが失われる可能性はありますか?経済的な損失?評判の損失?
  • このバグはどの程度発生する可能性がありますか? (これをシナリオに含めました)

等々。これはバグトリアージ、つまり修正するバグを決定するプロセスに影響します。ほとんどすべての出荷ソフトウェアには、まだ修正するのに十分重要とは見なされていないマイナーなバグの非常に長いリストがあります。

78
pjc50

他の答えはすでに非常に優れており、あなたの例は単なる例であることはわかっていますが、まだ説明されていないこのプロセスの大部分を指摘したいと思います。

想定を特定し、コーナーケースに対してそれらの想定をテストする必要があります。

あなたの例を見ると、いくつかの仮定があることがわかります。

  • 再帰的なアプローチでは、最終的にエラーが発生します。
  • 動画の再生に時間がかかりすぎてスタック制限に達するため、このエラーは誰にも表示されません。

他の人々は最初の仮定について議論しましたが、2番目の仮定を見てください。私のビデオが1秒のほんの1秒の長さである場合はどうなりますか?

そして、確かに、それはあまり一般的なユースケースではありません。しかし、あなたは本当にnobodyが非常に短いビデオをアップロードすることを確信していますか?あなたはビデオが最短の長さであることを想定していて、おそらく何かを想定していることにさえ気付かなかったでしょう!この仮定により、アプリケーションの他の場所で他のバグが発生する可能性はありますか?

未確認の仮定はバグの大きな原因です。

私が言ったように、あなたの例はほんの一例であることを知っていますが、この仮定を特定するプロセス(これは多くの場合、予想より難しい)であり、次にそれらの仮定の例外を考えることは、どこに時間を費やすかを決定する大きな要因です。

ですから、「私はこれを回避するためにプログラムする必要はありません。それが起こることは決してないからです」と考えているなら、その仮定を実際に検討するために少し時間を取る必要があります。多くの場合、当初考えていたよりも一般的である可能性のあるコーナーケースを考えます。

そうは言っても、これが無益な運動になるポイントがあります。 JavaScriptアプリケーションがTI-89計算機で完全に機能するかどうかは気にしないので、そのために時間を費やしても無駄になります。

他の答えはすでにこれをカバーしていますが、「これは重要」と「これは時間の無駄です」の間のその線を思い付くのは正確な科学ではなく、それは1つとは完全に異なる多くの要因に依存します別の人や会社。

しかし、そのプロセスの大部分は、最初に仮定を特定し、次にそれらの仮定の例外を認識しようとすることです。

33
Kevin Workman

次の論文を読むことをお勧めします。

信頼性とその脅威:分類法

特に、プログラムで発生する可能性のあるさまざまなタイプの障害について説明します。あなたが説明したものは休止状態の障害と呼ばれ、この論文では次のように説明されています:

エラーが発生すると障害がアクティブになり、それ以外の場合は休止状態になります。アクティブフォールトは、a)以前は休止していて、計算プロセスまたは環境条件によってアクティブ化された内部フォールト、またはb)外部フォールトのいずれかです。障害のアクティブ化とは、コンポーネントに入力(アクティブ化パターン)を適用して、休止状態の障害をアクティブにすることです。ほとんどの内部障害は、休止状態とアクティブ状態の間を循環します

これについて説明すると、すべては費用対効果の比率に要約されます。コストは3つのパラメーターで構成されます。

  • 問題はどのくらいの頻度で発生しますか?
  • 結果はどうなりますか?
  • 個人的にどれだけ気になるの?

最初の2つは重要です。一度ブルームーンに現れたり、誰も気にしたりしないバグである場合、または完全に適切で実用的な回避策がある場合は、既知の問題として安全に文書化し、さらに困難なものに進むことができます。重要なタスク。ただし、バグが原因で金銭取引が失敗したり、長い登録プロセスが中断されたりしてエンドユーザーが不満を感じる場合は、それに対処する必要があります。 3番目のパラメーターは、強くお勧めしません。ヴィート・コルレオーネの言葉で:

それは個人的なものではありません。それはビジネスです。

あなたが専門家である場合、感情を脇に置いて、最適に行動します。ただし、作成しているアプリケーションが趣味である場合は、感情的に関与しており、3番目のパラメーターは、バグを修正するかどうかを決定するという点で、他のどのパラメーターよりも有効です。

13
Vladimir Stokic

そのバグは、誰かが24時間年中無休で会社のプレゼンテーションを実行しているロビーの画面にプレーヤーを置く日まで発見されません。したがって、それはまだバグです。

あなたは何をしますか?への答えは、実際にはビジネス上の決定であり、エンジニアリング上の決定ではありません。

  • バグがユーザーの1%にしか影響せず、プレーヤーが別の20%に必要な機能をサポートしていない場合、選択は明白です。バグを文書化してから続行します。
  • バグ修正がToDoリストにある場合は、新しい機能を追加する前に修正する方がよい場合がよくあります。欠陥のないソフトウェア開発プロセスのメリットが得られ、リストにあるため、多くの時間を失うことはありません。
11

tl; drこれがRESOLVED/WONTFIXは物です。使いすぎないでください。注意しないと、技術的な負債が増える可能性があります。これは設計に根本的な問題であり、将来的に他の問題を引き起こす可能性がありますか?次に修正します。さもないと?優先度が高くなるまでそのままにしておきます(優先する場合)。

あなたが説明する状況には、実際には3つのエラーがあります。

  1. 修正する必要があるかどうかを判断するために、ログに記録されたすべてのエラーを評価するプロセスがない(チケット/バックログ/適切なシステムにエラーを記録しましたか?)これは管理上の決定です。

  2. このような欠陥のあるソリューションの使用につながるチームのスキルの欠如。これは、将来の問題を回避するためにこれに対処することが急務です。 (あなたの過ちから学び始める。)

  3. 非常に長い時間が経過した後、ビデオの表示が停止する可能性があるという問題。

3つのエラーのみ(3)を修正する必要はありません。

5
Bent

特に大企業(または大規模プロジェクト)では、何をすべきかを確立するための非常に実用的な方法があります。

修正のコストが修正によってもたらされる利益よりも大きい場合は、バグを保持します。修正がそのコストよりも多く返される場合は、その逆にバグを修正します。

サンプルシナリオでは、コストのかかるバグを修正するのではなく、新機能を開発した場合に失うと予想されるユーザー数と獲得するユーザー数によって異なります。

5
JoulinRouge

バグを残すこととは対照的に、修正されるバグのコストを評価することについて議論する多くの答えがあります。それらはすべて良いアドバイスを含んでいますが、バグのコストはしばしば過小評価されている可能性があり、非常に過小評価されている可能性があることを付け加えておきます。その理由は、既存のバグが継続的な開発とメンテナンスのために水を混乱させているからです。テスターに​​ソフトウェアを見つけてナビゲートする間、いくつかの「修正されない」バグを追跡させるnewバグにより、作業が遅くなり、エラーが発生しやすくなります。エンドユーザーに影響を与える可能性が低いいくつかの「修正されない」バグは、引き続き開発を遅くし、結果はバグが大きくなります。

4
Buhb

長年のコーディングで学んだことの1つは、バグが再発することです。エンドユーザーは常にそれを発見して報告します。バグを修正するかどうかは「単なる」優先事項であり、締め切りの問題です。

あるリリースでの修正に反対して決定された大きなバグ(私の意見ではメジャー)がありましたが、エンドユーザーが何度も何度もそれに遭遇したため、次のリリースのショーストッパーになりました。同じ逆も同じです-誰も使用しない機能のバグを修正するように求められましたが、管理者が見るのに便利でした。

2
Aleksandra

ここには3つの点があります。

原則

これはコインの片面です。ある程度は気づきますisだれも気づいていないとしても、バグ(または「機能する」としても悪い実装)の修正を主張するのは良いことです。

このように見てください。実際の問題は、例では必ずしもバグではありませんが、プログラマーが最初にこの方法でループを実装することは良いアイデアだと思ったという事実です。これが良い解決策ではないことは、最初の瞬間から明らかでした。現在、2つの可能性があります。

  • プログラマは気づきませんでした。まあ...プログラマは自分のコードの実行方法を直感的に理解する必要があります。再帰が非常に難しい概念であるようではありません。バグを修正することで(そしてすべての追加作業に汗を流すことにより)、将来追加作業を回避するためだけに、彼は何かを学び、それを覚えているかもしれません。理由が彼に十分な時間がなかったことが理由である場合、経営者はプログラマdoがより高品質のコードを作成するためにより多くの時間を必要とすることを知るかもしれません。

  • プログラマーは気づきましたが、「問題はない」と見なしました。これを放置すると、最終的には本当に痛むバグにつながる、自由放任主義の文化が発展します。この特定のケースでは、誰が気にしています。しかし、そのプログラマが次に銀行アプリケーションを開発していて、特定の星座が決して起こらないと決定した場合はどうでしょう。それはそうです。悪い時代。

プラグマティズム

これは反対側です。 コースの場合、この特定のケースでは、バグを修正しない可能性があります。しかし、気をつけてください-実用主義があり、それから実用主義があります。優れた実用主義とは、問題に対して迅速かつ確実で根拠のある解決策を見つけた場合です。つまり、設計しすぎないようにしますが、実際に実装するものはまだ十分に検討されています。悪いプラグマティズムとは、何かをハックして「うまく」機能し、最初の機会で壊れる場合です。

速く失敗し、強く失敗する

確信が持てない場合は、すばやく失敗し、強く失敗します。

これは、とりわけ、あなたのコードが環境ではなくエラー条件に気づくことを意味します。

この例では、ハードランタイムエラー(「スタックの深さを超えた」など)が発生しないようにするために、独自のハード例外に置き換えることで、最小限の操作を行うことができます。たとえば、グローバルカウンターを使用して、1000本の動画(または、通常の使用では発生しないほど十分に高く、ほとんどのブラウザーで引き続き機能するのに十分なほど低い数)の後で救済することを任意に決定できます。次に、その例外(JavaのRuntimeException、JavaScriptやRubyの単純な文字列など)に意味のあるメッセージを与えます。新しいタイプの例外を作成したり、特定のプログラミング言語で行うことを行ったりする必要はありません。

このように、あなたは持っています

  • ...コード内の問題を文書化しました。
  • ...それを決定論的な問題にしました。あなた知っているあなたの例外が起こることを知っています。基盤となるブラウザーテクノロジーの変化に気を取られているわけではありません(PCブラウザーだけでなく、スマートフォン、タブレット、または将来のテクノロジーについても考えてください)。
  • ...最終的に修正が必要になったときに簡単に修正できるようになりました。問題の原因はメッセージによって指摘され、意味のあるバックトラックなどがすべて得られます。
  • ...「実際の」エラー処理を行う時間を無駄にしません(エラーが発生することを決して期待しないことを忘れないでください)。

私の慣習では、そのようなエラーメッセージの前に「Paranoia:」という単語を付けます。これは、私と他のすべての人にとって明確な兆候ですneverエラーが発生することを期待しています。それらを「実際の」例外から明確に区別できます。 GUIやログファイルでそのようなものを見つけた場合、私は深刻な問題があることを確信しています。結局、それらが発生するとは思っていませんでした。 thisの時点でクランチモードに入ります(問題がどこで発生したかを正確に把握しているため、多くの誤ったデバッグから私を救い、迅速かつ簡単に問題を解決できる可能性が高くなります)。

2
AnoE

私の職場の上級開発者のデスクのポストイットは言います

それは誰かを助けますか?

それはしばしば思考プロセスの良い出発点だと思います。修正および改善すべき点は常にたくさんありますが、実際にどれだけの価値を付加していますか? ...それが使いやすさ、信頼性、保守性、可読性、パフォーマンスなど、その他の側面にあるかどうか。

低い確率/軽度の影響=優先度の低い修正

  • 発生の確率が非常に低い場合
  • 発生の結果が軽度の場合
  • その場合、バグは脅威をもたらさず、優先的な修正ではありません。

しかし、これは怠惰な開発者にとっては松葉杖にはなりません...

  • 「発生率が非常に低い」とはどういう意味ですか?
  • 「軽い影響」とはどういう意味ですか?

発生の確率が非常に低く、結果が穏やかであると述べるために、開発チームはコード、使用パターン、およびセキュリティを理解する必要があります。

ほとんどの開発者は、当初考えていたことが決して起こらない、実際にはたくさん起こると驚かれます

私たちの教育システムは確率と論理をあまりうまく教えていません。ほとんどのソフトウェアエンジニアを含むほとんどの人は、壊れたロジックと壊れた確率直観を持っています。これを修正するために私が知っている唯一の方法は、実際の問題の経験と広範なシミュレーションの経験です。

直感に現実世界のデータを対比させる

使用パターンを追跡できるように、いくつかのログを作成することが重要です。発生してはならないことのアサーションをコードに入力します。あなたは彼らがそうすることに驚かれることでしょう。そうすることで、直観にハードデータを対比させて改善することができます。

軽度の問題と制御の尺度の私の例

私がずっと前に働いていたeコマースサイトで、別のプログラマーがミスを犯しました。あるあいまいな状況では、システムはクライアントがログに登録されたものより1セント少ない金額を借方記入しました。バグを発見したのは、会計システムの回復力を高めるためにログとアカウントのバランスの違いを特定するレポートを作成したためです。差が非常に小さかったため、このバグを修正したことはありません。差は毎日計算され、月額2.00ドル未満でした。たまたま、1年で現在のシステムに取って代わるべき、まったく新しいシステムを開発していたのです。収益性のある可能性のあるプロジェクトからリソースを流用して、月額2.00ドルの費用がかかり、適切な管理手段の対象となったものを修正しても意味がありません。

結論

はい、すぐに修正する必要がないバグがあり、新機能の開発を遅らせるほど重要ではありません。ただし、システムはこのバグの発生を制御して、バグが小さいことを確認する必要があります。これは、自分の直感を信頼できないためです。

0
Lucas

次の3つのことが頭に浮かびます。

最初、特定されたバグの影響は、コードにバグを残すかどうかを決定する前に、徹底的に調査する必要があります責任ある方法で作られました。 (あなたの例では、増え続けるスタックが表すメモリリークと、再帰ごとにブラウザがどんどん遅くなる可能性があることを私はすぐに考えました。)これは徹底的です多くの場合、調査にはバグの修正よりも時間がかかるため、ほとんどの場合、バグの修正を希望します。

2番目、バグは、当初考えているよりも大きな影響を与える傾向があります。これは「通常の」ケースであるため、作業コードに非常に精通しています。一方、バグは「例外」です。もちろん、多くのバグが見られますが、全体的に作業コードがはるかに多くなっています。したがって、バグのあるコードの動作よりも、機能するコードの動作の経験が豊富です。動作するコードとそれがどのような状況で何をするかについての膨大な数の本があります。バグのあるコードの動作についてはほとんどありません。

これの理由は単純です:バグはorderではなくchaosです。多くの場合、注文の痕跡が残ります(または逆に言えば、注文を完全に破棄するわけではありません)。しかし、バグの多い性質は、プログラマーが望んだ注文の破棄です。カオス自体は、正しく推定されることに抵抗する傾向があります。バグがあるプログラムが何をするかを言うのは、それがもはや私たちの精神的パターンに適合しないという理由だけで、正しいプログラムがすることよりも難しいです。

番目、あなたの例には、バグを修正するとプログラムを再設計しなければならないことを意味する側面が含まれていました。 (この側面を取り除く場合、答えは簡単です:バグを修正します。再設計は必要ないため、それほど長くはかからないはずです。それ以外の場合:)そのような場合、プログラムの現在の設計方法に対する信頼を失います。再設計は、その信頼を回復する方法になるでしょう。

言ったことすべて、プログラムは人々が使用するものであり、不足している機能や、他の場所にある非常に扱いにくいバグは、バグの修正よりも優先される場合があります。もちろん実際的な方法で最初に他のことをします。ただし、バグの影響を最初にすばやく推定することはまったく間違っている可能性があることを忘れないでください。

0
Alfe