なぜ学校はデバッガをカバーしないのですか?[閉まっている]


12

SO に関するさらに別の宿題の質問の後。大部分の学生は、デバッガーとは何か、またはデバッガーの使い方を知らないようです。デバッガの使用方法を知ることは、他のプログラミングの基礎とほぼ同じくらい重要だと思います。

  • 問題はデバッグするべきではなく、プログラミングの基礎と一緒に最新のデバッグツールを使用する方法を教えますか?そうでない場合、なぜそうではない。

2
えーと。あなたはgdbが最新のデバッグツールだと言っているのですか?それは悪いデバッガではありませんが、確かに最先端ではありません。
ビリーONeal

1
同意しますが、学生がビジュアルスタジオを使用しており、デバッガーを使用する方法や理由がわからないという質問にも答えました。
再実行

@rerun:えーと。IDEの「再生」ボタンを押すことができませんか?(ところで、私は+
1'd

System.out印刷ログは怠惰と無能の最後の砦である

6
@Jarrod、かなり広範な一般化、そしておそらく過度に一般化。問題が発生するプログラムでデバッガを使用できない場合があります。

回答:


7

デバッガーの使用を教える必要があるのではなく、デバッグのより一般的なテクニックです。これには、もちろんデバッガの使用方法を教えることも含まれますが、他のさまざまな重要なテクニックも含まれます。

  • 批判的思考
  • 分割統治
  • printfのデバッグ、ロギングなど
  • デスクチェック
  • ストレステスト

追加の利点として、これらの手法の多くは、プログラミング以外の分野の問題解決にも適用できます。

この主題に関する非常に良い本があります。おそらく、すべての学部生とプログラミングの基礎を学んでいる人のために読む必要があるはずです:デビッドJアガンスによるデバッグ


8

あなたが言及したように、第三次コンピューターサイエンスコースは、学生にプログラミングの基礎を教えることに合わせて調整されています-これらの概念は、必要な概念を理解し、それを幅広いプログラミング言語と問題セットに適用することを期待して学生に教えられます。

一方、デバッグツールは実装領域のサブセットです。各ツールは言語ごとに異なります(概念は同じですが)。デバッグツールに触れましたが、それらを詳細に説明することはありませんでした。デバッグツールに1週間以上費やした場合、後から振り返ってみると、それは時間の無駄だと思います。私はむしろBigO表記法またはポリモーフィズムについて学びたいです。しかし、ffデバッグツールの能力が学生に(成功して)伝えられていないのであれば、それは必要ではないでしょう。


3
+1。翻訳済み:誰もがMSVS、GCC / GDB、LLVM / CLANGなどを使用しているわけではないため
ビリーONeal

1
+1私は@rerunに同意することを認めなければなりません。ソフトウェアショップで使用される基本的な概念とツールを学習するコース(またはその一部)は、新卒者の生産性向上に大いに役立ちます。しばらく使用した後でさえ、ソース管理を理解していないように思われるいくつかに出くわしました。
ケンヘンダーソン

平均的な開発者がそこに多くの時間を費やすスキルの多くは、学校でカバーされています。ソース管理、一般的な構成管理、コード調査、コード読み取り、ビルドプロセスなどコードでチェックして「デプロイ」すると、新しい開発者の利便性が高まります。
再実行

3
私はまったく同意しません。実際のコードが記述されている場合(コードを書くことは科学的概念を実践するための良い方法であるため)、学生はそのコードを書くための良い方法にアクセスする必要があります。これは、bigO表記に費やす可能性のある時間を奪うものではありません。多くの学生が軽微なエラーを強引に費やすために費やす時間を解放しています。それから何も得られません。さらに、他の多くの科学コース(物理学など)には、カリキュラムの一部として実用的な測定スキルが含まれています。
インカ

2
デバッガーを使用するには、コードだけでなく、コンピューターの動作を理解する必要があります。これはプログラミングの基本だと思います。私は自分のコンピューターが実際に何をしているのか全く分からない学生が多すぎて、それは良いプログラマーにはならない。
edA-qa mort-ora-y

2

ほとんどの入門プログラミングコースでは、プログラムの状態は非常に単純なので、いくつかの印刷ステートメントでバグを取り除くことができます。また、生徒に手で物事を行わせて、特定の種類のバグが発生するコードのどこでどのように感じているのかを把握する問題もあります。どこを探すべきかわからない場合、デバッガはほとんど役に立たないでしょう。


4
優れたデバッガーは、printステートメントよりも使いやすいです。Printステートメントでは、何らかの方法でデータを文字列にシリアル化する方法が必要です。これには、シリアル化を行うための独自の(おそらくバグが乗っている)コードが必要です。たとえば、リンクリストプログラムはデバッガーで簡単にステップスルーできますが、印刷ステートメントは、リンクリスト横断アルゴリズムを作成しようとしている学生には役立ちません。適切な印刷ステートメントを作成するにはそのアルゴリズムが必要だからです。 。
ビリーONeal

2
@Billyだから間違ったコードをステップスルーすることは彼らを助けるだろうか?
ニールバターワース

1
@Billi ONeal、あなたは間違っています。あなたが話しているデバッガは存在しません。プログラムの対話型ステップ実行は、デバッグロギングの問題をすでに特定している場合にのみ役立ちます。実際には(20年以上)決してデバッガーを自分のコードで使用する必要はありませんでした-適切なアサーションとロギングで常に十分でした。私は、ライブラリコードとレガシーなものでそのひどいツールを使用しています。そして、ところで。、連載することができるという任意の 何か読めるへのデータ構造はある常に 良いアイデア。一部の言語/環境では、これを無料で提供しています。
SKロジック

1
@Billy ONeal、シリアルポートに接続されたマイクロコントローラーデバイスのメモリをどのように参照しますか?そして、データ構造やアルゴリズムについて十分な知識が得られる前に、ポインターやものを使って低レベルの言語に新鮮な人をさらすのはあまり良い考えではないと思います。その時までに、彼らは適切にデバッグする方法を知っているでしょう。
SKロジック

1
@Billy ONeal、最も難しい部分は、デバッガーで値を検査する適切な瞬間を特定することです(ところで、ほとんどの場合、それは直接メモリ検査ではなく、.dump()メソッドを呼び出すようなものです)。シリアル化された値を印刷します。適切なデバッグロギングインフラストラクチャを配置すると、問題はログファイルの分析に絞り込まれます。ほとんどの場合、単純なgrepものが仕事をします。ステップなし、条件付きブレークポイントなし-grepのみ。
SKロジック

2

それほど重要ではありません。私はほとんど使用しませんし、使用したこともありません。コードをデバッグする最良の方法は次のとおりです。

  • そもそもバグを書かないでください
  • それらを作成する場合は、デバッガーに飛び込むのではなく、考えて修正してください

また、最新のマルチスレッドソフトウェアの場合、デバッガーはバグを発見するのではなく、隠すという効果があります。そして、彼らは間違いなく学位レベルで「教えられる」べきではありません。ワードプロセッサの使用方法を教えるのは1人以上です。


6
これは依存していると思います。記述していない大規模で文書化されていないコードベースの動作に慣れようとしている場合、デバッガーはコードベースの動作に慣れる最も速い方法の1つです。すべてのコードを記述している場合は、デバッガーを頻繁に使用する必要はありませんが、私たち全員がその場所にいるわけではありません。+1
ビリーオニール

1
@Billy異なることに同意する必要があります。デバッガを使用して巨大なMTトレーディングサーバーを知りましょう。
ニールバターワース

@Neil:私は個人的にこの種のものに対処したことはありません...しかし、私は問題なくMTコードをデバッグしたことがあります。おそらく私はMSVC ++に甘やかされています-そこにあるデバッガーは、さまざまなスレッドが何をしているのかを簡単に示すことができます。しかし、2008年以前のバージョンでデバッグしていた場合(それが追加されたのはその時だと思います)、それがどのように物事をより困難にするかを見ることができました。
ビリーONeal

@Neil:誤解しないでください-デバッガーが思考の代替物であると言っているのではありません。これは、場合によっては何かをより簡単に理解できるツールであると言っています。デバッガーがより多くの混乱を引き起こしている場合、それはより多くの混乱を引き起こしていると一般に簡単にわかります(あなたはより混乱しているため)。場合によっては役立ちますが、コード/入力/出力を見て、何が起こっているのかを考えることに代わるものではありません。
ビリーONeal

2
あなたはこの辺りで受け取った知恵の顔を飛んでいるのを知っています。しかし、あなたはライナス・トーバルズ、ラリー・ウォール、ブライアン・カーニガン、ロブ・パイクのような人々と仲良くしています。
btilly

0

学生は人間であり、人間はあらゆる種類の間違いを犯すため、特定の間違いに関する啓発が行われる前にいくつかの実験データ(デバッグ情報)を取得する必要があるため、デバッグを教える必要があります。

デバッグは、プログラムが設計上正しいはずであるという前提(おそらく数学部門から継承されている可能性がある)のために、おそらく証明されていても教えられていません。したがって、学生はプログラミングを正しく「実験」してはなりません。しかし、これは、スケジュールのプレッシャーなどで仕様を変更するためにソフトウェアを開発する不完全な人間の現実世界の製造プロセスを無視します。


うーん..私の学校は違うかもしれませんが、それはCWRUでのやり方ではありません。
ビリーONeal

おそらく、問題のプログラミングコースの歴史的な部門の継承ツリーに依存しています。
hotpaw2

これがどこで得られるのかわかりません。すべての入門クラスでは、バグを追跡する方法についていくつかの講義を行います。
davidk01

@ davidk01-それは、私が聞いたOPの観察を説明するものではなく、頻繁にではなく、以前に何度も聞いたことがあります。
hotpaw2

@ hotpaw2:OPの観察結果を説明できないものは何ですか?学生がプログラムのデバッグを学ぶのに苦労しているからといって、それが教えられないということではありません。私は、学部生と大学院生の両方として、いくつかのプログラミングコースを受講しました。すべてのクラスで、インストラクターは少なくとも1つの講義を行って、誤ったプログラムを調べ、それを修正して、一般的なデバッグ手法をいくつか示しました。
davidk01

0

この質問は私には異質です。私の大学では、デバッガー(JDBおよびEclipseデバッガー)の使用が最初の1年のコンピューターサイエンスシーケンスと同じくらい早く教えられました。デバッガーやその他のテストツールの使用は、ソフトウェアテストのコースで再び教えられました。

私は個人的に、労働力に就くために人々を準備しようとしている良い学校が適切なデバッグとテスト技術について教えていないと信じることは信じられないほど難しいと思います。彼らは明らかにそれのすべての側面をカバーすることはできませんが、少なくとも教室で基本を教えることができます。


0

自分で解決する

教授やTAが私に自分で簡単に理解できることを教える時間を割く必要はありませんでしたくありませんでした。彼らは私に難しい概念を教え、学習を導くためにそこにいます。彼らはそうではありませんといけませんあなたはRTFMする必要はありませんので、そこにあること。

学ぶ方法を学ぶ

大学は、あなたが知らないすべてのトピックを通してあなたの手を握るだけでなく、学ぶ方法を学ぶことについてでなければなりません。このプロセスを通して手をつないでいると、現実世界で惨めに失敗します。

上り坂、両方向、雪の中

私が学校に行ったとき、彼らはあなたに言語を教えることも気にしませんでした。あなたは自分の時間にそれを拾うことが期待されていました。彼らはあなたにプロジェクトと施設を提供します。実装を完了し、作業プログラムを提出するために必要な情報を追跡するのはあなた次第でした。営業時間を除いて、実世界とかなり似ています。

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