本物のプログラマはデバッガを使用しますか?[閉まっている]


15

経験豊富なプログラマーが実際にデバッガーを使用する場合、および使用する場合はどのような状況で使用するか。その質問に対する答えでは、「数か月」前に言ったが、おそらく「年」を意味していた-私は実際にデバッガを使用していません。私の具体的な回答可能な質問は、どのような状況下で、経験豊富なプログラマーとしてデバッガーを使用しますか?


14
経験豊富なプログラマーがキーボードを使用しているかどうかを尋ねるようなものです...経験がキーボードに関係しているのかわかりません。彼らは神だと思い、最初からエラーのない完璧なコードを作成しますか?たとえそうだとしても、それがあなたにとって何を意味するのか-あなたが必要なときにdebugerの使用をやめて、「私はデバッガを使用しないのでreaaプログラマです」と言ってください... :)ところで。どんな専門家もそのような質問に答えるのではないかと思います

3
@Wooble:「経験豊富なプログラマーがデバッガーを使用するか」という基本的な質問は良い質問です。実際、それは小さな聖戦を引き起こしたことに驚いた。
ケビン

19
本物のプログラマはもちろん、使用
レインHenrichs

4
ほとんどの既存のデバッガーは旧式であり、インターフェースが粗末で、プログラマーがマスターするのが難しい概念とパラダイムを知って理解する必要があり、今日では、ほとんどのプログラマーが使用または知ることを期待するのは公平ではありません。その結果、最新の経験豊富なプログラマーは、経験の苦痛を避けるために、デバッガーでデバッグする必要がほとんどない種類のコードを書くために必要なスキルを習得するためにかなりの時間を費やします。そして「できるだけ」「はい、彼らはそれを使用する」だから
blueberryfields

7
「デバッガーを使用しない」経験豊富なプログラマーは、おそらくgdb / SoftICEの観点で考えており、実際の統合デバッガーを使用したことはありません(おそらくIDEを使用しないでください)。彼らは痛みを伴う時代に遅れをとっています。
BlueRaja-ダニーPflughoeft

回答:


44

デバッガーを使用しないことは、経験不足の兆候だと思います。コードを1行ずつステップ実行することが、実行の流れを追跡するための最良の方法です。


30
奇妙なことに、アセンブラ、Fortran、C、C ++などでの30年以上のプログラミングの後、私は1つを使用することを望んでいません。

59
長時間何かをすることは、必ずしもあなたがそれを上手くできるとは限りません。
ceejayoz

31
デバッガ使用できないことは、経験不足の兆候です。コードを読むだけでプログラムの流れを理解することはできません。もちろん、経験豊富なプログラマーはたまにデバッガーを必要としますが、コードを読むことができれば必要はなく、デバッグのプロセスも速くなりません。
GolezTrol

10
@Karl Bielefeldt:デバッグにデバッガーを使用しないプログラマーの有名な例をいくつか挙げてみましょう。Linus Torvalds、Linuxの著者。Larry Wall、Perlの著者。あなたにとって十分に複雑なソフトウェアですか?
-btilly

9
@Neil:自分のコードの作成にどのくらいの時間を費やし、他の人が書いたコードをどれだけ維持していますか?特に、プログラミング言語の近くで許可されるべきではない他の人によって書かれたコードをどれだけ維持するのでしょうか?
Carson63000

28

デバッガーを頻繁に使用します。なぜなら、私は大規模なシステムで作業しているので、それが嫌だからです。 http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html

コードがどれほど短く頻繁に読み取られても、バグが発生する可能性は常にあります。http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

間違いは人間であり、プログラムが正しいことを決して証明できないので、この困難なビジネスで自分自身を支援するためにデバッガ/自動テストなどのツールを使用してみませんか?

コードが十分に短い場合、簡単なテストが実行されます。また、それが短く、バグの性質を知っている場合は、コードを読むだけで十分です。ただし、コードベースが大きくなり、いくつかの言語が混在し、さらに3つの層が含まれる場合は、多くのレベルで優れたテストカバレッジと非常に優れたデバッガーを用意する必要があります。

だから、いつデバッガーが必要ないのですか?

私は最も賢いコーダーでも、経験豊富なコーダーでもありませんが、それでもデバッガーを使用する必要がない場合があります。それは次の場合です:

  • コードは私のものか、よく書かれているAND
  • 読みやすい言語で書かれている
  • プロジェクト全体は小規模です。

