黑客掌故
原文由 Matthias Endler 于 发布,订阅该博客
有些计算机术语背后有着令人惊讶的历史。许多术语都源自早已过时的技术。本文试图拂去尘埃,挖掘那些我们每天都在使用、却未必清楚来历的术语背后那些精彩的故事。话不多说,直接开始吧!
自行车棚效应
今义:对琐碎问题进行无意义的讨论。
“自行车棚效应”(bike-shed effect)或“自行车棚讨论”(bike-shedding)这一术语是作为“琐碎定律”的一种形象化比喻而创造的,它由丹麦计算机开发者Poul-Henning Kamp 于 1999 年在 FreeBSD 邮件列表中推广,并由此传播到整个软件行业。
这一概念最初是作为他对管理学“帕金森定律”戏仿的推论提出来的。他用委员会对原子反应堆和对自行车棚的审议来戏剧化地阐释这一“琐碎定律”。正如他所说:“花在议程上任何一项议题上的时间,都与涉及的金额成反比。”
反应堆造价极其高昂、结构极其复杂,普通人根本无法理解,因此人们会默认从事相关工作的人自然是懂的。相反,每个人都能想象出一个便宜又简单的自行车棚,因此在规划时反而会引发无休止的讨论,因为每个参与者都想添上一笔、彰显自己的贡献。
参考资料 - 维基百科:琐碎定律
样板代码

来源:Wikimedia Commons
今义:一段被反复复制、几乎不做或只做少量修改的代码。
Boiler plate 最初指的是用于制造水锅炉的轧制钢板,但在媒体行业中则用来指陈词滥调或缺乏原创的文字。该术语指的是预先制好的金属印刷版,上面印有广告或辛迪加专栏等现成文本,会被分发给小型地方报社。这些印版因类比而被称为“锅炉板”(boilerplate)。这类锅炉板的一大供应商是 Western Newspaper Union,它向覆盖范围较小的地方报纸提供“可直接印刷的稿件,其中包含国内或国际新闻”,稿件中可能已在常规内容旁预先印好了广告。
参考资料:

来源:Wikimedia Commons
启动 / 重启 / 自举
来源:Wikimedia
在计算机语境中,boot 指的是启动计算机的过程。
在编译器开发中,bootstrapping(自举)指的是用一门新语言重写编译器的过程:先用已有语言编写第一个编译器,然后用新语言重写它,再用它来编译自身。
“揪着自己的靴襻把自己拎起来”(to pull oneself up by one’s bootstraps)这一说法可追溯至 19 世纪。高筒靴顶部可能有一个拉袢、拉环或提手,用来帮助穿靴。这一隐喻又衍生出更多比喻,指无需外界帮助、自我维持的过程。
据维基百科称,
这一习语至少可追溯到 1834 年,当时它出现在《Workingman’s Advocate》上:“据推测,墨菲先生如今将能够靠靴子上的带子把自己拽过坎伯兰河或农场的篱笆。”
在 Merriam-Webster 上也有一篇不错的总结。
Bug(缺陷)
今义:代码或硬件中的缺陷。
起源不详!
与流行的说法相反,它的出现早于 Grace Hopper 在 Mark II 计算机中发现的那只虫子。
工程师们早在此之前就已使用该词,至少可追溯到 19 世纪 70 年代。它早于电子计算机和计算机软件。Thomas Edison 就曾在笔记中使用过“bug”一词。参考资料
Bit(比特)
该词的发明归功于 John W. Tukey,他在 1947 年 1 月 9 日为贝尔实验室撰写的一份备忘录中,将“binary information digit”(二进制信息位)缩写为“bit”。参考资料
Byte(字节)
“byte”(字节)一词最早由Werner Buchholz 于 1956 年 6 月引入。当时正值 IBM Stretch 计算机的初期设计阶段。该计算机的设计支持寻址到单个比特,并允许可变字段长度的指令,字节的大小就编码在指令本身之中。之所以拼写为“byte”而非“bite”,是有意为之,以防止被意外篡改为“bit”。
回车与换行
今义:将光标移至下一行行首。
这两个术语源自打字机。
字车(carriage)承载纸张,随着按键敲击从左向右移动,以推进打字位置。它“承载”着纸张。回车(carriage return)是指将字车移回纸张最左侧起始位置的操作。
仅仅把字车移回左侧,并不足以开始新的一行。此时字车仍停留在原来那一行,只是回到了行首。要进入新的一行,还需要一次换行(line feed),它会将打字机内的纸张向上移动一行。
这两项操作——回车(CR)和换行(LF)——通常通过推动回车杆一次性完成。

