非常に少ない情報でデバッグするためのヒント?[閉まっている]


11

私はかなり大きなコードベースを持つプロジェクトを継承しましたが、元の開発者がメールに返信することはめったにありません。いくつかの方法がありますが、すべてを知っているわけではありません。これらのパスに沿った多くの重複コード(たとえば、比較的同じことを行う5ページに含まれる機能ではなく、5ページにコピーされたコードです)、およびデータベース内のいくつかの微妙な問題(私たちは皆、スパゲッティコードを聞いたことがあります) 、しかしスパゲッティデータベースについて聞いたことはありますか?)

これらすべてのことで、ほとんどの場合は問題なく対処できます。

問題は、クライアントがどこかでバグを見つけたときです。彼らは通常、最終的な問題のスクリーンショットを送信し、「これを見てください」と言います。間違っているページ上の特定のもの、および予想されるものを強調表示します。それ以上の情報はほとんど与えられず、彼らと話をしてもっと得ようとすること(結果を得るために彼らがしたことなど)は、歯を引っ張るようなものです。

基本的に、これは次のように要約されます。

  • 大規模で複雑なコードベース
  • 物事がうまくいかない多くの多くの方法
  • バグの発生に関する情報はほとんどありません

誰かがこの種のことをデバッグする方法についてのヒント、トリック、提案などを持っていますか?


「スパゲッティデータベースについて聞いたことがありますか?」私はかつて、製品のデータベースが10年以上にわたって絶えず進化してきた仕事で働いていましたが、要件の増加(および成長、成長、成長)に応じてリファクタリングする努力はほとんど、またはまったくありませんでした。「データベースを理解し、有用なものを抽出するためのSQLクエリを作成する」という仕事全体に要約された同僚がいました。彼女は不可欠でした。あなたの痛みが分かります。
BlairHippo

補足として、[Raymond Chenのブログの「精神的なデバッグ」の投稿を読んでください](goo.gl/2KIH)!
Wizard79

コードベースはどれくらいの大きさですか?10 KLOCまたは50 MLOCですか?
バジルスタリンケビッチ

回答:


11

そのようなものを手に入れたとき、私は通常より多くの情報を要求します。どこで作業しているかはわかりませんが、ここで問題をローカルに再現するための十分な情報がない場合は、詳細情報をリクエストして、チケットを「再現不可」とマークして送り返すことができます。私は最後にそれを破ることができます。

クライアントが手順の説明に問題がある場合は、スクリーンキャップビデオを依頼してください。Jingなど、それらを作成できる無料の製品がいくつかあります あなたが彼らが何をしていたかを正確に見ることができれば、それはずっと簡単になります。

編集: 数年前にこれを書いたとき、Jingは良いアイデアでした。それ以来、彼らはインストーラーを修正して、システムに「ボーナス」クラップウェアをロードしました。とはいえ、まともなスクリーンレコーダーがたくさんあります。


2
健全なアドバイスを+1し、バグを確実に発生させることができますか、それとも断続的ですか?それが確実に起こっている場合、彼らはあなたがそこに着くために取ったステップをあなたに教えることができますか?
BlairHippo

1
ログファイルを確認することは少し役立ちます。
pramodc84

11

良い出発点はこのかもしれません。

代替テキスト

開発者はもうサポートを行っていないように聞こえるので、以下の定義を使用しています。

レガシーコードは、サポートされなくなったものに関連するソースコードです。


悲しいことに、これはレガシーコードでもありません。私が取り組んでいるもののほとんどは、今年初めに開始されたと確信しています。
タルカ

3
@Slokun-本の「レガシーコード」の定義は、従来の定義と完全に同じではありません。とても良い本です。
オースティンサロネン

4

数年前に同様の問題が発生しましたが、生産性とコードのクリーンアップを最大化したのは、バグ追跡をシステムに統合することでした。

私たちはFogbugzを使用し(まだFogcreekを実行していると思います!)、例外が発生したときにユーザーがボタンを押すとすぐにシステムにログインできる例外処理メカニズムを構築することができました。スクリーンショットはもうありません。 このオプションを使用すると、ユーザーから情報を抽出しようとする代わりに、必要な情報を取得できます。 バリアントのように聞こえますが、特にスクリーンショットキャプチャオプションを使用すると、ある程度の効果が得られます。

もう1つやりたいことは、ログの追加を開始することです。引数値を使用してすべてのメソッド呼び出しをログに記録することをお勧めします。レガシーコード(テストなしのコード)で作業しているように聞こえるので、このログは適切な単体テストを追加して問題を繰り返さないようにします。


既存の大規模なコードベースの場合、適切なログを追加することは多くの労力を費やします。+1は、バグが断続的に発生する場合に唯一の実行可能なオプションであることが判明する可能性があるためです。
BlairHippo

@BlairHippo:私の経験からはそうですが、それは彼が説明しているコードベースで支払う価格です。それは...ほとんどそもそも、このようなコードベースで働くように悲惨なようだ
オースティンサロネン

ロギングは困難です。自動化された例外ログを追加することは簡単であり、(最小限の)努力の価値は千倍以上です。または、少なくとも、Delphiにあります。他の言語にどのような解決策が存在するかはわかりませんが、適切な例外処理を備えた言語にとってそれほど難しくないはずです。
メイソンウィーラー

1

私の最も真剣なアドバイスは、できる限りリファクタリングを開始することです。機能の再コピーを見た回数を数えることはできませんが、完全なコピーではないことがわかりました。これは99.9%のコピーと1つの小さな小さなミスであり、バグになりました。すべてに単体テストの追加を開始し、QA部門がある場合は、作業中のコードのこれらの部分に対して自動テストスクリプトを取得してみてください。

一方、どのくらいのロギングがコードに挿入できるかを確認してください。つまり、ロギングの方法があまりない場合は、コードにフラグを追加して、デバッグ目的でより詳細なロギングの取得を開始できます。これは、ダイアログを表示できる場合に、ユーザーにオンとオフを切り替えることができるものです。数えきれないほど何度も助けてくれました。私は通常、問題の写真なしで「機能しません」というメッセージを受け取ります。「ログファイルを送信してください」と言うだけです。


0

単体テストを書くことから始めます。クラスまたは関数を選択し、それがどのように機能するかについての考えに対応する一連のテストを記述します。テストが失敗した場合、理由を見つけてください。それがバグである場合-それを修正します。あなたの期待が間違っていることが判明した場合、その事が実際に何をしているかを把握し、それに応じてテストを修正してください。

適切な作業ユニットテストのセットを作成したら、コードをクリーンにするためのリファクタリングを行うためのセーフティネットができました。

コードベースを理解するまで繰り返してください。

言うまでもなく、これは、バグレポートへの応答ではなく、事前に行うべきことです。

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