从查尔斯·巴贝奇开始,发明计算机的男性都将主要的精力放在了机器的硬件上。然而,率先看到编程的重要性的却是在“二战”期间参与计算机工作的女性——就像是曾经的埃达·洛夫莱斯一样。她们研究出了编码计算机指令的方法,这些指令可以控制硬件执行的操作。这种软件内含的神奇配方可以让计算机实现一些令人意想不到的功能。
最具传奇色彩的一位编程先驱当属格雷斯·霍珀,一位勇敢、果断而且富有人格魅力的美国海军军官。她曾经在哈佛大学为霍华德·艾肯工作,后来进入了普雷斯伯·埃克特和约翰·莫奇利创办的公司。格雷斯·霍珀的本名是格雷斯·布鲁斯特·穆雷(Grace Brewster Murray),于1906年出生于一个位于曼哈顿上西区的富裕家庭。她的祖父是一位土木工程师,他经常会带她到纽约各处进行实地考察。她的母亲是一位数学家,父亲是一位保险经理。她大学毕业于瓦萨学院(Vassar),并取得了数学和物理学的双学位,随后进入耶鲁大学继续深造,于1934年取得数学博士学位。2
不过她的教育经历可能并没有你想象中的那么不同寻常。她是毕业于耶鲁大学的第十一位数学女博士,第一位是在1895年毕业的。3 女性在20世纪30年代取得数学博士学位其实不算是一件特别罕见的事情,尤其是对于一位家庭条件优越的女性来说。事实上,下一个时代的女性反而更难取得数学博士学位。在20世纪30年代,获得数学博士学位的美国女性数量为113人,占美国同期数学博士毕业生总数的15%。到了20世纪50年代,获得数学博士学位的美国女性只有106人,仅占总数的4%(这种情况到了21世纪的前10年大为改观,总共有1 600位女性在此期间获得数学博士学位,相当于总数的30%)。
在嫁给了一位比较文学教授文森特·霍珀(Vincent Hopper)之后,格雷斯回到了瓦萨学院任教。她的教学方式跟大部分的数学教授都不一样,她非常着重培养学生的写作能力。在概率论课程的第一课上,她讲解了一道自己最喜欢的数学公式[1] ,并要求学生们写出一篇关于这条公式的文章。她会根据文章内容的清晰度和写作风格进行评分。“我在给这些文章打分的时候会看到一些反对的意见,说他们上的是数学课,而不是英语课,”她回忆道,“然后我就会跟他们解释,如果无法和其他人进行交流,那么他们学习到的数学知识将没有用武之地。”4 她一直都擅长于将科学问题(例如弹道、流体流动、爆炸和天气模式)转化为数学公式,然后用平实的语言表达出来。这项天赋对她日后成为一位优秀的程序员起到了很大的帮助。
到了1940年的时候,格雷斯·霍珀开始对自己的生活感到厌倦。她没有生小孩,婚姻生活也日渐平淡,而且数学教师的工作也没有她想象中的充实。她从瓦萨学院请假来到纽约大学,与那里的知名数学家理查德·科朗特一起研究偏微分方程的求解方法。这项研究一直持续到1941年12月日本袭击珍珠港的时候。美国的参战为霍珀带来了一个改变人生的机会。在接下来的18个月里,她辞去了瓦萨学院的教职,与自己的丈夫离了婚,并以36岁的年龄加入了美国海军。在入伍之后,她被派到位于马萨诸塞州的史密斯学院的海军预备军官学校进行学习。她在1944年6月以全班第一的成绩毕业,并得到了少尉的军衔。
她以为自己会被分配到负责加密和解密的部门服役,但没想到自己接到的竟然是前往哈佛大学报到的命令,她的任务是进行与马克一号相关的工作。正如上文提到的,马克一号是由霍华德·艾肯在1937年设计的大型数字计算机,它使用笨重的机电继电器和电动马达驱动的转轴来建造。当霍珀被分配到这项任务的时候,美国海军已经接管了马克一号。这个项目的负责人仍然是艾肯,但他当时的身份是海军中校,而不是哈佛大学的教员。
霍珀在1944年7月来到哈佛大学报到,这时艾肯给了她一份巴贝奇备忘录的副本,并带她参观了马克一号。“这是一台计算机器。”他向她介绍道。霍珀默默地盯着它看了一会儿。“那里放着一台正在隆隆作响的巨大机械装置,”她回忆道,“它完全没有被遮盖起来,而且非常吵闹。”5 她意识到自己需要透彻了解这台机器才能正确地使用它,因此她花了几个晚上的时间来研究它的设计蓝图。她的一项长处是能够将现实世界的问题转化为数学公式(这是她在瓦萨学院任教的时候就拥有的能力),然后使用机器能够理解的指令表达出来。“我曾经学习过关于海洋学、扫雷、雷管、近炸引信和生物医药等各个领域的词汇。”她解释道,“如果要解决某个领域的问题,我们必须学习相关的专业词汇。我可以随意转换自己的用词,例如我可以和程序员进行非常技术性的交流,然后在几个小时之后使用另外一套完全不同的用词向上级陈述同样的内容。”创新需要清晰的表达能力。
由于霍珀拥有准确表达信息的能力,所以艾肯委派给她一项任务——编写世界上第一本编程手册。“你要写一本书。”有一天他站在她的桌子旁边说道。
“我不会写书,”她回复道,“我从来没有写过书。”
“既然你现在已经是海军的一员了,”他说道,“你就要写这本书。”6
霍珀最终写成了一本多达500页的书籍,这本书不仅记录了马克一号的建造历史,而且还是一本针对这台计算机的编程指南。7 霍珀在书的第一章讲述了一些早期发明的计算机器,其中重点介绍了帕斯卡、莱布尼茨和巴贝奇的机器。这本书的卷首插图是艾肯在办公室组装的巴贝奇差分机部分模型,她还引用了巴贝奇说过的一句话作为卷首语。跟埃达·洛夫莱斯一样,霍珀也能够理解巴贝奇分析机的独特之处,她和艾肯都认为这个特性将会是哈佛马克一号和同时代的其他计算机之间的区别所在。艾肯的马克一号与巴贝奇未完成的机器一样,也是通过打孔纸带接收操作指令的,而且可以使用新的指令进行重新编程。
每天晚上,霍珀都会向艾肯朗读她在当天写成的内容,这个过程让她学习到了成为优秀作家的一个简单技巧:“他指出如果你在大声朗读的时候发现有不顺畅的地方,那你最好修改一下这个句子。我每天都要朗读自己完成的5页内容。”8 在经过了这样的训练之后,她的文笔开始变得简洁利落、条理清晰。霍珀和艾肯的紧密合作关系就像是一个世纪之前的洛夫莱斯和巴贝奇一样。在不断深入了解埃达·洛夫莱斯的过程中,霍珀对她的认同感也变得越来越强烈。“她编写了第一个循环程序,”霍珀说道,“我永远不会忘记这点,我们都不会。”9
霍珀将历史部分的重点放在了历史人物上,也就是说她的书强调的是个人的作用。在霍珀的作品完稿后不久,IBM的管理层也聘请专人编写了另外一份关于马克一号的历史。相比之下,IBM版本的历史的主角是位于纽约恩迪科特的IBM工程团队,他们才是真正建成这台机器的人。“利用组织的历史取代个人的历史是最符合IBM利益的做法,”历史学家库尔特·拜尔(Kurt Beyer)在一份关于格雷斯·霍珀的研究中写道,“按照IBM的说法,企业是技术创新的中心。发明家在实验室或地下室中孤军奋战的神话已经不合时宜,取而代之的是平凡的工程师团队在企业中参与渐进式创新的现实。”10 在IBM版本的历史中,马克一号是多项微创新成果的集合,例如棘轮式计数器和双层卡片馈送装置。IBM书写的历史所歌颂的是一群在恩迪科特互相协作的不知名工程师。[2]
从表面上来看,霍珀和IBM所编写的历史是在争论谁对马克一号的贡献最大,但是它们之间其实有着更深一层的区别。这两段历史的差异表明了人们会以两种截然不同的观点来看待创新的历史。某些关于技术和科学的研究会强调实现创造性飞跃的发明家的作用,也就是霍珀所采用的研究方式。另外一些研究则强调团队和机构的作用,例如在贝尔实验室和IBM恩迪科特实验室进行的团队合作。后一种方式想要证明的是,所谓的创造性飞跃(灵光一闪的瞬间)其实是一个渐进过程的结果,当思想、概念、技术和工程手段都成熟的时候,创新就会随之出现。然而这两种看待技术发展的观点都是不够全面的。数字时代的多数伟大创新都是个人和团队相互作用的结果,即使是富有创意的个人(莫奇利、图灵、冯·诺依曼、艾肯),他们的想法也需要通过团队合作来实现。
和霍珀一起操作马克一号的搭档是理查德·布洛赫(Richard Bloch),后者是哈佛大学数学专业的毕业生,曾经在大学的一个喜欢恶作剧的乐队中担任长笛手,还参与过海军的外勤任务。在霍珀到任之前,布洛赫少尉已经为艾肯工作了三个月的时间,所以他负责为霍珀提供指导。“我记得我们一起坐下仔细研究这台机器的工作原理,讨论如何对它进行编程,一直聊到深夜。”他说道。他和霍珀需要每天12小时轮班管理马克一号,同时还要听候与这台机器一样喜怒无常的长官——艾肯的差遣。“有时他会在凌晨四点出现,”布洛赫说道,“他在视察我们的工作时会问:‘我们有在计算数字吗?’他在机器停止运作的时候会感到非常不安。”11
霍珀采用了非常系统化的编程方式。她会将每个物理学问题或者数学方程分解成简单的计算步骤。“你只需要告诉计算机每一步要怎么做,”她解释道,“比如说将这两个数字加起来,然后将结果放在这里;接着将另外两个数字相乘,将下一个结果放在那里。”12 每次到了要测试记录程序的打孔纸带的时候,马克一号的团队成员都会拿出一张跪垫,一起面朝东方祈祷他们的程序可以运行起来——这本来只是一次玩笑,不过后来就变成了一个固定的仪式。
布洛赫有时会在深夜对马克一号的硬件电路进行调整,这样做会导致霍珀编写的软件程序出现问题。这时年轻气盛的霍珀会以自己在军官学校学到的用语狠狠地训斥布洛赫一顿,而身材瘦长的布洛赫通常只是对这些责备一笑置之。他们两人之间的关系成为硬件工程师和软件工程师之间的对抗和友谊的典型。“每次当我完成了一个可行的程序之后,他都会在晚上改动计算机内部的电路,导致程序在第二天早上无法运行,”她抱怨道,“更糟糕的是,他在这个时候已经回家睡觉了,所以我也无法知道他做了些什么。”布洛赫表示出现这种情况的时候,他就知道自己又要遭殃了。“艾肯不会以乐观的心态来看待这些事情。”13
这样的事件让霍珀得到了为人傲慢无礼的名声。她的确是这样的一个人,但她能够将自己的傲慢和协作精神结合在一起,这是软件黑客特有的一种能力。这种犹如海盗和船员之间的共事关系(霍珀和后来一代接一代的程序员所共有的)实际上解放了她的能力。正如拜尔所写的,“为她的独立思想和行动创造空间的不是叛逆的性格,而是她的协作能力。”14
事实上,与盛气凌人的霍珀相比,沉着冷静的布洛赫反而更容易与艾肯中校发生争执。“布洛赫总是在闯祸,”霍珀说道,“我试着向他解释艾肯本人就像是一台计算机一样。他可以说是用电线连接而成的,如果你要和他共事的话,你必须知道他的电线是怎么排布的。”15 艾肯本来对于让一位女性军官加入自己的部队是有所顾虑的,但是他在不久之后就把霍珀任命为自己的首席程序员和第一副官。多年以后,艾肯深情地回忆起了霍珀对计算机编程的诞生所做的贡献。“格雷斯是一个好人。”他称赞道。16
在哈佛大学工作期间,霍珀对多种编程方式进行了完善,其中包括子程序的编写。子程序指的是专门用于特定任务的代码块,它们只需要储存一次就可以按照需求在主程序的不同位置调用。“子程序是一种明确定义、容易符号化和经常重复的程序,”她写道,“哈佛马克一号含有用于求解sin x、lg10 x和10x的子程序,每个子程序都通过单个操作码调用。”17 这是埃达·洛夫莱斯最初在分析机论文的“注解”中描述的概念。霍珀将这些子程序收集到一个不断增补的程序库当中。她在为马克一号编程的时候还发明了编译器的概念,编译器是一种用于为多台机器编写相同程序的工具,它可以将程序的源代码翻译为不同计算机处理器使用的机器语言。
此外,她的团队还提出了程序故障(bug)和调试排错(debugging)这两个术语。哈佛马克二号(Mark II)计算机被放置在一座没有安装纱窗的大楼里面。一天晚上,这台机器突然出现故障,工作人员马上开始查找问题的所在。他们发现有一只翼展达4英寸的蛾子卡在了机器的一个机电继电器里面。他们将这只蛾子取了出来,并用胶带把它黏贴在工作日志上面。“面板F(蛾子)在继电器中,”日志上的记录写道,“这是首次发现虫子(bug)的情况。”18 从此以后,他们就将排除故障的工作称为“为机器除虫”(debugging the machine)。
到了1945年,哈佛马克一号已经是世界上最容易编程的大型计算机,这点主要归功于霍珀的贡献。它只需输入打孔纸带上的新指令就可以切换任务,不需要对机器的硬件或线路进行重新配置。然而,这个优点无论在当时还是在历史上都没有得到什么关注,因为马克一号(即使是在1947年制成的后继机型马克二号)采用的是操作缓慢而噪声巨大的机电继电器,而不是像真空管这样的电子元件。“当时任何一个对她有所了解的人,”霍珀对马克二号评价道,“都认为她已经毫无希望了,所有人都在追捧电子技术。”19
计算机的创新者和其他领域的先驱一样,如果在前进的道路上止步不前的话,他们就会被其他人超越。他们的性格当中有着诸如固执和专注这样的特点,虽然这些特点是他们的创造力的来源,但有时候也会让他们难以接受新鲜的想法。史蒂夫·乔布斯正是一个以固执和专注著称的创新者,然而当他意识到自己需要“不同凡想”(think different)的时候,他就会突然改变自己的主意,这点经常让他的同事们感到措手不及。艾肯缺乏这种灵活应变的能力,所以他无法实现优雅的转身。身为海军中校的他对中央权威有着本能一样的执着,因此他的部下不能像莫奇利和埃克特在宾夕法尼亚大学的团队那样不受拘束地工作。艾肯还将可靠性的优先级放在了速度之上,所以即使宾夕法尼亚大学和布莱切利园的团队都已经清楚认识到了真空管是未来的潮流,他仍然坚持使用久经考验和可靠性更高的机电继电器。他的马克一号每秒只能执行三个指令,而正在宾夕法尼亚大学建造的ENIAC可以在同样的时间内执行5 000个指令。
艾肯后来前往宾夕法尼亚大学视察ENIAC,并参加了几场讲座。“艾肯完全沉浸在了自己的行事方式当中,”当时的一份会议记录写道,“看来他还没有意识到这些新的电子机器的重要性。”20 霍珀在1945年参观ENIAC的时候也出现了同样的情况。她似乎认为马克一号比ENIAC更加高级,因为它的编程操作十分简便。她对ENIAC的评价是:“你们连接各个组件的做法实际上是为每项任务制作一台专门的计算机。我们已经习惯了编程的概念,而且会利用自己编写的程序来控制计算机。”21 为ENIAC重新编程可能需要花费一整天的时间,这样一来它在处理速度上的优势就被抹平了,除非它一直被用于重复完成同样的任务。
但是跟艾肯不一样的是,思想开放的霍珀很快就改变了她的看法。当年出现了一些编程方式上的进步,使得ENIAC可以更加快速地实现重新编程。令霍珀感到欣慰的是,站在这场编程革命的最前沿的人都是女性。