Open source 如何阅读源代码学习如何使用大型系统?

Open source 如何阅读源代码学习如何使用大型系统?,open-source,Open Source,假设您想开始为一个拥有数千名LOC的开源项目做出贡献。我对如何开始学习/破解新系统的方法/建议很感兴趣 浏览代码,寻找你认为自己知道发生了什么的地方。通读这些章节,看看你最初的想法是否成立,然后尝试修改它,看看你是否可以改变它来做其他事情 我建议您在项目路线图的指导下,继续寻找新功能和错误修复的位置,以便以有意义的方式做出贡献 此外,请阅读文档和任何可能存在的加速文档(功能规范、需求规范等)。这可以进一步帮助您更快地学习代码:)找到一个让您感到舒适的小地方,然后进行更改。忽略其余的;当你需要的时

假设您想开始为一个拥有数千名LOC的开源项目做出贡献。我对如何开始学习/破解新系统的方法/建议很感兴趣

浏览代码,寻找你认为自己知道发生了什么的地方。通读这些章节,看看你最初的想法是否成立,然后尝试修改它,看看你是否可以改变它来做其他事情

我建议您在项目路线图的指导下,继续寻找新功能和错误修复的位置,以便以有意义的方式做出贡献


此外,请阅读文档和任何可能存在的加速文档(功能规范、需求规范等)。这可以进一步帮助您更快地学习代码:)

找到一个让您感到舒适的小地方,然后进行更改。忽略其余的;当你需要的时候,你会了解它的。不要被尺寸所压倒;每一个程序都是从第一行开始的,如果不是以小的、独立的位进行组织,就不可能维护。所以你总是有一个合适的位置。

如果你想要我发现对学习如何从代码中学习有用的书,我会看看Diomidis Spinellis的书


对于您的具体问题,我将从代码阅读开始。但两者都是好书。

有目的地学习。我认为如果你有一个目标——修复这个或添加那个功能,你会学到最好的东西。开始寻找可能需要进行更改的地方。向后跟踪控制线程以了解如何到达代码中的该点。另外,从“鸟瞰”的角度来看代码——看看布局和结构。好的代码将有描述性的名称,告诉您每个类和方法的用途。看看您是否能够识别实现模式,并看看它们在何处/如何使用。不要在文档中放太多的存货——文档可能很优秀,但它们通常与代码的实际功能不同步。让代码本身成为最好的文档。

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

我更喜欢在IDE调试器中逐行“逐步”检查代码。尝试访问大型系统中的所有代码是不实际的,但我从调试应用程序的启动开始,然后转到应用程序感兴趣/重要的其他代码领域。

我将针对源代码运行,因此我有一个可浏览、可读的类级源代码视图。它非常适合帮助您浏览庞大的代码库

我建议您找到一个您真正想要添加的功能

我只真正浏览过一次其他人的大量代码,这变得容易多了,因为我想添加的功能是我真正需要的。我认为这是大多数开源项目开始的原因;满足需要

抢劫

  • 在您的开发设备上构建并运行代码
  • 了解系统是如何使用的,并熟悉所使用的库。(例如,如果看到调用某个OpenGL库的代码,请熟悉该库)阅读系统文档
  • 然后我会找到一个代码点,它将基于一些输入运行。假设系统根据一些输入生成输出。我会找到启动这个过程的方法。现在,试着一步一步地完成它(可能会很痛苦),或者只是阅读代码,试着对正在发生的事情有一个高层次的概述
  • 我发现步骤3通常非常复杂,它给了我如何阅读代码和了解系统如何工作的方向

    添加一个特性可能是一个好主意,但在一个大型系统中,甚至弄清楚该特性是什么都可能是一件痛苦的事情。不仅如此,你为了解系统而编写的任何功能都很可能最终看起来像垃圾,因为你不知道系统在哪里以及如何运行。不过,您想要添加的功能肯定会引导您找到#3中的正确点,所以不要低估这一点


    -谢谢你的回答。很多有用的信息

    我认为有些工具是:

    • 格雷普
    • ctags
    • cscope
    • javadoc(Java)
    • 强氧(C,C++)
    • lxr(用于索引和显示源代码存储库的软件工具集)
    关于有用的工具还有什么建议吗

    • 不要在小细节上花费太多时间
    • 不要试图在一开始就理解整个系统
    • 重点是试图理解一个相对“独立”的模块或组件,该模块或组件在过去作为一个实体(特征)添加。这通常在你的脑力所能应付的范围内,因为它是由其他人在同一时间作为一个模块完成的
    • 在将更多的组件或“片段”消化和组装在一起后,您对整个系统的理解将得到提高
    • 工具非常有用:Doxygen+GraphViz,或者是一个软件,比如“理解”,VisualStudio中的调用和调用图,“查找所有”和“查找所有引用”,等等

      • 尝试对类图进行反向工程。假设有一个从a到B的功能。在a处设置断点,调试,逐步完成并观察通信,在论文中绘制链接和继承。您也可以使用序列图。这对我理解系统的特定功能起到了作用。

        是:第1步:将代码导入到一个像样的IDE中太琐碎了?Ian你能在回答这个问题时发表这一点吗?我想投你一票