跳到正文
Hacker News· jakevoytko·· 6 天前精选AI 评分36

jakevoytko 回顾早期软件故障,认为现代软件质量仍优于过去

Software may be getting worse, but it used to be horrible

AI 导读

作者认为,在其他条件相同的情况下,代码产量增加10x而错误率未同步降低10x,生产应用会比过去更容易有缺陷,但他认为早期软件整体更糟。作者回忆蓝屏、缺少可靠自动保存、恶意软件、磁盘碎片、内存限制和物理介质损坏等经历,并提到 Google Docs 团队在2010年发现 Ctrl+s 位列非编辑用户动作前5。

推荐理由

文章通过蓝屏、缺少可靠自动保存、磁盘碎片和物理介质等具体经历,校正了人们对早期软件质量的浪漫化想象。

正文 · AI 翻译

软件正在我们周围全面劣化,原因显而易见。 我以前写过这方面的文章。 在其他条件不变的情况下,如果你把代码产出量提高 10 倍,却没有将错误率降到原来的十分之一,那么你的生产环境应用就会比过去有更多缺陷。

我见过一些讨论串,人们也对过去怀有某种 nostalgia:“过去软件好得多”“我们已经忘记了如何像过去那样编程”或“几十年来软件质量一直在下降”。作为一个从 1990 年起就开始使用计算机的人,我要在这里纠正这种看法。软件当时糟透了。所有东西总是崩溃。没错,当时有一些像 John Carmack 这样的杰出程序员,能够在脑中容纳整个程序,并在数十年的时间里持续打磨经过深思熟虑的代码库。但他们并没有编写我们过去使用的大多数软件。

历史背景

世界上几乎所有人都在使用 Windows。Windows 的市场份额曾达到约 95%,具体数值会根据数据来源有几个百分点左右的差异。没错,你大概认识某个拥有 iMac 的人,他会告诉你 iMac 比 Windows 电脑好得多;只要曾有人真正为 Mac 发布过应用,他们就能证明这一点。没错,当时也有 Debian 这样的 Linux 发行版,人们确实能在上面完成真正的计算工作[0]。

但那些都只是例外。几乎每个计算机用户都有一台 Windows 电脑,配备 Intel 或 AMD 处理器。而 Windows 存在许多问题。

不过还是有一点值得庆幸: companies only got one chance to ship their software. 软件一旦发布,公司通常只有一次交付机会。到了某个阶段,它会被装进软盘,或者刻录到 CD 或 ROM 上,装进盒子,再邮寄出去。而那个版本必须开箱即用。因此,存在一条你无法跌破的质量底线。

到底有多糟?

下面是我记得的一些事情。这并非按线性时间排列;它是我从 1990 年起积累的一组回忆。

蓝屏死机

在我童年的大部分时间里,Windows 都存在严重的稳定性问题。

让我向你介绍我们这一族的歌——《蓝屏死机》。

Windows XP、Vista 和 7 中的蓝屏死机,由 Wikipedia 提供

这就是 Windows 版的内核崩溃。它总是在你正忙着做某件事的时候发生。又或者你什么也没做。无所谓:蓝屏迟早会来。

你的电脑会因为许多原因崩溃。首先是设备驱动程序。假如你买了新的外设,比如游戏摇杆,它通常会附带一张装有设备驱动程序的软盘或光盘。你会老老实实地安装它们。那些设备驱动程序的作用与如今相同:帮助操作系统了解如何与硬件交互。这可能会让你想:“哦,原来他们是通过实体介质发送设备驱动程序的?实体磁盘一旦寄出,就无法更新了。他们肯定格外谨慎,确保一切万无一失。”我的朋友,事实恰恰完全相反。我敢肯定,有好驱动也有坏驱动。但总体而言,它们漏洞百出,只要有一个质量勉强的设备驱动程序,就足以让电脑陷入不稳定。

当时,Windows 操作系统本身也存在代码质量问题,有时无法完全回收已退出程序占用的资源。因此,你的电脑会随着时间推移逐渐变慢、恶化,最终被这种缓慢的腐朽拖垮。

总而言之,你的电脑总会时不时地突然黑掉。这就是当时生活的一部分。

自动保存

你知道,什么最适合搭配一台经常崩溃的电脑?不自动保存的应用程序。更妙的是,那些虽有自动保存功能,却不会将缓冲写入刷入存储设备、从而损坏保存文件的应用程序。

进入心流状态,在一份文档上连续工作数小时,是很常见的事。然后突然之间,你会遇到死亡蓝屏,或者弹出一个窗口,说你的应用程序出了问题,必须退出。你会尖叫,一遍又一遍地双击文档,但根本没用。你只能从头再来。不过也有个安慰奖:轮到你告诉所有人,“我可是整整worked了三个小时!然后电脑崩溃了,我的工作全丢了。全没了。我不得不重做。”总有那么一个混蛋会问,“你为什么不保存?”但你不会生气,因为你知道,用不了 2 weeks,他就会遇到同样的事。

