Worse is Better_风闻
code2Real-有人就有江湖,有code就有bug2021-05-20 13:12
worse-is-better 哲学:
* 简单性(Simplicity)——(代码或系统)设计一定要简单,不论它的实现还是接口,都一定要简单。而相较而言,让实现保持简单更重要。简单是最重要的,其他的特性都不如保持简单更重要。
* 正确性(Correctness)——在所有可以观察到的方面,设计一定要正确。但是可以为了简单而轻微牺牲正确性。
* 一致性(Consistency)——设计一定不能太过不一致。某些情况下,为了保存简单可以牺牲一致性。如果将某个不常见的情况引入设计,会导致实现变复杂或者不一致,那么就不要考虑这种情况。
* 完整性(Completeness)——设计一定要尽可能多得涵盖重要的情况。所有符合预期的情况一定要被覆盖到。完整性可以为任何其他特性让步。实际上,一旦威胁到实现的简单性,完整性必须要被牺牲。如果保持简单,可以牺牲一致性来实现完整性;尤其是接口的一致性。
早期Unix和C即是这种设计下的完美例子。就把这种设计策略叫做新泽西佬们的策略吧。是的,就是在讥讽他们,为的就是让你明白这帮新泽西佬们搞出来的实现方式是真的糟糕。
-----------------------------------------------------------------------------
每一个Common Lisp和CLOS的设计者都对MIT/Stanford设计风格都身经百战,烂熟于心了。这种风格的本质一言蔽之就是做对的事。对于一个设计者来说,(代码与系统设计)最终要的是需要做到以下几点:
* 简单性(Simplicity)——(代码或系统)设计一定要简单,不论它的实现还是接口,都一定要简单。相较而言,让接口保持简单更重要。
* 正确性(Correctness)——在所有可以观察到的方方面面,设计一定要准确。不要妄想做一个不正确的设计。
* 一致性(Consistency)——设计一定不能是不一致的。为了确保一致性,你可以略微牺牲简单性和完整性。一致性和简单性同等重要
* 完整性(Completeness)——设计一定要尽可能多得涵盖重要的情况。所有符合预期的情况一定要被覆盖到。完整性优先级应该高于简单性。
我相信,大多数人会同意,这些是好的设计所应该有的特性。我将贯彻了这种设计哲学的实现方式称作MIT approach。Common Lisp(以及CLOS)和Scheme是MIT approach的代表。
----------------------------------------------------------------------------------------------------
然鹅,我相信worse-is-better哲学却更能大行其道。在做软件的时候那帮新泽西佬们的方式比MIT approach更好。。
这两种哲学的倡议者都是真心实意认为自己更好的。
很久以前,MITer和新泽西佬碰头开始讨论操作系统的相关问题。
MITer对ITS(MIT AI Lab操作系统)是身经百战了,而且一直在阅读Unix的资料。最近开发ITS的时候碰到一个问题,就是当用户程序调用系统例程以执行可能具有重要状态的冗长的操作(例如IO缓冲区)时会出现The PC loser-ing问题。如果在操作期间发生中断,则必须保存用户程序的状态。由于系统例程的调用通常是单个指令,因此用户程序的PC无法充分捕获进程状态。因为PC会被强制进入loser mode。
MITer没有看到处理此案的任何代码,并向新泽西佬询问如何处理该问题。
新泽西佬:哦。Unixer都知道这个问题,就让系统例程始终完成,但有时会返回一个错误代码,表示系统例程未能完成其操作。然后,我们相信,正确的用户程序会检查错误代码以确定是否再次尝试跑跑系统例程。
MITer(懵了):这不科学!我不喜欢。
新泽西佬:Unix这么做不对吗?Unix设计理念本身就很简单呀。我是真的不懂你们为什么总把事情搞的这么复杂。程序员又不是不能轻而易举地对他进行测试。。。
MITer(质疑):。。可是你们这么做实现是很简单,但是你们的功能接口会很复杂啊。。
新泽西佬:trade-off懂嘛?实现简单更重要。
MITer(喃喃道):那也就是说我写个helloworld都得心惊胆战咯。。?
现在我想说worse-is-better更好。
C是为编写Unix而设计的一种编程语言,它是使用新泽西佬们的方法设计的。因此,C是一种易于编写一个像样的编译器的语言,它要求程序员编写易于编译器解释的文本。有些人称C是一种奇特的汇编语言。 早期的Unix和C编译器都具有简单的结构,易于移植,需要很少的机器资源来运行,并且提供了大约50%-80%的操作系统和编程语言。
近一半的机器性能表现低于中位数,而Unix和C可以很好地在上面工作。 worse-is-better哲学意味着实现简单性具有最高优先级,这一点使得Unix和C很容易在这些机器上移植。 而又有这一半的机器可以令人满意地工作,使用他们又何乐而不为呢?
Unix和C是绝对的计算机病毒。
因此,当西方公司竭力向中国推荐unix/linux系统时,就是在往中国国产操作系统中渗沙子,注病毒。他们推销linux,就象微软默许windows被盗版一样包藏祸心。
一旦中国的国产操作系统接受了新泽西模式,就意味着放弃安全性、一致性、完整性,成为漏洞百出的系统,为CIA植入木马提供方便。
当中国程序员愉快地用简单的工具编程时,虽然开始时很爽,但是由于接口复杂增加了,使得中国人在整合大系统时遇到很多麻烦很难向更高的层次发展,做成大系统,维护时成了火丧场。
持新泽西佬哲学的还有马斯克,他的特斯拉和spaceX都坚持新泽西模式。
例如,传统的航天监控电脑成本上亿元,需要要考虑抗空间辐射,但是马斯克用7台商用CPU解决了问题,用票选算法判断7个CPU的正确性,这样将航天电脑的成本降低到20万美元。
spaceX用的火箭引擎是梅林,反正安全性不用考虑太多了,关注的是推重比和成本。
一枚火箭有9个引擎,当一部分引擎出现故障时,火箭可以靠剩余的引擎工作。
苏联当年也想那样做,反复试验多次都没成功。
特斯拉更不用说,我以为他会用QNX这样的实时操作系统呢,结果用了魔改的linux。特斯拉其它部分是能省就省,这样的产品还要对标超跑,卖超跑的价。
很久以前,有几个中国人在欧洲一家公司打工时,得到软件的源码(可能是有人故意泄露的)。于是他们就赶紧回国开公司卖这个软件。
几年后,这个欧洲公司在中国开分公司,总经理还宴请他们几个人,说感谢他们帮助打开中国市场。
原来,欧洲公司的软件源码和框架是分开的,这些中国人得到源码在中国推广时发现,小规模时还能用,一旦规模扩大就招架不住了,而欧洲公司因为懂框架原理,所以只须调整几个参数就能应付大规模应用了。
中国近代经历百年战乱,人心不定,不愿意踏踏实实地做事,看到什么都想拷贝复制,这给了西方一个很好的机会。
后面的话就不用我多说了,请自行体会。