デバッグスキルの学習と向上

プログラマーは、コードを書くよりもデバッグに多くの時間を費やします。言語やフレームワークを学ぶためのトレーニングを受けたと思いますが、ソフトウェアの欠陥を修正する方法をどのように学びましたか?

あなたがプログラミングに夢中になったとき(または少なくともそれが報酬のあるキャリアであると決めたとき)、あなたはおそらくそれを創造的な努力だと思ったでしょう。あなたは素晴らしいソフトウェアを設計し、コードを書き、そしてだまします!—最初は完全に機能します。

ええ。正しい。

現実の世界では、新しいものを書くのではなく、コードのデバッグに多くの時間を費やしました。新しい機能を作成するのではなく、欠陥の修正に費やされている開発者の時間のあいまいな割合を掘り下げることができると確信していますが、数字を聞く必要があるとは思えません。 Bug From Hellを探すのに費やした日数と、それがプロジェクトのスケジュールに与える影響を簡単に想像することができます。

今では、本を読んだり、技術会議に参加したり、JavaWorld.comなどのサイトにアクセスしたりするなど、プログラマーが新しいソフトウェアスキルを習得する方法はたくさんあります。 (後者を行っていただければ幸いです。)ただし、これらは通常、言語やフレームワークなどのツールに焦点を当てており、「2日ではなく2時間でそのバグを見つける方法」などのメタテクニックには焦点を当てていません。言語は行き来する可能性があり、IDEデバッガーも同様ですが、バグがどの岩の下に隠れているかを識別する機能は、永遠にあなたのそばにとどまります。

もちろん、デバッグを学ぶスキルの大部分は経験です。それはあなた自身の経験かもしれませんし、マスタープログラマーの足元でグラスホッパーになる機会かもしれません。また、トラブルシューティングに生来の才能を持っている人もいると思います(壊れた車を不正なアプリケーションとして修正することにも同様に関連します)。それがない人は、羨ましがるだけです。

ただし、これのいくつかは学ぶことができます。たとえば、私の知人のあるマスタープログラマーは、公理を持っていました。(比較的)長い間バグを探していて、それを見つけることができない場合、彼は「あなたは間違った場所を探している」と言いました。明らかなように聞こえますが、確かに真実です...そして、問題が完全に別の場所にあったときに、XYZモジュールを調べるのに時間を無駄にしたことがありますか?

私は何人かの開発者に、デバッグスキルを習得または改善する方法を尋ねました。驚くほど多くの人がIDEのデバッガーの習得やその他のツールの専門知識について話しましたが、私が知りたかったことのほとんどは、エラーを修正する能力を向上させるためのアドバイスです。これが彼らの反応の短い要約です。

  1. 懲戒処分を受ける。ある開発者によると、デバッグはプロセスであり、一連のランダムなイベントではありません。ノブをランダムに微調整しないでください。コードの実行プロセスに従います。芝刈り機を修理するのと同じように、彼は言いました。パートAは必要な入力を取得しますか?出力はどうですか?それでよければ、先に進んでください。
  2. スキルを向上させるには、自分のコードではなく、他の人のコードをデバッグします。自分の仮定を見るよりも、他の人の仮定の誤りを見る方が簡単です。これは、クロスピアコードレビューおよびクロスピアデバッグの一部として行うことができます。欠陥の一般的な原因をより迅速に認識する能力を開発し、1人の開発者に約束し、自分の悪い開発慣行を認識する(そして放棄する)ことを教えます。
  3. あなたがコンパイラのふりをします。コンパイルボタンを押す前に、できるだけ多くのエラーを見つけて修正してください。最新のIDEのほとんどには統合デバッガー(Visual StudioのIntellisenseなど)が含まれていますが、プロセスを意識的に調べるよりも、自動化から学ぶことは少なくなります。(同じように、すべての作業をスペルチェッカーに頼って正しくスペルを学ぶことは決してありません。)
  4. 開発プロセスのできるだけ早い段階でバグを修正する方法を学びましょう。これは、テスト駆動開発など、形式化されたものを意味する場合があります。これは、コーディングに集中するのではなく、設計のデバッグに時間を費やすことも意味します。
  5. システム全体を頭に抱えることができれば、デバッグが最も簡単になります。アプリケーションの一部だけに焦点を合わせるのを間違えないでください。モジュール間の相互関係に注意してください。あるプログラマーにアドバイスして、複数レベルの抽象化でコードを読んでください。「バグを見つけることは最も難しい部分であり、コードの複数の部分が何をしているのかを明確に理解する必要があります」と彼女は言いました。
  6. 同じアドバイスの一部は、他の誰かの提案だと思います。あなたが取り組んでいるものから1レベル下のシステムをよく理解することです。 「システムレベルのCプログラムをデバッグしている場合は、OSに関するアセンブリや何かを知るのに役立ちます」とシステムソフトウェアのリードエンジニアは説明しました。 「J2EEアプリをデバッグしている場合は、Javaスレッド、RMI、およびGCについて何かを知っておくと役立ちます。」多くの場合、エラーメッセージはその1レベル下から来ると彼は指摘しました。 「それが何を意味するのかを理解できれば、抽象化のレベルで何がうまくいかないのかを理解するのに役立ちます」と彼は説明しました。

数人の開発者も追加のリソースを推奨しました。その中には、9つの不可欠なルールを約束するDavid Aganの本、Debugging、および第2版でリリースされようとしているWhy Programs Fail:A Guide to SystematicDebuggingがあります。後者を推奨した開発者は、多くの実践的な例を使用して、デバッグへの体系的なアプローチを教えていると述べています。別の人はオンラインエッセイ、非常に効果的なソフトウェアテスターの10のスキルを提案しました。

私はそれらすべての答えが好きですが、共有されるべきより多くの知恵があると思います。どのようにしてデバッグスキルを習得しましたか?他の人の改善をどのように支援しましたか?

このストーリー「デバッグスキルの学習と向上」は、もともとJavaWorldによって公開されました。