写点什么

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

  • 2016-05-15
  • 本文字数:1714 字

    阅读完需:约 6 分钟

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

2016-05-15 19:001436
用户头像

发布了 1008 篇内容, 共 392.7 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

大作业

Denny-xi

产品经理 产品训练营作业

大作业

z

大作业6

YING꯭YING

年薪千万的产品经理打开了我对这个职位的新认知!

冰河

深度思考 程序人生 产品经理

翻译:《实用的Python编程》06_02_Customizing_iteration

codists

Python

算法攻关-爬楼梯最小花费_0076

小诚信驿站

刘晓成 小诚信驿站 28天写作 算法攻关 爬楼梯最小花费

从容一些,不必赶「Day 25」

道伟

28天写作

产品经理介绍产品

lenka

3月日更

uc01. 备案合同

新盛

第 8 周作业 _ prd

园子

初识Golang之语法基础介绍

Kylin

读书笔记 3月日更 Go 语言

ECMAScript 2017(ES8)新特性简介

程序那些事

ecmascript 程序那些事 ecmascript 2017 es8

“时间”都去哪儿了?性能调优分析方法与案例详解

京东科技开发者

数据库 客户端

篮下有球-用例

z

让“程序猿”抓狂的合并单元格

IT蜗壳-Tango

办公自动化 3月日更 IT蜗壳教学

强软弱虚——Java中的引用类型

少平

Zookeeper.03 - 实现分布式锁

insight

zookeeper 3月日更

GoPath模式和GoMoudle模式的相爱相杀

happlyfox

28天写作 3月日更 Go 语言

知识图谱上的图神经网络

博文视点Broadview

大作业—产品文档

三笠

产品

大作业--APP的注册与登录

王一凡

产品经理训练

架构实践全景图

博文视点Broadview

上万字详解Spark Core(建议收藏)

五分钟学大数据

大数据 spark 28天写作 3月日更

大作业附件1

三笠

网上签约备案系统-需求文档

新盛

Wireshark 数据包分析学习笔记 Day14

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

什么时候编程语言不重要

soolaugust

编程语言

C/C++ 性能优化背后的方法论:TMAM

vivo互联网技术

c c++ 性能优化 cpu

故事开始了,Python 图像算法取经之旅 365 天的第 1 天

梦想橡皮擦

28天写作 3月日更

《Redis核心技术与实战》学习笔记 01

escray

redis 学习 极客时间 28天写作 3月日更

少些爹味才是好爹——再谈自主性

Justin

心理学 教育 28天写作 游戏设计

借助软件演化理解大型代码库_架构_Ben Linders_InfoQ精选文章