“一晃 20 年,原来我所做的一切都是技术债务,你也一样……”
身为一名程序员,相信大家或多或少都遇到过“技术债务”。
具体来说,这是开发团队为追求短期效益,选择了一个短时间内容易实现的方案——但从长远来看,未来这种方案必将带来额外的开发负担,也就逐渐变成了开发团队所欠的“债务”。
很多开发团队在推进项目时,都会不断强调:“我们不仅要快速推进我们的 MVP(Minimum Viable Product,最小可行性产品),同时尽量减少技术债务!”对此,身为 Indobest Artha Kreasi 首席技术官的 Eddy Christiandy 表示:“我就笑笑,因为无论如何,最终所有东西都会变成技术债务。”
以其自身为例,Eddy Christiandy 分享了他这 20 年来的技术生涯及演变:“如果你不信你的整个职业生涯也会变成技术债务,在读完这篇文章后,你可能会相信。”
(图片下载自视觉中国)
以下为译文:
起初,我用的是 Basic
我的职业生涯是从一名 Visual Basic 6 开发者开始的。从 1999 年到 2003 年,我创建了多个不同的应用程序。我猜你会说,按照今天的标准,任何用 Visual Basic 6 的内容都是技术债务,或早已被取代。
后来,我花了很多时间从事经典的 ASP(动态服务器页面)开发,也一度成为了让网站在 Internet Explorer 6 和 Netscape Navigator 上运行的专家——但这些,在如今的简历上已经没什么意义了!
Visual Basic、ASP、IE6 和 Netscape,都是早已被遗忘的技术。
古老的语言:Perl,Delphi,Fortran,FoxPro,ColdFusion
在过去的 20 多年里,除了 Visual Basic 6 之外,还有很多编程语言都已经“失宠”了。如果你用这些语言建立了任何东西,人们很可能正在想办法重写它,因为现在已经很难找到熟悉这些语言的程序员了:Perl, Delphi, Fortran, FoxPro, ColdFusion。
这些语言中还存在应用程序吗?当然有。但你能雇人来做吗?这很难。在大多数情况下,公司必须对旧应用进行现代化改造和停用。
在 21 世纪初,当时人们认为 Adobe ColdFusion 是最热门的产品,但现在谁还记得它吗?Ruby on Rails 也可能走上 ColdFusion 的老路,它已逐渐失宠,也很难找到它的开发者——曾经 Ruby on Rails 独有的东西,如今已可以在其他语言中使用。
编程语言来了又去,开发人员又不想学习不需要的技能,这始终是一个供应与需求的平衡!于是开发人员迅速跳槽,并总希望能在他们的简历上体现一些热门的技术。
ActiveX、Java Applets、Flash 和 Silverlight 都怎么了?
我制作的第一批应用程序中,有些使用了 Internet Explorer 6 的 ActiveX 控件,当时主要是用它来做打印和其他黑客行为。那时 PDF 还没有那么普遍,从浏览器上打印本身就是一场有趣的“噩梦”。
Java Applets 也曾辉煌过,但它们很慢,想要安装正确的 Java 版本总是很麻烦。我永远不会忘记处理需要 Java Applets 的网络防火墙的噩梦——我并不怀念,幸运的是它们也已经消失了。
当然,我们应该都记得 Macromedia/Adobe Flash!它曾一度是整个互联网的宠儿,有无数的 Flash 游戏以及软件都是用 Flash 的 ActionScript 构建的。有一个叫 CheerpX 的产品现在可以用 WebAssembly 运行旧版本的 Flash 应用程序。
微软推出了一个 Flash 的竞争者,名为 Silverlight。对于 C# 开发者来说,这实际上是一个非常棒的框架,我们公司就用 Silverlight 做了一些不错的事情。
不过众所周知,后来苹果在其浏览器中取消支持 Silverlight 和 Flash,以此结束了它们。
以下是我们 10 多年前在 VinSolutions 用 Silverlight 构建的财务计算器的截图。现在,Silverlight 已经不复存在了,他们用 JavaScript 重写了整个应用程序,但它已经失去了旧版本的魅力!
我的第一个移动应用
我在 2004 年开发了一个移动应用程序。这很难记住,但那时 iPhone 和 Android 还不存在,我为 Compaq PDA 写了一个应用,用于跟踪汽车经销商的库存。它是用 C# 编写的,用于在 Windows CE 上运行 .NET Compact Framework。
这个 PDA 有一个 1 百万像素的摄像头,只要外面是阴天,照片就会略显糟糕——即便如此,这在 2005 年也是最先进的。但现在时代已经变了,这款应用很早以前就被淘汰了。
你最好使用 Swift
Swift 是另一个很好的例子,可以说明开发工具的变化有多快。自从苹果发布了 Swift,再用 Objective-C 编写代码就很难有说服力了。我相信仍有某些使用场景还在使用它,但用 Swift 开发要容易得多,这也是向前迈出的重要一步。
我认为,现在用 Objective C 编写的任何应用程序都可能是技术债务。
WebForms
在构建 Web 应用程序时,编写了疯狂的内联脚本之后,我很高兴能使用新的 Web 表单 ASP.NET,其服务器端控件使开发变得非常容易。它诞生的目标是使创建 Web 应用程序就像在 Visual Basic 6 中一样容易——我认为它基本上成功了!你可以在服务器端建立可重复使用的 UI 组件,并将其渲染到浏览器中。
虽然本质上来说,WebForms 并不完美,但这仍是一个相当大的升级。在 Ruby on Rails 出现并推广用于开发 Web 应用的 MVC(Model-View-Controller)框架之前,它一直都运行良好。
不过,MVC 的出现很快就让我们弃用了所有 Web Forms 应用。因此 Web Forms 中的任何东西也都是技术债务。
MVC 为王!(有一段时间)
在不知不觉中,当时每种编程语言都开始支持 MVC 框架,我们也转而在 ASP.NET MVC 中做一切新事情。它几乎无处不在,包括 Django、Laravel、Symfony、Spring 等等。
但快进到今天,MVC 已经落伍了,现在一切都在 React、Angular、Vue 和其他框架中完成——在我们拥有这些之前,我们还有其他 Javascript 框架。当我在 Stackify 工作时,我们使用了 Knockout,一个当时相当流行的前端框架。
但你还记得这些框架中的任何一个吗?Knockout,Ember,Aurelia,Meteor,,Backbone,Handlebars。
如果你用过其中任何一个,我敢打赌所有这些代码现在都会被认为是技术债务,并且已经失宠了。第一代前端框架们,都输给了 React 和 Angular。
Angular JS
2015 年,Angular 由谷歌创建并迅速将其引入市场,它很快成为了前端框架中最受欢迎的选择。
然后在 2016 年,Angular 经历了一次重大升级,并且不向后兼容——你猜猜这意味着什么?原始版本中的任何东西现在都是技术债务。
在我公司的项目中,我们还在使用旧版本的 Angular,这是我们必须升级的重大技术债务。
“又旧又脏”的 SOAP 和 WCF
在 REST API 和 JSON 成为事实上的标准之前,还有一种选项是 SOAP。它代表简单对象访问协议,使得调用 Web 服务变得容易,并自动生成代理类以正确地调用服务,主要由 Windows Communication Framework (WCF) 在 XML 上使用。
它一直工作得很好…直到它不在了。我职业生涯中最糟糕的一个项目,就是要解决如何在我公司和另一个供应商之间通过 WCF 和 SOAP 使用安全证书。SOAP 和 WCF 都很棒,但随着时间的推移,维护它们简直是噩梦。
SOAP 和 WCF 是我不感兴趣的东西。微软决定不再支持 .NET Core 中的WCF,REST、gRPC 和 GraphQL 现在才是首选。
随着时间的推移,我们用来调用 Web 服务的技术类型已经改变,旧的方式也能用,但大多数人可能更愿意让它们“退休”。
主要语言版本
另一个常见问题是主要编程语言的版本更改。无论是 Ruby、PHP、.NET 还是其他语言,它们通常需要修改一堆代码,甚至重写。
当.NET Core 问世时,它是 .NET 平台最新、最轻、最快的版本,旨在在 Linux 上运行。基本的 C# 代码很容易移植过来,但没有人只将基本代码用于实际应用。
但在复杂的企业应用程序中,想要升级时可能会出现许多潜在的问题。这变成了一个必须弄清楚的主要技术债务,否则你最终会被卡在一个古老的版本上。
也就是说,这些主要版本的更新,最终成为了大型技术债务。
被困在旧的外部依赖中
我们在 Stackify 工作十,遇到的最大挑战之一是:被困在 Elasticsearch 的一个旧版本上。
有一次,他们对 Elasticse 的工作方式进行了一些重大更改,这些更改并不完全向后兼容。而我们大量使用了它,于是所有升级工作都变成了大量的技术债务和升级项目。
我们一次又一次地积累这些工作,最终还是远远落后了——这也是一个可能困扰公司的真正技术债务项目的例子。
开源替代方案,使我的代码“退休”了
在 Stackify 工作室,我们为 6 种编程语言构建了自己的跟踪/分析库。要做到这一点,工作量其实非常大。
结果好了,现在 OpenTelemetry 出现了,一下子把我们的这些工作都变得毫无用处——当你可以用开源行业标准时,为什么要管理你自己的?所以现在 Stackify 正在慢慢消除我帮着构建的 .NET 分析器。
所有代码都将被荒废或替换
随着时间的推移,你可以看到几乎所有你创建的东西都会因各种原因被废止和替换,或者说是基于“旧技术”。
拿我来说,我在职业生涯早期开发的几个应用都被终止了,因为公司被收购后决定使用完全不同的技术。
大多数软件的寿命都是有限的,而且比你想象得要短,所以所有代码最终都会成为技术债务。每个人都希望以更现代的方式重写,也可能业务需求发生了巨大变化。
当然,在企业界更有可能产生似乎能永远存在的内部应用程序,像铁路公司或主要银行,已经用基于大型机的相同软件超过 40 年了。
我预测,WebAssembly 最终会超越如今的前端开发方式,一个全新的世界即将发展起来。
技术债务的现实
人们在做新项目时,总希望能尽量减少技术债务,我很理解,他们是想在让项目变得完美和发挥作用之间找到一个平衡。
然而,不可能不产生技术债务,因为世界上没有完美的东西。随着时光流逝,今天完美的东西在未来将不再完美,要学会忍受不完美的生活。
从另一个角度看技术债务,那就是一切都会慢慢“腐烂”:要么在升级到最新版本时存在重大问题,要么因为出现了更新的东西而失宠。
所以,一切最终都会变成技术债务,或者项目被整个淘汰。如果幸运的话,你的代码能存活足够长的时间,然后成为别人的技术债务。
不过只要有足够的时间,你的所有代码都将被删除。
开发者:“代码最终都会荒废?我认为不是”
Eddy Christiandy 分享的这篇文章在 Reddit 上吸引了许多程序员的关注,也引发了不少人的认同:
▶ “在几年前退休之前,我花了近 40 年的时间编写代码,但据我所知,目前只有一个应用还在用(大约已经用了 6 年)。我所做的其他所有工作,最终要么被取代,要么就是随着公司倒闭消失了。”
▶ “这 25 年来,我一直在相同的代码库上工作。早期我用 C++ 写的一个 Windows 桌面应用目前仍在使用中,但是,它现在的确变成了技术债务。”
不过,也有部分开发者认为这种说法过于武断:
▶ “虽然这种情况很多,但并非所有代码都会被弃用,像医疗设备和控制系统就永远在相同的代码上运行。我从事医疗设备领域,我工作的一家公司大约在 20 年前被收购,目前他们也只是继续运送设备而没有任何重大更新。”
▶ “仍然有汽车带着我 15+ 年前编写的代码跑来跑去。你说代码最终都会荒废?我认为不是。”
与此同时,也有开发者认为这些都不重要:“我已经从事编码 30 多年了,除了上一份工作,我不知道我之前写的任何代码是否仍在使用。不过我也不在乎——只要公司付钱了,让我写什么代码我就写。”
那么,你对于“所有代码最终都会变成技术债务”的说法,有什么看法吗?
参考链接:
https://blog.visionarycto.com/p/my-20-year-career-is-technical-debt
https://www.reddit.com/r/programming/comments/13ihrtx/my_20_year_career_is_technical_debt_or_deprecated/
推荐阅读:
▶百度云首次实现季度盈利;OpenAI 或将发布新的开源语言模型;苹果已注册 xrOS 系统商标|极客头条
▶Stack Overflow 正遭到 ChatGPT 的“暴击”!
▶Windows 11 初尝 Rust,36000 行内核代码已重写!