デバッガに大きく依存するのはいつですか?

  • 短い答え:多くの場合
  • アプリケーションがクラッシュしたとき。特に、それが展開されるとき。そのコンピューターにVS2010をインストールすると、「不明なエラー」とFileNotFoundException
  • サードパーティのライブラリがクラッシュしたり、不正な動作をしたとき。
  • コードが不完全に書かれているとき。特に、過去10年間に10人のユーザーが同じファイルに触れた場合、そのうち7人は会社にいません。
  • プロジェクトが大きい場合
  • コードがかなりモノリシックな場合。
  • 複数の層(GUI、SQL、BL)が関係している場合。

「デバッガ」は複数のツールを参照できることに注意してください。Visual Studioデバッガー、SQLデバッガー(主にストアドプロシージャ用)、およびSQLプロファイラーも使用します(どのSPが呼び出されているかを把握するため)。簡単なシステム管理者用のPythonスクリプトを書いていたこの口径のツールが必要でしょうか?いいえ。独自の小さなGUIベースのツールを作成した場合は?依存します。.Net WinFormsの場合-おそらくそうではありません。WPFの場合-はい。

とにかく「本当の」プログラマを定義するものは何ですか?速いの?知識がある?アルゴリズムが得意ですか?適切なドキュメントを作成しますか?まさにこの新しいタイトルに卒業したのはいつですか?いつ魔法の線を越えますか?

私は、既存の100年以上の努力で手を汚していないプログラマーは、複雑さと自身の制限(およびコード品質に不満を抱いている)に謙虚になる機会がなかったと思います。

私は個人的に私が利用できる最高のデバッガーを使用しようとしていますが、頻繁に使用する傾向があります。タスクが十分に単純で、デバッガーを必要としない場合-私はそれを使用しません。必要かどうかを判断するのにそれほど時間はかかりません。

...

理論的には、コードベースを非常に長い間読むことができたので、すぐに理解できました。ただし、実践的なアプローチが最も効果的です。また、私が見ているその愚かなコードを書き直したいことがよくあります。残念ながら、現在のコードベースをクリーンアップするには10年以上かかります。そのため、デバッガーを使用することは明らかな最初のステップです。500万行のコードのうちどれが機能しているのかを見つけた場合にのみ、ファイルを上下にスキャンして、そのクラスが何をしているかを理解しようとします。


+1、すばらしい答えです。「いくつかの層が関係しているとき」という側面に特に同意します。これは「コードを読んでエラーを見つける」支持者によってめったに言及されない側面です。
Carson63000

全部読んでくれてうれしいです。
ジョブ

+1と「正真正銘のプログラマー」の定義を調べるために。このフレーズを使用すると、OPは陰鬱で、面白く、潜在的に炎症を起こします(含意や暗示を否定するため)。
スマンドリ

1
「プログラムが正しいことを証明することはできません」それは真実ではありません。
GManNickG

1
@GMan、声明について詳しく説明してください。私が学んだように、特定の言語の短いコードスニペットの正当性を証明するための多くの以前の試みは失敗しました。いくつかの非常に些細なプログラムが正しいことが証明できると思います。ここであなたの角度を知りたいです。
仕事

17

「デバッガは好きではありません。決して持っていないし、おそらく決してそうしません。」— ライナス・トーバルズ

一方、彼はStack Overflowアカウントを持っていないので、彼の意見に興味があるかどうかはわかりません:)


3
私たちの多くはLinus Torvaldsではありません。残りの私たちにとっては、デバッガが必要なだけの人間です。
ノードノーノードガイ

7
カーネルはデバッガーにはあまり適していません。

7
ええ、カーネルプログラミングはユーザー空間プログラミングとは異なる分野です。私は通常、ユーザー空間に対するLinusの意見に同意しませんが、カーネル空間を扱うときは間違いなく立派です。
代替案

16
「デバッガが好きではない」とは、「デバッガを使用しない」という意味ではありません。Linusが実際に言ったのは、「デバッガが好きではない。決して持っていない、たぶん決してしないだろう。常にgdbを使用するが、デバッガとしてではなく、プログラム可能なステロイドの逆アセンブラとして使用する傾向がある」(私は、Linusがデバッガーを使用しないことを意味するようにそれをひねろうとする人もいますが、それは正確ではありません。)
クリストファージョンソン

