软件行业,一团浆糊

人们对软件行业的态度和要求似乎和别的行业有明显的不同。如果你买了一个灯泡,换上之后每两周就要请服务人员来检修,你一定会非常生气;如果你买了一块肉,包装上标注着“只能使用某品牌煤气灶烹饪”,你一定会嗤之以鼻;如果你买了一支笔,卖家说你不能把它借给同学用,你一定会觉得大有问题。

但这些事情在软件行业似乎都是现状。有些软件限制了(系统或硬件)平台,有大部分付费软件禁止分发,而几乎所有互联网时代的软件都很喜欢系统更新。当你发现你买的“智能云灯泡”每两周就要安装一个固件更新的时候,你恐怕会怀疑这个东西里面到底有多少智能。而这并不是一个新问题:早在“前互联网时代”的 2002 年,MIT 科技评论的这篇报道就批判过这个问题。现在个位数和十位数已经换位,从 2020 年的视角看来,这个问题有任何改善吗?

恐怕没有。

软件更新

一切传统的行业(也包括很多电子的行业),一旦交付成品,就得是成品。如果在大量生产的某产品上发现了问题,生产者要么得大批量召回,要么得大批量维修。这里的关键是,你的召回或者维修的工作量正比于产品的数量。这让所有的生产者在交付成品之前,都必须把自己的产品做到没有缺漏、没有问题,才敢实际上批量生产出来卖;否则他必定赔本、被喷。

最早期的软件也是这样。向一个公司购买软件,也就购买了此后部署、使用这一软件的服务,一旦使用出现问题,你可以找软件开发商联系解决。免费的开源软件免除了自己维护和持续介入的成本,但开放的源代码实际上把维护的责任推给了使用者本身。但互联网的基础设施普及后,软件更新就成为了软件行业的一把保护伞。不管你制造出来的东西有什么问题,在下一个版本修好然后发布,让大家都更新就好了。但是问题就恰恰在这里:开发商在开发初版本的时候就知道将来可以使用更新来修复问题,那么出于节约成本、更快推出产品等理由,开发商必然会降低初版本的质量。这本质上是通过降低消费者体验来给开发商提供利润。这一点需要我们来反着理解:如果开发商在售卖某一软件的时候对软件效果没有保证、但保证“持续五年的安全更新”,这很可能就是说这五年里的每个版本都有各式各样的安全问题。当软件发布的门槛降低,拿着一大堆零件、糊到一起、然后加一些胶带把它们尽快拼起来,这样的浆糊软件开发就成为了主流——甚至成为了被推崇、被研究的开发模式。

更新的另一个问题就是,更新本身不一定是有益的。更新一个新版本,你不仅修了这个问题,还可能引入新的问题。对安全极为敏感的程序(比如远程控制、办公会议、虚拟机),在一次更新之后出现漏洞后门、或者加密问题,可以被黑客利用,这样的事情屡见不鲜。Windows 最近的几个大版本中,每次更新发布,都会出现各种文件丢失抑或循环蓝屏等问题:要知道这可是系统软件。不仅 version 1.0.0 是催赶出来的浆糊软件,后续的每个版本都是催赶出来的浆糊更新,并且每次都在上一个版本的外面再抹上一层垃圾然后用胶带裹上三四层包起来;这就是“屎山”的来历。毕竟,当你知道你做的东西一定有缺陷、会被后来者替代掉,那么你为什么要认真做呢?

垄断

互联网行业的一个很大的问题是,它的服务商恰好就是它的基础设施提供商。像 Google、Microsoft、Apple 这样的大公司,他们提供硬件、操作系统、应用软件、网络服务、信息服务,无所不包。你要在任何一个方面上和这些公司作竞争,你必然会在另外其他方面使用他们的平台和基础设施:比如说你写一个邮件应用,跑在 Android上,使用 Google 提供的 API 访问 Gmail,并且你的邮件应用发布在 Google Play 上,你自己的服务器跑在 Google Cloud 上。而你这样的邮件应用要和谷歌相竞争,实际上就是你作为运动员,要和身兼裁判、场务、球队股东的一个超级巨人竞争。想想都知道这是不可能的。看看 iTunes for Windows 和 Office for Mac 就知道了。

那么作为 Google 的任何一环(不妨假设是应用程序),不管你生产的东西有多烂,由于它和硬件、系统、网络是同一家生产的,你的程序总是可以预置在系统里而获得几十亿的安装量,你的小问题也会被大部分受到影响的人忽略。这就再次降低了你的产品的质量门槛。(当然,实际上情况不这么糟糕;但他们完全可以这么做。)

迭代

Bennett Foddy 在知名游戏 Getting Over It 中说:

多年以来,人们一直在预测,游戏很快会由商店里买来的预制物品组装而成;但大多数情况下,这并没有发生,因为商店里的物品是垃圾。我并不是指它们长得很糟糕,或者做得很糟糕(虽然其中很多确实是这样的);我的意思是说它们的价值是垃圾,就像精美的食物倒进水槽里之后就变成了垃圾。事物受时间的作用消耗,时间一过,它们就变成垃圾。

在技术的背景下,这种时间的尺度是几秒钟。随着时间的推移,我们向被称为互联网的数字垃圾填埋场倾倒了越来越多的垃圾。现在,无论是在数量上还是重量上,这个垃圾填埋场里的东西已经远远超过了那些新鲜的、未被污染的、未被利用的东西。当我们周围的一切都是文化垃圾时,垃圾成了新的媒介,成为了数字时代的通用语言。你用垃圾创建文化,也只能有垃圾文化:B类游戏,B类电影,B类音乐,B类哲学。

也许这就是数字文化,一个垃圾堆积成的大山,是创造力的源泉所烧成的死灰。

一切只新鲜了大约六秒钟,直到一些新的东西到来,然后我们刷新页面。

迭代是互联网文化的一部分,不可分割的一部分,是互联网创造力不断涌现的源泉,也是互联网这一巨大屎山的罪魁祸首。软件也是一样。一个人写了个小工具,发布(或许开源),然后两周之后失去兴趣走了。说不定他跳槽之后去生产苹果酒了。说不定二十五年之后有人发现正好需要这个工具,但它被堆积在厚厚的尘土当中,当时作者使用的工具链在现在已经无人听说。这在传统行业不是问题,因为传统产品(比如灯泡)一般不需要制作者的持续介入;但前文已经说过,软件需要持续维护和更新(美其名曰“解决方案”),因此找到一个被迭代掉的软件不会带给你任何收益,使用它反而可能会造成伤害。

解决?

~~无。~~认真来说,我们真的没有什么能做的。

如果汽车行业这样的传统工业像计算机行业这样的话,每两三年你的车耗油量和噪音会减小一半,车速会提升一倍,并且加入大量娱乐功能;如果汽车行业像计算机行业这样的话,每辆车每天会无故抛锚两次,并且你打电话给4S店的时候,他会让你把引擎拆下来、再重新装上去。当你拥抱快速变革、新功能、近乎无限制的分享的时候,你也带来了不稳定、不兼容。软件开发的上述缺陷是必要之恶

我们只能着力去减少这样的问题。如果你的出厂功能就足够完备,那么你就不需要稳定的更新系统。如果你的代码需要被用在至关重要的、性命攸关的地方,那你应该使用严格的方法来论证、检验软件的有效性,就像点击一万次来检验机械键盘轴的有效性一样。关于市场问题…我们实在没有什么能做的,只能精神上侮辱一下资本家好了。(XD)