来源:piqsels
- 在 Unix 系统(如 Linux 或 macOS)中,
\n至今仍代表换行(ASCII 符号:LF)或换行符。 - 在 CP/M、DOS 和 Windows 中,则使用
\r\n,其中\r代表回车,\n代表换行(CR+LF)。 - 参考资料
下面这段老视频展示了回车与换行的基本机械原理:
Command 键符号(⌘)
今义:苹果电脑上用于提供额外键盘组合的功能键。
以下直接引用维基百科(着重号为笔者所加):
⌘ 符号是在 Macintosh 项目后期才加入的。开发团队最初沿用旧的 Apple 键,但 Steve Jobs 发现当菜单中“苹果”图标与快捷键并列、大量出现时令人烦躁,因为他觉得这过度使用了公司标志。于是他决定换一个按键符号。在离截止日期仅剩几天时,团队的位图设计师 Susan Kare 开始为 Apple 标志的继任者寻找灵感。她在翻阅一本符号词典时,偶然发现了这个形似三叶草的符号,它在北欧国家常被用作文化地标和名胜古迹的指示标志(它是丹麦、芬兰、冰岛、挪威和瑞典官方的旅游景点路标,瑞典的 Mac 用户常称这个按键为 Fornminne——意为“古代遗迹”,丹麦用户则称之为 Seværdighedstegn)。当她把这个符号展示给团队其他成员时,大家都很喜欢,于是它便成了 1984 年 Macintosh 上 command 键的符号。Susan Kare 表示,后来有人告诉她,这个符号之所以被选中,正是因为其在斯堪的纳维亚的用法——它形似从空中俯瞰的、带圆形角楼的方形城堡,尤其是以 Borgholm 城堡为原型。

来源:Wikimedia Commons

来源:Wikimedia Commons
参考资料:
Cookie
今义:由网站发送并存储在用户网页浏览器中的一小段数据。
cookie 一词由时年 23 岁的网页浏览器程序员 Lou Montulli 于 1994 年秋创造。它的灵感来自magic cookie(魔术饼干)一词,这是 Unix 程序员用来指代程序接收后又原样返回的一包数据。该词本身又源自幸运饼干(fortune cookie),即内藏字条的饼干。
Montulli 用 cookie 来形容网页浏览器接收后又原样发回给网页服务器的那些小数据包。
“是啊,cookie,”Montulli 笑着说,“那不过是我生命中的一周,却成了我做过的最重要的事。”(参考资料)
Core Dump(核心转储)
今义:通过保存程序的全部内存来获取(已崩溃)程序状态的快照,以便离线分析。
这个名字来自磁芯存储器,这是一种基于环形磁体网格的早期存储机制。它早已过时,但该术语至今仍用于指代获取计算机进程快照的操作。参考资料

来源:Wikimedia Commons
Cursor(光标)
今义:视频显示屏上的视觉提示(如闪烁的竖线),用于指示位置(如数据输入位置)。Merriam-Webster
Cursor 在拉丁语中意为奔跑者。cursor 原指计算尺上刻有发线的透明滑块,用于在尺上标记位置。该术语随后通过类比被引入计算机领域。参考资料

