他者のソースコードの解釈[終了]


9

注:この質問は承知しています。この質問はもう少し具体的で詳細ですが、デバッグしたり、作者に尋ねたりするのではなく、実際のコードを読むことに焦点を当てています。

入門レベルのコンピューターサイエンスクラスの学生として、私の友人は時々私に彼らの課題を手伝ってくれるように頼みます。プログラミングは私がとても誇りに思っていることなので、私はいつも喜んで義務付けています。しかし、私は通常、ソースコードを解釈するのが困難です。

これは、奇妙なまたは一貫性のないスタイルが原因である場合もあれば、割り当てで指定された奇妙な設計要件が原因である場合もあれば、私の愚かさだけが原因である場合もあります。いずれにせよ、私は何分か画面を見つめている馬鹿のように見えて、「ええと...」

私は通常、最初に一般的なエラーをチェックします-セミコロンまたは括弧の欠落、抽出演算子の代わりにコンマを使用するなど。

それが失敗すると問題が発生します。構文エラーのため、デバッガを使用できないことがよくあります。また、設計者が設計上の決定を理解していないため、作成者に質問することはできません。

通常、他のユーザーのソースコードをどのように読みますか?トップダウンでコードを読み通しますか、それとも呼び出されるときに各関数をたどりますか?「リファクタリングの時間です」と言うタイミングをどうやって知っていますか?


1
私は言うでしょう:大学にいる間でさえ、悪いプログラマーにあなたの時間を無駄にしないでください...あなたが彼らにそれを請求しない限り。成功への秘訣は、emをバカに見せながら$を取ることです。
ジョブ

2
@ジョブ:まあ、私たちが始めていたとき、私たちはみんな悪いコードを書いていました。彼らが時間を過ごす価値があるかどうかは、彼らが自分で働き、改善したいかどうかに依存します。

@仕事私は高校生で、友達をきちんと扱いたいです。私はそれを競争として扱うことの背後にある論理を見ることができますが、私はより良い人になることを目指しています。
Maxpm

5
そしてこのようにして、あなたは彼らに親切でありながら、実際に競争をなくします。あなたが彼らのためにすべてを解決するなら、あなたは多くを学び、彼らは無力になるでしょう。(反対側では、彼らは学位を取得します。これは知識の欠如と相まって、おそらくすぐに管理職に入るでしょう:))
biziclop

回答:


22

最初のヒント:IDE(または非常に優れたエディター:))を使用して、構文エラー、括弧の誤配置、その他の些細な間違いを見つけます。

2番目のステップ:すべてのコードを使いやすい形式で自動フォーマットします。これはそれほど重要ではないと思いますが、驚くほど重要です。

ローカル変数の名前が不適切な場合でも、名前を変更することを恐れないでください。(システム全体にアクセスできる場合は、任意の名前に変更できます。)

特定の関数/メソッドが実行していることを発見したら、コメントを自分に追加します。

我慢して。エイリアンコードを理解することは簡単ではありませんが、ジグソーパズルのほとんどの部分が突然所定の位置に収まるとき、常に画期的な瞬間があります。それまでは、大変な作業であり、大変です。良い知らせは、練習すればこのエウレカの瞬間が早く来るということです。


元の作者を尊重しながら、どのように再フォーマット/名前変更できますか?私は次のようなことを言っているコメントを残すべき// Renamed to ABC for XYZですか?
Maxpm

3
@Maxpm簡単な答えは、元の作者を尊重する必要がないということです。コードは芸術作品ではありません。それが機能しない場合、それは間違いなく機能しません。ただし、そのようなコメントを入れることができるので、変更した内容と理由を元の作成者に簡単に説明できます。その理由は、可能な限り、非常に重要であり、なぜあなたが物事をしているのかを文書化します。これは最も便利なタイプのコメントです。
biziclop 2011年

6
@Maxpm-コードファイルをコピーします。やりたいことは何でもして、戻ってシステムの問題を修正する手助けをしてください。まあそれは私がそれをする方法です。
エリン

@Maxpmコードのコピーを作成し、最初にastyle(astyle.sourceforge.net)を実行します。プログラミングの方法を学ぶ人々が一貫したコーディングスタイルを持っていることはほとんどありません。適切にフォーマットされたコードを見ると、視覚的に「解析」するときに非常に役立ちます。
Vitor Py

