内容提要
软件系统无法保证永不失败,因其依赖电力、硬件等物理条件。必须提前设计失败应对方案:以“一切皆可能故障”为思维,区分避免与容忍故障,判断故障影响范围,降低冲击,运行时正确处理故障,并衡量恢复能力。
延伸解读
为什么“完美代码”无法消除故障
文章指出,即使应用代码写得完全正确,软件仍依赖物理计算机、电力供应和正常工作的存储。一旦机器断电,再好的软件也会失败。因此,故障并非仅由代码缺陷引起,而是系统运行所依赖的物理条件决定的。这一视角提醒开发者,不能把可靠性完全寄托在代码质量上,而必须承认外部环境本身就可能失效。
从“避免故障”转向“容忍故障”
文章区分了避免故障与容忍故障两种思路。避免故障试图阻止问题发生,但无法覆盖所有物理和环境风险;容忍故障则承认部分组件可能失效,并提前决定系统应如何表现。对开发者而言,这意味着设计重点不只是减少错误,还要考虑当某些部分不能正常工作时,系统如何继续运行或有序降级。
故障设计需要回答的几个问题
文章提出,设计故障应对方案时要判断故障的影响范围、降低冲击、在运行时正确处理故障,并衡量恢复能力。这些环节构成一个完整链条:先知道故障会波及多大范围,再设法减轻后果,然后让系统在运行中正确响应,最后用可衡量的方式确认恢复效果。缺少任何一环,故障设计都难以落地。
Q&A
为什么软件系统无法保证永不失败?
因为即使代码完美,软件仍依赖物理计算机、电力供应、正常工作的存储等物理条件。如果机器断电,软件无论多好都会失败。
设计故障应对方案时,应该采用什么样的思维方式?
采用“假设一切皆可能故障”的思维方式,提前决定当系统某些部分不能正常工作时,系统应如何表现。
避免故障和容忍故障有什么区别?
文章将避免故障与容忍故障作为两种策略进行区分,但未展开具体定义。
如何判断故障的影响范围?
文章提到需要弄清楚故障的范围,但未提供具体方法。
如何降低故障带来的影响?
文章指出需要降低故障的影响,但未给出具体措施。
在系统运行时,应该怎样正确处理故障?
文章强调在系统运行时需要正确处理故障,但未详细说明具体做法。
如何衡量系统从故障中恢复的能力?
文章提到需要衡量恢复能力,但未提供具体指标或方法。