Daemon(守护进程)
在计算领域,daemon 是指在后台处理打印排队、文件传输等服务请求、随后终止的后台进程。该术语由MIT 的 Project MAC(Mathematics and Computation,数学与计算)的程序员于 1963 年创造。他们从麦克斯韦妖(Maxwell’s demon)——一个思想实验中假想的、在后台不断工作、分拣分子的生物——那里借用了这个名字。
MIT 的程序员们认为 demon 很适合用来命名在后台不知疲倦地执行系统杂务的进程。但他们没有直接使用 demon,而是用了更古老的拼写 daemon。(参考资料)
Dashboard(仪表盘)
今义:提供系统状态快速概览的用户界面。
最初是指马车前部的一块木板,用于遮挡马蹄向后扬起的泥浆,保护车夫。
汽车出现后,驾驶员前方的那块板也沿用了同样的名称。那里正是放置各种仪表、便于驾驶员查看的合理位置。久而久之,这个词更多地与仪表读数本身相关联,而非其原本的防护功能。参考资料

来源:Wikimedia Commons
Firewall(防火墙)
今义:在可信的内部网络与不可信的外部网络(如互联网)之间建立屏障的网络安全系统。
防火墙主要用于联排住宅,也用于独栋住宅。它们能在发生火灾时防止火势和烟雾蔓延到建筑物的另一部分,从而避免大火蔓延。该术语自 20 世纪 80 年代起在计算领域使用。参考资料

来源:Wikimedia Commons
Firmware(固件)
今义:一类为设备特定硬件提供底层控制、且与所运行的硬件紧密绑定的计算机软件。
Ascher Opler 在 1967 年《Datamation》杂志的一篇文章中创造了 firmware 一词。按最初的用法,firmware 与 hardware(CPU 本身)和 software(在 CPU 上执行的常规指令)相对。它存在于硬件与软件的边界上,故得名“firmware”。原文可在 Internet Archive 上查阅。参考资料
Foo 和 Bar
今义:常见的占位变量名。
该词最初可能源自军事术语 FUBAR。有几种不同说法,但常见的解释是 FUBAR:“f***ed up beyond all recognition”(糟透了,面目全非)。
在编程语境中使用 foo 通常归功于 MIT 的 Tech Model Railroad Club(TMRC,科技模型铁路俱乐部),约在 1960 年左右。在其复杂的模型系统中,房间各处都设有 scram 开关,一旦发生不妙之事——比如列车全速冲向障碍物——就可以扳动开关。
据我所知,他们当时真的有标着 foo 的紧急按钮,只是苦于想不出更好的名字。或许这与 FUBAR 原本表示“出了大问题”的军事含义有关。

foo来源:Wikimedia Commons
参考资料:
Freelancer(自由职业者)
今义:不受雇于某一特定雇主、长期自主择业的自由职业者。
该词最早出现在 Sir Walter Scott 的小说《Ivanhoe》中。(该小说也对罗宾汉传说产生了深远影响。)

来源:Wikimedia Commons
书中,一位领主向 Richard 国王献上他麾下的“自由长矛手”雇佣军:
我曾向 Richard 献上我的自由长矛手,而他拒绝了——我将率领他们前往 Hull,夺取船只,扬帆前往 Flanders;多亏这动荡的时局,有为之人总能找到用武之地。
因此,“free lancer”是指为出价最高者而战的人。free 并非指“免费”,而是指可以自由地为任何雇主工作的额外自由。参考资料
Hash(哈希)
今义:哈希函数是指可将任意大小的数据映射为固定大小数值的任意函数。
据维基百科称,哈希函数中“hash”一词的使用“源于对其非技术含义的类比,即‘切碎并混合’。事实上,典型的哈希函数,如取模运算,会将输入域‘切碎’成许多子域,再将其‘混合’到输出范围中,以改善键分布的均匀性。”
参考资料:
Log / Logfile(日志 / 日志文件)
今义:记录计算机程序或系统事件的文件。
水手们曾使用所谓的测程绳(log line)来测量航速。一块扁平的木块(即 log)系在一条长绳上,绳上等距打有绳结。当木块随水漂离时,水手们会数在固定时间内放出多少个绳结,据此得出航速——单位即为“节”(knots)。
航速对航行至关重要,因此水手们会将其记录在一本书中,恰如其分地称为 log book(航海日志),同时还会记录其他有助于更准确确定船位的信息,如地标观测和天气情况。后来,更多与航船有关的一般信息也被加入——或称“记入日志”(logged)——例如港口费用和异常的给养消耗。
参考资料。

