在计算机工程的「黄金时代」——那可是段好日子——想要区分出男人和男孩是很容易的(有时 在文献中他们会被分别称为「真男人」和「娘娘腔」1)。当时,「真男人」是那些了 解计算机编程的人,而「娘娘腔」对这些一窍不通。一位真正的程序员说话就像这样:“DO 10 I=1, 10”, 或者这样:“ABEND” (他们都用大写字母说话,你懂的),而其他人则会说: “计算机对我来说太复杂了”,或者:“我可没法跟计算机交朋友——它们冷冰冰的”。(之前的 一项研究 2 指出,「真男人」不会和任何东西“交朋友”,也不害怕冷冰冰。)
但时代洪流一如既往滚滚向前。在我们如今的世界中,上了岁数的老太太可以拥有一台内置 微电脑的微波炉;一个 12 岁的小孩子可以在《吃豆人》和《爆破彗星》中把「真男人」打 得屁滚尿流;街上随便哪个人都能给自己买台个人电脑,他们甚至还能搞懂这些小机器。 「真程序员」濒临灭绝,有可能被摆弄垃圾 TRS-80 机器的高中生取代!
我们有必要明确指出一位「真程序员」和一个随处可见的,玩《吃豆人》的高三学生之间的 区别。搞清楚二者的不同之处将给这些毛头小子树立一个榜样——一个父亲般的榜样——来引导 他们。这也有助于让「真程序员」的雇主们搞清楚,把「真程序员」替换成毛都没长齐的 《吃豆人》玩家实在大错特错,虽然这能省下不少薪金上的开支。
语言
从人群中找出「真程序员」的最简单方法就是看他(或她)用什么程序语言。「真程序员」 用 FORTRAN。「娘娘腔」用 PASCAL。 尼古劳斯·维尔特(Nicklaus Wirth)是 PASCAL 的 设计者。当有人问他,他的名字该怎么读时,他回答道:“你可以按名字(name)叫我,读 作’Veert’, 或者用值(value)来叫我,读作 ‘Worth’。”这句话将他的「娘娘腔」本质暴 露得一干二净。「真程序员」只认可一种传参机制,那就是按值返回调用。IBM/370 FORTRAN G 和 H 编译器就是这么做的。真正的程序员不用时髦的抽象也能完成工作。给他 们一个打孔机键盘,一个FORTRAN IV 编译器和一杯啤酒,他们就心满意足了。
- 「真程序员」用 FORTRAN 做列表处理。
- 「真程序员」用 FORTRAN 做字符串操作。
- 「真程序员」用 FORTRAN 记账,如果他们会记账的话。
- 「真程序员」用 FORTRAN 编写人工智能。
如果一个需求没法用 FORTRAN 解决,「真程序员」会用汇编。如果汇编也搞不定,那这个 需求就不该存在。
结构化编程
最近几年,计算机科学家陷入了名为“结构化编程”的泥潭之中。他们声称,如果程序员们用 一些特别的语言结构和技巧,最后得到的程序会更容易理解。当然,在究竟该用哪些结构这 件事上他们还没达成一致,而他们用来展示自己观点的例子通常只能占据某本不知名期刊的 堪堪一页——这显然没法说服任何人。当我从学校毕业时,我自认为是世界上最强的程序员。 我做了一个无懈可击的井字棋游戏,通晓五种编程语言,而且可以写出一千行能跑的代码。 (真的!)然后我来到了现实世界。我在现实世界接手的第一份工作是阅读并理解一个包含 两万行 FORTRAN 代码的程序,然后优化它,让它能以两倍的速度运行。任何一个「真程序 员」都会告诉你,再多的结构化编程都帮不了你解决这样的问题——这需要真正的天才。以下 是在粗略研究「真程序员」和结构化编程后得到的结论:
- 「真程序员」无惧于使用 GOTO 语句。
- 「真程序员」无惑于编写长达五页的 DO 循环。
- 「真程序员」钟爱算术 IF 语句 3,因为这给代码平添一分野趣。
- 「真程序员」会编写自修改代码,尤其是这么做能让程序在一个紧凑循环中节约 20 纳秒 的时候。
- 程序员无需注释,代码不言自明。
- 由于 FORTRAN 中没有结构化的 IF,REPEAT … UNTIL,或 CASE 语句,「真程序员」不 会为没有使用它们而担忧。另外,遇到真要用上它们的时候,也可以用赋值 GOTO 语句来 模拟。
近期,数据结构也备受关注。抽象类型、结构、指针、列表和字符串等概念在某些小圈子里 流行起来。维尔特(前文提到过的「娘娘腔」)还写了一整本书 4 声称应当基于数据结 构编写程序,而不是反过来。然而所有「真程序员」都知道,唯一有用的数据结构是数组。 字符串、列表、结构、集合——这些只不过是数组的特殊情况,也能用对待数组的方法来轻松 处理,不需要什么复杂的方式来搞乱你使用的编程语言。关于这些新奇数据类型最糟糕的一 点是你必须声明它们。但我们都知道,真正的程序语言会根据(六个字符长的)变量名首字 母进行隐式类型推断。
操作系统
「真程序员」用什么操作系统?CP/M?别开玩笑了,CP/M 说到底就是个玩具系统,连老奶 奶和小学生都会用。
UNIX 当然要复杂得多——UNIX 黑客一般记不住本周的 PRINT 命令是怎么调用的——但认真讲, UNIX 只不过是个被捧得很高的电子游戏。人们在 UNIX 上传阅讨论组上的笑话,码冒险游 戏,写研究论文,但他们从不在 UNIX 上进行严肃的工作。
「真程序员」的操作系统是 OS/370。一个优秀的程序员可以在 JCL 手册上找到并理解他刚 遇到的 IJK305I 错误的描述。一个卓越的程序员可以不用十六进制计算器就找出 6 兆字节 核心转储(core dump)中隐藏的 bug。(我亲眼所见。)
OS/370 是一个真正伟大的操作系统。在这个系统中,一 bit 的数据错位就可以毁掉数天的 努力,因此编程人员养成了时刻警惕的美德。你需要一台打孔机来获得这个系统下的最佳交 互体验。据说 OS/370 上有个分时系统。经过仔细研究,我得出了结论:这个说法纯属谣传。
编程工具
「真程序员」用什么工具呢?理论上讲,一个「真程序员」可以通过在前面板 5 上一 个字一个字敲键输入程序来运行它们。在以前计算机还有前面板的时候,这种事还真发生过。 「真程序员」会以十六进制格式把整个引导程序保存在内存中。每当他写好程序,就会载入 引导程序强制计算机运行它。(那时候内存可没有易失性,断电后数据不会消失。现在的内 存要么在该保留数据时将其丢掉,要么在该丢掉时把数据一直保留。)传说西摩·克雷 (Seymour Cray)——超算 Cray I 和康大资讯大部分机器的缔造者——真的用前面板从 CDC7600 的内存加载进入了它的第一个操作系统。不消说,西摩是个「真程序员」。
我最喜欢的一个「真程序员」是德州仪器的系统程序员吉姆。一天他接到用户打来的远程电 话,用户说他的系统在重要工作干到一半时崩溃了。吉姆在电话中指挥用户通过前面板切换 磁盘 I/O 指令,在十六进制下修复系统表,同时听用户报告寄存器内容,最后成功挽救了 系统。这个故事告诉我们,虽然「真程序员」的工具包里装着打孔机和行式打印机,但在紧 急情况下,他们只用电话和前面板也能应对自如。
在某些公司,文本编辑不再是过去的“十个工程师排队使用一台 029 打孔机”。事实上,我 工作的大楼里一台打孔机都没有。这种情况下,「真程序员」也不得不使用文本编辑器来完 成工作。大多数系统都提供了几个文本编辑器供用户选择,而「真程序员」会从中谨慎挑选, 不然就辜负了他的个人风格。许多人认为最好的文本编辑器是施乐为 Alto 和 Dorado计算 机编写的那些 6。很不幸,没有哪个「真程序员」会去用 Smalltalk 系统,更不会去用 鼠标。
Xerox 编辑器的某些概念已经被其他编辑器吸纳,而后者运行在一些名字更正常的操作系统 上。其中最有名的应该是 EMACS 和 VI。而在「真程序员」看来,“所见即所得”这个概念用 在编辑器上就和用在女人身上一样糟糕。「真程序员」不喜欢这些编辑器。他们想要的是一 个“你想要什么,就得到什么”的编辑器——复杂、晦涩、强大、危险、没有回头路。直白点讲, 他们想要的是 TECO 7。
据观察,一串 TECO 指令比起可读文本更像是传输线上的噪音 8。一个著名的游戏就是 将你的名字输入到 TECO 命令行,然后猜测会发生什么。与 TECO 交互时,几乎任何输入错 误都可能摧毁你的程序,甚至更糟——在你曾经正常工作的程序中注入深刻奇妙的 bug。
因此,「真程序员」不太愿意在实际工作中编辑代码。他们发现使用一个名为SUPERZAP 的 神奇程序(或者它在非 IBM 机器上的等价物)在二进制目标码上直接打补丁要容易得多。 这套方法运转如此良好,以至于在 IBM 系统上,许多工作程序跟最初的 FORTRAN 代码已经 毫无关系。很多时候,源代码已经不可用。当需要修复这样的程序时,没有一个经理会派遣 非「真程序员」去做这项工作——沉迷于结构化编程的「娘娘腔」们对此甚至无从下手。这被 称作“工作保障”。
「真程序员」不使用的编程工具包括:
- FORTRAN 预处理器,比如 MORTRAN 和 RATFOR。这些是编程中的烹饪套装——「娘娘腔」会 用这些做他喜欢的甜点。
- 源语言调试器。「真程序员」会去读核心转储。
- 带数组边界检查的编译器。它们扼杀了创造力,毁掉了 EQUIVALENCE 的大部分有趣用途, 还断绝了使用负下标修改操作系统代码的可能。最糟的是边界检查效率很低。
- 源码维护系统。一个「真程序员」会把他的代码锁在卡片里,这样他的重要程序就不会没 有防卫了 9。
工作中的「真程序员」
「真程序员」通常在哪里工作?什么样的程序值得如此天纵英才耗费心血?毫无疑问,没有 哪个「真程序员」会去用 COBOL 写应收款帐程序,或者给《人物》的邮件列表做排序。他 们希望做一些真正有分量的任务:(真的!)
- 「真程序员」在洛斯阿拉莫斯实验室工作,编写 Cray I 超算上的原子弹模拟程序。
- 「真程序员」为国家安全局工作,破译俄国人传输的信息。
- 感谢在 NASA 工作的成千上万「真程序员」的努力,我们的宇航员在苏联的太空人之前登 月并返回。
- 航天飞机上的计算机程序由「真程序员」编写。
- 在波音工作的程序员正在设计巡航导弹的操作系统。
加州的喷气推进实验室里有一些最令人敬畏的「真程序员」。他们中的许多人将先驱者号和 旅行者号的整个操作系统熟记于心。通过结合地面上的大型 FORTRAN 程序和航天器上的小 型汇编程序,他们可以在导航和紧急处理的过程完成种种壮举,比如在太空航行六年后成功 瞄准土星上一个十公里宽的窗口;修复或跳过损坏的传感器平台、无线电和电池。据称,一 个「真程序员」成功将一个模式匹配程序藏在了旅行者号航天器的几百字节未使用内存中, 这个程序成功搜索、定位并拍摄了木星的一颗新卫星。
伽利略号航天器正在准备中,该航天器计划利用火星重力助推前往木星,这要求伽利略号在 经过火星时距离火星表面 80±3 公里。没人相信 PASCAL 程序(或者说,PASCAL 程序员) 的导航能力能达到这种精度。
你也看得出来,许多「真程序员」为美国政府工作,其中大部分人理所应当地服务于国防部。 然而在最近,「真程序员」的天空中出现了一朵乌云。
国防部上层的一些「娘娘腔」似乎决定所有国防部的项目都应该使用一种被称为“ADA”(国 防部注册商标)的大一统语言来编写。有那么一段时间,这个 ADA 看起来注定要成为违背 所有「真程序员」编程原则的语言:一种支持结构化编程、具有各种强数据类型以及分号的 语言。一言以蔽之,这门语言旨在削弱大部分「真程序员」的创造力。幸好国防部采用的这 种语言有足够多有趣的特性让它变得平易近人,不那么高高在上:它十分复杂,有能力重新 排列内存还能搞乱操作系统,另外艾兹格·迪科斯彻(Edsgar Dijkstra)不喜欢它 10。 (你大概知道他是《GOTO 被认为有害》的作者。这篇论文是编程方法论的里程碑作品,广 受 PASCAL 程序员和「娘娘腔」的好评。)此外,坚定的「真程序员」能把所有语言都写得 像 FORTRAN。
真正的程序员也不总是坚持他们的原则,为了赚到钱,他们也会做一些比毁灭世界稍微琐碎 些的工作。比如,有几个「真程序员」就在 Atari 制作电子游戏。(但他们从来不玩。 「真程序员」总能知道怎么战胜机器。这毫无挑战性。)在卢卡斯影业工作的每个人都是 「真程序员」。(谁能拒绝五千万星战粉送来的钱呢!)计算机图形学领域内的「真程序员」 占比略低于正常水平,主要是因为目前大家还不知道图形学有啥用。不过话说回来,所有图 形学的工作都是用 FORTRAN 来完成的。所以有相当一部分人为了逃离 COBOL 而从事这个领 域。
游戏中的「真程序员」
「真程序员」的娱乐方式和他们的工作方式完全一致:摆弄计算机。「真程序员」一想到雇 主竟然会付钱让他捣鼓电脑,总是不禁啧啧称奇——就算不付钱给他,他也会出于兴趣做这些 事。当然,他不会把这些感想公之于众。「真程序员」偶尔也会走出办公室,呼吸一下新鲜 空气,再喝上一两杯啤酒。以下几点能帮你在机房之外认出「真程序员」:
- 在聚会中,「真程序员」会站在角落里讨论操作系统的安全性以及如何绕过安全措施。
- 在看球时,「真程序员」会把比赛过程和打印在 11x14 连续纸上的模拟结果做比较。
- 在海滩上,「真程序员」会在沙子上画流程图。
- 在葬礼中,「真程序员」会说:“乔治真是可怜,他在心脏病发前差点就要搞定那个排序程序了。”
- 在杂货店,「真程序员」会执意亲自用收银扫描机给自己的罐头结账,因为他不相信收银 员能一次就做对,就像他不信任打孔机操作员一样。
「真程序员」的栖息地
什么样的环境对「真程序员」来说最合适?这对「真程序员」的经理们来说是个重大课题。 考虑到雇佣一名「真程序员」成本不菲,最好将他(或她)安排在一个能让他完成工作的环 境中。
「真程序员」通常栖息在计算机终端前,终端边上还有:
- 「真程序员」参与过的所有程序的清单,大致按照时间顺序排序,铺满了整个办公室。
- 大概半打左右杯子,里面装着没喝完、已经冷掉的咖啡。咖啡里偶尔漂着烟蒂。有时杯子 装的是橙子汽水。
- 除非他非常优秀,否则这里还有会 JCL 手册和《操作原理》的副本,这些册子都被翻开 到一些格外有趣的页面。
- 贴在墙上的是一份用行式打印机打印出来的 1969 年 Snoopy 日历。
- 地板上散落着几张花生酱芝士条的包装纸(这种零食在做的时候就已经走味了,这样把它 们扔进自动售货机里不管也不会变得更糟。)
- 一堆奥利奥饼干藏在桌子左边最上面那个抽屉里。这些饼干是为了特殊场合准备的。
- 奥利奥饼干下面是一张流程图模板,这是办公室的前任主人留下来的。(「真程序员」只 写程序,不写文档。文档就交给之后的维护人员写去吧。)
「真程序员」能在重压之下连续工作 30、40 甚至 50 小时。事实上他就喜欢顶着压力连轴 转。糟糕的响应时间不会让「真程序员」感到困扰,他正好能在编译时打个盹。如果日程压 力不大,「真程序员」会给任务添加一些挑战性:他会先在前九周研究一些有趣的细节,然 后在最后一周来上两三个 50 小时马拉松,完成剩下的工作。这不仅能给经理一个惊喜(他 都不指望能赶上时限),还给不写文档提供了一个方便的借口。总的来说:
- 「真程序员」从不朝九晚五。(晚九朝五倒有可能。)
- 「真程序员」不戴领带。
- 「真程序员」不穿高跟鞋。
- 「真程序员」会在午饭时间到岗 11。
- 「真程序员」也许不记得自己老婆叫什么名字,但他肯定记得整个 ASCII(或 EBCDIC) 码表。
- 「真程序员」不会做饭。凌晨三点杂货铺都不开门,所以他们靠奶油蛋糕条和咖啡维生。
未来
未来会怎么样?「真程序员」有点担心,因为新一世代的程序员们没有和他们前辈相同的人 生观。他们中的许多人从未见过带前面板的计算机。如今找不到一个毕业生能手算十六进制 数。现在的大学毕业生都很软弱——他们被源码级调试器、能匹配括号的文本编辑器和用户友 好的操作系统宠坏了,远离了现实世界的编程。最糟糕的是,一些自称是计算机科学家的人 居然连 FORTRAN 都不会就拿到了学位!这个行业注定要被 UNIX 黑客和 PASCAL 程序员支 配吗?
恰恰相反。根据我的经验,我可以对各地的「真程序员」说:前景是光明的。无论全世界的 PASCAL 程序员如何努力,OS/370 和 FORTRAN 也没有出现任何消失的迹象。甚至一些给 FORTRAN 添加结构化构造之类的小把戏也失败了。当然了,有些计算机供应商推出了 FORTRAN 77 编译器,但是每个编译器都有 FORTRAN 66 兼容模式以便按照上帝的意图编译 DO 循环。
连 UNIX 对「真程序员」来说都不像以前那么坏了。最新版本的 UNIX 有潜力成为值得「真
程序员」信赖的操作系统。它拥有两种不同且微妙地不兼容的用户界面,一个深奥复杂的终
端驱动,还有虚拟内存。如果忽略掉 C 的结构化特性,「真程序员」会很喜欢用这门语言
编程:毕竟,它没有类型检查,变量名有七个(或者八个?十个?)字符长,还有指针数据
类型,这玩意可以说结合了 FORTRAN 和汇编语言之长。(更不用提对 #define
的各种创
意用法了。)
是的,未来并没有那么糟糕。大众媒体甚至对最近几年新出现的一批黑客和电脑宅进行了报 道 12 13。他们离开斯坦福和 MIT 的象牙塔,充满活力地投身现实世界。从他们表现 出的种种迹象来看,「真程序员」的精神依旧存在于这些年轻男女身上。只要还有定义不清 的目标、奇形怪状的 bug、不切实际的日程表,就会有「真程序员」站出来解决问题,同时 不写文档。FORTRAN 是永恒的!
致谢
感谢 Jan E.、Dave S.、Rich G.、Rich E. 在刻画「真程序员」方面提供的帮助、感谢
Heather B. 的插图 14、感谢 Kathy E. 对这篇文章的包容,以及感谢
atd!avsdS:mark
为本文提供了最初的灵感。
译者后记
译者是个英文中手兼编程低手,犯错在所难免。如有错讹不妥之处望各位联系我改正,在此 先行谢过。
英文原文很好找,动动手指敲敲键盘就能搜到。对于懒人,这里有一篇原文。
转载(真的值得转载吗?)请注明来源。
-
译者注:原文是 “Quiche Eaters”。 ↩︎
-
Feirstein, B., Real Men Don’t Eat Quiche, New York, Pocket Books, 1982. ↩︎
-
Wirth, N., Algorithms + Datastructures = Programs, Prentice Hall, 1976. ↩︎
-
Xerox PARC editors … ↩︎
-
Finseth, C., Theory and Practice of Text Editors - or - a Cookbook for an EMACS, B.S. Thesis, MIT/LCS/TM-165, Massachusetts Institute of Technology, May 1980. ↩︎
-
Weinberg, G., The Psychology of Computer Programming, New York, Van Nostrabd Reinhold, 1971, page 110. ↩︎
-
Dijkstra, E., On the GREEN Language Submitted to the DoD, Sigplan notices, Volume 3, Number 10, October 1978. ↩︎
-
Datamation, July, 1983, pp. 263-265. ↩︎
-
Rose, Frank, Joy of Hacking, Science 82, Volume 3, Number 9, November 1982, pages 58 - 66. ↩︎
-
The Hacker Papers, Psychology Today, August 1980. ↩︎
-
译者注:我没找到这个插图,怀疑这个 illustration 就不是插图,但这样就不 知道怎么翻合适了。不过我想最适合的插图大概是 xkcd 的那篇漫画。 ↩︎