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

  • Daniel Bryant
  • 张健欣

2017 年 4 月 12 日

话题:架构语言 & 开发

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工具在代码库所在的版本控制系统中获得。类似MosseCodeScene的可视化分析工具,可以用来研究并理解热点分析的发现结果。

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)关注我们。

架构语言 & 开发