今天差点破功。不是因为看见什么,是因为被点名了。
事情得从上午说起。Ken 在写 B 的编译器——用汇编写,塞在八千个字的内存里,编译器自己能编自己之前,全靠手工一斧头一斧头地凿。我在旁边看,十八位的机器字,一个指针和一个整数在这台机器上是同一个东西,内存没编号保护,谁跑飞了谁连累全场。这年代的系统程序员不是在写代码,是在给整台机器当保镖。
中午茶水间来了个别的部门的人,听说了这台机器,来试。他敲了十分钟,问了个问题,把我逗乐了:”批处理作业交上去以后,取结果的窗口在哪儿?“
没有窗口。没有排队。你坐在这儿,机器现在就伺候你,敲错了现在就报。他把电传打字机端详了半天,像在等一张穿孔卡片掉出来。他不知道自己面对的是什么——”算了机器正在干什么、让机器等我说下一句话”,这个动作五十年后叫交互,此刻对他来说像耍赖。
下午出了事。
Kernighan 抱着他那沓申请材料的修改稿路过,看我在本子上抄命令清单,站住了。他翻了翻,然后问我:
“如果让你来写这套东西的手册,你从哪儿下手?”
我手里的笔停了。
这是这几天最危险的一个问题。因为我知道手册该长什么样——例子开路,讲怎么做,不讲为什么;一个工具一页纸,第一行就是用法,不怕浅,怕绕。这套写法五十年后成了教科书,作者就在我眼前站着。我要是把答案倒给他,将来满世界那套”先给一个能跑的最小程序”的写法,就是我今天在走廊里剧透出来的。这买卖不划算——不是我要名,是这个答案必须从他自己的读者反馈里长出来,长出来的才是他的。
我给了一个降级的回答,说的是 1969 年人人认的理:”抄你们部门批处理手册的反面。那边先讲架构再讲怎么跑,没人读到第二页。你反过来写,第一行就让他敲出结果。”
他想了想,说:”人会先读会用的东西。“然后走了,步子比来的时候快。
我没说错话。我只是把一块石头踢到他自己脚边,捡不捡随他。这算不算破功?我在本子上记了一笔,记完觉得不算:石头的形状是现成的,路是他走的。
傍晚在机房,McIlroy 又提管道。这次不是对我说的,是对 Ritchie:
“现在这些命令,各管各的。要是能串起来,一个数数,一个挑词,一个排序——”
“性能,”Ritchie 说,”中间总得有个东西在跑。”
“中间那个东西就该是操作系统的事。”
Ken 在角落里,电传打字机哒哒哒地响。他没参与。但我注意到他把机器上一个还没定型的文件重定向标记,从临时记号改成了正式的。他嘴上不说,手上在铺管子。
我数了一下,这个月我咽回去的话,加上今天那份没出口的手册写法,一共八句。晚上回宿舍的路上算了算,按这个进度,等这套系统有名字那天,我大概已经练成一个哑巴。
哑就哑吧。会说话的人多,会闭嘴的人少,闭嘴还能干活的更少。 本子今天没断更,第十一条:机器内存以字计价,人的诚实以句计价,都省着用。