写点什么

入职阿里 5 年,他如何破解“技术债”?

  • 2020-06-24
  • 本文字数:2448 字

    阅读完需:约 8 分钟

入职阿里5年,他如何破解“技术债”?

作为一名技术人,你常常会听到这样的话:


“先快速上线”


“没时间改”


“再缓一缓吧”


“以后再解决”


“先用临时方案处理”


……


当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同 “人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。”


作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码库复制,似而不同的应用比比皆是。



图片来源:


https://www.monkeyuser.com/


当新人加入团队,老人总要顶着新人鄙夷的目光解释:当初是什么原因,才导致系统设计得如此丑陋。一边是产品经理突然心血来潮的需求变动让人暴跳如雷,一边遗留代码和遗留系统让人望而生畏,直到有一天整个崩溃,也不知道锅落谁家。


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


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

一、技术债是什么?


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


经济债务相对容易衡量,只需要计算归还多少本金和利息。而技术债更像不规范的高利贷,不仅不容易衡量,而且很容易陷入无限还债的深渊。


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


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

二、 技术债的恶性循环


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


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


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


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


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

三、技术债是如何产生的?

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


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


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


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

四、如何解决技术债

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


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


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



图片来源:https://www.jarchitect.com/


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

解决技术债的方案

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

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


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


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

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

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


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

后记

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


本文引用:


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


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


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


2020-06-24 19:123073

评论

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

PAGC2023 金帆奖 | 融云三度荣膺「年度优秀出海产品技术服务」奖

融云 RongCloud

网络 通信 融云 PAGC

英特尔Flex系列GPU支持数字内容创作,提高创意生产力

E科讯

客户案例|某知名连锁咖啡品牌点餐小程序排障实录

观测云

可观测性 观测云 云原生可观测 可观测性用观测云

如何实时统计最近 15 秒的商品销售额|Flink-Learning 实战营

Apache Flink

大数据 flink 实时计算

单元测试|Unittest setup前置初始化和teardown后置操作

霍格沃兹测试开发学社

HttpRunner

接口测试|Fiddler介绍以及安装

霍格沃兹测试开发学社

fiddler

建设数字工厂:华为云数字工厂平台接入第三方网关设备数据

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

接口测试|HttpRunner header处理以及发送post请求

霍格沃兹测试开发学社

HttpRunner

上新!智能分析云助力【消费品行业】实现数智驱动

用友BIP

数据分析

TDengine 3.0.5.0 正式发布,系统稳定性进一步提升

爱倒腾的程序员

涛思数据 时序数据库 ​TDengine

如何使用敏捷工具管理敏捷缺陷

顿顿顿

Scrum 敏捷开发 缺陷管理

敏捷项目管理流程及工具

顿顿顿

敏捷项目 敏捷项目管理 敏捷工具 scrum敏捷工具

如何用好数智员工实现轻松采购?

用友BIP

数智底座 Pass平台 采购云

这样的全面预算体系才能构建一流财务体系!

用友BIP

全面预算

性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析

袋鼠云数栈

数据湖 Hudi 企业号 6 月 PK 榜

将 NGINX 部署为 API 网关,第 1 部分

NGINX开源社区

nginx 网关 NGINX Kubernetes Gateway

SaaS产品如何用好大模型?腾讯云给出了一个参考答案

ToB行业头条

2023京东全球科技探索者大会暨京东云峰会来了!

京东科技开发者

人工智能 AI 京东云 AIGC 企业号 6 月 PK 榜

【有奖征文 】AI编程:华为云CodeArts Snap入门体验

人工智能 AI

中原银行 OLAP 架构实时化演进

Apache Flink

大数据 flink 实时计算

接口测试|HttpRunner接口关联与常用断言

霍格沃兹测试开发学社

HttpRunner

WorkPlus AI助理正式上线!为企业打造定制化的AI私有助理

BeeWorks

ZEGO 即构音乐场景降噪技术解析

ZEGO即构

音视频

华为云AI实战训练营即将截止,赶紧报名,不要错过!

云计算 华为 华为云 华为云开发者联盟

火山引擎DataTester:企业如何使用A/B实验优化商业化能力

字节跳动数据平台

A/B 测试

Run in PaddleX 2.0,一站式搞定飞桨精选模型开发全流程!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨

接口测试|HttpRunner获取响应数据&extract提取值到变量

霍格沃兹测试开发学社

HttpRunner

国内外常用的Scrum敏捷看板工具

顿顿顿

Scrum 敏捷开发

软件测试/测试开发丨学习笔记之Python运算符

测试人

Python 程序员 软件测试 运算符

ABAQUS 在按键手感分析中的应用

思茂信息

软件设计 abaqus abaqus软件 abaqus有限元仿真 有限元仿真技术

接口测试|HttpRunner环境变量与跨文件输出传递变量

霍格沃兹测试开发学社

HttpRunner

入职阿里5年,他如何破解“技术债”?_文化 & 方法_技术琐话_InfoQ精选文章