Language agnostic 理解大型单片代码的技巧

Language agnostic 理解大型单片代码的技巧,language-agnostic,legacy-code,Language Agnostic,Legacy Code,我正在寻找一些好的技巧来跟踪和理解庞大的代码库。我通常从顶部开始,过了一段时间,我就会迷失在函数的一些细节中。因为我已经深入浅出了,所以备份和步入正轨的过程是令人厌倦和疲惫的。当您试图理解庞大的代码库时,如何跟踪跟踪跟踪 我通常会打开一个记事本,试着跟踪这些步骤。但是在理解代码和记笔记之间的转换对我来说并不是很有效。有什么建议吗 编辑:我正在考虑一种情况,我想修复一个bug。我怀疑如果我将我的理解局限于存在缺陷的函数/类,我将对我的修复没有信心。通常我尝试做的事情是避免试图从头理解代码。我通常会

我正在寻找一些好的技巧来跟踪和理解庞大的代码库。我通常从顶部开始,过了一段时间,我就会迷失在函数的一些细节中。因为我已经深入浅出了,所以备份和步入正轨的过程是令人厌倦和疲惫的。当您试图理解庞大的代码库时,如何跟踪跟踪跟踪

我通常会打开一个记事本,试着跟踪这些步骤。但是在理解代码和记笔记之间的转换对我来说并不是很有效。有什么建议吗


编辑:我正在考虑一种情况,我想修复一个bug。我怀疑如果我将我的理解局限于存在缺陷的函数/类,我将对我的修复没有信心。

通常我尝试做的事情是避免试图从头理解代码。我通常会查看代码中的所有类和包,看看哪些类和包最突出,我可能有兴趣进一步查看。专注于理解这个小部件是如何独立工作的


然后,我继续讨论另一段代码,等等,希望在足够的时间后,我能理解所有代码是如何工作的,从而更容易理解全局。

我从代码中的概念/逻辑开始。采用一个基本概念/逻辑并遵循它,然后了解开发人员是如何尝试的。在这个过程中,我总是找到相关的细节,然后再研究这些参数

一旦您有了代码的基本模型,并且了解了开发人员的想法,您就可以从中学习。一直为我工作:)


编辑:如果代码非常大,也可以编辑。更高级别的建模有帮助。将代码划分为模块,并了解它们是如何相互连接的。稍后,逐个深入到模块中,并遵循我上面提到的技巧。

首先回答问题:你想做什么

可能的问题

  • 您想评估设计/架构吗

  • 你想修复一个bug吗

  • 实现新功能

  • 可能的办法:

  • 掌握一些静态分析工具:声纳、结构101就是例子。使用这些工具可以获得架构的概述

  • 从bug测试开始(理想情况下是单元测试,但调试器中的会话可以)。开始跟随调试器。不要深入。检查变量值是否存在意外值

  • 查找相关特性,按名称搜索这些特性,并查看它们是如何实现的。忽略所有与手头任务无关的细节

  • ----对问题版本的补充----

    在您不知道的代码库中进行bug修复(并且可能没有广泛的自动测试)始终是一项有风险的业务

    不过,我认为上面介绍的一般方法是可取的。当然,它应该通过测试得到“保护”:

    • 一旦确定了需要进行更改的区域,请检查谁在使用此代码以及以何种方式使用此代码。小心地添加日志语句并运行应用程序可能会达到目的
    • 编写测试以记录当前行为(这些行为应为绿色,并保持绿色)
    • 编写测试,记录更改后的更改行为(以红色开头)
    • 找你的钱。这将使之前的测试变成绿色

    • 运行手动测试以确保应用程序按预期工作

    像往常一样,测试的数量取决于丢失错误的风险。

    我怀疑,如果我将我的理解局限于存在错误的函数/类,我将不会对我的修复有信心

    修复这个bug,如果你的修复破坏了其他东西或者不足以修复它,就责怪代码作者没有编写可维护的代码

    您不必了解所有内容来修复一个片段。

    关于代码考古学,有一个有趣的话题,就是关于这个主题

    有些想法,有些来自那次谈话,有些则不是:

    你有权获得VC回购协议吗?发生了很多变化的热点是什么?这为您提供了一个关于花费大量开发时间的提示

    最大的文件是什么。不幸的是,代码往往会在使用的地方累积,如果不进行拆分,代码就会停留在那里。最大的文件通常也是最重要的文件

    有bug追踪器吗?哪些组件有最多的bug,这也会告诉您问题发生在哪里(由于逻辑的重要性,开发可能集中在哪里)

    一个好的IDE使跟踪变得更加容易,因为您可以跳转到定义并再次返回

    文档生成器,即使没有任何注释,通常也可以对类或函数调用进行良好的图形表示,从而将您引导到正确的位置

    有一种非线性的方法(有点黑客式的、横行霸道的、公认不专业的)来做到这一点——一种遵循面包屑的方法:

    • 选择任意一行代码并继续阅读 直到你找到一些(比如)功能或 吸引你注意力的课程

    • 复制其名称并用注释标记块('found:[name of thing]',递增地添加所跟随的每一项内容)

    • 然后搜索 这个词贯穿整个代码

    • 你会在地图上找到真正的“东西” 这样,请记下哪一行 它的出现和作用

    在您完成这项工作一段时间后(如果该方法适合您),代码背后的思想将变得明显,您有望很快找到所有主要连接

    在最糟糕的情况下,我还搜索并替换了所有名称不好的变量、子例程等的实例,使其更具描述性(然后再次运行代码)

    当然(就像保罗说的)如果