现在你点击“update”时,几乎不会多想。进度条移动。几个文件被替换。也许你的手机会重启。patch 这个词听起来干净、抽象,几乎没有什么烟火气。
但它一开始并不是这样。
在计算机发展的早期,patch 往往就是它字面上的意思:一种施加在实体代码载体上的实体修补。不是比喻意义上的。不是概念意义上的。就是字面意义上的。程序被存储在打孔介质上,如果程序的某一部分需要纠正,损坏或错误的那一段就可以被遮盖、剪掉,或者换成一段补上的新片段。[1]
现代软件悄悄继承下来的,正是这一层含义。早在有人通过 Wi-Fi 下载安全修复之前,程序员就已经在用双手给软件“打补丁”了。
当代码还是可以拿在手里的东西时
人们很容易忘记,早期计算机到底有多“实体化”。代码并不是漂浮在云端里、肉眼看不见的东西。它存在于打孔卡片和纸带上,这些系统用孔洞的排列来编码指令。如果孔打错了,程序就错了。如果序列断裂了,机器就会以完美的服从去执行错误的指令。[1]
而正因为这些指令存在于实体介质上,修正它们也可能变成一种实体动作。在像 1944 年 Harvard Mark I 这样的早期机器上,操作员会用真正的补片去覆盖打错的孔,以此进行修正。[1] 编程错误不只是逻辑问题。有时,它只是摆在你眼前某个实物上的一个小缺陷。
这个细节之所以重要,是因为它揭示了早期计算文化的一种气质。机器是新的。问题是新的。但修理的本能却很古老,几乎带着机械式的直觉:哪一段错了,就补哪一段。
最初的软件更新,其实像一场外科手术
后来,当软件供应商开始分发修正时,他们往往并不会寄来一整套全新的程序。他们寄来的是变更。在纸带或打孔卡片的时代,这意味着接收者可能需要把原始纸带或卡组中指定的那一部分剪下来,再把替换片段补接进去。[1]
到了这里,这个词一下就变得非常鲜活。patch 不只是一个新版本。它是一段插入物。一次修复。一次移接。
这种说法之所以能保留下来,是因为那种动作太具体了。如果原始序列中的某一部分错了,你不一定非得从头再来。你只要把有问题的部分拿掉,再把修正过的部分接进去。换句话说,给程序打 patch,和给布料、胶片或线路打补丁,其实没什么本质区别。
对于一个如今属于数十亿美元软件生态的词来说,它的起源故事倒显得异样地朴素。现代的 patch 无声无息地到来。旧时代的 patch 则伴随着剪刀、替换材料和说明书一起到来。
为什么这个名字留了下来
当一个词准确抓住了一类问题的形状,它就会存活下来,而 patch 恰恰做到了这一点。即便载体不断变化,底层的逻辑并没有变。你不是在替换整个系统。你是在修复某一个具体缺陷。你是在对一个已经投入使用的东西,施加一次定点修正。[1]
也正因如此,这个词才能从打孔介质一路活到磁带时代,再到可移动磁盘、通过邮件寄送的 CD-ROM,最后活到可通过互联网下载的更新。[1] 变的是材料。没变的是这个比喻。
事实上,它现在几乎已经不像比喻了,因为它是靠最辛苦的方式挣来的。它最初是实打实的修理工作,后来才变成数字世界的词汇。
从纸带和卡片,到下载
patching 的历史,本身也是一部缩微版的软件分发史。最早是纸带和打孔卡片。然后是磁带。再后来,可移动磁盘让开发者把修正后的代码以实体形式交付给客户变得更容易。接着是 CD-ROM、邮寄更新,最后是互联网,它把 patching 从一种物流事件变成了后台日常流程。[1]
每一步都让 patching 更快,也更不显眼。同时,它也让这个词原本的含义变得更容易被遗忘。
当一个 patch 通过邮寄送达时,你还能感受到它的重量。可当它通过空气抵达时,一切就显得近乎自然,仿佛软件会自己痊愈。但那个古老的词依然在低声提醒你真相。在所有这种无缝体验之下,仍然是那个古老的想法:这一部分错了,所以我们只修这一部分。
Patch 和重写之间的区别
这也是为什么 patch 从来不完全等同于“新软件”。patch 的含义比那窄得多。它意味着连续性。这个东西已经存在。它大体上还在工作。它只是需要修理、调整,或者加固。
这种区别很重要。重写听起来很激进。patch 听起来很外科手术式。前者意味着重新发明,后者意味着维护。而软件在它的大部分历史中,依赖的并不是戏剧性的重新发明,而是无穷无尽的维护,一次修一个缺陷。
这或许也解释了为什么这个词一直如此好用。计算机几乎已经变得面目全非。维护的思维方式却没有。
那个至今仍带着硬件时代痕迹的词
有许多计算机术语,它们的起源几乎已经被完全漂白了。人们没有转盘电话也照样会“dial”号码;没有听筒支架也照样会“hang up”。但 patch 这个词仍然保留着一丝硬件血统的痕迹。它听起来仍然像修理。它仍然让人联想到某种实用的、局部的、带点临时应变意味的东西。
而这很合适,因为软件的历史不只是发明的历史。它也是修正的历史。程序会出错。假设会崩塌。bug 会出现。用户会发现设计者从未预料到的边界情况。最光鲜的部分是发布新东西。最持久的部分,是给它打补丁。
所以,当你听到某家公司发布了一个 patch 时,请记住,这个词比它看起来更古老,也更字面。它来自一个代码由打孔构成的时代,来自一个错误可以被覆盖或剪掉的时代,来自一个修复软件有时意味着要直接改动承载指令的那个实物的时代。[1]
如今,更新也许会在静默中完成。但这个词,仍然记得那卷纸带。