1
@Maxpm、あなたのシステムをコピーして作業するのが最善ですが、あなたがそれらの前でそれをしなければならない場合でも(あなたがやって来てあなたを助けてくれるように頼む場合など)、変数の名前を変更する必要がある場合は、あなたがやったことを伝えてくださいそれを書いていないので、すべてが何をしているのかわからないので、名前を変更する必要があります。
ドミニクマクドネル

20

これについてあなたは間違ったアプローチをとっていると思いますか。人々が彼らのコードの助けを求めてあなたに頼っているなら、私はあなたが振り向いて、彼らに彼らのコードを説明するように言う責任があると思います。あなたは彼らのために彼らのエラーを修正することができます、そして彼らは(あなたの助けを借りて)彼ら自身のエラーを見つけることができれば彼らがより多くを学ぶ可能性が高いなら、彼らは(腐敗によって)何かを学ぶかもしれません。さらに、さまざまな人々がどのようにコーディングにアプローチするかにより、幅広い経験を得ることができます(これにより、より多くのコードを読み、理解できるようになります)-好循環...;)


2
なぜ反対票?これは良い考えのようです。
マットエレン

同意する。非常に奇妙に思えます。
マイケルK

@マット・アド・マイケル、ドライブ・バイ・ダウンボーター、あなたができることはあまりない...私は推測する...
Nim

素晴らしいアイデアですが、実際には、「8年前に書かれた職場でポルノを見て解雇されたサポートから破られた」というコードが与えられる可能性が高くなります。加えて、おそらく基本に苦労している人によって与えられた説明の真の価値は何ですか?
biziclop 2011年

これは良い答えです。彼らは、彼らのコードが何をするために想定しているのか、あるいは少なくともそれがしたいと思っていることについて、何らかの考えを持つべきです。
JeffO 2011年

3

この能力は、経験と才能を兼ね備えていると思います。私たちが最初から何かを作るように依頼した場合、多かれ少なかれ何でも解決できる従業員がいますが、同時に、自分が記述し​​ていないコードの一部にある明らかなバグを完全に見つけることはできません。また、同時に、基本的な設計を超えるものは信用できないが、他のコードに飛び込んで問題をすぐに追跡できる従業員がいます。

とはいえ、これに取り組む方法はコードを変更することです。使い慣れた形式に再フォーマットし、変数名をわかりやすい名前に変更し、コードが明確でない場合はコメントを追加します。彼が助けを求めてきたら、問題を見つけるまで先に進んで物事を変えてください。その後、元のコードを修正するか、自分のコードを使用するかは、友人に任せてください。


+1-他の人が書いたコードの開発とバグの追跡は、2つの非常に異なるスキルセットです。雇用者は、両方が非常にうまくできる人を見つけたとき、彼らが持っているものに感謝しません。
2011年

2

まず、構文エラーがある場合は、コンパイラエラーを注意深く読む必要があります。多くの場合、行はエラーとして強調表示されますが、実際にはエラーのある前の行でした。

入門者にとっては、プログラムのコンパイルを妨げるいくつかの編集アーティファクトが見られない可能性があることに注意してください。たとえば、戻るのではなくスペースバーを使用する(私の生徒ではない)学生を見たことがあります。彼のコードは、80列の後に折り返されたエディターで正常に見え(学生は非常に辛抱強く)、彼が追加するまでコードは機能しました//プログラムの残りすべてをコメントアウトした「」スタイルのコメント。同様に、Webサイトからコードサンプルをコピーする場合、(Webサイトがコードをどのようにフォーマットしたかに応じて)コピーされる印刷できない文字がしばしば存在します。疑わしい場合は、コピーアンドペーストせずに行を再入力してください。[それは一種の驚くべきことですが、私はそれが最近もっと多く発生するのを見てきました。]

厄介なコンパイラエラーの場合、新しいファイルを作成し、すべてのコードを入力してプログラムを拡張する必要があるかもしれません。次のステップに進む前に、主要な各ステップの後に必ずコンパイルしてください。

では、構文エラーがない場合はどうでしょうか?次に、コードをステップ実行します。これにはデバッガを使用できますがprintf、コード全体に呼び出しを入れることも非常に効果的です。たとえば、forループがある場合は、ループカウンターの印刷ステートメントを追加します。ネストされたforループの場合、間違った変数がインクリメントされていることがあります。