2010 年加入 Google Docs 团队时,我们出于好玩,给 Ctrl+s 键盘快捷键加了埋点。它除了记录一个表明快捷键被按下的指标,什么也不做。这个“保存”键盘快捷键位列用户非编辑类操作的前 5 名,仅排在“使用方向键移动光标”之类的操作之后。而它完全没有任何作用。Google Docs 会自动保存。但所有人都曾因多年甚至几十年来丢失工作而受到严重创伤,以至于每次编辑任何内容,都会条件反射般地保存。

没有任何东西是安全的

我和妹妹还小的时候,我们很喜欢去有展示电脑的商店。那些电脑通常会预装一些可以玩的游戏。就算没有游戏,你也可以打开 MS Paint 或 Solitaire,玩上几分钟。

有一次,我们在一家商店里看到展示机,其屏幕保护程序设有密码。我妹妹毫不气馁。她直接按下 Ctrl+Alt+Del,选中屏幕保护程序,然后点击“结束任务”。于是我们便进去了。微软最优秀的头脑,与一个 9 岁孩子的黑客天赋相比,也根本不值一提。

而这就是你的电脑当时能给你的安全水平。如果你长时间使用互联网,电脑就会开始积攒一大堆广告型恶意软件。打开电脑后,即使没在用浏览器,也会开始看到弹窗和背景弹窗,里面全是随机广告。于是你会再运行一次杀毒扫描,或者过一阵子也可以访问一些网站,替你进行恶意软件扫描。

更别提那些病毒了,它们每年都会让互联网跪地求饶,只需要做一些琐碎的事情,比如“给一个用于发送电子邮件的 Word 文档添加宏”。

磁盘碎片

任何懂技术的人都能记得去不懂技术的亲戚家拜访的情景。在某个积满灰尘的角落,他们会有一台老掉牙的 Windows 电脑,几乎只剩一口气。光是开机就真的得花 20 分钟。

你会叹口气说:“让我来帮你修好吧。”

你会打开两个程序。这大约要花 5 分钟。第一个程序清空缓存文件和回收站。第二个是磁盘碎片整理程序。

A screenshot of disk defragmenter

如果你从没见过这个窗口,你的电脑就会慢慢变得无法使用。

过去,Wintel 机箱里的硬盘用旋转的磁性盘片存储数据。硬盘有一根可伸缩的臂,上面装着一个小小的磁性读取头;它会把伸缩臂回收到合适的位置,然后把磁盘移动到某个扇区的起点,以读取数据。

当然,随着你添加的文件越来越多,俄罗斯方块这个游戏就摆不下了,你的其余文件也无法在下一个文件的记录开始之前整齐地放进磁盘空间里。因此,你的文件最终会散落在硬盘的两个(或更多)位置。这就叫作碎片化。少量碎片在所难免,但如果越来越多的文件发生碎片化,电脑就会越来越慢,直到最终爷爷的电脑要花 20 分钟才能启动。

如今,许多现代文件系统(包括 Windows)都会自动在后台进行碎片整理。但 Windows 当时并非如此。你需要定期手动启动碎片整理过程。

等我上大学时,我发现 Windows 有任务计划程序,可以在我想要的任何时候运行磁盘碎片整理程序,于是我就让电脑一直开着,让它在凌晨 5 点整理碎片。

非凡的宇宙力量,微小的内存

应用程序受到内存的严重限制,因此程序员试图到处节省比特和字节。

这本应是我察觉不到的东西,但事实并非如此。

我曾玩过一款很糟糕的 Axis and Allies PC 版游戏,它于 1998 年发行[1]。想象一下 Risk,只不过背景是第二次世界大战。AI 非常糟糕,通常很容易就能击败。但这款游戏有一个严重缺陷:如果一个国家拥有超过 255 个单位,整个游戏就会崩溃。AI 自然也很喜欢龟缩,因此 AI 常常拥有一块驻扎着上百个单位的领地,让人根本难以将其慢慢耗尽。所以,由于这个编程选择,这款游戏成了一场竞速:你必须在敌人通过让游戏崩溃来强行制造僵局之前将其消灭。

这种事经常发生。高中一年级第一堂编程课上,其中一课的内容基本是:“这就是为什么你们都认识 128、256,也许还有 65536 这样的数字。”

软件通过不可靠的实体介质发行

即使软件运行完美,你也可能把游戏 CD 刮出划痕,从此无法再玩。然后你会开始询问朋友,看有没有谁有多余的 Red Alert 或其他什么副本,只为终于能够打通单人战役。

这并非 CD 独有。任何实体介质都可能老化。我那位同父异母的兄弟有一张名为 Dragon Warrior 或其他什么名字的 NES 游戏卡带,但卡带已经损坏,根本无法离开第一个房间。即使你把所有游戏都保存得很好,NES 内部用来连接卡带与主机的触点也可能生锈并失灵。这种事经常发生。