6
Linus Torvaldsのようで、私は何も同意しません。
BlueRaja-ダニーPflughoeft

12

私の具体的な回答可能な質問は 、どのような状況下で、経験豊富なプログラマーとしてデバッガーを使用しますか?

  • コードを読み取って「デバッグ」できない場合。
  • 特定の変数が特定の時間を持つを予測できない場合。
  • あなたの場合はメンタルモデル、コードのは、あなたのコードによって与えられた出力に適合しません

編集:

私は、プログラミングの旅でデバッガーを使用する方法を知らないという幸運/不幸を経験しました。したがって、過去には、デバッガなしでデバッグする必要がありました。ただし、デバッガーの使用方法を学んだ後、バグを見つける際の生産性が100倍になりました。


+1「コードのメンタルモデルがコードで指定された出力に適合しない場合」
ユーザー

8

現在の回答とは少し異なる視点を与えるため。多くの場合、リアルタイムコンポーネントを備えたシステムで作業する組み込みソフトウェアエンジニアとして、私はほとんどデバッガーを使用しません。

ときどきデバッガは素晴らしいツールになり、デスクトップでコードをビルドして実行できるときはいつでも、デバッガを常に使用します。

オンチップでは、リアルタイムの制約により、デバッガーを使用しようとすると大きな負担がかかります。実行を一時停止するとすぐに、システムの残りの部分のタイミングが動揺し、場合によっては致命的になります。通常、オンチップでは、クリティカルではないコードのprintfとタイムクリティカルなコードでのIOワグリングが、最良かつ実際に最も簡単なツールです。デバッガほどではありませんが、実際のシステムで作業する方がはるかに安価です。


1
ハードウェアベースのデバッガボードを調査することをお勧めします
スティーブンA.ロウ

@スティーブンありがとう。残念ながら、私が取り組んでいるシステムの中には適切なハードウェアをサポートしているものもあれば、そうでないものもあります。通常、ロジックアナライザーのオプションがありますが、これは時間の面でさらに高価になる傾向があります。
ルークグラハム

私は正反対です。組み込みシステムでは、デバッガを頻繁に使用します。ただし、タイミングを混乱させることに同意します。デバッガーをループに配置することによって生じる変更を除外および/または最小化するには、かなりの労力が必要です。
カールビーレフェルト

7

経験豊富なプログラマーは、必要に応じてほとんど独占的にデバッガーを使用すると思います。実際にコードの実行を追跡するよりも、バグを追跡するより良い方法...

あなたは世界のスキートが間違いを犯さないか、すべてを知っているという仮定の下にありますか?状況によっては、最も些細なプログラムを除くすべてが予期しない動作をします。問題を調査する必要があることは当然です。そのため、選択肢は、スペクトルの一方の端でprint文を使用するか、もう一方で事後を調べるか、コードの実行中に何が起こっているかを調べて、真ん中を見るかです。

たぶんそれについてのより良い考え方は、経験豊富なプログラマがデバッガをいつ使用するかを知っていることです。スタックトレースを調べる依存関係の少ないコードでは、おそらく何が問題なのかを判断するのに十分です。しかし、コードが他のコードと連携している複雑なシナリオがあり、あなたが書いていないものを見るためにデバッガが必要です。


4
まあ、これはまさに私が調査しようとしているものです-私は非常に経験豊富なプログラマーであり、決して使用しません。

5
@ニール、多分あなたは必要はありません。残りは....デバッガは、あなたが実際には1つを使用して終了するか否か、問題の底に取得する最も簡単な方法になりますどこの時間が来る、安心
hvgotcodes

書いていないものも読むことができます。そして、私ができない場合、それは悪いコードであるため、それは通常使用されます。他の場合には、デバッガーを使用します。
GolezTrol

使用する言語が例外をサポートしており、例外とロギングフレームワーク(log4jなど)を適切に使用している場合、常にエラーの行を指すスタックトレースになります。99%の時間、それはあなたがそれを予期していなかったnullポインタ例外です。デバッガは他に何を伝えますか?さて、私がcでプログラミングしていたとき、デバッガーなしでは見つけることができないものがありました(スタックの破損など)。しかし、これらのタイプのことは、高級言語ではもはや起こりません。
ケビン

