worse is better

worse is better

做系统设计和开发时,需要在既有需要约束下,反复考虑如何有最少的组件、最清晰的逻辑构建系统,甚至为了简洁性、可以牺牲一少部分需求。
因为我们对问题的理解总是随着对问题的思考而越来越深入;我们在做选择时受限于当时对问题的理解,很难真正做出最合适的决策。遵循“事缓则圆” 的原则,能尽量弄清楚那些是自己已经清楚的部分,那些是自己尚不能确定的部分;在决策时遵从简单粗暴原则寻找一个次优的决策;在适当的时候能进行重构对自己当初的设计和实现进行修正(甚至抛弃),利用对问题域更多的理解来做出一个比你上次决策显得更好更合理的决策。

现实是在许多环境下很少有人有勇气承认自己做的不好,需要改进。于是整个系统就这样腐烂下去。

可以背书的资料: 

一:
UNIX 以及LINUX系统。LINUX今天获得极大的成功,从大型服务器,如BAT等几乎所以互联网的服务器,大都是运行的LINUX,小到嵌入式,以及手机上都有linux的影子。
linux的设计理念源于unix,一脉相承。
摘录<The Art of UNIX Programming>的1.6节 Unix哲学基础
1、模块原则: 使用简洁的接口拼合简单的部件

2、清晰原则:清晰胜于机巧

3、组合原则:设计时考虑拼接组合

4、分离原则:策略同机制分离,接口同引擎分离

5、简洁原则:设计要简洁,复杂度能低则低

6、吝啬原则:除非却无它法,不要编写庞大的程序

7、透明性原则:设计要可见,以便审查和调试

8、健壮原则:健壮源于透明和简洁

…其他几条略。
如果用一句话来总结UNIX 哲学的话,那就耳熟能详的 keep it simpile, stupid,即KISS原则。

二:Richard Gabriel 在 1989 年写的文章The Rise of ‘Worse is Better’。

文章比较了两种设计理念,日常工作也经常有这两种分歧。文章最精华部分抽取如下: 
 麻省理工方法与新泽西方法(MIT Approach vs. New Jersey Approach)的对比

1) MIT 方法

简单性:设计必须简单,这既是对实现的要求,也是对接口的要求。 接口的简单要比实现的简单更加重要。

正确性:设计在任何值得注意的方面都要保证正确。 不正确是绝对不允许的。

一致性:设计必须保持一致兼容。设计可以允许轻微少量的不简单和不完整,来避免不一致。 一致性和正确性同等重要。

完整性:设计必须覆盖到实际应用的各种重要场景。所有可预料到的情况都必须覆盖到。简单性不能过度的损害完整性。

2) 新泽西方法

简单性:设计必须简单,这既是对实现的要求,也是对接口的要求。 实现的简单要比接口的简单更加重要。简单是设计中需要第一重视的因素。

正确性:设计在任何值得注意的方面都要求正确。为了简单性, 正确性可以做轻微的让步。

一致性:设计不能过度不兼容一致。为了简单, 一致性可以在某些方面做些牺牲,但与其允许设计中的这些处理不常见情况的部分去增加实现的复杂性和不一致性,不如丢掉它们。

完整性:设计必须覆盖到实际应用的各种重要场景。所有可预料到的情况都应该覆盖到。为了保证其它几种特征的品质, 完整性可以作出牺牲。事实上,一旦简单性受到危害,完整性必须做出牺牲。一致性可以为实现的完整性作出牺牲;最不重要的是接口上的一致性

我站在New Jersey这一派上。理由前面已经说了一部分,另外我们是做工程的,需要权衡成本和收益,当成本远大于收益时,一些事情可以不做,或者换其他便宜方式做。软件系统的规模,最大的瓶颈,我认为是人的脑子,超过人类理解的工程系统,是无法维护的。

三:
硅谷创业之父的Paul Graham 《黑客与画家》 设计与研究一章
作者举了画画的例子,论述Worse is Better。“几乎所有的美术老师都会告诉你准备画出一个事物的方法,不是沿着轮廓慢慢一个部分、一个部分把它画出来,因为这样的话各部分的错误会积累起来,最终导致整画失真。你真正应该采用的方法是快速地用几跟线画出一个大致准确的轮廓,然后再逐步加工草稿。” 


四:http://www.dodgycoder.net/2012/04/scalability-lessons-from-google-youtube.html

作者总结了这几家知名互联网大厂的设计教训:

  1. Keep it simple – complexity will come naturally over time.
  2. Automate everything, including failure recovery.
  3. Iterate your solutions – be prepared to throw away a working component when you want to scale it up to the next level.
  4. Use the right tool for the job, but don’t be afraid to roll your own solution.
  5. Use caching, where appropriate.
  6. Know when to favor data consistency over data availability, and vice versa.

第1条和第3条都符合worse is better的理念

当今的互联网大公司的系统往往有成千上万台机器,这样系统的设计、部署和运维都相当有挑战。一个系统往往N多节点,N多环节。如果各个环节做不到简单可靠,整体系统的稳定性就无从谈起。

kuaikuai

老程序员一名