借助软件演化理解大型代码库

  • Ben Linders
  • 谢丽

2016 年 5 月 15 日

话题:架构文化 & 方法

GOTO 阿姆斯特丹 2016 大会上,《代码即犯罪现场》一书的作者 Adam Tornhill 将介绍如何借助“软件演化(software evolution)”理解大型代码库。

InfoQ 采访了他,内容涉及软件演化、从代码挖掘社交信息、如何使用这些信息加深对大型代码库的理解、如何创建代码地理分析以及类似社交信息挖掘和地理分析这样的技术所带来的好处。

InfoQ:您能解释下软件演化是指什么吗?

Tornhill:软件演化是指理解代码库如何变得越来越大。实际上,代码库的演化遵循特定的模式。有些模式不错,但有些模式预示着严重的维护问题。我的方法是分析代码库的历史。一旦我们了解了过去,我们就会获得大量有用的信息。这些信息让我们可以发现生产力瓶颈、难以维护的部分,甚至是代码库中可能引入缺陷的部分。

InfoQ:您能举例说明下如何从代码中挖掘社交信息吗?

Tornhill:当然,我们可以从代码演化中提取许多信息。例如,我们可以构建代码库的知识地图。知识地图可以显示出,在代码的不同部分,哪位程序员做的工作最多。我利用这些信息简化沟通过程,保证我找对了谈论设计的人,或者只是推断系统的知识分布。

以此为基础,我们可以对数据做各种有趣的分析。我最喜欢做的分析是识别存在过度并行开发的代码,就是那些总是有多名程序员在修改的代码。这样的代码存在引入缺陷的风险,可能会导致协作瓶颈,同时,这表明存在设计问题,因为代码频繁修改总是有原因的。

InfoQ:社交信息挖掘如何加深对代码库的理解?

Tornhill:在 Empear,作为日常工作的一部分,我分析了大量的代码库。我经常会发现,组织问题被误认成了技术问题。主要的原因是代码本身包含的社交信息不可见。那导致我们把注意力放在了解决错误的问题上。让我们看一些具体的例子。

不同的组织往往会遇到一些相同的问题。例如,我见过许多这样的情况,不同特性的分支难以合并,发布质量难以预测,人们抱怨代码难以理解。不过,结果往往证明,真正的问题是社交;在如何设计系统和实际上如何编码之间存在偏差。例如,关注技术解决方案,如更好地合并或比较工具,只能帮助你缓解症状。相反,要想真正实现改进,第一步是判断和理解问题背后的真正原因。

InfoQ:在 QCon 伦敦 2015 大会上,您在题为“将代码视为犯罪现场”的演讲中解释了如何构建代码地理分析。您能简单地描述下这是如何操作的吗?

Tornhill:大多数有关代码质量的讨论都是以代码复杂度为中心。然而,复杂度只有在你需要解决它的时候才成为问题。如果你观察下有关我们的代码如何变得越来越大的数据,就会发现我们的开发工作往往都集中在相对较少的几个模块上;大部分的代码很少触及。就是说,我们喜欢优先改进那些我们做工作最多的代码部分。这实际上是一个大难题。

我曾参与过取证,我发现,犯罪调查员面临的问题同我们类似,都是开放性的大问题。我在演讲“将代码视为犯罪现场”中介绍的技术就是基于识别犯罪现场地理分布模式。以此为基础,我将同样的基本原则应用到了代码上。我使用代码库历史来识别我们做工作最多的代码部分,并结合代码复杂度的基本度量。我将这两个维度的重叠部分称为“热点”。热点代表经常使用的复杂代码。在设定改进 / 重构优先级时,热点分析是一个很棒的工具,而且它还可以确保我们获得了实际的效果。

InfoQ:类似社交信息挖掘和地理分析这样的技术有什么好处?

Tornhill:有多个重大的好处。最明显的是,这样的信息可以帮助我们专注于最需要的改进。另一个好处是,我们可以用数据支撑我们的决策。我认为,这是软件行业落后于许多其他学科的一个关键点。

最后,我们能够从演化途径获取的是那些我们无法从代码本身获取的信息。例如,使用代码历史,我们能够发现高级的变更模式,根据架构原则对它们进行评价,看看它们和我们的组织方式的匹配程度。代码的静态结构不包含任何的时间概念。当我们了解了过去,我们就可以增加那个缺失的维度,并且能够更高效地推断我们的工作方式。这是一个激动人心、充满希望的领域。

GOTO 阿姆斯特丹 2016 大会将于 6 月 14-15 日举行。这是一个由从业者推动的企业软件开发大会,面向团队负责人、架构师和项目管理人员。InfoQ 将以 Q&A、概要和文章的形式对大会进行报道。

查看英文原文Understanding Large Codebases with Software Evolution

架构文化 & 方法