2008-12-02 153 views
8

假设你想开始贡献一个具有数千LOC的开源项目。我对你如何开始学习/黑客入侵新系统的方式/建议感兴趣。如何阅读源代码学习如何使用大型系统?

+1

是: 第1步:将代码导入一个体面的IDE 太琐碎了? – 2008-12-02 14:16:56

+11

伊恩你能在这个问题的答案中发布这个,我想投票给你。 – 2008-12-02 14:24:01

回答

6

通过代码浏览,寻找你认为你知道发生了什么的地方。仔细阅读这些部分,看看你最初的想法是否成立,然后尝试修改它,看看你是否可以改变它来做别的事情。

我建议稍微引导一下项目路线图,以便您可以继续发现新功能和错误修复的位置,以便您能够以有意义的方式提供帮助。

此外,请阅读文档以及可能存在的任何旋转文档(功能规格,要求规格等)。这可以进一步帮助您更快地学习代码绳索:)

2

找到一个您感觉舒适并且改变它的小地方。忽略其余;你会在需要时了解它。不要因为尺码而感到不知所措;每个程序都是从第一行开始的,如果它不是以小的,独立的位组织的,就不可能维护。所以你总是有一个利基。

8

学习的目的。我认为如果你考虑到一些目标,你会学得最好 - 解决这个问题或者增加这个功能。开始寻找您需要进行更改的可能位置。向后跟随控制线程以找出如何在代码中达到该点。此外,对代码进行“鸟瞰”视图 - 查看布局和结构。良好的代码将具有描述性的名称,告诉您需要每个类和方法。看看您是否可以识别实施模式并查看它们在何处/如何使用。不要在文档中放置过多的文档 - 文档可能非常好,但它们通常与代码实际上不同步。让代码本身成为最好的文档。

0

如果您对该项目非常熟悉,并且对您想要贡献的内容有一些了解,那么请获取最新版本的代码并进行您想要进行的更改。不要试图一次消化全部代码。寻找正在使用的模式和惯例并尽可能地遵守它们。

3

我更喜欢在IDE调试器中逐行执行代码。尝试访问大型系统中的所有代码是不现实的,但是我首先调试应用程序的启动,然后转到其他对应用程序来说很有意义/重要的代码区域。

3

我将运行DOxygen对源代码,所以我有一个可浏览的,可读的,类级别的源视图。它非常适合帮助你穿越庞大的代码库

2

我会建议找到一个功能,真的想补充。

我以前只是真的看过别人的代码,因为我想添加的功能是我真正需要的。我认为这是大多数开源项目开始的原因;填补需求。

罗布

2
  1. 获取代码建设和您的开发机器上运行。
  2. 找出如何使用该系统并熟悉所使用的库。 (例如,如果您看到调用某些OpenGL库的代码,请熟悉该库)请阅读系统文档。
  3. 然后我会找到一个基于某些输入的代码点。假设系统根据某些输入生成输出。我会找到启动过程的方法。现在尝试一步一步完成(可能会很痛苦),或者只是阅读代码,并尝试获得关于发生的事情的高级概述。

我发现第3步通常会变得非常复杂,这就是我如何阅读代码和学习系统如何工作的方向。

添加一个特征可能是一个好主意,但是在一个大系统中,甚至可以弄清楚这个特征是什么会很痛苦。不仅如此,你编写的任何学习系统的功能很可能最终会看起来像垃圾,因为你不知道系统在哪里以及如何运行。你想添加的功能当然可以引导你在#3的正确点,所以不要打折。

-s

3

谢谢你的回答。 Lot是有用的信息。

一些工具,我能想到的是:

  • grep的
  • CTAGS
  • cscope的
  • 的javadoc(JAVA)
  • doxygen的(C,C++)
  • LXR(软件工具集索引和呈现源代码库)

有关有用工具的更多建议?

5
  • 不要花太多时间在小细节上。
  • 不要试图在开始时了解整个系统。
  • 重点是尝试理解一个相对“独立”的模块或组件,它在过去被添加为一个实体(功能)。这通常在您的大脑能力可以应付的大小限制内,因为它是由其他人一次完成的一个模块。
  • 将更多零件或“零件”消化并组装在一起后,您对整个系统的理解将会得到改善。
  • 工具是非常有益的:使用Doxygen + GraphViz的,或如“理解”,呼叫和来电图在Visual Studio中,“查找全部”和“查找所有引用”等
1

尝试软件对类图进行反向工程。有一个功能可以从A到B的断点,调试,逐步浏览并观察通信,在纸上绘制链接和继承。您也可以使用序列图。这有助于我理解系统的特定功能。