web-dev-qa-db-ja.com

デバッグとアンチバグの違いは何ですか?

debuggingおよびという用語antibuggingは、バグを取り除くためのツール、対策、設計パターンを参照するために広く使用されているようです。

Peter Norvigの Paradigms of Artificial Intelligence Programming:Case Studies in Common LISP を読んだ後、これらの用語の違いについて確信が持てませんでした:

通常のデバッグに加えて、アンチバグチェックをコードに含めることをお勧めします。アンチバグコードはエラーをチェックし、場合によっては修正アクションを実行します。

そしてさらに:

(すべてがうまくいけば)決して使用されないというアサーションの作成に時間を費やすことは無駄な努力のように思えるかもしれません。ただし、完璧なプログラマを除くすべての人にとってバグは発生します。デバッグに費やした時間は、デバッグ時間を節約するのに十分です。ある種のデータベースなどの複雑なデータ構造を開発する場合は常に、対応する整合性チェッカーを開発することをお勧めします。整合性チェッカーは、データ構造を調べ、考えられるすべてのエラーをテストする機能です。新しいエラーが発見された場合は、そのチェックを整合性チェッカーに組み込む必要があります。整合性チェッカーを呼び出すことは、データ構造のバグを分離するのに役立つ最速の方法です。さらに、難しいテストケースのリストを手元に置いておくことをお勧めします。そうすれば、プログラムが変更されたときに、以前に削除されたバグがその変更によって再度導入されたかどうかを簡単に確認できます。これは回帰テストと呼ばれ、Waters(1991)は一連の回帰テストを維持するための興味深いツールを提供しています。

here は、サンフランシスコ大学での「プログラミング言語パラダイム」と呼ばれる講義の別の例です(Chris Brooks、2004)。 @ Max3kがこの投稿で指摘したように、

「アンチバグ」とは、多くの優れた慣行や結果のコードをカバーする用語のようです。防御的なプログラミング、例外のスローとキャッチ、名前付き例外、(ユニット)テストについて言及しています。また、動的な言語よりも強く型付けされた言語を使用しているソースによると、それは「アンチバグ」であることを意味します。

さらに別のリファレンス、@ CandiedOrangeに感謝します:

デバッグとは対照的に、アンチバグは「欠陥の回避」を意味し、「欠陥の除去」を意味します。

C through design-George E. Defenbaugh、Richard Smedley Franklin、Beedle、1988 p16

だから私は googled さらに正確で客観的な答えを得たが、信頼できる答えを得ることができなかったし、それについて多くの経験もなかった(今までのところ、私は単に「国内"プロジェクト)。

2つの用語を区別して正しく使用するために、2つの用語の違いを教えてください。

[〜#〜]免責事項[〜#〜]Antibuggingはまだ世界的に受け入れられていないようですやっぱり。しかし、一部の評判の高い人々が両方の用語を使用しており、学界と業界の両方で使用しているという証拠があります。これは問題を正当化し、意見に基づくものではないことを示していると思います。

用語

用語antibuggingまたはanti-buggingは広く使用されていません:約2000のGoogleの発生(一部はスパイウェアのデバイスに関連しています) debuggingの3千3百万と比較して!)

これは、1975年に出版されたソフトウェアエンジニアリングのパイオニアである Ed Yourdon の著書 "Techniques of Program Structure and Design"で最初に使用されました。

構造化分析と構造化設計 または Yourdon/DeMarco dataflow モデリングなど、Yourdonによって促進された他のアイデアの人気が得られなかったことは奇妙です。

しかし、めったに使用されないにもかかわらず、この用語は知られるようになりました。

デバッグ

デバッグの目的は、特に初期の段階でエラーを検出して修正し、本番環境の後半で発生した場合にバグの発見をサポートするツールを提供することです。デバッグは主にコーディングに関連して実行されます。例えば:

  • 関数の開始時または終了時の事前条件と事後条件のアサーションチェック(失敗した場合、実行は中止されます)、
  • バグが発生した場合にその原因を分析できるようにするためのロギング
  • 潜在的なバグを見つけるための広範なテスト、
  • 一晩のコーヒー主導の活動が枯渇するか、虫が根絶するまで.

デバッグ(特にロギング)をサポートするいくつかの汎用コードを除いて、デバッグはソフトウェア構造IMOに直接影響しません。

アンチバグ

アンチバグの目的は、バグの発生を防ぐことです。このアクティビティは、開発プロセス全体を通じて実行されました。例えば:

  • バグの状態を防ぐ設計
  • エラーの伝播を防ぎ、特殊なケースが適切に処理されることを保証する防御的コーディング
  • 自動エラー修正または回復戦略(例:中止されたが必要なサービスの再起動)

この種の防止策は、開発の最初から着手する必要があり、設計とソフトウェア構造(API設計、例外管理など)に根ざしている必要があります。したがって、ソフトウェアアーキテクチャに影響を与える可能性があります。また、エラー条件を適切に処理するための代替実行パスを提供するために、従来の防御プログラミングも含まれています。

したがって、デバッグとアンチバグには明確な境界があります。

しかし、それはどこで終わりますか?

IMOアンチバグと健全なソフトウェア設計の実践を区別することははるかに困難です。たとえば、予期しない副作用を減らしてバグを防ぐという理由だけで、カプセル化はアンチバグですか?オブジェクトの状態と一致しない動作の発生を防ぐため、状態デザインパターンはアンチバグですか? ... 等々。

したがって、実際には私は具体的でありそうなバグ(起こり得るエラー状況)の防止に焦点を合わせ、それをあまりにも広く見て決して書かれないコードのバグを防止するのではなく、健全な設計原則を別のものとして維持しますアンチバグ。

さらに読む:

3
Christophe

まず、アンチバグは一般的に使用される用語ではありません。一部の人々はそれを使用しますが、一般的には認識されません。

それを使用する人々にとって、それらはバグが発見された後にそれを削除するのではなく、最初からバグを書くことを避ける習慣を意味します。

13
Winston Ewert

デバッグとは、ソフトウェアコードの欠陥を修正することです。

アンチバグは「エラーをチェックし、場合によっては修正措置をとります」
人工知能プログラミングのパラダイム:アンチバグs3.14 p87

はい、それは少し同じように聞こえますが、これはまたこれを意味します:

enter image description here

彼らが説明しているのは、検証と呼ばれるようになったものです。移動する前に有効な状態であることを確認し、混乱を広げるために何かをします。 cerror(継続的なエラー)がある場合、他のユーザーが例外をスローしてキャッチします。

したがって、これはまったくデバッグではありません。デバッグはコードの欠陥を修正しています。コードの欠陥はプログラマに起因します。このアンチバグは、状態の欠陥を修正しています。あなたはあらゆる入力から悪い状態を得ることができます:ユーザー、ファイル、インターネット、それらのプログラマー...

Googleの本は、より正式な定義を見つけるのに役立ちました。

デバッグとは対照的に、アンチバグは「欠陥の回避」を意味し、「欠陥の除去」を意味します。

C through design-George E. Defenbaugh、Richard Smedley Franklin、Beedle、1988 p16

誰かがトラブルチケットを提出するのを防ぐためにあなたがすること、彼らがした後にあなたがすることではないように私には思えます。

5
candied_orange