NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

在系统整体性和微服务方面合理偿还技术债务的指引:来自 Adam Tornhill 的一些思考

  • 2017-04-12
  • 本文字数:1838 字

    阅读完需:约 6 分钟

QCon London 大会上,Adam Tornhill 发表了演讲“合理偿还技术债务的指引(A Crystal Ball to Prioritize Technical Debt)”。他谈到,尽管技术债务预示了软件领域的一场风暴,但大部分机构发现很难合理偿还技术债务。他演讲的要点包括:识别代码复杂度和代码变动热点(hotspots)的方法;通过检查组件或微服务临时耦合之类的方法,对当前系统适用度持续评估的好处;通过检查在版本控制系统中随着代码提交的社交元数据,可以了解到跨团队协作的成本。

Tornhill ,Empear 的创始人和 CTO,引用 Martin Flower 的一句话开场:“像金融债务一样,技术债务也需要支付利息,这会导致你不得不在将来的开发中付出更多的精力”。关于这点,他陈述了三个观点:技术债的利息率与花费在系统上的时间相关;技术债都不尽相同;大部分技术债其实都不是因为技术——技术债往往与产出代码的组织架构有很强的关系。

Tornhill 接着建议到,如何高效合理地偿还技术债务,你所需要知道的信息和需要思考的问题包括:

  • 代码库中技术债利息率最高的点在哪?
  • 当前技术架构能否支撑系统的演化之路?
  • 跨团队协作方面是否有生产力瓶颈?

技术债利息率最高的代码也许可以通过使用热点(hotspot)分析法来发现,它们可以用来形象地表示为代码库中规模大、复杂、耦合度高的区域。代码的规模和复杂度可以通过传统的工具检测出来,例如 Sonar Qube 或者 Code Climate 。耦合度和其他协作信息,可以通过使用类似 Tornhill 的 Code Maat 工具在代码库所在的版本控制系统中获得。类似 Mosse CodeScene 的可视化分析工具,可以用来研究并理解热点分析的发现结果。

Tornhill 说,“所有代码都是平等的,但是有些代码比其他代码更平等一些”。这句话引自 George Orwell 的《动物庄园》(Animal Farm),但被 Tornhill 做了些幽默的改动。他然后以图片的方式演示,在较长时间段内,一些很流行的语言的代码库中耦合度最高的代码,都分布在某些代码区域内(伴随着一条长长的尾巴)。以.NET 开源项目 coreclr 中的 gc.cpp 文件为例,耦合代码在功能 / 方法级别和类 / 文件级别分布得一样多。他这里总结到,建议优先重构所有这些热点来减少技术债的利息率,同时持续监控这些代码相应的代码复杂度趋势。

接着,他针对“当前技术架构能否支撑系统的演化之路”这一问题进行了探讨。每个系统都有一个引爆点(tipping point),那里的代码复杂度会增加到无法控制,并且非常难以修改。他建议,应该经常监控系统复杂度,找出引爆点并通过优先安排系统重构来避免引爆点的出现。分析临时性耦合(Temporal Coupling)对于找出引爆点非常有用。如果两个或更多的组件(类、层、模块、微服务)经常在同一时间被修改,这就意味着一种架构层面的依赖关系。这种依赖关系不太容易通过单纯地分析代码本身发现。“微服务散弹修改模式(microservices shotgun surgery pattern)”应该被及时发现和避免。如果在新增或修改应用功能时,经常需要跨多个服务之间的协调修改,那么说明服务架构边界也许设置得不合理。

Tornhill 发言的最后部分集中在软件开发社交方面。他首先介绍到,在代码库上协作的所有开发人员的潜在生产力,通常有很高的过程损失(process loss)。团队协作,或者职责分配,可以通过 VCS 分析测量,以此找出跨多个团队的开发者都有提交操作的代码区域。Tornhill 建议到,这是可视化和测量“ Conway’s Law ”的一种方法。职能型团队架构会导致代码库中的很大区域需要跨团队协作,这通常成本很高并且会导致代码规范和风格不统一。Tornhill 强烈建议“系统架构要与组织架构相协调”,以此减少技术债务。

Tornhill 最后强烈建议依据数据来进行系统设计、实现和重构决策。Tornhill 认为,由于系统复杂度会在开发过程逐渐增加,因此依据数据来进行决策将成为一个必需的惯例,相应地,他已经将这些想法浓缩为《程序员修炼之道》(Pragmantic Programmer)系列的一本书“《代码即犯罪现场》(Your Code As a Crime Scene)”。

Adam Tornhill 在 QCon London 上演讲的幻灯片,“合理偿还技术债务的指引(A Crystal Ball To Prioritize Technical Debt)”,以及对外公开的大会演讲记录,都可以在QCon London 大会的网站上找到。

查看英文原文: A Crystal Ball to Prioritise Technical Debt in Monoliths or Microservices: Adam Tornhill’s Thoughts


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-12 19:001476

评论

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

kubernetes入门:可视化界面dashboard极简安装教程

小鲍侃java

8月日更

写作 7 堂课——【3. 碎片式写作】

LeifChen

时间管理 写作技巧 8月日更 碎片化 心流

架构实战营模块4作业

子豪sirius

架构实战营

番外3. Python OpenCV 中如何绘制各种图形?

梦想橡皮擦

8月日更

手撸二叉树之二叉树的最大深度

HelloWorld杰少

数据结构与算法 8月日更

Python代码阅读(第6篇):根据给定的函数对列表中的元素进行分组

Felix

Python 编程 Code Programing 阅读代码

架构实战营模块 4 作业指导

华仔

架构实战营

golang--切片(slice)

en

slice Go 语言 切片

千万级学生管理系统试卷存储场景

张文龙

#架构实战营

模块四作业

king

【Vue2.x 源码学习】第二十九篇 - diff算法-节点比对| 8月更文挑战

Brave

源码 vue2 8月日更

架构实战训练营模块四作业

NewBranSTONE

架构实战营

printf函数的常用格式化输出

Changing Lin

8月日更

Vue进阶(十九): ES6 箭头函数

No Silver Bullet

Vue 箭头函数 8月日更

模块四作业:千万级试卷结构设计

buoge

iOS官方瘦身方案ODR(二):换肤系统改造|践行 On-Demand Resources

LabLawliet

ios 独立开发者 apple 优化技巧 8月日更

电商秒杀系统设计方案

Lane

搜索二维矩阵②

Memorys

Java 面试 算法

架构实战营基于redis哨兵模式的考试数据存储设计

慕溶枫

#架构实战营

prometheus介绍与安装

Rubble

Prometheus 8月日更

python--语句的多样性

加里都好

软件测试基础面试常问问题

程序员阿沐

面试 软件测试 自动化测试 经验分享 测试工程师

架构实战营总结

Lane

FastApi-08-路径参数校验

Python研究所

FastApi 8月日更

毕业设计

青鸟飞鱼

十大排序算法--计数排序

Ayue、

排序算法 8月日更

🏆【Git 实战专题】你知道git rebase如何让代码提交变得清晰明白吗?

洛神灬殇

git Rebase git rebase 8月日更

理解 defer、panic 和 recover

Rayjun

Go 语言

阿里云-云开发平台计算篇——加强应用本身的计算能力

若尘

阿里云 云开发 8月日更

毕业总结

梦寐凯旋

#架构实战营

架构实战营第四周作业——考试试卷存储

发酵的死神

架构实战营

在系统整体性和微服务方面合理偿还技术债务的指引:来自Adam Tornhill的一些思考_架构_Daniel Bryant_InfoQ精选文章