“但是,Jake,那是硬件,不是软件。”我想说的只是,你的软件很脆弱,需要加以保护和维护。并不是说你可以在实体光盘和在线安装之间做选择,然后选择了光盘。就其发行方式而言,软件本身就会逐渐老化,最终在你手中腐坏。

网络游戏假定玩家会友善行事

我最早玩过的网络游戏之一是 Diablo II,这意味着我已经见识过人性深处真正的黑暗内核。

网络游戏有一个奇怪的问题:玩家往往并不想与其他玩家待在一起。他们只是碰巧共处同一个空间。而 Diablo II 在设计上有许多很容易滋生混乱的特性:

  • 客户端外挂泛滥。在 PVP 服务器中,人们会使用外挂,例如发射远远超出正常射程的追踪箭。

  • 服务器中的所有掉落物品对所有人而言都同样可以获取。这意味着,当你快要击杀一个章节首领时,你和队伍就会从盟友变成对手,并在首领终于倒下时疯狂连点。

  • 如果你地上有一具尸体,却再次死亡,就会失去所有已装备的物品。人们会把一堆廉价物品丢在你的尸体上,迫使你的物品栏被塞满,并希望你在拾取自己的尸体之前,误把普通物品捡起来。然后你试着拾取自己的尸体,却只能拾取其中一部分物品。接着他们会再次杀死你,而你就会失去所有好不容易拾取的物品。

  • 这款游戏有许多物品复制漏洞。可以想象,这破坏了游戏内的经济,因为复制品主宰了游戏经济。这也使许多骗局得以得逞。他们会假装刚刚复制了一件物品,然后等着有人问他们是怎么做到的。接着他们会一步步带着用户操作,但其中一步是让你把自己的物品丢在地上,然后骗子再把物品捡走。

  • 当时没有公会系统,但人们仍然建立公会。这意味着,没有可信的方式来确认哪些玩家一定是友方。

等到 Diablo III 推出时,其中许多问题已经得到修复。他们增加了针对复制物品的额外防护。首领会为玩家提供各自独立的掉落,因此击杀首领后不必争抢物品。你也不必再冒着物品丢失的风险,从自己的尸体上捡回物品。这些都是来之不易的教训。

涡轮按钮

大约从 1990 年学会识字起,我就开始使用家里的电脑。那是一台米黄色的 286,放在我们家的桌上,显示器架在主机上面。它有一个 5.25" 软盘驱动器、一个电源按钮、一个重置按钮,还有一个 TURBO 按钮。多数时候用不着这个 TURBO 按钮,但需要让电脑的处理器降速时,可以按下它。

为什么需要这么做?因为 IBM 最早的台式电脑采用 8088 处理器,主频为 4.77MHz[2]。这种情况并没有维持太久。但这里有个问题:许多程序员编写应用程序时,都假定电脑配备的是那种 4.77MHz 处理器。程序员会让动画和电子游戏帧率保持同步,并且普遍依赖固定时钟频率这一假设。如果在速度更快的处理器上运行这类应用,它们很可能会变得无法使用。

电脑制造商想出了一个简单的办法:加装一个 TURBO 按钮,可以按需让 CPU 降速。每当碰到有时序问题的应用程序,只要按下 TURBO 按钮,看着它慢到合适的速度即可。

我其实从来没有在气急败坏时按过 TURBO 按钮。据我了解,最能从 TURBO 按钮中受益的应用大多是游戏,而我们只玩较新的教育游戏,那些游戏没有这类时序问题。编辑这篇文章时,我好几次都想删掉这一节。但你能想象吗?你的 iPhone 侧面有个“Original iPhone”按钮,只为让 Notes 应用能够运行?天哪。

现代软件并不完美

现代软件并不完美。它臃肿不堪。它运行缓慢。它是由太多人共同编写的。它过于复杂。参与的人太多,反而没人能做主。而如今,随着我们把越来越多的事情委托给智能体,我们正在失去对软件底层运作机制的理解。

但我绝不会回到过去那种编写软件的方式。给我进程隔离和在线更新。给我高级编程语言,将 C 和 C++ 中常见的陷阱抽象掉。给我使用系统时钟来处理计时的游戏设计师。给我 Steam 和 Windows Update。你们那套已经被时代淘汰的旧发布流程就留着吧。

脚注

[0]

据我对高中时期尝试安装 Debian 的记忆,Linux 上最受欢迎的应用是任何能够编辑 XF86Config。

[1]

我很难用网上能找到的信息来印证这则轶事。细节可能不完全准确。不过,事情确实就是这样发生的——至少,我那延续了约 25 年的记忆是这样的。

[2]

不是 GHz,而是 MHz!

来源:Hacker News · bitlog.com