没有“程序”的年代
今天你说“写程序”,意思是敲键盘。可是在最开始,“程序”不是写出来的,是接出来的、拨出来的、打洞出来的。 那时候连“软件”这个词都还不存在。
1804:织布机上的卡片,藏着最早的“指令”
1804 年,法国人约瑟夫·雅卡尔(Joseph Marie Jacquard)让织布机学会读卡片上的洞: 有洞的地方,针带着线穿过去;没洞的地方,针停下来。 卡片上洞的排列,就是布上的图案。 换一叠新卡片,同一台机器就织出完全不同的花,一根线都不用重接。
这是历史上第一次,一台机器照着“一串随时可以换掉的指令”干活,而不是照着人的手干活。 今天程序员说的“打孔卡”(punched card)就是从这儿来的。
1890:卡片从织布搬到数人
美国 1890 年做人口普查,要数几千万人。手工统计要花好几年,普查结果出来时人早就搬走了。 赫尔曼·霍列瑞斯(Herman Hollerith)把每个人的资料打在卡片上, 再用一排带电的针去碰卡片:碰到洞,针就穿过洞接通电路,机器自动分类、自动计数。 几千万人的数据,几个月就算完了。
他的公司后来并进了 IBM。卡片上洞的位置,从此从“图案”变成了“数据”。
1837 — 1843:会算数的机器,和第一位程序员
查尔斯·巴贝奇(Charles Babbage)设计了一台叫“分析机”(Analytical Engine)的机器: 有做加减乘除的部件,有存数字的地方,还能根据刚才的结果决定下一步做什么。 这台机器当时没能造出来(那个年代做不出足够精密的零件),但它的图纸上写满了一种全新的想法。
1843 年,阿达·洛夫莱斯(Ada Lovelace)为这台还没出生的机器写下一整套计算“伯努利数”的步骤, 还写下了一句惊人的猜测:这样一台机器,将来也许不只能算数,还能处理音乐、图形。 一百多年后,人们把这份工作承认为世界上第一个程序。
1936:图灵埋下的一颗种子
阿兰·图灵(Alan Turing)在 1936 年问了一个很抽象的问题:什么样的机器才算“会计算”? 他给出的答案简单到像玩具:一条无限长的纸带,一个能读写符号、能左右移动的小脑袋,一张告诉它“看到什么符号就做什么”的规则表。
最厉害的是他接下来那句:这样的机器可以读另一台机器的规则表,然后照着扮演那台机器。 一台机器能变成任何机器——这叫“万能机器”(universal machine)。
程序能“造”程序,全靠图灵这个想法:把一台机器的说明书当成数据,交给另一台机器去读。 第 4 站讲自举的时候,你会看到它就是整条链条的地基。
1940 年代:真的动手了
- 1941 年,德国的 Z3。 康拉德·楚泽(Konrad Zuse)把指令打在废弃的电影胶片上——在胶片上打孔当纸带用,因为当时买不到别的材料。
- 1944 年,哈佛 Mark I。 用打孔纸带输入程序,纸带一圈圈转,机器一步步算。
- 1945 年,ENIAC。 世界上最早的一批通用电子计算机之一:重约 27 吨,用了大约 18000 个真空管,一间屋子才装得下。
ENIAC 怎么编程?插线板 + 几千个开关。 程序员的活儿是:把每一步计算翻译成“哪根线插进哪个孔、哪个开关拨到哪一边”,然后真的用手去插、去拨。 换一道题目,就要把线拔下来重新插一遍,常常要花好几天。
做这件事的是六位女性:Kay McNulty、Betty Jennings、Betty Snyder、Marlyn Wescoff、Fran Bilas、Ruth Lichterman。 她们发明的调试方法、写下的接线图,是最早的“编程实践”之一。
ENIAC 前接线的两位程序员,和随时要换的真空管。图片:美国陆军(美国国家档案,摄影者不详) · 公有领域 · Wikimedia Commons 图片:M. Weik / 美国陆军 · 公有领域 · Wikimedia Commons
1947 年 9 月,哈佛 Mark II 的日志本上贴了一只从机器里夹出来的飞蛾,旁边写着 “First actual case of bug being found”(第一次真的抓到一个 bug)。 从那以后,程序里的错误就叫 bug——字面意思就是“小虫子”。所以“调试”(debug)原本的意思,是“把虫子弄出去”。
如果每换一关游戏,都要拆开机箱、重新焊线,花上三天——你还会“玩”游戏吗? 那时候的程序员不是在“写”,而是在“改机器的身体”。 你能不能想到一个办法,让机器换程序时不用动电线?
想亲手接一次线?去第 6 站 · 动手:插线游戏—— 把线从拨轮插到运算器、再插到输出灯,通电看结果。那就是这一站讲的事。
小结
没有程序的时代,人是用自己的手直接改变机器的形状来“编程”的。程序长在这些地方:
- 一段接线图 = 程序
- 一排开关的位置 = 数据
- 一张卡片上洞的排列 = 一条指令
- “修 bug” = 真的把线拔下来重新插
于是下一个问题就非常自然了:能不能让程序自己待在一个地方,随时能换、不用动电线? 第 2 站,人们找到了答案——把程序也变成数据。