1
@kevin、そうですね、これら2つの問題の間には、デバッガーが問題の根底に到達する最も自然な方法であるという問題があると思います。たぶん、grailsのような動的言語フレームワークでオブジェクトに設定された動的プロパティを見たいと思います。たぶん、私はnullではないと思う何かがnullにされる場所を正確に見たいと思うかもしれません(NPEは、物事がnullである理由ではなく、例外がどこにあるかを教えてくれます)。スタックトレースで発生しただけでなく、例外の原因となったコードの組み合わせを確認できるように、デバッガーを例外で一時停止させたい場合があります。
hvgotcodes

4

私はそうではなく、10年以上プログラミングを続けています。以前は、c / c ++でプログラミングしたときに使用していました。今、私はJavaでプログラムします。真実は、正しくロギングを行っている場合、ほとんどの熟練した開発者にとって十分なスタックトレースになることです。また、(良い)単体テストと機能テストを書いている場合、クラスのバグ全体を排除します。


それがさらに明確になれば、デバッガを使用する多くのJavaプログラマーを知っています。彼らはほとんどが学校のすぐ外です。
ケビン

1
スタックトレースはデータを表示しません-その情報を自分で追加する必要があります-しかし、それらは純金です。

1
@Thorbjørn:実際にデータ表示できます。たとえば、Pythonのcgitbモジュールを参照してください。(名前のCGIはほとんど痕跡であり、モジュールの本来の目的はCGIがクラッシュしたときに使用可能なスタックトレースを提示することでした。)もちろん、それによって、スタックにナビゲートするのが困難になるほど多くのデータを取得することがあります関心のあるフレーム。cgitb.enable(format='text')とにかく大好きです。
SamB

私は実際にデバッガーを使用せず、C ++を使用します
日航

@SamBケビンはJavaについて話しましたが、それはできません

4

誰も気にしない?私が知りたいのは、デバッガーを使用すると、長期的にはより良いプログラマーになるのを妨げるでしょうか?多くの経験豊富な開発者が作業を開始したとき、デバッガーの品質は低かったので、それらは障害となりました。より深い理解を妨げるのは松葉杖ですか?

一部のプログラマは、おそらく他の人よりも優れていて、デバッガーの必要性を発見し、デバッガーを作成しました(最初のデバッガーを作成したユーザーはわかりません)。その結果、生産性が向上したと確信しています。私はその動機が、より少ない人間がコードを書くことを可能にすることであったとは思わない。


3

まれに。

あなたのメソッドはあなたの心でコンパイルされ実行されるのに十分なほど小さく/単純でなければなりません、ユニットテストは機能性をカバーするべきです。バグを見つけたら、テストを書きます。実行して修正してください。

私はiveがASP.NETフレームワークのようなテストできないコードから予期しない動作をしたときにのみデバッガーを使用する傾向があります。


3
このスレッドにはいくつかの本当の憎しみの塊があります...

2
これに賛成票を投じる理由はない-彼は正しい。
wadesworld

11
-1この主張は、ベガスでお金を稼ぐ方法はすべてのハンドを勝ち取ることだと言っているようなものだからです。それは状況の現実を反映しておらず、すべてのコードが単純であるという主張は小さな孤立した問題にのみ存在します。さらに、「実行、修正」という主張は、修正方法を完全に無視しています。私はそれをスライドさせようとしていましたが、それから反対するすべての人はそれを落胆する価値があるとほのめかします。
whatsisname

2
-1:「あなたの方法は、あなたの心によってコンパイルされ実行されるのに十分なほど小さく/単純でなければなりません」は現実から切り離されています。これは、20行より長い関数が長すぎると言っているようなものです。ナンセンス。
ジョンディブリング

3

Smalltalkでは、ほぼ完全にデバッガーで開発します。

  1. 失敗することがわかっているテストを作成します。
  2. テストを実行します。失敗すると、デバッガーがポップアップします。
  3. テストに合格するために必要なコードをデバッガーで作成します。
  4. 実行を再開します。
  5. 緑色のライトが点灯した場合は、新しいテストに失敗してステップ1に進みます。そうでない場合は、デバッガーで私が間違ったことを見つけて修正します。

2