printfs を使用する利点は、現在見ているものを時間/空間にわたって「圧縮」できることです。デバッガーを使用してステップスルーすると、無関係な状態も多く表示され、面倒な場合があります。また、コンソールに出力された内容の履歴を確認しないと、一部のパターンを見逃す可能性があります。ここでのポイントは、デバッガーとprintfsは補完的な手法であり、どちらも常に他のものより優れているということです。

最後に、何が起こっているかを友達に聞いてください!それを見て「ええ」と言う代わりに、彼らが何をしているのかを尋ねます:「今何をしnているのですか?」ダイアログを開始すると、彼らは自分の質問に答えてしまうかもしれません。または、彼らがプログラムを概念化した方法に欠陥があったことに気づき、それが解決策につながる可能性があります。

他の場所でコメントしたように、これはすべて経験とともに良くなります。私は20年間プログラミングをしてきましたが、過去5年間、学生と一緒に仕事をするようになってから初めて、生徒たちのエラーを手助けするようになりました。


1

私はこれを言うのが嫌いですが、ここに特効薬はありません。

率直に言って、事件の10%でも他の人が書いたときに他の人が何を意味しているのかを理解できるほど透視力があれば、間違いなく数百万人になったでしょう。

より実際的な注意として、インテリジェントIDEの使用はステップ1です。

ステップ2は、doxygenまたは類似したものを実行して、ソースコードの階層を理解することです。

ステップ3は、コマンドラインまたはファイルを処理してロジックを実行するアンカー関数またはオブジェクトを見つけることです。

手順3と並行して、グローバルを使用している場合は追跡します。また、既知の特定のアルゴリズムを使用しているかどうかを相手に尋ねます。コードを確認する前に、アルゴリズム(存在する場合)を読むことは常に有益です。


1

一言で言えば、経験は、経験を積むほど、ベストプラクティスについて学び、他の人のコードを判断/理解できるようになります。これは自動的には発生しませんが、多くの場合、同じミスを自分で行うことによってのみ発生します。

とはいえ、コードを見るとき、それは多くの場合、コードから推定するのが非常に難しい主要な思考プロセスの結果であることが多いため、プログラマーが適切にコードにコメントすることを学ぶことが不可欠です。いくつかのコメント、デザインの考えを含むテキストファイルは、コードの理解と完全な誤解の違いを生む可能性があります。


1

私はよく学校の研究室で同じように尋ねられました。通常、「このコンパイラエラーを修正するにはどうすればよいですか?」ぶら下がっているelse、セミコロンが足りないなどの発見にかなり慣れました。(マクロもデバッグするのは楽しい#define CUBE(x) x * x * xです。私たち全員が間違いを犯す運命です。)私が持っていた利点は、同じ教師と同じクラスを受講したことでした。そのため、すでに要件に精通していました。

私が最もうまく機能することがわかったプロセスは、実行中のダイアログを維持することです。彼らは学ぶ必要があるので、あなたは彼らのためにプログラムを書きたくありません。つまり、彼らと同じコンピュータにいる必要があります。研究室では私は彼らのコンピュータに行きました。コンパイラーのメッセージから始めて、エラーを見つけさせようと思います。(私たちはCを使用していました。)行番号から始めて、メッセージとエラーが対応する場所を指摘します。同じエラーが複数ある場合は、2つのエラーの類似点を尋ねます。

全体のアイデアは、他の学生を導く手助けをすることです。彼らのために彼らのコードを書き直すことは彼らが学ぶのを助けません。


#define CUBE(x) x * x * x型安全性以外の何が問題になっていますか?
ジョブ

のようCUBE(3)に呼び出された場合、問題ありません。で呼び出すと、Cで評価されたものCUBE(x + 1)が取得x + 1 * x + 1 * x + 1されx + (1 * x) + (1 * x) + 1ます。これ3x + 1はx <sup> 3 </ sup>ではないものと評価されます!宣言して修正し#define CUBE(x) (x) * (x) * (x)ます。
マイケルK

0

構文エラーは論理エラーよりもずっと簡単に見つけることができます。問題のほとんどが構文にある場合は、IDEを見つけ、コードをコピーしてそれに貼り付け、エラーを修正します。論理エラーははるかに困難です。あなたがなぜ彼らに彼らのコードを説明するように頼むことができないと言うのか私にはわかりません。コードを他の人に説明したところ、多くの論理エラーが見つかりました。

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