小池有话说

【意译】坏到好处(草稿)

2014-11-06

The Rise of Worse is Better

首先介绍一下 MIT/Stanford 的设计风格,这是一种优雅的、学院派的设计风格,一个字概括:好。一个好的设计,必须具有如下特质:

大多数人都会同意上述四点。

然而,坏到好处 的理念有点不同。

早期的 Unix 和 C 就是这种设计风格,我称之为 土鳖流。上面我有意黑了这种风格一下,你会觉得这种理念是 的。

然而,我觉得这种 更有生命力。

我讲一个故事,你们感受一下这两种哲学的区别。

两个人在一起讨论操作系统的问题。一个来自 MIT,一个来自伯克利的土鳖(但是使用 Unix)。MIT 的人通读了 Unix 的源码,他对 Unix 是如何解决 PC loser-ing 问题的很感兴趣。这个问题是这样的:在用户程序发起一个长时间的带有状态的系统调用的时候(如 IO 操作),如果此时一个中断进来了,用户程序的状态(上下文)应该被保存。系统调用通常只是一条指令,用户程序的 PC 不能代表此时的状态。系统要么后退,要么完成这个调用。正确的做法应该是后退,将用户程序的 PC 保存在此次系统调用中,以便最后重入此次系统调用。

MIT 人在源码里没有看到任何处理此种情况的代码。他问土鳖这是怎么回事。土鳖回答道:Unix 的作者们知道这个问题,这个问题的处理手段就是系统调用立刻结束,但是会返回一个错误码,表示此次操作失败。一个正确的用户程序,应该检测错误码,自行决定是否重新发起系统调用。MIT 人不喜欢这个解决方案,因为这个解决方案 不负责

土鳖则说,Unix 的解决方案是正确的,因为 Unix 的设计哲学就是简洁,就这件事情来讲,正确的方案太复杂了。而且,程序员额外写个 test and loop 很简单的。MIT 人指出,实现确实很简洁,但是这个功能的接口太复杂了。新泽西人说,在鱼和熊掌之间,Unix 选择了实现的简单,而非接口的简单。

MIT 人听了这句话,说,有时候,你必须很努力,才能看起来毫不费力。但是土鳖没文化,理解不了这句话。(我也不知道我理解吗)

现在,我想说,坏才是好。C 是为了写 Unix 设计出来的编程语言,使用的就是土鳖流。所以,给 C 语言写个编译器就很简单。有些人称 C 为汇编语言的精选集。早期的 Unix 和 C 都具有简单的接口,容易移植,占有资源少。提供了大约 50%-80% 的功能。

有一半的电脑都在平均水平以下。但 Unix 和 C 在它们上面也能很好的工作。 坏到好处 的哲学的本质就是实现的简单高于一切,也就意味着 Unix 和 C 便于移植到这些机器上面。因此,如果 Unix 和 C 的 50% 的功能可以让一个人满足,那么它们就会遍地发芽。历史已经证明。

Unix 和 C 是终极病毒。

坏到好处 哲学的进一步的好处是程序员可以酌情牺牲安全性、便利性,不自找麻烦,来获得更好的性能、占用更少的资源。用土鳖流写成的程序在大机器和小机器上都能运行的很好,也有很好的移植性——毕竟是写在病毒上,不能给病毒丢脸。

最初的病毒得是好的。只要这样才能保证迁移的顺畅。一旦病毒传播开来,就会有变得更好的压力,比如将功能提升到 90%,但此时用户已经习惯这个坏到好处的东西。因此,坏到好处的软件首先会得到认可,其次会让它的用户习惯简陋,再次它会进化到一个基本正确的东西。一个具体的例子是:1987 年的时候,Lisp 编译器已经和 C 编译器一样好了,但是有更多的大牛想要优化 C 编译器。

好消息是到 1995 年,我们就能拥有一个优秀的操作系统和一个优秀的编程语言,坏消息是,它们会是 Unix 和 C++。

坏到好处的最后一个好处是:因为土鳖流的语言和系统不足以建造一个复杂而庞大的软件,大型系统必须被设计为可以重复使用的组件。就这样,集成的传统出现了。


译者有话说:先让它 能用,再让它 好用。头脑中的完美比不上现实中的聊胜于无。正如美国军规所言:如果一个笨办法管用,就不算笨。