“系统设计得应该没问题吧”,当你内心在这么问自己的时候,那么这个系统肯定存在非常多的问题!
Anything that can go wrong will go wrong!
一、什么是墨菲定律
墨菲是美国爱德华兹空军基地的上尉工程师。1949年,他和他的上司斯塔普少校,在一次火箭减速超重试验中(human tolerance for g-forces during rapid deceleration),因仪器失灵发生了事故。墨菲发现,测量仪表被一个技术人员装反了。由此,他得出的教训是:如果做某项工作有多种方法,而其中有一种方法将导致事故,那么一定有人会按这种方法去做。
一句本无恶意的玩笑话最初并没有什么太深的含义,只是说出了坏运气带给人的无奈。或许是这世界不走运的人太多,或许是人们总会犯这样那样错误的缘故,这句话被迅速扩散,最后竟然演绎成:如果坏事情有可能发生,不管这种可能性有多小,它总会发生,并引起最大可能的损失。
二、理论依据
在数理统计中,有一条重要的统计规律:假设某意外事件在一次实验(活动)中发生的概率为p(p>0),则在n次实验(活动)中至少有一次发生的概率为pn=1-(1-p)n。由此可见,无论概率p多么小(即小概率事件),当n越来越大时,pn越来越接近1。
这一结论被爱德华·墨菲应用于安全管理,他指出:做任何一件事情,如果客观上存在着一种错误的做法,或者存在着发生某种事故的可能性,不管发生的可能性有多小,当重复去做这件事时,事故总会在某一时刻发生。也就是说,只要发生事故的可能性存在,不管可能性多么小,这个事故迟早会发生的。
三、具体定律
墨菲定律(Murphy's Law)主要内容有四个方面
1、任何事都没有表面看起来那么简单
设计系统时,多问问自己是不是考虑全面了,多请教这方面的资深人士。如果有可能,借鉴已有被验证的成熟方案。在继承的基础上创新风险相对小一些。
2、所有的事都会比你预计的时间长
很多项目是倒排时间的,前紧后松会让项目出问题的概率降低。一定要不断向团队强调时间意识,经验不够丰富的成员估计的时间肯定不够!我在按周迭代的项目中,会尽可能要求成员只用一半的时间做开发,后边留给测试和上线的工作。最重要的是让所有成员一开始就充分工作起来。只要大方向没错,先执行起来!
3、会出错的事总会出错
我经常给组内同学说,一定要搞定一件事。
有些同学把明面上那点工作完成后就等着了,等着别人集成,等着来联调,等着QA测试。这样不太好,你可以多写点单测,让自己负责模块更健壮;了解你这块在整个系统中的定位,跟前后左右的系统的关系,甚至推着相关方向前跑。
系统不少问题都出现在模块间的调用上。做好你这块,同时保证跟前后左右的系统间的依赖都OK才算搞定一件事。
4、如果你担心某种情况发生,那么它就更有可能发生
文章开头那句话,“系统设计得应该没问题吧”。如果你做的东西,自己心里都没底,那大概率是有问题的。
“墨菲定律”的根本内容是“凡是可能出错的事有很大几率会出错”,指的是任何一个事件,只要具有大于零的机率,就不能够假设它不会发生。
四、扩展
墨菲定律应用于不同行业或领域,衍生出了不少有意思的“定律”,可以在http://www.murphys-laws.com/进行查看,网站首页如下图
看的大多是程序员,Murphy’s love laws送给大家