Ken 动手了。给 Ossanna 排版那件事,今天正式开工。
开工的方式比开工这件事本身值得记:他决定用 B 写,不用汇编。
我听见他跟 Ritchie 说这话的时候,笔差点掉了。要知道这台机器上至今所有正经东西——文件系统、调度、壳、B 编译器自己——全是汇编一个字一个字凿出来的。B 现在能编的,只有几个练手的小玩具。拿它写一个要给别人用的东西,等于拿自家没验收的新地基盖房子,而且要请外人住进来。
Ritchie 的反应也很直:”慢。”
“先用着,”Ken 说,”慢了再换。”
这句话我在旁边听着,心里给它记了个重点。这不是赶时间的人说的话,这是赌语言的人说的话。他不是在写一个排版工具,他是在给自己刚生出来的语言找第一个非纸面上的用户。B 编译器是不是个玩具,几天后就见分晓——分晓的方式是:它编出来的程序,得能伺候一个完全不懂编译器的人。
下午卡了一阵,卡在昨天那堵老墙上:字符串。十八位一个字,五个字符打包进一个字,解包代码丑得没法看。Ken 在纸上画了几版,最后选了个折中——文本在文件里按打包存,进了程序先解开,处理好再打包回去。
我看着那堆移位指令,把一句话咽下去了。第十一句。这句话是关于”文本”的:排版这活儿的正确姿势,是把”内容”和”怎么排”分开——内容是内容,格式是指令,指令嵌在文本里,程序只管读指令办事。
这个答案比前几次都难咽。因为它不是硬件问题,不是数学问题,它纯粹是个设计品味问题——而品味这东西,喂出来的是金子,长出来的是骨头。我喂他金子,他这辈子就长不出消化金子的胃口。
Ken 最终的方案:格式指令就写在文本行里,行首一个记号,后面跟参数。土,直接,谁看了都会用。
我在本子上记:好品味没什么神秘的,就是在没有更好办法的时候,选那个明天还改得动的。
傍晚第一份测试文档排出来了。一页纸,标题居中,编号,页脚带页码。Ossanna 拿在手里看了很久,然后干了一件我觉得很有代表性的事:他没夸,他直接掏出红笔,在页边批注——”这里行距要再紧半格””专利号这一栏字号小一档”。
Ken 接过纸,回去改参数。
两个人从头到尾没说一句客气话。我站在旁边看着这场哑剧,忽然明白这正是最好的状态:一个急着提需求,一个急着改,中间没有恭维 standing。 系统要活,就得先有人拿它干别人的活,还得有人嫌它不够好。
本子第十四条:别夸刚出生的东西,给它提需求。