2010-08-27 54 views
10

我是刚刚开始工作的新鲜大学毕业生。在我的加速阶段,我需要学习很多产品代码。有一些设计文档,但他们没有多大帮助。你如何理解大量的代码?

您能否提供一些通用技术来浏览和理解巨大的产品代码(特别是C++)?

+2

重复:http://stackoverflow.com/questions/2783612/listing-c-c-functions-code-analysis-in-unix/2783652#2783652 – 2010-08-27 22:28:20

+1

社区wiki? – Anon 2010-08-27 22:33:04

+2

@gbrandt该链接是关于如何获取列出C/C++函数的方法。这当然不是一个重复。 – OTZ 2010-08-27 22:33:25

回答

10

运行它通过doxygen。这将生成html文档,即使代码没有适当的doxygen样式注释,这些文档也会很有帮助。

另一个好的建议是查看单元测试,如果有的话。如果没有单元测试,理解代码的一个好方法是编写你自己的单元测试。努力做到这一点将会为自己付出很多代价。

8

利用一切提供给你的方法(没有特别的优先级):

  1. 使用产品本身和理解什么
  2. 谈话到维护,或已与它以前工作过的开发者
  3. 通过它进行调试,看看数据如何流动以及类如何相互作用(“当我点击这个按钮时,究竟发生了什么,谁负责?”)
  4. 看看架构,UML或者类图
  5. 我最喜欢的一个:创建您自己的类层次结构,类交互,通用控制流,高级组件,进程/ DLL交互,对象生命周期和管理的图表
  6. 如果它们不是完全失控的,迄今为止,读取开发/测试/用户的规格(以#顺利1)
  7. 阅读文档上

最重要的是:顽强和执着。如果你没有投入工作,不要指望理解它。如果你不明白的东西,挖掘和挖掘,直到你做。软件并不神奇,它只是辛勤工作:)

+1

不错的名单。不过,我认为你的确按优先顺序排列。大部分时间在大型旧项目上,任何文档都毫无价值。 – 2010-08-27 22:29:35

+0

我会补充说,如果你在步骤(5)上工作,与团队分享你的图表。大多数团队(包括我的)欢迎贡献。您的努力可以帮助补充已经缺乏的文档集。 – 2010-08-27 22:47:03

5

有些人会告诉你从数据结构开始,但是在一个大的系统中,即使这在大多数情况下都不是非常有用。我可以想到四点:

  • 花点时间。通常情况下,它更像是一系列的格式转换,而不是单一的,线性的,渐进的理解。所以要耐心等待。

  • 不管它有多大,你都应该能够在调试器中放置一个断点并将它放在一个调试器中。即使在一个庞大而复杂的多线程系统中,您也应该能够通过并了解发生了什么。

  • 寻求错误,并开始修复它们,无论它们看起来有多疯狂。这就好比把自己放到外国去了。你会最终拾起语言。

  • 寻找导师。丛林指南是无价的。

+2

+1:修复错误是学习代码库的强大功能。除非错误是微不足道的,否则你必须学习一些代码才能修复它。 – 2010-08-27 22:41:09

+1

如果我负责学习任何新软件,则通常会要求我修复这些错误。这样,你不仅了解它在做什么,而且如何(有时甚至比你的同事更好,如果他们不能找出错误)。 – 2010-08-28 01:35:23

1

我认为已经有一些很好的回应。我的2c值得...

不知道你的课程很大(10 KLOC,1000 KLOC,10000 KLOC等),但有人会希望这是以某种方式分解,而不是一个单一的单一程序。也许你的管理层对目前你最可能花费时间的'模块'有一些指导。希望这可以帮助打破问题范围。

首先,在尝试了解代码之前,尝试了解产品。它有什么作用?那它是如何做到的?它与什么互动?那它是如何相互作用的?等等...

在到达代码时,首先要了解高层次的设计和理念,并在深度之前在广度上工作。我同意上面的一些重新修复一些错误,但是我也强烈建议你即使需要深入了解细节以修复一些错误,仍然可以继续处理高层次的问题。

如果您找不到任何已存在的图表,我也同意上面的说明为自己生成一些图表。然后分享他们,也许是一个团队/产品维基?我很好奇为什么现有的doco没有太大的帮助。通常这是因为这种类型的doco是从早期的概念中产生的,并且产品不再有任何相似性,但是如果情况并非如此,那么您可以为这个问题做出贡献。一个人假设你今天在哪里,其他人的时间就会足够短,并且你处于一个理想的位置,知道什么是必不可少的doco!

如果产品实际上是“巨大”的,那么你必须接受你永远无法把它全部放在你的脑海中,所以你能做的最好的事情是足够熟悉,知道从哪里开始寻找(回到理解产品,并首先接近代码宽度)。