最近做的几件事和最近刚读到这篇文章(http://www.jwz.org/doc/worse-is-better.html)让我重新认识了KISS和这个所谓的Worse-is-better原则。

软件是一个相当复杂的系统,哪怕仅仅是一个数百行的程序,也往往在运行时会出现很多不可预知的场景;作为程序员,我们总是想尽可能的保证所有的场景都能得到正确的处理,但这只能是一个美好的愿望:或者这个是类似于一个NP的问题,或者是我们自身能力有限。做超出我们能力的事还想把它做好做完美,那是绝对不可能的。就像俄罗斯轮盘赌一样,只有一颗子弹,不可能同事搞定两个赌徒。

程序员往往就是这个俄罗斯轮盘赌的操控者,时常纠结于把这颗子弹给谁。有些必要的纠结是必须的,当回过头来看,往往花费我们大量时间和精力的纠结发生在一些细枝末节的事上,而那些往往真正需要我们去考虑、权衡的地方却因为我们对问题本身理解的深度或广度,仓促的做了决定。我想很多人都会有和我类似的体会,例如我们常常会想某个功能是放在class A里面还是class B里面更合理?某个函数我们是让它返回boolean还是抛出异常。。。等等之类

这类选择往往并没有对错之分,就和我们日常中会碰到的很多小事一样;既然如此,我们何必需要耗费大量的时间和精力进行权衡呢?直接采用简单粗暴的方式可能和最完美的解决方法比起来会有这样或那样的不足,但它能节约你的时间和精力,让你能专注于更大更重要的事上,综合起来你能获得的回报可能会远远大于你坚持选择最完美方案所带来的回报。

另外一个需要坚持KISS和Worse-is-better做法的原因在于,我们对问题域的理解总是随着对问题的深入而越来越深入的(从时间和空间上都是如此);我们在做选择时受限于当时对问题域的理解,很难真正做出最合适的决策。所谓的计划没有变化快,过多的计划往往会被证明为是没有任何益处的,我们过多的在对问题充分了解时做出所谓正确选择也是没有任何意义的:能容忍你的实现有些不足深证是bug也是一种能力和境界。

总之在系统设计和程序实现时,能尽量弄清楚那些是自己已经清楚的部分,那些是自己尚不能确定(从而只能做假设)的部分;在决策时遵从简单粗暴原则寻找一个次优的决策;在适当的时候能进行重构对自己当初的设计和实现进行修正(甚至抛弃),利用对问题域更多的理解来做出一个比你上次决策显得更好更合理的决策。

Worse Is Better的更多相关文章

  1. Lesson 24 It could be worse

    Text I entered the hotel manager's office and sat down. I had just lost £50 and I felt very upset. ' ...

  2. Performance Tuning

    本文译自Wikipedia的Performance tuning词条,原词条中的不少链接和扩展内容非常值得一读,翻译过程中暴露了个人工程学思想和英语水平的不足,翻译后的内容也失去很多准确性和丰富性,需 ...

  3. C++右值引用浅析

    一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...

  4. C++ std::deque

    std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...

  5. The .NET of Tomorrow

    Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciting times lie ahead f ...

  6. 【热文】 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows?

    校对:伯乐在线 - 黄利民 链接: 1. Why do most of the developers in Silicon Valley prefer OS X over Linux or Windo ...

  7. Reactor by Example--转

    原文地址:https://www.infoq.com/articles/reactor-by-example Key takeaways Reactor is a reactive streams l ...

  8. Java I/O and NIO [reproduced]

    Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...

  9. RabbitMQ学习系列(六): RabbitMQ 高可用集群

    前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...

随机推荐

  1. C#中的线程(一)入门

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

  2. MySQL——保证数据的完整性

    为了防止垃圾的产生,从而影响数据库的执行效率. 1实体完整性——行数据的有效性   唯一约束(unique).主键约束(primary key) 2域完整性——列数据的有效性 非空约束(not nul ...

  3. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  4. Error:SSL peer shut down incorrectly

    从别的地方拷贝过来的项目有时会报这个错误,解决方法 File -> Project Structure -> project 对比本地项目和拷贝项目并修改至与本地项目一致

  5. c# htmtToPDF

    http://www.cnblogs.com/shanyou/archive/2012/09/07/2676026.html

  6. OVER 分析函数

    over不能单独使用,要和分析函数:rank(),dense_rank(),row_number(),ntile ,sum(),avg()等一起使用. rank,dense_rank,row_numb ...

  7. windows配置thrift开发环境

    1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了 c:\windows ...

  8. html5实现摇一摇功能

    原理:使用DeviceMotion实现,关于DeviceMotion介绍可以查看 https://developer.mozilla.org/en-US/docs/Web/Reference/Even ...

  9. javascript 日期转换为中文

    function CNDateString(date) { var cn = ["〇","一","二","三",&quo ...

  10. 想在Images.xcassets 只能用 imageNamed 加载里边的素材 其他方法 你就别费老劲了

    1.Images.xcassets中的素材 (1)只支持png格式的图片 (2) 图片只支持[UIImage imageNamed]的方式实例化,但是不能从Bundle中加载 (3)  在编译时,Im ...