2

【意译】坏到好处

 3 years ago
source link: https://zhuanlan.zhihu.com/p/352433580
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【意译】坏到好处

反对资本主义,反对官僚,反对帝国主义

本文翻译自The Rise of Worse is Better 原文写于1989年

首先介绍一下 MIT/Stanford(麻省理工/斯坦福) 的设计风格,这是一种优雅的、学院派的设计风格,一个字概括:好。

一个好的设计,必须具有如下特质:

- **简单** —— 设计必须简单,不论是实现还是接口。接口的简单比实现的简单更重要。
- **正确** —— 在所有可预见的方面都必须正确。不正确是不可容忍的。
- **一致** —— 设计必须一致。为了避免不一致,可以牺牲一些简洁。一致性和正确性同等重要。
- **完全** —— 覆盖尽可能多的情况。必须满足所有预料到的合理情况。和简洁性相比,完全性更加重要。

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

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

- **简单** —— 设计必须简单,不论是实现还是接口。 **实现的简单比接口的简单更加重要。简单性是整个设计过程中最重要的考虑因素。**
- **正确** —— 在所有可预见的方面都必须正确。但简单性比正确性重要一点。
- **一致** —— 不能太不一致。在某些情况下,为了简单,可以牺牲点一致性。如果一个东西会带来实现上的复杂或者不一致,但又只为了解决一些不常见问题,这种东西宁可不要。
- **完全** —— 设计必须覆盖尽可能多的情况。所有能够预料到的合理情况应该被满足。和其他三者比起来,完全性没有那么重要。实际上, **一旦威胁到简单性,完全性就微不足道了。** 在保持简单的前提下,为了完全性,可以牺牲一致性(尤其是接口的一致性)。

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

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

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

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

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++。

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


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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK