这周处理了一个HOTFIX,一面忙的焦头烂额,另一面也在反思,HOTFIX可能完全避免吗?
什么是HOTFIX?字面意思是热更新,现实生活中,多用在软件产品上。当某一个产品发布后出现缺陷,需要紧急修复,我们就可以称之为HOTFIX。更宽泛一些,这是一类不可预料的对现实有影响的问题,今天浅谈一下他们。
首先从问题的发生来看,大多数的问题我们可以避免吗?答案是肯定的。通过一些预防性的措施,我们可以有效的避免问题的发生。比如一个组织的安保问题,可以通过增加监控、安检、严格的证件审查等预防。软件开发上,我们通过Code Review、Unit Test、CI/CD来保证代码质量,通过强健的基础架构去保证服务质量等等。
但所有的问题都可以避免吗?在这一点上,我认为问题的出现和预防措施符合二八法则。即20%精力做的预防就可以防止80%的问题出现,在此基础上,想要达到100%的预防,就需要付出越来越多的代价。
事实上,预测这个世界将变得越来越难。很长一段时间里,世界被机械论统治。机械论认为,世界是一个复杂的机器,只要知道所有的变量、条件,就能够推导出未来的状态。但量子力学中的“不确定原理”说明,存在不可测量的变量,因为测量本身会改变变量状态。混沌理论中的蝴蝶效应指出,一只南美洲亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国得克萨斯州的一场龙卷风。这些都说明一件事,就是机械论是不可靠的。随着变量的增多,这个世界变得越来越复杂,越来越不可预测。
现代的软件工程一直在高速发展,摩尔定律带来的硬件大幅提升,使人类控制机器的领域,逐渐从最底层的机器码、汇编、中级程序语言,到高级程序语言、脚本语言,发展到现在的各种“云”技术,抽象的层级不断变多变高。整个软件开发的生态环境,在慢慢变得庞大而复杂。
基于以上两点,我们不难得出一个结论,即现代软件系统的行为,将出现越来越多不可预测的问题。想开发一款零bug产品,也将变得愈发不可能。
既然问题不可能完全预防,那么问题发生后的应对,将会成为保证系统安全的最后一道屏障。这种应对的方案,可以是一些预先准备好的风险管理项,更重要的是建立一种机制,这种机制保证不论发生什么事情,大家都不用慌张,依着这种机制,一步一步来,总能度过难关。
回到软件开发上,也不限于这个行业,防范方法也可以分为两类。一类是预案,出现紧急bug怎么办?系统宕机怎么办?第三方应用挂了怎么办?问题没有出现前,自己去想象会有什么问题。墨菲定理说,最坏的情况总是会发生。所以不论多坏的情况,多么不可能出现的场景,都要假定它会出现,并提前作出应对方案。
如果不幸遇到那些没能想到的问题,以及想到但没有预案的问题,可以尝试回答几个问题。
1. 发生了什么?——描述现象
2. 为什么会发生?——描述原因
3. 有什么影响?——已经造成的后果,将会造成的后果。
4. 该怎么做。——解决问题,消除影响
这几个问题的答案有了,危机的解决便只剩执行和等待了。事后再思考几个问题,增加经验,也是防患于未然:
1. 是否能避免?
2. 如何避免再次发生?
这都是很容易就可以想到的思路,通过这种一来二去,个人或组织就完成了一次迭代和升级。下次遇到同类问题出现将会是手到擒来,遇到新的问题也会信心满满。