软件开发越来越糟?


内存越来越大,空间却越来越小!

原文链接:https://stackoverflow.blog/2023/01/30/is-software-getting-worse/

本文为 CSDN 编译整理,未经授权,禁止转载!


作者 | Isaac Lyman 译者 | 弯月
责编 | 梦依丹
出品 | CSDN(ID:CSDNnews)

最近,我偶然间读到Nikita Propokov的一篇文章《软件幻灭》(https://tonsky.me/blog/disenchantment/)。这不禁让我想起了 Maciej Cegłowski 的帖子《网站臃肿危机》(https://idlewords.com/talks/website_obesity.htm),以及其他几篇类似的帖子。

越来越多的软件开发人员认为,如今的应用程序规模越来越大,速度越来越慢,问题越来越多。然而,以这个时代的硬件水平,我们理应能够编写出更快、更小、更健壮的应用程序。DOOM,于 1996 年问世,就能在怀孕测试仪(https://www.cnet.com/culture/programmer-makes-original-doom-playable-on-pregnancy-test/)以及其他上百种意想不到的设备上运行。而另一方面,时至 2022 年,聊天应用程序在后台运行时居然会占用 0.5GB(甚至更多)的内存,有时甚至会让设备完全失去反应,即使在高端硬件上也是如此。

对于这个主题的帖子,人们普遍认为 80% 的批评是公平合理的,还有 20% 只不过是没病空呻吟。

大多数开发人员都知道,千万不要说“这只是一个智能手机操作系统,能有多难?”之类的话。或者,“90 年代的电子表格应用程序只需要 10 KB,为什么这款应用需要一个G?”若非亲手构建应用程序,你永远无法想象其复杂性和困难程度。

但这并不意味着,我们不能进行客观的批评。如今的应用程序的的确确比以前更慢了,而且还在没有相应增加价值的情况下呈指数增长。其实,几乎所有现代应用程序都可以被优化。我们可以提高它们的速度,甚至可能提高几个数量级。我们可以删除代码。我们可以编写微型的、专门构建的库。我们可以找到压缩文件的新方法。

但为什么我们没有这么做呢?

Propokov 的答案是“软件工程师并没有为自己的工作而感到自豪”。这句话虽有一定的道理,但我坚信,努力工作并出色地完成任务是人类的自然天性,只有当某些事情反复阻碍时,我们才会失败。因此,与其抱怨人类的懒惰,并以此来解释为什么如今的软件如此缓慢且有缺陷,我们更加应该思考:“什么样的力量和驱动力创造的环境导致软件工程师很难全力以赴做好自己的工作?”

对此,我有几个答案。


速度、可靠性以及磁盘占用空间并不能吸引客户


在工程师眼中,软件是由交互组件、输入和输出构成的网络。这个模型既准确又实用。然而,这并不是打包、营销或销售软件的方式。对于商人和客户来说,软件就是一系列功能。

以库存管理应用程序为例。营销会大肆展示高分辨率的库存照片、大胆的色调,以及各种功能亮点:

  • 跨多个仓库跟踪库存;

  • 与物流、供应链以及销售系统集成;

  • 多层次的周次以及月度报告;

  • 细粒度的访问和安全控制;

  • 所有终端的即时更新;

  • 可在 Windows、MacOS 和 Linux 上运行。

这些陈述都是可证伪的,也就是说,我们只需要一个小时的演示,就可以证明软件能否做到这些。但只有一条与速度有关。软件实际上可能非常慢,需要几秒钟才能响应按钮点击,但依然可以保证“即时更新”。

速度会影响用户对应用程序的整体体验。速度是质量的重要标志,但这个特性很难吸引人。如果你花大量时间优化核心流程,而竞争对手正在开发一种新型报告,那么有可能接下来你会因此而损失大量客户。针对现有客户调查一下,你就会发现,当问及下一步应该开发什么时,他们大多会要求功能,而不是速度,除非软件太慢以至于无法使用。再者,董事会根本不可能允许公司暂停现有的产品开发计划,抽出六个月的时间来处理技术债务。功能、功能、还是功能,我们身上的这些压力从未减轻。

程序员希望编写快速的应用程序。但市场根本不在乎

你可能注意到,上述我们没有提及可靠性。有谁敢说自己的应用程序没有bug?我们根本没有办法确保这一点,更不用说通过产品演示证明了。难道我们要说“90%的单元测试覆盖率和全套集成测试?”谁能明白这意味着什么,而且如果你向他们解释,他们会感到无聊。我们无法向客户解释可靠性,让他们相信你的说辞,同时又对这个话题感兴趣。敏捷时代告诉他们,bug是不可避免的,你只能努力修复。由于没有全面的方法来衡量软件中的缺陷,因此不能将其作为比较产品的特性。我们投入时间来测试、重构和改进,但可能完全不会有人注意到。

程序员希望编写没有bug的应用程序。但市场根本不在乎

另外,上述我们也没有提到磁盘使用情况,尽管有时我们会在“下载”按钮下方用一行小字显示下载文件的大小。与上述功能亮点相比,磁盘使用情况在客户心目中的影响力太小。上一次,你因磁盘空间不足而责怪开发人员(而不是自己的计算机)是什么时候?你是否会根据下载文件的大小选择视频游戏?可能永远不会。你会发现有人抱怨最新的《使命召唤》太大,但新版发布的那一周仍然赚了 10 亿美元。

减小可执行文件或输出包的大小是吃力不讨好的工作。但这通常是一项技术含量很高的工作,不仅需要了解正在构建的应用程序,还需要了解其依赖的数百个较低级别的库。此外,通常我们并不鼓励这项工作,部分原因是这是一个雷区。你也许并不了解某一行代码的作用,但这并不意味着它没有用。也许这样做只会造成在智能手机上运行Ubuntu的那0.01%的用户出问题。但也许你付出了大量努力,最后不过是防止应用程序在每四年一次的闰日崩溃。即使是最小的工具函数最终也会发展成公司智慧的产物。我们没必要惹这种麻烦。

一些程序员希望编写更小的应用程序。但对市场或我们来说,这样做并没有好处


消费类软件被低估


分发应用程序并不难。互联网的诞生或多或少正源于此。但销售应用就像拔牙。大众愿意花 15 美元买一个三明治或一张电影票,即便碰到烂片也只能一声叹息,但面对感兴趣的应用,即便只需要 1 美元,他们也会犹豫不决。只有两种人群愿意为优质的软件付费:企业和游戏玩家。不知为何,我们所在的世界其他人都希望软件免费。

这种期望对消费应用的质量造成了破坏。构建一款应用所需的成本大约为 5 万~50 万美元。如果你无法让用户付费,那么就必须通过其他方式收回成本。以下这些因素是导致 Web 和原生应用膨胀和缓慢的最主要原因:用户跟踪、广告、营销漏斗、捆绑销售、付费订阅、针对上述所有内容的反制措施,以及其他上百个不太体面的收入来源。人们往往以为这些都是因为商家的贪婪,但其实大多数时候都是因为他们很绝望,没有更好的方式。互联网上的一些流行网站,大多只能勉强维持。

我并没有夸大这样的系统造成的浪费和低效率。如果按照合理的价格发布一款独特、高质量的应用,结果往往是无人问津,下载量为 0。于是,你只能以免费试用/订阅模式重建。然而如此一来,即便下载此次达到数百次,也只有少数用户愿意转为付费,这些收入不足以支撑你的开销。那么,接下来,你只能在免费版本中投放广告,虽然 UI 设计师可能会极力反对。然而,即便这样,你也会发现广告浏览获取的收入仅为几分钱。于是,你只能投放更多的广告。然后,用户就会抱怨广告太多,因为在他们看来,你应该让他们继续免费使用应用。你尝试将一些广告换成应用内购买。而用户会继续抱怨。无奈之下,你添加了一些“行动呼吁”,鼓励用户付费使用无广告体验版。结果发现,很多人很快就删除了应用。为此,你添加了分析和遥测,这样就可以弄清楚如何保留住客户。然而,你发现“保留”可能就是“成瘾”的代名词。如此循环往复,不久之后你的应用就彻底“面目全非”,成为一个毫无乐趣的收入机器,各种滥用用户的注意力和隐私。但你依然无法赚到很多钱。

如果人们愿意付费购买应用,我们就可以避免这一切。但不幸的是,他们不愿意,所以应用都变成得臃肿、缓慢、bug 累累。


开发人员没有意识到自己的力量


看到这里,有人肯定会说,你就知道指责他人,难道软件开发人员就没有责任了吗?我认为,确实有些方面我们可以做得更好。

即使在经济衰退期间,开发人员也拥有非凡的影响力。我们可以坚持使用(或不使用)特定技术。我们依然有高薪、福利和股权。我们可以团结一致来改变整个公司的文化和工作环境,虽然这种力量非常微弱。优秀的程序员很难找,每个人都知道,而我们知道他们知道。

这就是我们的力量,我们可以更好地利用这种力量。

我们应该在每次冲刺中预留一些时间出来解决技术债务。当有优化和改进代码的机会时,我们应该设法延迟功能开发。我们应该说服老板支持开源项目。我们应该建立一种期望,让所有人明白我们不一定要投入所有工作时间开发新功能,我们的准则和行业对我们有更高的期望。

大多数时候,这些做法都不会产生任何负面影响。我们并没有过分要求。每个行业都有专业标准和要求。为什么我们认为软件开发就不能建立类似的标准和要求?

唯一需要注意的是,这些激励措施对我们没有好处。这是一场艰苦的战斗。有些经理不愿意我们花时间解决技术债务,仅仅是因为他们不理解。有些销售人员会担心我们的软件没有竞争力。投资者可能会威胁将我们的工作外包给更灵活的开发人员。客户的态度和市场力量的转变还需要一段时间。但是,如果改变现代软件的状态是一个有价值的目标,那么就值得付出努力。



未来软件开发能得到改善吗?


我对软件的未来并不乐观。90 年代,程序员可以构建微型、高度优化的应用程序,因为当时他们别无选择。客户的计算机只有 32MB 内存和 200 兆赫兹的单核处理器。如果应用做不到极简,就无法运行。如今,两年前购买的基本型号 Macbook Air 的内存是原来的 250 倍,而且四核处理器的速度是单核的数倍。我们有更多选择了,但我们交付的应用 90% 是垃圾。除非有人抱怨,否则我们不会做优化。我们会把整个Web浏览器打包到发消息的应用、做笔记的应用中,甚至连我们写代码用的工具都是如此。

在过去的二十年里,我们一直在努力提高软件开发的速度,降低软件开发的难度,让软件越来越易于使用。诚然,如今我们正在以前所未有的速度创建应用,应用拥有的功能数量也超出了以往,而软件开发人员的经验也比以往任何时候都匮乏。从商业的角度,我们不难看出这其中的吸引力。但我们也为此付出了代价,我们的客户、电力能源乃至整个地球都为此付出了沉重的代价。

这种状况不会在一夜之间发生变化,甚至可能在未来五年内都不会变化。但我依然对此充满了希望。

最新一波 Web 编程语言和技术(如 WebAssembly、ESBuild、SWC、Bun 和 Yew)正在努力让编译时和运行时的速度和可靠性达到新的水平。Rust 不仅能够提供与 C 看媲美的性能,而且对开发人员非常友好,这种高级语言在 Web 服务器上越来越受欢迎。此外,还有 Tauri 等轻量级 Electron 的替代品有望成为 Web 开发人员的首选跨平台框架。Tree-shaking 也将为编译器和打包器带来新的希望。

就市场而言,几款流行的游戏(比如《死亡细胞》和《以撒的结合》)已经以付费下载的方式进入移动平台。虽然革命尚未成功,我们仍需努力,但这是对全球最大的技术消费者群体智能手机用户进行软件成本再教育的一次突破。

如果在过去的二十年里,我们一直致力于提高生产力(虽然此过程会牺牲掉效率和财务可持续性),也许接下来的二十年里,我们可以解决集体技术债务,找回失去的效率,并改善经济交流,同时还不会失去软件为我们的生活带来的生产力提升。