写点什么

在系统整体性和微服务方面合理偿还技术债务的指引:来自 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:001903

评论

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

InPlant SCADA笔记 图形控件

万里无云万里天

工厂运维 InPlant SCADA

使用京东API接口适用于的环境及验证调用合法性的方法

Noah

InPlant SCADA笔记 配方功能

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 数据库中本地节点创建modbus tcp驱动

万里无云万里天

Modbus Tcp 工厂运维 InPlant SCADA

InPlant SCADA笔记 新建第一个工程

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 用户权限

万里无云万里天

工厂运维 InPlant SCADA

Zilliz Cloud✖️Ivy.ai:构建 GenAI 驱动的聊天业务

Zilliz

人工智能 Milvus Zilliz 向量数据库 大语言模型

国外的远程控制软件哪个好

科技热闻

低代码平台在现代人事管理系统中的应用与优势

天津汇柏科技有限公司

低代码 人事管理系统

Cyble被Frost & Sullivan评为全球网络威胁情报市场的创新领导者

财见

InPlant SCADA笔记 数据库中添加位号,读取modbustcp设备的值并显示在流程图

万里无云万里天

Modbus Tcp 工厂运维 InPlant SCADA

InPlant SCADA笔记 数据库中使用modbustcp在线调试来读取modsim32中的值

万里无云万里天

Modbus Tcp 工厂运维 InPlant SCADA modsim32

IBM 发布《2024年数据泄露成本报告》:企业数据泄露成本创新高,AI和自动化成为"数据保卫战"突破口

财见

InPlant SCADA笔记 数据标签控件

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 事件配置

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 数据库管理中位号的批量导出

万里无云万里天

工厂运维 InPlant SCADA

大模型数据分析平台 LangSmith 介绍

心有千千结

LLM #LangChain

InPlant SCADA笔记 历史趋势

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 使用位号分组来管理位号

万里无云万里天

工厂运维 InPlant SCADA

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