web-dev-qa-db-ja.com

他人のコードをどのように読みますか?

ほとんどすべての上級プログラマーは、他の専門家のコードを読むことは非常に役立つと言っています。通常、彼らはオープンソースを勧めます。

読みますか?もしそうなら、コードを読む手順はどのくらいの頻度で何ですか?また、初心者がSVN-ファイルの束-に対処するのは少し難しいです。解決策は何ですか?

23
Sergey

読みますか?

はい。

行う場合、どのくらいの頻度

毎日。常に。私は数多くのオープンソースプロジェクト(主にPython関連)を扱っており、mustは最も正確なドキュメントであるため、ソースを読みます。

そして、コードを読む手順は何ですか?

ええと。開いて読む。

また、初心者がSVN-ファイルの束-に対処するのは少し難しいです。解決策は何ですか?

開いて読む。その後、続きを読みます。

簡単ではない。簡単なことは何もありません。理解する王道はありません。それは仕事がかかります。

25
S.Lott

あなたが持っている難問にはいくつかの層があります。まず、いわば鳥瞰図である高レベルから始めます。プロジェクトをチェックアウトすると、ディレクトリ構造内に多数のファイルが作成されます。オープンソースでもクローズドソースでも、同じです(結局のところ、ソースコードはソースコードです)。だからこれから始めましょう:

  • ソースファイルはどのように整理されていますか?ファイルの名前または含まれているディレクトリの名前で、内部に何が見つかるかわかりますか?私たちのプログラマーは、予測可能な名前と論理構造を好む傾向があります。特定の問題のどこを見ればよいか、おおまかな目安が得られるはずです。
  • アプリケーションの性質は何ですか、それはWebベース、コマンドライン、GUIですか?これが重要な理由は、実行のトレースを開始する場所を知りたいからです。 Webベースの場合は、アプリがリクエストの処理を開始する場所から始めます。それがフレームワーク上に構築されている場合は、なおさら良いです。フレームワークがわかったら、通常はそこにあるコードをよく理解できます。それ以外の場合は、コマンドライン/ GUIアプリのそれぞれのエントリポイントから開始します。
  • 紙と鉛筆を入手するか、運が良ければホワイトボードと乾式マーカーを入手してください。コンポーネントに名前を付け(またはコードで提供されているものを使用)、ボックス間に矢印付きの線を引くと、処理の様子を確認できます。あるいは、アルゴリズムを検討している場合は、データ構造を、それがどのように操作されるのかを理解してスケッチできるようにスケッチします。

それは練習が必要ですが、それは間違いなく実行可能です。アプリケーションが使用しているライブラリとフレームワークについて理解するほど、コードをどのように編成する必要があるか、特定の質問に対する回答を探す場所がわかります。一部のコードは、特にそれがかなり間接的である場合、追跡が少し難しくなります。それが鉛筆と紙が必要な理由です。最終的にあなたの頭の中で電球が消え、あなたはそれを手に入れます。残りのコードを読むことで、全体の意味が大きくなります。

9
Berin Loritsch

それは小説を読むようなものではなく、参考書をどのように読むかのようです。チェックインメッセージから最近修正されたバグを選び、何が変更されたかを比較し、問題と解決策の両方を理解するまで関連する部分を読むのが良い方法です。よく公開されているセキュリティ脆弱性は、フォーラムで多くの議論があるため、選択するのが楽しいバグです。次に、バグトラッカーから「ぶら下がっている果物」のバグの1つを選び、自分で修正する方法を理解するまで読みます。専門家が行うコード読み取りのほとんどは、バグの修正や機能の追加の過程で付随するものです。

通常、最良のコードサンプルはほとんど目立ちません。あなたはそれらを一度以上読まなくても即座にそれらを理解するでしょう。通常、優れたコードは多くのドラフトを通過しますが、非常に簡単に書けるように見えます。それはあなたが最初に考えた方法ではありませんが、もちろん与えられたコードがそれを行う明白な方法であるという逆説的な感覚を生み出します。

そのようなコードに出会ったときは、それを書いたときに得られた洞察と、それに含まれる設計原則を理解するようにしてください。そうすれば、将来同じような状況に陥ったときに、同じ原則をうまく適用できるはずです。

5
Karl Bielefeldt

いくつかの複雑な関数を読み取るときによく使用する1つのトリックは、コードセグメントは、ロジックを変更せずに、より読みやすいものにリファクタリングを開始することです。

4

「ファイルの束」に対処するのは難しいですか?それが文書化されていない限り、その組織に関する事前の知識がないことを除いて、独自のコードを作成する場合と同じです。

クレームされたプログラマーとして、「ファイルの束」からプロジェクト構造を理解できない場合、それは非常に組織化されていないプロジェクトであるか、またはあなたが不精なプログラマー(または極端な場合は両方)です。

読み始め、いくつかのエントリポイントまたはその他の重要なピボットクラス/メソッドを見つけて、そこからすべてがどのように統合されるかを理解してください。インスタントになることはありません。時間がかかりますが、ドキュメントがまったくなくても実行できます。

2
jwenting

APIまたはソフトウェアの一部であっても、別のプロジェクトのコードを読み取るときに期待できる最高のことは、変数、関数、マクロの名前が曖昧に省略されたり、名前が付けられていないため、意図が理解できないことです。

しかし、それ以外には、言語、プログラミング手法、さらにはコードの目的自体について、複雑なコードに飛び込むことができる程度の知識が必要です。

私は現在 Lua がその魔法の一部をどのように実行するかを確認しようとしていますが、多くの識別子が漠然と名付けられているという点に達しています。私が知っていることを実行しようとしている行を関数コードのある時点で特定します...頻繁に1文字の変数とかなり短縮されたマクロ/関数名が頭に浮かびます。

0
Nick Bedford

@Berin Loritschが提案したように、「最初に、高レベルからの鳥瞰図」から、ユニットテストや統合テストがあるかどうかを探すことができます。

nittestsは、(api-)detailsがどのように機能するかを見るのに興味深いものです。

integrationtest通常、businesprocessesの概要を説明します。

0
k3b