私はいつもワインに驚かされてきました。時々、私はそれをハッキングしたり、小さなことを修正したり、それがどのように機能するかを一般的に理解したいと思っています. それで、Wine のソース コードをダウンロードすると、すぐに圧倒されてしまいます。コードベースは膨大で、Linux カーネルとは異なり、コードに関するガイドはほとんどありません。
このような巨大なコードベースを理解するためのベスト プラクティスは何ですか?
私はいつもワインに驚かされてきました。時々、私はそれをハッキングしたり、小さなことを修正したり、それがどのように機能するかを一般的に理解したいと思っています. それで、Wine のソース コードをダウンロードすると、すぐに圧倒されてしまいます。コードベースは膨大で、Linux カーネルとは異なり、コードに関するガイドはほとんどありません。
このような巨大なコードベースを理解するためのベスト プラクティスは何ですか?
複雑なコードベースでは、あなたが犯す可能性のある最大の間違いは、コンピューターになろうとすることです。コンピューターにコードを実行させ、デバッガーを使用して何が起こっているのかを調べます。
既存のソースコードから独自のバージョンのWineをコンパイル、インストール、および実行する方法を理解します。
ご使用のバージョンのWineの実行中のインスタンスでデバッグ(gdbの使用など)する方法を学びます。
デバッガーでWineを実行し、望ましくない動作を示すようにします。
楽しい部分:コード実行パスがどこに行くのかを見つけて、すべてがどのように連携するかを学び始めます。
はい、たくさんのコードを読むことは役に立ちますが、コンパイラー/デバッガー/コンピューターはあなたよりもはるかに速くコードを実行できます。
(これは、しばらく前に質問に投稿した回答です。この質問に合うように少し変更しました。)
経験から、レガシーシステムを学習する際の主な目標は3つあることがわかりました。
これらの3つの部分はすべて非常に重要であり、開始するのに役立ついくつかのトリックがあります。
まず、すべてを理解するためにコードをCtrlキーを押しながらクリックする(またはIDEが使用するものは何でも)という誘惑に抵抗します。特に、各行がそれが何であるかを理解するために他の複数のクラスを見るように強制する場合は、この方法ですべてを頭の中で把握することはおそらくできないでしょう。したがって、いくつかのレベルを保持できる必要があります。あなたの頭の中でスタックします。
可能な場合はドキュメントを読んでください。これは通常、後続のすべてを構築するための精神的なフレームワークをすばやく取得するのに役立ちます。
可能な場合はテストケースを実行します。
質問があるかどうかを知っている誰かに尋ねることを恐れないでください。確かに、他の人の時間を無駄なクエリで無駄にするべきではありませんが、単に理解できないことがある場合(これは、「これを次のように実装する方がはるかに理にかなっているのではないでしょうか。 ___ "か何か)、何かを台無しにして理由がわからない前に、答えを見つけることはおそらく価値があります。
最終的にコードを読むことになったときは、論理的な「メイン」の場所から始めて、そこから進んでください。コードを上から下に読んだり、アルファベット順に読んだりしないでください(これはおそらく明らかです)。
大規模なコードベースに慣れるための最良の方法は、飛び込んでみることです。多くのプロジェクトには、実行する必要がある簡単なタスクのリストがあり、通常、それらは人々が簡単に理解できるように予約されています。これらのいくつかを見つけて作業する必要があります。 ; 一般的なコードの概要と構造について多くを学び、プロジェクトに貢献し、より大きなタスクを引き受けるのに役立つ簡単な見返りを得ることができます。
ほとんどのプロジェクトと同様に、WINE には開発者が利用できる優れたリソースがあります。IRC、wiki、メーリング リスト、およびガイド/概要。ほとんどの困難なコードベースでは、最初のいくつかの修正の後はそれほど怖くありません。WINE は非常に大きく、カーネルと同じように、すべてのシステムに専門家がいるとは思えません。あなたもそうである必要があるとは思わないでください。自分にとって重要なことに取り組み始め、そこから始めましょう。
私自身、WINE へのパッチをいくつか開始しましたが、これは優れたコミュニティであり、優れた構造です。非常に役立つデバッグ メッセージがたくさんあります。これは非常にクールなプロジェクトなので、より長くヒットするのにも役立ちます。
私たちは皆、WINE を支援する勇気と意欲に感謝しています (それが必要です)。ありがとう、そして幸運を祈ります。
改善したい特徴を 1 つ探します。その実装を検索します。見つけたら、そのストローを引っ張ると、残りはすべて続きます。
最良の方法は、コメントを使用することです。皮肉なことに、獣のほんの一部を理解してコメントを追加すると、自分の道をたどることができます。不足しているガイドをコードに追加すると、他の開発者もそれを楽しむことができます。
(警告:恥知らずなマーケティングを先取り)
Eclipse を使用する Java 開発者には、nWireがあります。これは、大規模なコードベースをナビゲートおよび視覚化するための Eclipse プラグインです。
他の人が示唆したように、掘り下げてください!吸収できるすべての利用可能なドキュメントを読んでください。次に、関心のある、または知識のある他の人を見つけて、一緒に/から学ぶことができるかどうかを確認してください。人々にアイデアをぶつけたり、質問したりするのに役立ちます。
C ソース コードの場合、コードのどの部分に取り組みたいかがわかったら、そのコードのctagsとcscopeデータベースを生成します。これらのツールを使用すると、コードをジャンプして理解するのがずっと簡単になります。多くのテキスト エディター (一例としてgvim ) は ctags と cscope をサポートしているため、簡単に移動できます。
コードに小さな小さな変更を実装してみてください。これは、目に見えるものです。それは、デバッグ ステートメントを出力する実行可能な方法を見つけ出すこと (および出力がどこに表示されるかを理解すること) かもしれませんし、ウィンドウのデフォルト サイズやデスクトップの色などを変更することかもしれません。コードベースで何かを実現できるようになると、理解の表面をなぞったことになり、より複雑なことに進み始めることができます。その時点で、コードに実行させたい、もう少し便利な目標を選択し、それを実装します。または、プロジェクトのバグ トラッカーをチェックして、何か小さなことから始めてみてください。
必要に応じて文書化し、必要に応じて単体テストを作成し、必要に応じてリファクタリングします。ルーチンが何をするかを理解したら、コメントしてください!!
大規模なシステムを理解する良い方法は、システムを構成要素に分解し、アプリケーションの特定のパスに注目することです。
あなたのデバッガーはここであなたの友達です。調査したいスレッドにブレークポイントを設定し、各部分がどのように機能するかを1行ずつ見ていきます...お役に立てば幸いです...