Hacker Folklore

Matthias Endler

黑客掌故

有些计算机术语有着令人惊讶的历史传承。其中许多源自早已过时的技术。本文试图拂去我们每天都在使用、却不太清楚其起源的一些术语背后那些激动人心的历史尘埃。让我们直接开始吧!

Bike-Shedding(自行车棚效应)

今日含义:关于琐碎问题的无意义讨论。

Bike-Shed Effect(自行车棚效应)或Bike-Shedding一词是作为阐明琐碎定律的隐喻而创造的;它由丹麦计算机开发者Poul-Henning Kamp(波尔-亨宁·坎普)于1999年在FreeBSD邮件列表中在Berkeley Software Distribution社区中推广开来,并从那里传播到了整个软件行业。

这一概念最初是作为他对管理学更广泛的“帕金森定律”戏仿的推论而提出的。他用一个委员会对原子反应堆的审议与对自行车棚的审议作对比,来戏剧化地展现这一“琐碎定律”。正如他所说:“花在议程中任何一项上的时间,将与所涉及的金额成反比。”

反应堆是如此昂贵和复杂,以至于普通人无法理解,因此人们会假定从事相关工作的人是懂行的。另一方面,每个人都能想象出一个便宜、简单的自行车棚,因此规划它可能会导致无休止的讨论,因为每个参与者都想添上一笔、展现个人贡献。
参考 - 维基百科:琐碎定律

Boilerplate(样板代码)

一台用于将钢板弯制成水锅炉的旧机器。
一台用于将钢板弯制成水锅炉的旧机器。
来源:Wikimedia Commons

今日含义:一块被反复复制、几乎不作修改的代码片段。

Boiler plate最初指的是用于制造水锅炉的轧制钢板,但在媒体中被用来指代陈词滥调或缺乏原创性的文字。该术语指的是预先准备好的文本的金属印刷版,例如分配给小型地方报纸的广告或连载专栏。这些印刷版因类比而被称为“boilerplate”。向报纸提供这类Boilerplate的一家大型供应商是Western Newspaper Union,它向地域覆盖面较小、包含预先印在常规内容旁的广告的报纸提供“可直接印刷的故事[其中包含国内或国际新闻]”。

参考资料:

前景中的男子手持一块弧形印刷版。像这样的印版由 Western Newspaper Union 等公司提供给许多小型报纸。
前景中的男子手持一块弧形印刷版。像这样的印版由Western Newspaper Union等公司提供给许多小型报纸。
来源:Wikimedia Commons

Boot / Reboot / Bootstrapping(启动/重启/自举)

明希豪森男爵揪着自己的辫子把自己从沼泽中拉出来的石版画
明希豪森男爵揪着自己的辫子把自己从沼泽中拉出来的石版画
来源:Wikimedia

术语boot在计算机语境中用于指代启动计算机的过程。

在编译器开发中,术语Bootstrapping(自举)指的是用一门新语言重写编译器的过程:第一个编译器用现有语言编写。然后用新语言重写它,并由其自身编译。

“揪着自己的靴襻把自己拉起来(to pull oneself up by one’s bootstraps)”这一说法可追溯到19世纪。高筒靴顶部可能有一个拉环、套袢或提手,便于穿靴时向上拉。这个隐喻又衍生出其他用于指代无需外部帮助即可自我维持的过程的隐喻。

根据维基百科

这一习语至少可追溯到1834年,当时它出现在《Workingman’s Advocate》上:“据推测,默菲先生现在将能够揪着靴子的襻带把自己拉过坎伯兰河或越过谷仓的栅栏。”

Merriam-Webster上也有一篇不错的总结。

Bug(缺陷)

今日含义:一段代码或硬件中的缺陷。

其起源不明!

与流行的看法相反,它早于Grace Hopper(格蕾丝·赫柏)在Mark II计算机中发现的那个Bug

工程师们早在此之前就已使用该术语;至少自19世纪70年代起。它早于电子计算机和计算机软件。Thomas Edison(托马斯·爱迪生)在笔记中使用过“bug”一词。参考资料

