查看原文
其他

阿里技术专家都铎:一文搞懂技术债

The following article is from 阿里巴巴技术质量 Author 都铎



阿里巴巴技术质量

读完需要

6分钟

速读仅需 2 分钟

阿里 QA 导读:先快速上线、没时间改、再缓一缓吧、以后再解决、先用临时方案处理……埋下的坑越来越多,不知道哪天哪位同学会踩上一颗雷。
特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。”

作为一个程序员,我们反对复制粘贴,但是我们经常见到相似的代码到处都是,相同的二方包多个版本,整个代码库复制,似而不同的应用比比皆是。当新人加入团队,老人总要顶着新人鄙夷的目光解释当初因为什么原因系统设计的如此丑陋。一边是产品经理突然心血来潮的需求变动让人暴跳如雷,一边遗留代码和遗留系统让人望而生畏,直到有一天整个崩溃,也不知道锅落谁家。

渐渐的我们学会了用技术债当借口“之前欠了太多债,所以开发慢,历史遗留问题,我也没办法”,渐渐我们失去了对开发热爱的灵魂,只剩下痛苦而缓慢的完成业务的躯壳。

这一切的一切背后都是技术债带来的问题。作为程序员的我们,听到《没有理想的人不伤心》“我不要在失败孤独中死去”,我们一样会热血沸腾,一样想要迎难而上,所以今天就让我们搞懂技术债,进而搞定技术债。

1


   

技术债是什么?

技术债 1992 年被沃德·坎宁安提出来。在金融领域通过短期的借贷获得充足的资金加快发展,代价就是除了本金之外还要付出利息。软件领域也是一样,为了尽快上线,暂时不顾代码质量欠下技术债,在今后的开发持续的降低开发效率,就像还利息一样。

经济债务可能很容易衡量,包括具体需要归还多少本金和利息。而技术债更像不规范的高利贷,不仅不容易衡量,而且很容易陷入无限还债的深渊。

我们经常会把代码称之为宝贵的资产,因为技术债在代码层面的普遍存在,所以我们也可以说,代码就是债务。只要你是程序员,可以说你的一生都会被技术债所影响。

所以技术债本身是对项目或者代码质量的重要衡量指标。

2


   

技术债的恶性循环

  • 首先,技术债肯定会不断地降低开发效率,每加一个功能都困难重重,进而拖慢业务进度。

  • 之后,业务上的挫败感会给程序员自身带来更大的挫败感。就像每天被人上门讨债的负债者,当杨白劳的滋味相信没人喜欢。

  • 再之后,团队开始无休无止的争论,新人想要改革,老人害怕风险,每个人固守自己的业务不敢接受升级,N 变更带来的 N*N 的风险,没人愿意承担。

  • 在这之后,长期技术不升级导致技术落后,这个团队的技术竞争力下降,每个人都能感受到团队无论是技术能力还是商业价值都在下降,进而导致更大的挫败感。

  • 最终,上面这些问题还是会反过来影响业务,影响商业价值,让整个团队陷入恶性循环之中,最怕人才流失,又让新人更难融入。当团队(公司)业务(商业)价值降到最低的时候,也就是宣告解散(破产)的时候。

3


   

技术债是如何产生的?

  • “复制-粘贴式开发模式。” 技术债的认为感知是有延迟的,就像你在高速上超速开车,知道一周之后你收到罚单才知道自己要付出代价了。很多团队不顾后果的复制粘贴,直到体会到业务发展缓慢,但是已经来不及了。

  • “我们必须马上上线。” 技术界流传最广的三大借口,“我们的领域非常复杂,所以我们有很陡峭的学习曲线”,“我们的情况特殊,所以没办法写单元测试”。“我们时间紧急,必须尽快上线”。首先这些假设从来没被证明过,其次假设“我们时间紧迫,所以必须牺牲质量”成立,但是不代表着“牺牲质量就能赶时间”。最后,在一个必须马上上线的论调充斥的团队中,那些想要做更多重构和更优设计的人会有深深地负罪感,陷入不断创造技术债的怪圈。

  • “我们暂时赶一下进度,后面再重构。” 如果能够经过合理分析,为了短时间赶工做出一定的牺牲,后面在有计划的重构升级,技术债本身并不一定是全是坏事。但是很多时候这句话成了空头支票,结果就是变成了上一种恶性循环。

  • “解决问题的最好办法是写代码。” 我们最喜欢的一句话就是“用代码改变世界”。但是恰恰相反的是,如果能够不写代码就能解决问题,才是最好办法。我们喜欢崇拜代码量,但是无休止的复制黏贴带来的大量代码不但没有价值,反而带来更大的成本。