来源:The Pilgrims & Plymouth Colony:1620 by Duane A. Cline

来源:The Pilgrims & Plymouth Colony:1620 by Duane A. Cline

来源:Navigation and Logbooks in the Age of Sail by Peter Reaveley
Patch(补丁)
今义:可用于修复或改进计算机程序的一段代码。
在计算机发展早期,如果编程出错,就得通过在孔上贴补丁来修复纸带或穿孔卡片。

来源:Smithsonian Archives Center
Ping
今义:一种通过网络检查计算机可用性及响应时间的方法。
ping 是 Mike Muuss 于 1983 年编写的终端程序,现已包含在所有版本的 UNIX、Windows 和 macOS 中。他以声呐发出的声音为其命名,灵感来自回声定位的整体原理。“……ping 使用定时的 IP/ICMP ECHO_REQUEST 和 ECHO_REPLY 数据包来探测到目标机器的‘距离’。”这篇参考资料非常值得一读。
Pixel(像素)
今义:屏幕上可呈现图像的最小可控单元。
pixel 一词由 pix(来自“pictures”,缩写为“pics”)和 el(来自“element”)组合而成。类似地,voxel 是体积元素(volume element),texel 是纹理元素(texture element)。参考资料
Shell
今义:用于与计算机系统交互的、通常基于文本的交互式运行环境。
该术语的发明者 Louis Pouzin 在其文章《The Origins of the Shell》中并未对名称作出解释。不过,它可以追溯到 Unix 的前身 Multics。在Multics 词汇表中,它被描述为:
[shell] 被传递一个命令行,由监听器(listener)执行。
Eric S. Raymond 所著的 The New Hacker’s Dictionary(亦称 Jargon File,行话文件)中有如下记载:
历史注记:显然,最初的 Multics shell(含义 1)之所以被称为 shell,是因为它是一个 shell(含义 3);
其中含义 3 指的是
一个由手工或由另一个程序(如解析器生成器)创建的骨架程序,它提供了设置某项任务所需的必要咒语以及驱动它的控制流(有时 driver 一词作为同义词使用)。用户需要填入完成实际工作所需的代码。这种用法在人工智能和 Microsoft Windows 领域很常见,并让 Unix 黑客感到困惑。
遗憾的是,该书并未为这一说法提供任何证据。
我倒是喜欢那个(可能在历史上并不准确)的类比:把坚果的外壳比作 shell,包裹并保护着内核(kernel)。
Slab 分配器
今义:一种高效的内存分配技术,会重用先前的分配。
slab 分配由John Bonwick(注意:PDF 文件)于 1994 年发明,此后被 Memcached 和 Linux 内核等服务所采用。
通过 slab 分配,某种类型或大小的数据对象的缓存会拥有若干预先分配的“slab”内存;在每个 slab 内又有适合该对象的固定大小的内存块。(维基百科)
slab(厚板)这个名字来自 Bonwick 少年时的一位朋友。他在 Oracle 博客上讲述了这个故事:
两人一起看电视时,Kellogg’s 的一则广告播出,广告语是:“你能捏起一英寸吗?”
言下之意是,如果你能在腰间捏起超过一英寸的赘肉,就说明你超重了——而吃上一碗玉米片会有帮助。
Tommy 体重约 250 磅,毫不犹豫地伸手摸向自己的腰腹部,回应道:“见鬼,我能抓起一整块板!”
十年后,Bonwick 在寻找一个词来描述较大块内存的分配时,想起了这个词。
以下是 Kellogg’s 的原始广告:
Spam(垃圾邮件)
今义:未经请求的电子通信,例如通过群发邮件或在论坛、聊天中发帖。
该词可追溯至英国喜剧团体 Monty Python 在 1970 年的一个小品。在小品中,一家咖啡馆几乎在每道菜里都加入Spam(一种罐装熟猪肉品牌)。Spam 是spiced 和 ham 的混成词。小品中反复提及 Spam,影射了二战后英国国内进口罐装肉制品的泛滥——在英国实行配给制的时期,国家正努力重建农业基础。参考资料