Bit(位)

该术语的发明归功于John W. Tukey(约翰·W·图基),他在1947年1月9日为Bell Labs撰写的一份备忘录中将“binary information digit(二进制信息位)”缩写为“bit”。参考资料

Byte(字节)

术语“byte”最早由Werner Buchholz(维尔纳·布赫霍尔茨)于1956年6月引入。这是在IBM Stretch计算机的初始设计阶段。该计算机的设计能够寻址到单个位,并允许可变字段长度的指令,字节的大小被编码在指令本身中。选择拼写为“byte”而非“bite”是故意为之,以防止被意外篡改为“bit”。

Carriage Return and Line Feed(回车与换行)

今日含义:将光标置于下一行开头。

这两个术语取自打字机。

字车(carriage)托住纸张,并在按键时从左向右移动以推进打字位置。它“承载”着纸张。Carriage Return(回车)是指字车被移回纸张最左端原位的操作。

然而,仅仅将字车移回左侧还不足以开始新的一行。字车仍会停留在与之前相同的一行上——只是在行首。要进入新的一行,需要一次line feed(换行)。它会将打字机内的纸张向上移动一行。

这两个操作——Carriage Return(CR,回车)和Line Feed(LF,换行)——通常通过推动回车杆一次性完成。

一台机械打字机。回车操纵杆位于最左侧。
一台机械打字机。回车操纵杆位于最左侧。
来源:piqsels
  • 在Unix系统(如Linux或macOS)上,\n仍表示line feed(ASCII符号:LF)或newline(换行)
  • 在CP/M、DOS和Windows上,使用\r\n,其中\r表示carriage return\n表示line feed(CR+LF)。
  • 参考资料

这里有一段展示回车与换行基本机械原理的旧视频:

Command键符号 (⌘)

今日含义:Apple电脑上用于提供额外键盘组合的元键。

直接引用维基百科(重点为笔者所加):

⌘符号是在Macintosh项目后期才加入的。开发团队最初沿用旧的Apple键,但Steve Jobs(史蒂夫·乔布斯)发现当“苹果”图标在Mac菜单中与快捷键并列填满时令人烦恼,因为他觉得这是对公司标志的过度使用。于是他决定改用不同的按键符号。在离截止日期仅剩几天时,团队的位图艺术家Susan Kare(苏珊·凯尔)开始为Apple标志的继任者进行研究。她在翻阅一本符号词典时,发现了这个三叶草状的符号,它在北欧国家常被用作文化场所和名胜的指示标志(它是丹麦、芬兰、冰岛、挪威和瑞典官方的旅游景点路标,该按键也常被瑞典Mac用户称为Fornminne——古代遗迹——被丹麦用户称为Seværdighedstegn)。当她向团队其他成员展示时,大家都很喜欢,于是它成为了1984年Macintosh Command键的符号。苏珊·凯尔表示,后来有人告诉她,该符号之所以因其斯堪的纳维亚用法而被选中,是因为它形似从空中俯视的带圆形角塔的方形城堡,尤其是博格霍尔姆城堡。

挪威 Severdighet(名胜)路标
挪威Severdighet路标
来源:Wikimedia Commons
博格霍尔姆城堡的航拍图,它可能是该符号的原型
博格霍尔姆城堡的航拍图,它可能是该符号的原型
来源:Wikimedia Commons

参考资料:

Cookie

今日含义:从网站发送并存储在用户网页浏览器中的一小块数据。

术语cookie由23岁的网页浏览器程序员Lou Montulli(卢·蒙图利)于1994年秋季创造。它的灵感来自术语magic cookie,即程序接收后又原样发回的一包数据,被Unix程序员使用。该术语又源自fortune cookie(幸运饼干),即内嵌纸条的饼干。

蒙图利使用术语cookie来描述网页浏览器接收后又原样发回给网页服务器的小数据包。