4


   

如何解决技术债

4.1


   

让技术债可衡量是解决技术债的第一步


根据观察者效应,将问题暴露出来本身就是一种解决问题的办法。人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。

  1. jarchitect 是一款根据一定的规则,评估代码技术债的工具。可以在平时开发中,不断的观察技术债的变化。

  2. 同时因为很多“复制-粘贴式”代码是跨代码库的,所以评估工具也只能参考,最好能够多仓库横向对比

4.2


   

解决技术债的方案

直接宣布破产(整个重写) 下线老的系统,用新的系统替代,很多团队都这么干过。尤其当你接手了一个很老的遗留系统,维护成本高,新特性需求积压严重,用新的系统替代可能是更好的办法

向后兼容的不断迁移 新做一个系统兼容老的功能,或者直接在老的系统中直接加入新的流程,在测试用例的保证下,将功能随着业务升级一点一点的迁移,慢慢放弃老的系统,删掉代码,最后完成整个升级,将技术债像手术一样切除掉。

4.3


   

最后,请不要再引入技术债

可以参考技术债产生的原因,所有的因素都是想法的偏差,只要调整正确的态度,技术债就是可以规避的。

5


   

我在阿里五年的技术债解决经历

回想我加入阿里的五年时间,第一个系统就是在做这个系统重写的迁移,老的系统已经严重导致业务发展迟缓,这时候用到的就是“破产清算”,系统重写的方式。

后面做另一个系统,随着产品的增多,应用不断增加,最后我们用一个应用承接了所有业务,将老的应用全部下线,做了整个向后兼容的迁移。

后记最近读了一篇文章《二十年的编程,教会我的五件事》,发现作者作为一个咨询师的角度在几年的时间内写了很多关于软件项目的文章,其中几篇技术债的文章以我的英语读起来很困难,所以为了搞懂技术债,决定边翻译边学习。

本文引用:

[1]https://www.monkeyuser.com

[2]https://www.jarchitect.com

[3]https://daedtech.com/5-things-ive-learned-in-20-years-of-programming

扩展阅读


   

架构师成长系列

Erik Dietrich:二十年的编程,教会我的五件事! 2020-09-22

支付宝研究员兼OceanBase总架构师杨传辉:我在数据库梦之队的十年成长路2020-09-21

Mobvista首席架构师蔡超:工作感悟之失败与成功,我的8点总结2020-09-20
奈学教育CEO孙玄:成为一个有情怀的工程师,我的12点思考2020-09-19
架构师,是否需要写代码?2020-09-18
Netstars CTO陈斌:架构师的成长之路2020-09-17
阿里技术专家麒烨:修炼测试基本功2020-09-16
爱奇艺数据中台负责人马金韬:数据中台建设与应用2020-09-14
数之联CTO方育柯:技术的意义在于成就他人2020-09-13
东方证券首席架构师樊建:企业微服务架构转型实践2020-09-12
红帽资深解决方案架构师魏新宇:云原生应用构建之路2020-09-10
苏宁智能 BU大数据中心数据治理团队负责人韦真:数据治理“三字经”,超实用!2020-09-09
蚂蚁资深算法专家周俊:从原理到落地,支付宝如何打造保护隐私的共享智能?2020-09-08
阿里高级技术专家箫逸:如何画好一张架构图?2020-09-07
阿里巴巴闲鱼架构负责人王树彬:万亿交易规模技术架构实践2020-09-05
58转转技术总监骆俊武:监控系统选型?必读本篇!2020-09-04
蚂蚁集团高级架构师郭援非:分布式数据库是金融机构数字化转型的最佳路径2020-09-03
工行高级经理林承军:工行基于 MySQL 构建分布式架构的转型之路2020-09-02
平安银行吴建峰:RocketMQ 在银行的应用和实践2020-09-01
阿里高级技术专家张建飞:应用架构分离业务逻辑和技术细节之道2020-08-31
   END     
#接力技术,链接价值#
点分享点点赞点在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存