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 ...
随机推荐
- 配置Eclipse编写HTML/JS/CSS/JSP页面的自动提示。
我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...
- textArea 高度自适应
<textarea name="apparatus" class="dhxTextArea" style="width:100%;height: ...
- Codeforces 703B (模拟) Mishka and trip
题目:这里 题意:n个城市,每个城市有个魅力值vi,首先,有n条路将这n个城市连成一个环,1号城市连2号城市,2号连3号****n号连1号城市,每条路的魅力值是其连接的两个城市 的魅力值的乘积,这n个 ...
- 统一资源定位符URL类
package j2se.core.net.base; import java.io.BufferedReader;import java.io.IOException;import java.io. ...
- Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信
紧接着<Tomcat单向Https验证搭建,亲自实现与主流浏览器.Android/iOS移动客户端安全通信>,此处演示下更安全的双向Https认证的通信机制,为了清晰明了,以下进行单独描述 ...
- PHP图片裁剪_图片缩放_PHP生成缩略图
在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...
- JavaScript 常用函数总结
javascript函数: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数 .cookie函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert ...
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- 【转载】最完美解决Nginx部署ThinkPHP项目的办法
网上通用解决方法的配置如下: server { ... location / { index index.htm index.html index.php; #访问路径的文件不存在则重写URL转交给T ...
- Git入门仅这篇就够了
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5978937.html 前言 大家好,我是Cavalier ...