“所以,是的,cookie,”蒙图利笑着说。“那是我生命中一周的工作,却变成了我做过的最重要的事。”(参考资料

Core Dump(核心转储)

今日含义:通过存储其全部内存来获取(已崩溃)程序状态快照以供离线分析。

该名称来自magnetic core memory(磁芯存储器),这是一种基于环形磁体网格的早期存储机制。它此后已被淘汰,但该术语至今仍用于获取计算机进程的快照。参考资料

一块存储 1024 位(即 128 字节)数据的 32 x 32 磁芯存储平面。最早的 core dump 被打印在纸上,考虑到当时数据量如此之小,这听起来很合理。
一块存储1024位(即128字节)数据的32 x 32磁芯存储平面。最早的core dump被打印在纸上,考虑到当时数据量如此之小,这听起来很合理。
来源:Wikimedia Commons

Cursor(光标)

今日含义:视频显示器上指示位置(例如用于数据输入)的视觉提示(如闪烁的竖线)。Merriam-Webster

Cursor在拉丁语中意为runner(奔跑者)。Cursor是刻有发丝线的透明滑块的名称,用于在计算尺上标记某一点。该术语随后通过类比被转移到计算机上。参考资料

1951 年 12 月 IBM 604 电子计算穿孔机的广告,该机型于 1948 年首次生产。广告宣称一台 IBM 604 可以完成 150 名使用计算尺的工程师的工作。cursor(或 runner,游标)是计算尺中间的透明部件。
来源:1951年12月IBM 604电子计算穿孔机的广告,该机型于1948年首次生产。广告宣称一台IBM 604可以完成150名使用计算尺的工程师的工作。cursor(或runner,游标)是计算尺中间的透明部件。

Daemon(守护进程)

在计算中,Daemon是一种处理打印假脱机和文件传输等服务请求然后终止的后台进程。该术语由MIT的Project MAC(Mathematics and Computation,数学与计算)的程序员于1963年创造。他们从Maxwell’s demon(麦克斯韦妖)中借用了这个名字,这是一种思想实验中的假想生物,它在后台不断工作,对分子进行分拣。

MIT的程序员们认为demon会是后台进程的一个合适名称,它不知疲倦地执行系统杂务。但他们没有使用术语demon,而是使用了daemon,这是该词更古老的形式。(参考资料

Dashboard(仪表盘)

今日含义:提供系统状态快速概览的用户界面。

最初是指马车前部的一块木板,用于保护车夫免受马蹄向后扬起的泥浆“飞溅(dashed)”。

当汽车被制造出来时,驾驶员前方的那块板也被赋予了同样的名称。那是将必要仪表放在驾驶员易于看到的位置的合理之处。随着时间的推移,该术语更多地与读数而非其提供的保护相关联。参考资料

一辆马车的挡泥板。
一辆马车的挡泥板。
来源:Wikimedia Commons

Firewall(防火墙)

今日含义:在可信的内部网络与不可信的外部网络(如互联网)之间建立屏障的网络安全系统。

防火墙主要用于联排住宅,但也用于独立住宅建筑。它们可以防止火灾和烟雾在发生火灾时蔓延到建筑的另一部分。从而可以防止大火。该术语自80年代以来在计算领域中使用。参考资料

住宅建筑中的防火墙,将建筑分隔成两个独立的居住单元和防火分区。
住宅建筑中的防火墙,将建筑分隔成两个独立的居住单元和防火分区。
来源:Wikimedia Commons

Firmware(固件)

今日含义:为设备的特定硬件提供底层控制且与所运行的硬件紧密关联的一类计算机软件。

Ascher Opler(阿舍·奥普勒)在1967年《Datamation》杂志的一篇文章中创造了术语Firmware。按最初用法,Firmware与hardware(CPU本身)和software(在CPU上执行的常规指令)相对。它存在于硬件与软件之间的边界上;因此得名“Firmware”。原文可在Internet Archive上获取。参考资料

Foo and Bar

今日含义:常见的占位变量名。

最初该术语可能来自军事术语FUBAR。有几种变体,但常见的含义是FUBAR:“f***ed up beyond all recognition”(糟糕得面目全非)

在编程语境中对foo的使用通常归功于MIT的Tech Model Railroad Club(TMRC),大约在1960年。在复杂的模型系统中,房间周围的许多地方都设有scram开关,如果发生不希望出现的情况,例如列车全速冲向障碍物,就可以扳动这些开关。

据我所理解,他们实际上有标为foo的紧急按钮,只是苦于没有更好的名字。也许与FUBAR的原始军事含义有关,用以表示出了非常非常严重的问题。

一个 scram 开关(按钮),按下可防止误操作。也许 TMRC 拥有的按钮上标的是 `foo`
一个scram开关(按钮),按下可防止误操作。也许TMRC拥有的按钮上标的是foo
来源:Wikimedia Commons

参考资料:

Freelancer(自由职业者)

今日含义:不受雇于某一特定雇主的自雇人士。

该术语首次出现在Sir Walter Scott(沃尔特·司各特爵士)的小说Ivanhoe(《艾凡赫》)中。(该小说也对罗宾汉传说产生了持久影响。)

一本 Classic Comics 漫画的封面
一本Classic Comics漫画的封面
来源:Wikimedia Commons

在书中,一位领主向理查王提供他雇佣的“free lances(自由长矛手)”军队:

我向理查提供了我的自由长矛手们的服务,而他拒绝了——我将率领他们前往赫尔,夺取船只,启航前往佛兰德;多亏这动荡的时局,一个实干家总能找到用武之地。

因此,“free lancer”是指为出价最高者而战的人。Free并非指“无偿”,而是指为任何雇主工作的额外自由。参考资料

Hash(哈希)

今日含义:Hash函数是可用于将任意大小的数据映射为固定大小值的任何函数。

根据维基百科,Hash函数中“hash”一词的用法“是通过类比其非技术含义‘切碎并混合’而来。事实上,典型的Hash函数,如取模运算,会将输入域‘切’成许多子域,并将其‘混合’到输出范围中,以提高键分布的均匀性。”

参考资料:

Log / Logfile(日志/日志文件)

今日含义:记录计算机程序或系统事件的文件。

水手们使用所谓的计程绳(log lines)来测量船速。一块扁平的木块(log)被系在一根长绳上。绳子上有等距的绳结。当木块随水漂离时,水手们会在固定时间间隔内数出放出的绳结数,这就是船速——以节(knots)为单位。

船速对航行很重要,因此水手们会将其记录在一本书中,恰当地称为log book(航海日志),并与其他信息一起更准确地确定船只位置,如地标观测和天气事件。后来,更多更广泛地与船只相关的信息也被添加——或说被“记录(logged)”——例如港口费用和异常的给养消耗。

参考资料

水手们用计程绳测量航速
水手们用计程绳测量航速
来源:The Pilgrims & Plymouth Colony:1620,作者 Duane A. Cline
计程绳的组成部分
计程绳的组成部分
来源:The Pilgrims & Plymouth Colony:1620,作者 Duane A. Cline
英国 Winchelsea 号航海日志的一页。第二列表示用计程绳测得的节数,即航速
英国Winchelsea号航海日志的一页。第二列表示用计程绳测得的节数,即航速
来源:Navigation and Logbooks in the Age of Sail,作者 Peter Reaveley

Patch(补丁)

今日含义:可用于修复或改进计算机程序的一段代码。

在计算机历史的早期,如果你犯了编程错误,就必须通过在孔上贴补丁来修复纸带或穿孔卡片。

一条带有物理补丁的程序纸带,通过覆盖来修正已打的孔。
一条带有物理补丁的程序纸带,通过覆盖来修正已打的孔。
来源:Smithsonian Archives Center

Ping

今日含义:一种检查计算机在网络上可用性及响应时间的方法。

Ping是一个最初由Mike Muuss(迈克·穆斯)于1983年编写的终端程序,包含在每个版本的UNIX、Windows和macOS中。他以“声呐发出的声音”来命名它,灵感来自回声定位的整个原理。“[…] ping使用定时的IP/ICMP ECHO_REQUESTECHO_REPLY数据包来探测到目标机器的‘距离’。”参考资料非常值得一读。

Pixel(像素)

今日含义:屏幕上所表示图像的最小可控单元。

单词pixel是pix(来自“pictures”,缩写为“pics”)和el(表示“element(元素)”)的组合。类似地,voxel是体积元素,texel是纹理元素。参考资料

Shell(外壳)

今日含义:用于与计算机系统交互的交互式、通常基于文本的运行时环境。

该术语的发明者Louis Pouzin(路易·普赞)在其文章The Origins of the Shell中并未对名称作出解释。然而,它可以追溯到Unix的前身Multics。在Multics glossary中,它被描述为:

[The shell] is passed a command line for execution by the listener.

Eric S. Raymond(埃里克·S·雷蒙德)所著的The New Hacker’s Dictionary(《新黑客词典》)(亦称Jargon File)中包含以下内容

Historical note: Apparently, the original Multics shell (sense 1) was so called because it was a shell (sense 3);

其中sense 3指的是

A skeleton program, created by hand or by another program (like, say, a parser generator), which provides the necessary incantations to set up some task and the control flow to drive it (the term driver is sometimes used synonymously). The user is meant to fill in whatever code is needed to get real work done. This usage is common in the AI and Microsoft Windows worlds, and confuses Unix hackers.

不幸的是,该书并未提供任何证据来支持这一说法。

我喜欢这个(可能在历史上并不正确的)类比:把坚果的外壳比作在外层保护内核(kernel)的Shell。

参考资料

Slab allocator(Slab分配器)

今日含义:一种高效的内存分配技术,可重用之前的分配。

Slab allocation由John Bonwick(约翰·邦威克)(注意:PDF文件)于1994年发明,此后被Memcached和Linux Kernel等服务所采用。

采用Slab allocation时,某种类型或大小的数据对象的缓存拥有若干预先分配的“slab”内存块;在每个slab内,有适合这些对象的固定大小的内存块。(维基百科

名称slab来自邦威克的一位少年朋友。他在Oracle博客上讲述了这个故事

在一次一起看电视时,Kellogg’s的一则广告播出,广告语是“Can you pinch an inch?(你能捏起一英寸吗?)”

其含义是,如果你能在腰间捏起超过一英寸的脂肪,就说明你超重了——而吃一碗玉米片会有所帮助。

汤米毫不犹豫地伸手摸向自己的腹部,给出了他的回应:“见鬼,我能抓起一整块(slab)!”——他当时体重大约250磅。

十年后,邦威克在寻找一个词来描述更大块内存的分配时,想起了这个词。

这里是最初的Kellogg’s广告:

Spam(垃圾邮件)

今日含义:未经请求的电子通信,例如通过发送大量电子邮件或在论坛和聊天中发帖。

该术语可追溯到英国喜剧团体Monty Python在1970年的一个小品。在小品中,一家咖啡馆几乎在每道菜中都加入Spam(一种罐装熟猪肉品牌)。Spam是spiced(香料)ham(火腿)的混成词。提及的大量Spam是指二战后英国进口罐装肉制品和其他进口罐装肉制品无处不在的情况(当时英国处于配给时期),当时该国正努力重建其农业基础。参考资料

复古广告:看看一罐 Spam 能做出什么
复古广告:看看一罐Spam能做出什么
来源:用户Jamie (jbcurio) on flickr.com

Monty Pythons Flying Circus (1974) - SPAM 来自 Testing Tester,发布于 Vimeo

Mainframe(大型机)

今日含义:一种大型计算机系统,常被大型组织使用。

最初,该术语指的是容纳计算机主要组件的框架。主要组件是CPU、内存和I/O设备。该术语在20世纪60年代和70年代计算机体积庞大、需要大量空间时被使用。

该图显示了 IBM 701 主机如何展开以便于检修电路。来自 IBM《701 型 EDPM[电子数据处理机]安装手册》。图源:Computer History Museum 档案馆。
该图显示了IBM 701主机如何展开以便于检修电路。来自IBM《701型EDPM[电子数据处理机]安装手册》。图源:Computer History Museum档案馆。

Ken Shirriff(肯·希里夫)的博客上阅读更多相关内容。

Radio Button(单选按钮)

今日含义:一种允许从一组互斥的预定义选项中进行选择的UI元素

“Radio buttons”得名于收音机中使用的机械按钮的类似物。这一UI概念后来被用于磁带录音机、盒式录音机和可穿戴音频播放器(著名的“Walkman”及类似产品)。后来又被用于VCR和摄像机。参考资料

一台老式汽车收音机(左)和 CSS 单选按钮(右)。在任何时刻只能选中一个选项。小时候我会同时按下两个按钮让它们卡住。美好时光。
一台老式汽车收音机(左)和CSS单选按钮(右)。在任何时刻只能选中一个选项。小时候我会同时按下两个按钮让它们卡住。美好时光。
来源:图片由Matt Coady提供

Uppercase and lowercase(大写与小写)

今日含义:键盘上大写字母与小写字母的区分。

在排版还是由铅字单个字母“排版”以形成单词和句子的手工过程时,大写和小写字母被分别存放在不同的容器——或称cases(字盘)——中,以使这一相当繁琐的过程稍微快一些。

一套活字印刷字盘
一套活字印刷字盘
来源:来自Daniel Berkeley Updike(1860-1941)所著《Printing types, their history, forms, and use; a study in survivals》一书。可在archive.org上免费阅读

Honorable mentions( honorable 提及)

404

今日含义:HTTP状态码“File not found(未找到文件)”。

有一个故事称,这个数字来自存放万维网中央数据库的服务器房间。在那里,管理员会手动定位被请求的文件,并通过网络将其传输给发出请求的人。如果文件不存在,他们会返回一条错误信息:“Room 404: file not found”。

然而,这似乎是一个神话,状态码是基于当时已确立的FTP状态码而相当随意地选择的。参考资料

Programming languages and Abbreviations(编程语言与缩写)

编程语言名称和常见缩写的词源可能值得单独写一篇文章,但我暂时决定记下一些我最喜欢的。

C++

C++是一种由Bjarne Stroustrup(本贾尼·斯特劳斯特鲁普)基于C语言的编程语言。该名称是其同事Rick Mascitti(里克·马斯基蒂)开的一个程序员玩笑。++指的是在许多类C语言中常见的后增量运算符。它将变量的值增加1。从这个意义上说,C++可以被视为C在精神上的“后继者”。参考资料

C Sharp

与C++类似,C#是一种类C编程语言。该名称同样指代在C++基础上的“增量”改进。名称中的#看起来像四个加号。因此C# == (C++)++。但除此之外,该名称还受到了音乐记谱法的启发,其中升号(sharp)表示所写的音符应升高半音。参考资料

一个升 C 音符。
一个升C音符。
来源:Wikimedia Commons

PNG

官方上,PNG代表Portable Network Graphics(便携式网络图形)。它诞生于1994年CompuServe宣布支持GIF的程序从此必须支付许可费所引发的挫败感。一个由黑客Thomas Boutell(托马斯·鲍特尔)领导的工作组创建了.webp文件格式,这是一种无专利的GIF替代品。因此我更喜欢该格式的非官方名称:PNG’s Not GIF(PNG不是GIF)。这里有一篇关于PNG历史的好文章参考资料

致谢

大部分内容来自维基百科等来源(已在适当处注明参考资料),但如果你不知道自己在找什么,这些解释很难搜寻到。
这是一份持续更新的文档,如果收到读者投稿,我计划对其进行更新。

结论

你必须了解过去,才能理解现在。
—— Dr. Carl Sagan(卡尔·萨根博士)(1980)

希望你喜欢这次对往事的回顾。现在轮到你了!
👉 你还知道其他故事吗?给我发消息,我会把它们添加到这里。

原文由 Matthias Endler 发布

本文章由 muse-spark-1.2-contributor 进行翻译