写点什么

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

  • 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:001412
用户头像

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

关注

评论

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

5招详解linux之openEuler /centos7防火墙基本使用指南

华为云开发者联盟

centos7 网络安全 防火墙 openEuler 网络环境

华为阿里下班时间曝光:所有的光鲜,都有加班的味道

程序员生活志

华为 加班 阿里

丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!

Hollis

Java 程序员 后端

不断壮大的电竞生态——英特尔大师挑战赛携手李宁中国选手等你来战!

最新动态

第四届IMC再起烽烟 极致性能助战力升级!

最新动态

中国计算机软件开发合同纠纷分析报告(2019-2)

朱又生

大数据 项目管理 计算机软件开发合同纠纷 风险管理

IMC御用设备到底有多强?英特尔携手掠夺者呈现“飞”一般5GHz电竞盛宴

最新动态

将设计模式应用到日常的curd中-模板方法和装饰器

LSJ

Java 设计 设计模式 装饰器 模板方法

SpreadJS 纯前端表格控件应用案例:医疗行业智能报表系统

葡萄城技术团队

AndroidStudio解决Unknown host 'd29vzk4ow07wi7.cloudfront.net'. You may need to adjust the proxy settings in Gradle

小菜鸟学php

原创 | 使用JPA实现DDD持久化- O:对象的世界(3/3)

编程道与术

Java hibernate DDD JDBC jpa

SpreadJS 纯前端表格控件应用案例:生产采购管理软件

葡萄城技术团队

第十周作业

晨光

软件规模扩张与其组织粒度的进化

superman

中台 微服务 服务化改造

低/零代码的认知误区有哪些?

代码制造者

编程语言 低代码 零代码 信息化 开发应用

最右JS2Flutter框架——动画、小游戏的实现(四)

刘剑

flutter 大前端 探索与实践

中国计算机软件开发合同纠纷分析报告(2019-1)

朱又生

大数据 项目管理 计算机软件开发合同纠纷 风险管理

架构师训练营第10周

大丁💸💵💴💶🚀🐟

中国计算机软件开发合同纠纷分析报告(2019-3)

朱又生

大数据 项目管理 计算机软件开发合同纠纷 风险管理

即大数据后-贵阳能否成为区块链的机遇之城?

CECBC

区块链 大数据 贵阳

获奖名单公布 | 写作平台八月宠粉福利来袭,参与创作领取限时大奖~

InfoQ写作社区官方

写作平台 征稿 热门活动

Linux神器strace的使用方法及实践

华为云开发者联盟

Linux 运维 工具 后端 Strace

微服务的认识

chenzt

信息管理软件需求分析阶段的实践经验及论述(2010年)

朱又生

项目管理 产品经理 需求分析 用户需求调研

Oracle常用命令

阡陌r

娱乐至穷

北柯

学习 互联网 娱乐 抖音

快速学习秘诀:费曼学习法

池建强

学习

RushPlayer“一键下马”系列之-JavPlayer

flow

第十周总结

晨光

如何通过electron构建桌面跨平台音视频应用

ZEGO即构

音视频 Electron RTC

央行清算总中心与三家银行签署区块链福费廷交易平台合作协议

CECBC

区块链技术 人民银行

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