必要なときにデバッガーを使用します。それは毎日ではありませんが、時々起こります。コードをステップ実行して正確に何が起こるかを確認する方が良い場合があります。

デバッガーの使用はますます少なくなっていることを認めなければなりません。私はDelphiで10年以上開発してきました。PL / SQLでストアドプロシージャも記述します。数ヶ月以来、私もPHP開発者です。

何年も前に書かれたあいまいなコードを見つけて、それを修正する必要がある場合、これらのケースのいずれかで主にデバッガーを使用します。コードを読みにくい場合、プログラムの正確な動作方法を見つけるのに役立つことがあります。PHPではほとんど必要ありませんが、イベントベースのDelphiでは、複雑なフレームワークを取得するときに役立つことがあります。

しかし、あなたが言うように、デバッガーの使用は例外です。ほとんどの問題は、コードを読んで、自分(または他の誰か)が犯した間違いを修正するだけで解決されます。

しかし、それはコードをステップスルーするために行く。例外が発生したときにコールスタックを頻繁に使用し、変数を検査するためにブレークポイントをどこかに置くことがあります。しかし、とにかく徹底的なリファクタリングを必要とするコードの一部ではほとんど常に。


2

私はときどきデバッガなしでコーディングしますが、それは銃を突きつけられたときだけです。8051またはZ80のレガシー埋め込みガンジ。

私見、あなたはデバッガと複雑なジョブにログオンする必要があります。一度は他の代替ではありません。アプリがドライバーに詰め込んでいる場合(たとえば、コードでできることはハードウェアとやり取りしてセマフォを設定することだけ)、ロギングシステムは役に立ちません。

デバッガは、アプリが記述した方法に従って正常に動作しているシステムエラーを解決できませんが、通信プロトコルエラーが断続的に発生するため、システムは動作しません。

だから、バカで目立つバグやハードウェアのコックアップを取り除くためにデバッガが必要です。断続的なシステム統合のバグをキャッチするには、適切なログが必要です。

両方持っていなければならない-私は得ることができるすべての助けが必要です!


2
z80はデバッガーに十分な大きさです。CP / MにはZSIDがありました。

1

これらの手順が失敗した場合にのみ、デバッガーを使用します。

  1. 再現可能なエラーを取得します。考えて。多くの場合、これで十分です。
  2. スタックトレースとログを確認します。
  3. 問題のあるコードの周りにログを追加します。

これらの手順は、すべてのケースの95%を処理します。つまり、デバッガーを使用することはめったにないので、使用すると情報が多くなりすぎる傾向があります。なりて、関連のない詳細に行き詰まってしまいます。これは、マルチスレッドのリアルタイムシステムで作業する場合に特に当てはまります。

したがって、適切に配置されたロギングステートメントは大いに役立ちます。


1

非常に経験豊富なプログラマーは非常に古いプログラマーと同じであり、デバッガーが常に利用可能ではなく、時にはあまり良くないときに戻ってプログラミングを学び、習慣を形成したということでしょうか?

printfのデバッグが非常に上手になった場合(80年代に戻った場合、あまり良い選択はありませんでしたが、本当に上手になりました)、おそらくデバッガーはそれほど追加しません。


0

それは個人的な選択の問題です。

正直なところ、デバッガはプログラムの実行の任意のステップでRAMの状態を知るのに役立つ特定の状況で役立つと思います。

デバッガーの主なユーティリティは、プログラムを停止することなくプログラムを停止することです。この機能は非常に重要です。

これら2つの機能は別として、デバッガーは本当に必要だとは思いません。作成する複雑なプログラムには、何らかの「冗長」モードが必要です。つまり、printfまたはstd :: coutで実行していること、選択した内容、その他の多くのパラメーターを伝えます。

あなたがプログラムを作成し、ユーザーがそれを使用する際に問題を抱えていると想像してください。

デバッガーは、あなたの車の電動ステアリングのようなものです。1つ持っている方が快適ですが、ドライブが良くなることはありません。

プログラムとは設計とロジックに関するものであり、ツールが物事を追跡するのに役立つ方法では、優れたプログラマーにはなりません。

Plusデバッガーは、コンパイルされた言語に役立ちますが、解釈された言語にはあまり役立ちません。


2
コンパイルされたものと解釈されたものがそれとどう関係するのか分かりません。
マイケルバー

いい質問です。私もです。
jokoon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.