Getcha Program!
在棒球场和竞技场内外,总有人在兜售程序。我们所做的大部分计算都是其他人的程序的结果,以及我们调整或重写的程序的结果。这很明显。
然而,正如我之前写过的,编写好的、有用的、不太冗长和臃肿的程序并不容易。尽管有许多非常棒的书籍(弗雷德·布鲁克斯的,克努特的第三卷,凯尼根和普劳格,凯尼根和派克,本特利),但查看代码会发现大量不整洁、重复、马虎的工作。
我承认采取旧代码,剪掉几行,输入一些东西,然后就可以了——一个新的驱动程序。快速而马虎。
看到 Office 2000 的 4000 万行代码,我意识到开源和 Windows 之间的区别在哪里——也许是两者之间的鸿沟在哪里。
我指出过,如果你去看 BSD 手册,你可以计算出 15 年来对 CSRG(计算机系统研究组)工作做出贡献的人数。大约有 600 人。1998 年,我听到比尔·盖茨提到雷德蒙德有 2000 名程序员。现在很可能更多。
好的程序是由个人或小团体编写的。Brian Kernighan 告诉我,AWK 是他做过的最困难的事情,“因为我们有三个人。”
找来一群聪明的程序员,把他们分配到各个团队,给每个团队分配一个产品,然后让他们开始工作。结果会略低于每个团队中最迟钝的成员所能产生的结果。
当我读到 Hunt 和 Thomas 的 The Pragmatic Programmer(Addison-Wesley,2000 年)时,我很惊讶。这是一本写得很好的书,旨在将程序员从“需求”带到真正的“产品”。我必须承认,我一直认为这种事情有点可笑,但可能 Hunt 和 Thomas 有好主意。这本书绝对值得一读。
考虑到这一切,我开始思考我每天使用的工具:shell、sed、awk、grep、sort、pipe 等。
有几本关于 shell 编程的好书,但没有一本能涵盖甚至大部分可用的 shell(sh、bash、csh、ksh、tcsh 和 zsh,我想到了,我知道还有更多)。Robbins 的 AWK 卷非常出色,几年前有一本关于 sed 的书,但我不知道有任何关于 grep 的书(也没有 egrep,它使用正则表达式搜索)。事实上,我不知道任何关于 zsh 的东西。在这些情况下,我们实际上被迫阅读在线手册页。
我认为,我们如何在日常生活中获得工具是具有启发意义的。例如,我仍然使用 troff。
1967 年,L.P. Deutsch 和 B.W. Lampson 将运行在 MIT 的 PDP-1 上的 TECO(一个编辑器)移植到 SDS 940 上,命名为 QED(= Quick Editor)。Ken Thompson 获取 QED 并为 IBM 7094 上的 CTSS(兼容分时系统)重写了它。他和 Dennis Ritchie 为贝尔实验室的 GE 635 编写了一个版本。然后 Thompson 使用该版本在 1969 年 8 月创建了 ed。
这允许编辑,但打印呢?J.E. Saltzer 为 CTSS 编写了 runoff。Bob Morris 将其移植到 635 上,并将其命名为 roff。Ritchie 将其重写为 PDP-7 的 rf,然后在 UNIX 出现之前(这是一个进化的死胡同)。与此同时,1969 年夏天,Doug McIlroy 用 BCPL(Martin Richards 的基本组合编程语言,1966 年)重写了 roff,同时扩展和简化了它。正是 McIlroy 的版本,首先由 Joe Ossanna,在他去世后,由 Brian Kernighan 变成了我们今天仍在使用的 troff。
(顺便说一句,TECO 也是 Emacs 的祖先。)
将近十年后,Ted Dolotta 创建了备忘录 (-mm) 宏,其中包含大量来自 John Mashey 的输入。此后,Eric Allman 编写了 BSD -me 宏。我仍然使用它们。
没有团队。没有大型团体。只有很多优秀的程序员试图将代码变成真正有用的东西。而开放的方式做到了这一点。
Peter H. Salus,《UNIX 四分之一世纪》和《编织网络》的作者,是 LJ 的特约编辑。可以通过 peter@usenix.org 与他联系。