Worse Is Better
最近做的几件事和最近刚读到这篇文章(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的更多相关文章
- 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. ' ...
- Performance Tuning
本文译自Wikipedia的Performance tuning词条,原词条中的不少链接和扩展内容非常值得一读,翻译过程中暴露了个人工程学思想和英语水平的不足,翻译后的内容也失去很多准确性和丰富性,需 ...
- C++右值引用浅析
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以 ...
- C++ std::deque
std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...
- The .NET of Tomorrow
Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciting times lie ahead f ...
- 【热文】 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows?
校对:伯乐在线 - 黄利民 链接: 1. Why do most of the developers in Silicon Valley prefer OS X over Linux or Windo ...
- Reactor by Example--转
原文地址:https://www.infoq.com/articles/reactor-by-example Key takeaways Reactor is a reactive streams l ...
- 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 ...
- RabbitMQ学习系列(六): RabbitMQ 高可用集群
前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...
随机推荐
- python学习之——django环境搭建
Django是一个基于MVC构造的框架,用于web开发,主要目的是简便.快速的开发数据库驱动的网站. 前提:已经安装python 搭建步骤: 1.https://www.djangoproject.c ...
- js从服务器下载文件
通常,将文件绝对路径url作为超链接<a>的链接地址href的值,点击<a>后,浏览器将会尝试请求文件资源,如果浏览器能够辨认文件类型,则将会以预设的打开方式直接打开下载的文件 ...
- iOS.ReactNative-5-make-react-native-to-support-dynamically-update
基于React Native来实现App的热更新 热更新: 类似Hot-Patching,在程序不发布版本的前提下,对部分功能或者全部功能进行修改或者升级. JSX 1. JSX简介 1.1 http ...
- iOS10字体
iOS10字体随着手机系统的字体改变,当我们手机系统字体改变以后,我们的app的lable也会跟着一起变化: 同样的6sp,在iOS9上面运行字体显示是没问题的,当我的手机更新了iOS10以后,有的界 ...
- python课程第一周重点记录
- C# ToString("x2")的理解
1).转化为16进制. 2).大写X:ToString("X2")即转化为大写的16进制. 3).小写x:ToString("x2")即转化为小写的16进制. ...
- python中几个常见的“黑盒子”之 列表list
python常见的数据类型有:字符串,布尔类型,整数,浮点数,数字,日期,列表,元祖,字典.相信前面6个大家都非常的熟悉,但是对于python的列表,元祖,字典我有时候一直在想其内部的实现是怎么样子的 ...
- Linux系统调用
在前面,我们接触到了很多函数能够实现系统相关的功能,比如解析命令行参数.控制进程以及映射内存等等.实际上,这些函数能够分为两大类: 库函数--这些函数就像普通函数一样,参数放置在寄存器或者栈里,运行时 ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- (Python)继承
面向对象的另一个特性是继承,继承可以更好的代码重用. 例如一个学校里面的成员有老师.学生.老师和学生都有共同的属性名字和年纪.但老师还有它自己的属性,如工资.学生也有它的属性,如成绩. 因此我们可以设 ...