1.3 结缘贝尔实验室
本节写到好些我的个人经历,希望能告诉你是什么样的好运气让我选择电子计算作为职业,将我带入贝尔实验室这个举世无双的地方从事相关工作。
我出生于多伦多,曾就读于多伦多大学,专业是工程物理(后来改名为工程科学),这是为那些自己也不知道想学什么的人准备的“大杂烩”专业。我毕业于1964年,那时电子计算正处于早期阶段:我大三时才第一次见到计算机。整个学校只有一台IBM 7094大型计算机,算是当时最高端的设备。它拥有32K(32 768)个36位字长的磁芯存储器(如今我们会说是128 KB),还有大机械硬盘形态的次级存储。当时它价值足足300万美元,安放在空调机房中,由专业操作员照料,普通人(尤其是学生)不允许靠近。
所以,尽管我努力学习Fortran语言,但身为本科生,也只能浅尝辄止。对于那些曾经挣扎着写出自己第一段程序的人,我感同身受。我精读了丹尼尔·麦克拉肯(Daniel McCracken)的Fortran II大作[2],学会了各种编程规则,但还是不懂怎样写出第一段程序。动手能力跟不上理论知识,这该是很多人都会遇到的障碍吧。
在大学生活第一年结束前的那个夏天,我在多伦多帝国石油(Imperial Oil)公司找到一份工作,加入为精炼厂开发优化软件的小组。新泽西标准石油(Standard Oil of New Jersey)公司是帝国石油公司的股东,标准石油于1972年更名为埃克森(Exxon)。
回想起来,我在实习时的表现远低于平均水平。我花了整个夏天的时间编写一套体量庞大的COBOL程序,用来分析精炼数据。我不记得其具体功能,但它肯定没能正常工作。我其实并不清楚如何编程。COBOL缺乏对良好程序组织方式的支持,结构化编程也还未被发明出来。我的代码充斥着没完没了的IF语句,在我想到要做什么事时,将执行流程分支到另外某处。
我还尝试让Fortran程序在帝国石油的IBM 7010上运行,因为相对于COBOL而言,我对Fortran懂得多一点儿,而且Fortran大概更适合用来做数据分析。在与JCL(IBM的作业控制语言)搏斗了几周之后,我才发现7010上根本没有Fortran编译器。JCL错误信息如此晦涩难懂,以至于以前根本没人搞清楚过这个问题。
度过略有挫败感的暑假之后,我回到学校继续完成学业。我对编程的兴趣依然强烈。学校没正式开设计算机科学课程,但我高年级时的论文都与人工智能有关。人工智能在当时是热门主题。定理证明器、下国际象棋和跳棋的程序、自然语言的机器翻译似乎触手可及,看似只需要一点点程序设计就可以实现。
1964年毕业后,我不知何去何从,所以就像很多其他学生一样,打算直接读研究生。我申请了十来所美国大学(那时加拿大人不怎么申请美国学校),并有幸被其中几所录取,其中就有麻省理工学院和普林斯顿大学。普林斯顿大学说,完成博士学业通常需要3年时间,麻省理工学院说大概需要7年;普林斯顿大学提供全额奖学金,麻省理工学院说我得每周做30小时的研究助理工作——结论显而易见。而且,我的好友,高我一届的多伦多校友阿尔·阿霍,已就读于普林斯顿大学,于是我就去了普林斯顿大学。事实证明,这是一个超级幸运的选择。
1966年,好运再度降临。因为普林斯顿大学研究生李·瓦里安(Lee Varian)上一年在麻省理工学院干得不错,所以我得到了暑期去麻省理工学院实习的机会。我在那儿使用兼容分时系统(Compatible Time-Sharing System,CTSS)和密歇根算法译码器(Michigan Algorithm Decoder,MAD,ALGOL 58语言的分支)编写程序,为一种叫作Multics的新操作系统打造工具。我会在第2章中详谈Multics。(Multics本来拼作MULTICS,但小写字母版本看起来更顺眼,其他全大写字母单词我也都会写成比较顺眼的形式,如将UNIX写成Unix,哪怕这样写不符合史实。)
我在麻省理工学院名义上的老板是费尔南多·科巴托(Fernando Corbató)教授,人人都叫他“科尔比(Corby)”。他创建了CTSS,负责Multics,是一位了不起的绅士。1990年,科尔比因其为分时系统做的基础工作获得图灵奖。他于2019年去世,享年93岁。
除了带领团队设计、实现CTSS和Multics,科尔比还是输入密码访问计算机的发明人。批量计算很少用到这种方式,但运行共享文件系统的分时计算机的确需要某种安全机制来保护私有文件。
1966年夏天我在麻省理工学院时,系统自动为我生成了两个可拼读的短密码,我至今仍然想得起来。使用两个密码确有必要。夏日的某天,有人搞混了存储密码的文件和保存当日欢迎登录消息的文件。密码都是明文存储的,结果一登录系统就会看到所有人的密码。
我的办公室属于约瑟夫·魏岑鲍姆(Joseph Weizenbaum)教授,那个暑假他不在学校,记得办公室里也没有其他人。早在1966年,魏岑鲍姆就发表了对Eliza的描述。Eliza是模拟与罗杰斯学派心理学家对话的程序[3],也是使用自然语言与计算机互动的早期尝试之一。它令人惊奇地有效,起码在我第一次看到时特别有效。我也乐意带领访客去看它。如今有许多模拟Eliza的网页程序,虽然这些程序很快就会“原形毕露”,但和它们聊几分钟还是很有意思的。
ELIZA: Please tell me what’s been bothering you.
YOU: I’m trying to write a book about Unix.
ELIZA: Is it because you are trying to write a book about unix that you came to me?
YOU: Yes.
ELIZA: You are sure.
YOU: Yes.
ELIZA: You seem to be quite positive.
YOU: Yes.
ELIZA: I see.
1967年夏天,终极好运从天而降:墨里山的贝尔实验室计算科学研究中心让我去实习,老板是道格·麦基尔罗伊(图1-4)。道格建议我研究内存分配评估问题,这也是他长期关注的方向。遵循最佳实习传统,我最终做出了与老板要求风马牛不相及的东西。我写了一套函数库,以方便在Fortran程序中做列表处理。整个夏天我都在墨里山的大型计算机GE 635上编写严密的汇编语言。GE 635实际上是重整过后更有条理的IBM 7094,同时也是Multics专用机GE 645的简化版。那差不多是我最后一次写汇编语言。尽管我所做的事从根上就走错了方向,但代码写得十分过瘾,让我与编程结下了不解之缘。
图1-4 道格•麦基尔罗伊,约1981年
(杰勒德•霍尔兹曼供图)