「糟糕的更好」的崛起
作者:互联网
「糟糕的更好」的崛起
- 原文:https://www.dreamsongs.com/RiseOfWorseIsBetter.html
- 作者:Richard P. Gabriel@Lucid公司
- 翻译:Tacey Wong
本文摘自《Lisp: Good News, Bad News, How to Win Big.》(Lisp:好消息,坏消息,如何赢大)。
2.1 「糟糕的更好」的崛起
我与几乎每个Common Lisp和CLOS的设计师都深度接触了解了MIT/Stanford设计风格。这种风格的本质可以由正确的语句体会懂得。对于这样的设计师来说,要正确体会懂得以下所有特征是很重要的:
- 简单性——设计必须简单,无论是在实现上还是接口上。接口的简单性比实现的简单性更重要。
- 正确性——设计必须在所有可观察的方面都是正确的。不允许出现错误。
- 一致性——设计不能不一致。设计可以稍微不那么简单和完整,以避免不一致。一致性和正确性同样重要。
- 完整性——设计必须覆盖尽可能多的重要情况。必须涵盖所有合理预期的情况。简单性不允许过多地减少完整性。
我相信大多数人都会同意这些都是好的特点。我把这种设计哲学的运用称为MIT方法。Common Lisp(与CLOS)和Scheme代表了MIT的设计和实现方法。
「糟糕的更好」的哲学只是略有不同:
- 简单——设计必须简单,无论是在实现上还是接口上。实现的简单性比接口的简单性更重要。简单是设计中最重要的考虑因素。
- 正确性——设计必须在所有可观察到的方面都是正确的。简单比正确要好一些。
- 一致性——设计不能过于不一致。在某些情况下,可以为了简单而牺牲一致性,但最好放弃那些处理不太常见情况的设计部分,以避免引入实现的复杂性或不一致性。
- 完整性——设计必须覆盖尽可能多的重要情况。所有合理预期的情况都应涵盖在内。为了其他质量,可以牺牲完整性。事实上,只要实现的简单性受到损害,就必须牺牲完整性。如果保持简单性,可以牺牲一致性来实现完整性;尤其没有价值的是接口的一致性。
早期的Unix和C语言就是使用这种设计流派的例子,我将这种设计策略的使用称为新泽西方法。我故意用讽刺的方式描述了「糟糕的更好」的哲学,以说服你们这显然是一种糟糕的哲学,而新泽西的方法也是一种糟糕的方法。
然而,我相信即使是在稻草人的形式中,「糟糕的更好」也比“正确的事情”有更好的生存特性,而且当用于软件时,新泽西方法比麻省理工方法更好。
让我首先重述一个故事,该故事表明麻省理工学院/新泽西的区别是有效的,每个哲学的支持者实际上都相信他们的哲学更好。
两位名人,一位来自麻省理工学院,另一位来自伯克利(但从事Unix工作),曾经会面讨论操作系统问题。这个来自麻省理工学院的人对ITS(麻省理工学院AI实验室操作系统)非常了解,并且一直在阅读Unix源代码。他对UNIX如何解决PC失败问题(loser-ing)感兴趣。当用户程序调用系统例程以执行可能具有重要状态(例如IO缓冲区)的冗长操作时,PC失败问题就会发生。如果在操作过程中发生中断,必须保存用户程序的状态。因为系统例程的调用通常是一条指令,用户程序的PC不能充分地捕获进程的状态。系统例程要么退出,要么推进。正确的做法是退出并恢复用户程序PC到调用系统例程的指令,以便在中断后恢复用户程序,例如,重新进入系统例程。它被称为电脑输家,因为电脑被强制进入输家模式,输家是MIT对用户的亲切称呼。
麻省理工的家伙没有看到任何处理这个问题的代码,于是问新泽西的人这个问题是如何处理的。那个新泽西的家伙说Unix的人已经意识到了这个问题,但是解决方案是让系统例程总是完成,但是有时候会返回一个错误码,表明系统例程没有完成它的操作。因此,正确的用户程序必须检查错误码,以确定是否只需再次尝试系统例程。麻省理工学院的家伙不喜欢这种解决方案,因为这不是正确的事情。
那个新泽西的家伙说Unix解决方案是正确的,因为Unix的设计哲学是简单,正确的东西太复杂了。此外,程序员可以很容易地插入这个额外的测试和循环。麻省理工学院的人指出,实现很简单,但功能的接口很复杂。那个新泽西人说Unix选择了正确的权衡——也就是说,实现的简单性比接口的简单性更重要。
麻省理工学院的家伙嘟囔着说:“有时候做嫩鸡需要一个强硬的人。”但是新泽西的家伙不明白(我不确定我也不知道)。
现在,我想争辩说「糟糕的更好」更好。C是一种用于编写Unix的编程语言,它是使用新泽西方法设计的。因此,C语言很容易编写一个像样的编译器,它要求程序员编写易于编译器解释的文本。有些人把C语言称为一种奇特的汇编语言。早期的Unix和C编译器都具有简单的结构,易于移植,运行所需的机器资源很少,能够提供操作系统和编程语言所需的50%-80%的功能。
在所有存在的计算机中有一半比中值更差(更小或更慢)。Unix和C在它们上运行得很好。「糟糕的更好」的哲学意味着实现的简单性具有最高的优先级,这意味着Unix和C很容易在这样的机器上移植。因此,如果对Unix和C的50%功能的支持是令人满意的,那么它们将开始出现在任何地方。他们做到了,不是吗?
Unix和C是终极计算机病毒。
「糟糕的更好」的哲学的另一个好处是,程序员有条件牺牲一些安全性,便利性和麻烦,以获得良好的性能和适度的资源使用。使用新泽西方法编写的程序在小型机器和大型机器上都能很好地工作,而且代码是可移植的,因为它是在病毒上编写的。
重要的是要记住最初的病毒必须基本上是好的。如果是这样,只要是可移植的,病毒传播就是有保证的。一旦病毒扩散,就会有压力来改进它,可能是通过将其功能提高到接近90%,但用户已经习惯于接受比正确的东西更糟糕的东西。因此,「糟糕的更好」的软件首先会被接受,其次会让用户期望更少,第三会被改进到几乎是正确的程度。具体来说,尽管1987年的Lisp编译器和C编译器差不多好,但是想让C编译器更好的编译器专家要比想让Lisp编译器更好的编译器专家多得多。
好消息是,在1995年,我们将拥有一个良好的操作系统和编程语言;坏消息是它们将是Unix和c++。
「糟糕的更好」还有最后一个好处。因为新泽西语言和系统还没有强大到足以构建复杂的单体软件,所以必须设计大型系统来重用组件。因此,一种融合的传统应运而生。
正确的事情是如何叠加的?有两个基本场景:大型复杂系统场景和类似钻石的宝石场景。
大型复杂系统场景是这样发展的:
首先,需要设计出正确的东西。然后需要设计它的实现。最后实现。因为它是正确的,所以它几乎100%地实现了预期的功能,而且实现的简单性从来都不是问题,所以它需要很长时间来实现。它又大又复杂。它需要正确使用复杂的工具。最后的20%需要80%的努力,所以正确的东西需要很长时间才能出来,而且它只能在最复杂的硬件上令人满意地运行。
钻石般的珠宝场景是这样发展的:
正确的东西需要花很长时间甚至永久去设计,但它在整个过程中的每一个点上都非常小。实现快速运行它要么是不可能的,要么超出了大多数实现者的能力。
这两个场景对应于Common Lisp和Scheme。
第一个场景也是经典人工智能软件的场景。
正确的东西通常是软件的一个整体,但是除了正确的事物外,没有其他原因是单一设计的。也就是说,这个特征是偶然的。
从中得到的教训是,首先就去做正确的事情往往是不可取的。最好有一半正确的东西可用,这样它就会像病毒一样传播。一旦人们迷上了它,花时间把它改进到90%是正确的。
一个错误的教训是,从字面上理解这个比喻,并得出结论说C语言是人工智能软件的正确工具。50%的解必须基本正确,在这个例子中不是。
但是,我们只能得出这样的结论:Lisp社区需要认真反思自己在Lisp设计上的立场。我稍后会详细说明。
那篇关于「糟糕的更好」的经典文章不是被误解了就是错了。. ——Jim Waldo
标签:更好,崛起,正确,糟糕,Unix,简单,设计,新泽西 来源: https://www.cnblogs.com/taceywong/p/16579641.html