来源:用户 Jamie (jbcurio) on flickr.com
Monty Pythons Flying Circus (1974) - SPAM 来自 Testing Tester,发布于 Vimeo。
Mainframe(大型机)
今义:大型计算机系统,常被大型组织使用。
最初,该词指的是容纳计算机主要部件的框架。主要部件包括 CPU、内存和输入/输出设备。该术语在 20 世纪 60、70 年代计算机体积庞大、需要大量空间时被使用。
![该图展示了 IBM 701 主机如何向外打开以检修电路。摘自《Type 701 EDPM [Electronic Data Processing Machine] Installation Manual》,IBM。藏于 Computer History Museum 档案馆。](https://endler.dev/2020/folklore/mainframe.jpg)
可在 Ken Shirriff 的博客上阅读更多相关内容。
单选按钮
今义:一种允许从一组预定义的互斥选项中进行选择的 UI 元素
“单选按钮”(radio buttons)得名于收音机上使用的机械按钮的类似对应物。这一 UI 概念后来被用于磁带录音机、盒式录音机和随身听(著名的“Walkman”及类似产品),之后又用于录像机和摄像机。参考资料

来源:图片来自 Matt Coady
大写与小写
今义:键盘上大写字母与小写字母的区分。
早年排版还是手工操作、单个铅字被“排版”成单词和句子时,为了让这一相当繁琐的过程稍微快一些,大写和小写字母被分装在不同的容器——即字盘(case)——中。

来源:摘自 Updike, Daniel Berkeley, 1860-1941 所著《Printing types, their history, forms, and use; a study in survivals》。可在 archive.org 上免费阅读。
值得一提的
404
今义:表示“未找到文件”的 HTTP 状态码。
有一种说法称,这个数字来自存放万维网中央数据库的服务器机房。在那里,管理员会手动查找被请求的文件,并通过网络将其传输给请求者。如果文件不存在,就会返回一条错误信息:“Room 404: file not found”(404 房间:未找到文件)。
然而,这似乎是个讹传,该状态码实际上是基于当时已确立的 FTP 状态码相当随意地选定的。参考资料
编程语言与缩写
编程语言名称和常见缩写的词源或许值得另写一篇专门文章,但在此我先记下几个我最喜欢的例子。
C++
C++ 是 Bjarne Stroustrup 在 C 语言基础上开发的编程语言。其名称是 Stroustrup 的同事 Rick Mascitti 开的一个程序员玩笑。++ 指的是许多类 C 语言中常见的后置自增运算符,它将变量的值加 1。从这个意义上说,C++ 可被视为 C 的精神“后继者”。参考资料
C Sharp
与 C++ 类似,C# 也是一门类 C 编程语言。其名称同样指在 C++ 之上的“增量”改进。名称中的 # 看起来像四个加号,因此 C# == (C++)++。除此之外,该名称还受到了音乐记谱法的启发,其中升号(sharp)表示将所记音符的音高升高半音。参考资料
来源:Wikimedia Commons
PNG
官方上,PNG 代表 Portable Network Graphics(便携式网络图形)。它诞生于人们对 CompuServe 在 1994 年宣布支持 GIF 的程序今后必须支付许可费用的不满。由黑客Thomas Boutell 领导的工作组创建了 .webp 文件格式,作为 GIF 的无专利替代品。因此我更喜欢该格式的非官方名称:PNG’s Not GIF(PNG 不是 GIF)。这里有一篇精彩文章介绍了 PNG 的历史。参考资料
致谢
大部分内容来自维基百科等来源(已在适当处注明出处),但如果你不知道要找什么,这些解释其实很难搜寻到。本文是一份持续更新的文档,如有读者投稿,我计划对其进行更新。
结语
你必须了解过去,才能理解现在。
—— Dr. Carl Sagan(1980)
希望你喜欢这次对往昔的回顾。现在轮到你了!
👉 你还知道其他故事吗?给我留言,我会将它们补充到这里。
随机一篇博客
评论
登录后参与讨论