最近做的几件事和最近刚读到这篇文章(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. 配置文件操作(ini、cfg、xml、config等格式)

    配置文件的格式主要有ini.xml.config等,现在对这些格式的配置文件的操作(C#)进行简单说明. INI配置文件操作 调用系统函数GetPrivateProfileString()和Write ...

  2. sql 中 in与exists的对比

    1.exists只能用于子查询,可以替代IN,如果查询到结果则退出内部查询,并将条件标记为TRUE,传回全部结果资料 in 不管匹配到匹配不到,都全部匹配 2.根据上面的解释可以得出结论:如果子查询结 ...

  3. js动态时间

    一.在<head></head> 之间写入下面js代码 <script type="text/javascript" language="J ...

  4. LeetCode(131)Palindrome Partitioning

    题目 Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  5. android json解析详细介绍之gson

    废话不多说,什么json是轻量级数据交换标准:自己百度去深入了解:这里有三种json解析工具.本人只用过其中两种:    1.Google Json利器之Gson   评价:简单,方便. 2.阿里巴巴 ...

  6. Map中的entry

    是java中的一个对象,一般可以通过map.entrySet()得到.1,entrySet实现了Set接口,里面存放的是键值对.一个K对应一个V.2,用来遍历map的一种方法.Set<Map.E ...

  7. 15.Xcode8 升级遇到的问题

    一:注释快捷键cmd+/不能用,解决方法: 1. Swift_3.0 没法快捷键(command+/)注释的原因:这个是因为苹果解决xcode ghost,把插件屏蔽了. 2. 解决办法: (1) 终 ...

  8. JS-reverse(数组内容颠倒)

    var arr1 = [ 1,2,3,4,5,6 ];// arr1.reverse();// alert( arr1 ); //怎么颠倒字符串呢? var str = 'abcdef';alert( ...

  9. windows sdk编程 richedit创建,像十六进制编辑器一样显示文件

    编译环境 :windows 7 64位 vs2010,工程创建选择"win32项目" 注意添加几个头文件 #include <WinBase.h> #include & ...

  10. JavaScript-cookie是客户端本地,持久存储用户私密数据的文件

    navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...