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 ...
随机推荐
- Reverse链表 递归实现
#include<iostream> struct node{ int payload; node* next; }; void bianli(node* head){ node* ite ...
- Android进程间的通信之AIDL
Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL ...
- hadoop-mongo map/reduce java
官方 http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-hadoop/ mongo-haoop项目地址 https://g ...
- Unity 3D
Assets(模型.贴图.脚本) Library(快捷方式.暂存文件) ProjectSettings(设置信息) Temp(临时文件) Generate Colliders(是否碰撞) Terrai ...
- NOIP注意事项
高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精 (后面c,d考的可能性较小 ...
- HTML5 CSS3学习
HTML5 CSS3学习 :http://www.1000zhu.com/course/css3/ HTML5 相关书籍: http://www.html5cn.com.cn/news/gdt/2 ...
- easyui form表单提交应注意的问题
今天在一个项目中用到表单提交,代码如下: $('#CreateForm').form('submit', { onSubmit: function () { ajaxCreateFrom(this, ...
- mysql galera cluster 集群的分裂与仲裁机制
集群的分裂 当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致.这种情况 下,只有一组节点能够继续提供服务,这组节点的状态 ...
- MvcPager 免费开源分页控件3.0版发布!
MvcPager 3.0版在原2.0版的基础上进行了较大的升级,对MvcPager脚本插件重写并进行了大量优化.修复了部分bug并新增了客户端Javascript API等功能,使用更方便,功能更强大 ...
- Jquery插件开发精品教程
最开始接触jquery对他提供的各种插件总是十分有兴趣,但是总是不理解为什么这样写,从网络上查询了很久终于找到这篇文章,讲解的很详细,分享给大家. 要说jQuery 最成功的地方,我认为是它的可扩展性 ...