- 人机沟通法则:理解数字世界的设计与形成
- (美)前田约翰
- 9字
- 2025-03-19 17:05:08
第一章 机器循环运行
1 计算机擅长通过循环重复自己
我从小就不太擅长体育,我不光是班上第二胖的孩子,而且无论如何也无法扔出或接住任意大小的球。我唯一的特殊技能就是能长时间保持清醒,这要归功于父亲的影响和他用来管理家里生意的军事化理念。但当我在学校里跑圈并且不断被同学们超过时,这一技能带给我的仅存的自豪感也消失殆尽。我一直觉得在学校里跑圈很无聊,更别提很累。虽然我不太擅长跑圈,但我也知道我不是唯一感到筋疲力尽的——即便是那些跑得最快的同学,在我到达终点的那一刻也都气喘吁吁。无论是否擅长运动、身体素质如何,我们都是终会感到疲倦的动物。
在一件事上,计算机可以比现实世界中的任何人类、动物或机器做得更出色:重复。如果你让它从1数到1,000甚至10亿,计算机绝对不会因为感到无聊而抱怨。你只需要让它从0开始,加1,重复这一步直到达到目标数字。接下来计算机就能自己运行。举个例子,我在计算机中输入以下三行代码:
top = 1000000000 i = 0 while i < top: i = i + 1
这条指令能让计算机数到10亿,用时不超过一分钟,然后它会等待我发出新的指令,在我的完全掌控下执行命令。它急于取悦我。
试想一下:仓鼠在跑轮上不停地跑步,最终一定很累;一级方程式赛车在赛道上高速行驶,也会耗尽汽油停下来。如果仓鼠不停下来,我们会开始担忧。我们的第一反应是:太奇怪了!如果比赛中的赛车不需要进站补给,我们会惊叹:太神奇了!
但是,一台运行程序的计算机只要接通电源就可以处于循环状态并一直运行,永远不会失去能量和热情。它是一种超机械机器,不会像真正的机械那样经历表面磨损,也不会受到重力的影响,因此它能够完美地运行。这一特性是计算机与生机勃勃、躁动不安、吱吱作响的世界的首要区别。
我第一次接触到计算循环的力量是在1979年,当时我还在读七年级,我遇到了我人生中的第一台计算机。这对像我这种在城市贫困地区长大的人来说很不寻常。多亏了民权运动推动废除种族隔离的努力,我被送到一所离家一小时车程的学校就读,这里比我家附近那所破败不堪的学校要好得多。
当时康懋达公司(Commodore)在计算机界颇有名气,当然我指的是在当时美国和欧洲的几千名计算机爱好者这种规模的圈子里。那时个人计算机还不是真正的个人计算机,因为一般家庭都买不起。康懋达个人电子交易器(Commodore PET)是美国制造的,它自带一个只显示荧光绿色文本的小屏幕、一个小小的触觉键盘和一个用于存储的磁带驱动器。它拥有8千字节的总内存,处理速度是1兆赫。相比之下,现在一般的手机内存是8吉字节,是当时的100万倍,运行速度为2,000兆赫,是当时的2,000倍。
那时互联网还没出现,不能搜索任何东西。没有微软(Microsoft),不能用文字处理器或电子表格来工作。没有触摸屏或鼠标,不能直接与显示器上的内容进行交互。没有彩色或灰度像素来显示图像,无法直观地传达信息。系统只配有一种字体,文本也只有大写字母。你通过键盘控制光标在计算机屏幕中上下左右移动。你要是想让它拥有任何功能,都必须自己创建一个新程序或者把书或杂志上的代码逐行敲进去。
可想而知,这样的计算机放在教室里,一般是没人用的——它不但没什么用,就算用起来也没有灵魂。没有具有表现力或能传达信息的图像,没有立体声或流行音乐,更没有一系列好应用带来的可操作性,只有那个矩形的光标不停地向你眨眼睛——似乎在等待着你输入指令让它服从。当你终于鼓起勇气往里面输入内容时,你很可能会得到一行大写字母回复:SYNTAX ERROR(语法错误),这基本上就是在告诉你:“你输入的内容出错了,我不明白你的意思。”
不出所料,这样的计算机只吸引了少部分学生——也许是那些和我一样同理心成长得较慢的学生,或者说那些能够忍受每次击键都被报错的沉重打击的学生。我的朋友科林(Colin)的父母在波音公司(Boeing)从事计算机相关工作。他向我展示了我见过的第一个程序,他飞快地在PET中输入了以下这段没有任何语法错误的代码:
10 PRINT "COLIN" 20 GOTO 10
然后他让我输入RUN……接下来发生的事让我大吃一惊,计算机开始不停地输出COLIN。我问科林计算机什么时候会停下来,他说:“永远不会。”这让我很担心。然后他用control-C键中断了程序。光标再次闪烁起来。
接着科林重新输入了第一行代码,但这次多了一个空格和一个分号。
10 PRINT "COLIN";
他接着输入RUN,计算机屏幕上显示了以下内容:
COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN COLIN . . .
再一次,它就这样不停地向下滚动、输出文字。我自己试了一下,输入:
10 PRINT "MAEDA ". . .
我的名字不断重复地出现在屏幕上带给了我极大的满足感:
MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA MAEDA . . .
自从学会了这一招,我会向任何对计算机感兴趣的人表演这个“说出我的名字”的魔术。我把它展示给我当时暗恋的女同学杰西卡看。当她问我“除了这个计算机还能做些什么呢?”的时候(不妙!),我的计算机能力的缺陷变得非常明显。
我的好奇心被点燃了,我开始阅读《字节》(Byte)杂志(当时仅有的两本计算相关杂志之一)。因为当时几乎没有任何可用的软件,所以学会写程序非常重要。《字节》杂志里通常印有程序的完整代码,长达好几页,让读者可以随时手动输入到计算机里——唯一的问题是,我没有常用的计算机。
幸运的是,我母亲伊琳娜看待事情总是具有前瞻性,她希望自己的孩子能去做更伟大更好的事情。于是,她从家里在西雅图开的小豆腐店里拿出足够的钱,给我买了一台Apple II计算机和一台Epson打印机。为了表达对她的感激,我希望自己写的第一个程序是她在豆腐店里用得上的。因此,我开始写一个每月账单程序,希望帮她节省时间。用这个程序输入老顾客每周的订单,在月底能打印出一张账单。
在读十年级的时候,我是一个打字很快的人,因此满怀热情地写了这个程序,我觉得可以帮她一点忙。我花了大概三个月的时间,每天放学后都写代码。其间遇到的最有挑战性的问题是如何处理闰年——如果我按一年365天设计这个程序,那么每四年就会遇到多一天这个问题。最后,我选择见机行事,比起解决这个问题,我选择手动把365条命令逐条打进去(那时还没有具有复制和粘贴功能的文本编辑器)。这是一项需要手动输入且相当费力的工程。我还记得,当母亲第一次用它来打印每月账单时,我感受到了极大的成就感。
在写完这个程序后不久,我十年级的数学老师莫耶先生(Mr. Moyer)鼓励我参加他的课后计算机俱乐部。在学校里,我在计算机编程方面已经小有名气——也许应该说我是个计算机书呆子。我已经成功完成了我的第一个千行程序,我在想我如果还去参加莫耶先生的俱乐部会不会有失身份,因为跟其他参加聚会的人比,我肯定比较专业。但我还是去了,我清楚地记得莫耶先生讲起一种使用FOR...NEXT的循环命令(LOOPS)。听他讲完,我冒了一身冷汗,感觉自己做了件特别傻的事情。
那天晚上回到家,我回看自己写的那个长长的程序,里面有365组单独的命令:
10 DIM T(365), A(365) : HOME 100 REM GET THE NUMBER OF TOFU AND SUSHI AGE FOR EACH DAY OF THE YEAR 110 REM COMMENTS LIKE THIS ARE HOW PROGRAMMERS TALK TO THEMSELVES 120 PRINT "IT'S DAY 1" 130 PRINT "HOW MANY TOFU" 140 INPUT T(1) 150 PRINT "TOFU ORDER IS", T(1) 160 PRINT "HOW MANY DOZEN SUSHI AGE" 170 INPUT A(1) 180 PRINT "SUSHI AGE ORDER IS", A(1) 190 PRINT "CONTINUE? HIT 0 TO EXIT OR 1 TO CONTINUE" 200 INPUT ANSWER 210 IF (ANSWER = 0) GOTO 9999 220 PRINT "IT'S DAY 2" 230 PRINT "HOW MANY TOFU" 240 INPUT T(2) 250 PRINT "TOFU ORDER IS", T(2) 260 PRINT "HOW MANY DOZEN SUSHI AGE" 270 INPUT A(2) 280 PRINT "SUSHI AGE ORDER IS", A(2) 290 PRINT "CONTINUE? HIT 0 TO EXIT OR 1 TO CONTINUE" 300 INPUT ANSWER 310 IF (ANSWER = 0) GOTO 9999 320 PRINT "IT'S DAY 3" 330 PRINT "HOW MANY TOFU" 340 INPUT T(3) 350 PRINT "TOFU ORDER IS", T(3) 360 PRINT "HOW MANY DOZEN SUSHI AGE" 370 INPUT A(3) 380 PRINT "SUSHI AGE ORDER IS", A(3) 390 PRINT "CONTINUE? HIT 0 TO EXIT OR 1 TO CONTINUE" 400 INPUT ANSWER 410 IF (ANSWER = 0) GOTO 9999 420 PRINT "IT'S DAY 4" 430 PRINT "HOW MANY TOFU" 440 INPUT T(4) 450 PRINT "TOFU ORDER IS", T(4) 460 PRINT "HOW MANY DOZEN SUSHI AGE" 470 INPUT A(4) 480 PRINT "SUSHI AGE ORDER IS", A(4) 490 PRINT "CONTINUE? HIT 0 TO EXIT OR 1 TO CONTINUE" 500 INPUT ANSWER 510 IF (ANSWER = 0) GOTO 9999 520 PRINT "IT'S DAY 5" 530 PRINT "HOW MANY TOFU" 540 INPUT T(5) 550 PRINT "TOFU ORDER IS", T(5) 560 PRINT "HOW MANY DOZEN SUSHI AGE" 570 INPUT A(5) 580 PRINT "SUSHI AGE ORDER IS", A(5) 590 PRINT "CONTINUE? HIT 0 TO EXIT OR 1 TO CONTINUE" 600 INPUT ANSWER 610 IF (ANSWER = 0) GOTO 9999 620 REM CONTINUE SIMILARLY FOR 360 MORE TIMES BY TYPING AS FAST AS YOU CAN 9999 PRINT "ALL DATA ENTERED"
完成了!
我难以置信地看着这365个独立的小节,每小节包含约40行代码——总计约14,600行代码。通过新的方法,我在半小时内就把它缩减到了50行之内,我的自尊心在那一刻受到了打击。在此之前,我还为自己能够完全用蛮力——手动输入去完成工作而感到自豪。我意识到,如果我能像计算机本身思考的方式那样循环思考,它就能自动优雅地完成我安排的工作。我只需要学会以正确的方式来为计算机设定不停重复的任务,然后就可以像玩具车那样给它上紧发条,它就能自己跑起来了!
让计算机一遍又一遍地做同样的事情,看似是我们在占它不够聪明的便宜。但作为人类,我们必须运用自己的智慧,把重复转化为代码中的一种艺术形式。毫无疑问,计算机拥有自己专属的语言,有特定的词汇和语法。为了能流畅地与它沟通,你需要掌握比本书更多的内容。不过,我可以帮你了解计算最基本的要点,为此,我将先绕道带你了解软件的本质。