![]() |
1
24
如果可能,从一些小任务开始,围绕您的问题调试代码。 在调试模式下单步执行代码是了解某些东西如何工作的最简单方法。 |
![]() |
2
17
另一种选择是为您感兴趣的特性编写测试。设置测试工具是一种很好的方法,可以确定系统具有哪些依赖性以及其状态所在的位置。每个测试都从一个关于您认为系统应该如何工作的断言开始。如果结果是这样的话,你已经取得了一些成果,并且有了一些可工作的示例代码来重现它。如果不是这样的话,你就有一个难题要解决,还有一系列的问题要解决。 |
![]() |
3
10
我通常向尚未提及的人建议的一件事是,在成为开发人员之前,成为现有代码库的合格用户是很重要的。当新开发人员进入我们的大型软件项目时,我建议他们花时间成为专家用户,然后再潜心研究代码。 也许这是显而易见的,但我已经看到很多人试图过快地跳到代码中,因为他们渴望开始取得进展。 |
![]() |
4
9
这完全取决于你是什么样的学习者和什么样的程序员,但是:
|
![]() |
5
7
配合严格的旋转。 如果可能的话,在浏览文档/代码库时,尝试使用具有严格旋转的配对。也就是说,你们两个坐在一起一段固定的时间(比如两个小时的会议),然后你们交换一对,一个人将继续完成这项任务,而另一个人将和另一个伙伴一起完成另一项任务。 两人一组,你们都会学到一点知识,然后当轮换发生时,这些知识会被反馈给团队的其他成员。还有一个好处是,当一对新的代码组合在一起时,完成任务(在本例中是研究代码)的人可以用更容易理解的方式总结和解释概念。随着时间的推移,每个人都应该有一个相似的理解水平,并希望避免“哦,只有约翰知道这一点代码”综合症。 从我对您的场景的了解来看,您有一个很好的数字(3对),但是,如果您是分布式的,或者不在同一个时间范围内工作,这是不可能的。 |
![]() |
6
5
我建议在上面运行doxygen以获得最新的类图,然后再进行一段时间的广泛讨论。这给了你一个快速的大图,你可以使用当你接近和肮脏的代码。 |
![]() |
7
4
我同意这完全取决于你是哪种类型的学习者。说了这句话,我在两家公司工作过,他们的代码库非常庞大。通常,我这样工作: 如果可能的话,在查看任何功能代码之前,我先完成已经编写的单元测试。这些通常能帮上不少忙。如果它们不可用,那么我将执行以下操作。 首先,我在很大程度上忽略了实现,只查看头文件或类接口。我试着了解每门课的目的。第二,我从看起来最重要的领域开始,深入到实现的一个层次。这是很难衡量的,所以有时候我只是从顶部开始,在文件列表中一路向下。我称之为广度优先学习。在这个初始步骤之后,我通常会深入了解代码的其余部分。最初的宽度优先查找有助于巩固/修复我从接口级别获得的任何想法,然后深度优先查找向我展示了用于实现系统的模式,以及不同的设计思想。我指的是深度优先,你基本上是使用调试器逐步完成程序,逐步进入每个函数,看看它是如何工作的,等等。这显然不可能在真正的大型系统中实现,但20K LOC并没有那么多。:) |
![]() |
8
3
与另一个更熟悉系统的程序员合作开发新特性或修复错误。这是我见过的最好的方法。 |
![]() |
9
2
我认为你需要把这个和一个特定的任务联系起来。当你手头有时间的时候,选择你想要的任何一种方法。 当你有事情要做的时候,给自己一个狭隘的焦点,然后完成它。 |
![]() |
10
2
让团队让你花两个星期(如果你有两个星期的话)。他们会很乐意找人来负责这件事,到这段时间结束时,你会花很多时间在图书馆解决问题,你可能会很清楚。 |
![]() |
11
2
如果它有单元测试(我敢打赌它没有)。从小处开始,确保单元测试不会失败。如果你一眼盯着整个代码库,你的眼睛就会变得呆滞,你会感到不知所措。 如果没有单元测试,您需要关注您想要的特性。运行应用程序并查看功能应影响的结果。然后开始查看代码,试图找出应用程序是如何创建您想要更改的内容的。最后更改它并检查结果是否符合您的需要。 你提到它是一个应用程序和一个图书馆。首先更改应用程序,并坚持将库作为用户使用。那么,在你学习了图书馆之后,你就更容易改变了。 从一个自上而下的方法来看,这个应用程序可能有一个主循环或者一个控制所有操作的主GUI。有必要了解应用程序的主要控制流程。阅读代码是值得的,它可以让你对应用程序的主要流程有一个大致的了解。如果它是一个图形用户界面应用程序,那么就创建一张纸来显示有哪些屏幕以及如何从一个屏幕切换到另一个屏幕。如果是命令行应用程序,则说明如何完成处理。 即使在公司里,采用这种方法也不少见。通常没有人完全理解应用程序是如何工作的。人们没有时间带你到处转转。他们更喜欢具体的问题,所以你必须自己去钻研和实验。然后,一旦你得到了你的特定问题,你就可以试着为应用程序的那一部分隔离知识的来源并提出问题。 |
![]() |
12
2
首先要了解“问题域”(它是工资单系统吗?库存?实时控制或其他)。如果你不理解用户使用的术语,你将永远无法理解代码。 然后看看对象模型;可能已经有了一个图表,或者您可能需要对其中一个进行反向工程(手动或者使用道格建议的工具)。在这个阶段,您还可以调查数据库(如果有的话),如果应该遵循对象模型,但它可能不会,这很重要。 看看变更历史或bug数据库,如果有一个领域出现了很多问题,请先看看这个部分。这并不意味着它写得不好,但它是每个人都使用的。 最后,做一些笔记(我更喜欢wiki)。
|
![]() |
13
2
我也有类似的情况。我想说你是这样的:
这将使您更好地熟悉系统。记住,只有当您非常了解单元测试时,才能尝试编写或理解单元测试。 什么 正在测试和 为什么? 它需要在 只有 那样。 如果大型应用程序不是面向数据库的,我建议使用其他方法:
对于第一个战略: 以这个stackoverflow站点为例。检查数据存储、存储的内容、存储的方式、这些项在代码中的表示方式、这些项在UI上的显示位置。它们从何而来,一旦它们返回数据存储区,会对它们进行什么处理。 对于第二个 以文字处理器为例。有哪些组件?IO、UI、PAGE等。它们是如何相互作用的?随着学习的深入继续前进。 放松点。写代码是一个人的思维定势,冻结了逻辑和思维方式,阅读它需要时间。 |
![]() |
14
2
首先,如果您有对代码有经验的团队成员,您应该安排他们与您一起概述代码。每个团队成员都应该向您提供他们专业领域的信息。多人解释事物通常是有价值的,因为有些人比其他人更善于解释,有些人比其他人更能理解。 然后,你需要在没有任何压力的情况下开始阅读代码一段时间(如果你的老板会提供的话,几天或一周时间)。它通常有助于您自己编译/构建项目,并且能够在调试模式下运行项目,这样您就可以单步执行代码。然后,开始弄湿你的脚,修复小虫子,做一些小的改进。希望你很快就能准备好一个中等规模的项目,然后是一个大项目。在你走的时候继续依靠你的队友-通常你可以找到一个特别的愿意指导你的人。 如果你挣扎的话,不要对自己太苛刻-这很正常。理解一个大的代码库可能需要很长的时间,甚至是几年的时间。事实上,通常情况下,即使经过多年,代码的某些部分仍然有点可怕和不透明。当你在项目间休息的时候,你可以深入到那些领域,你会发现,经过几次尝试,你甚至可以找出那些部分。 祝你好运! |
![]() |
15
2
你可以考虑看看 源代码逆向工程 工具。我知道有两种工具:
这两个工具都提供类似的特性集,其中包括静态分析,该分析生成软件中模块之间关系图。 这主要由调用图和类型/类缺陷组成。查看这些信息可以让您很好地了解代码的各个部分是如何相互关联的。利用这些信息,您可以深入了解您最感兴趣的部分的实际来源,以及您首先需要了解/修改的部分。 |
![]() |
16
1
我发现仅仅是跳到代码中可能有点压倒性。尽可能多地阅读有关设计的文档。这将有希望解释每个组件的用途和结构。如果一个现有的开发人员可以带你通过它,那是最好的,但这并不总是可能的。 一旦您对代码的高级结构感到满意,就尝试修复一两个bug。这将帮助您掌握实际的代码。 |
![]() |
17
1
我喜欢所有的答案,比如说你应该使用像doxygen这样的工具来获得类图,并且首先尝试理解全局。我完全同意这一点。 也就是说,这在很大程度上取决于代码的分解程度。如果真是一团糟,那就很难学了。如果它干净,组织得当,就不会那么糟糕了。 |
![]() |
18
1
见 this answer 关于如何使用测试覆盖工具来定位感兴趣的特性的代码,而不知道该特性在哪里,或者它是如何跨多个模块分布的。 |
|
niebelung · Rails3:无法为遗留代码添加正确的路由 11 年前 |