社会学家和心理学家发现人类和其他动物存在一种现象,这种现象称为习得性无助。它来源于个人在实现自己的目标或者摆脱坏习惯时屡次遭受的挫折。最终,动物们会采取极端的毁灭性措施,就是从内心深处放弃尝试。即使在出现了实现目标的机会或者存在逃脱的良机时,动物们也会表现得很消极,无法利用这些机会。 为了证明即使是资深和理智的软件工程师也会受这个畏缩毛病的影响,我将描述一个由于向后兼容所导致的不良安全性的例子。 向后兼容是现有的技术部署一直存在的一个问题。发现新的技术,并需要部署到不兼容的(甚至在本质上不同的)现有解决方案中。 在系统演化的每个时刻,开发商需要决定是否必须结束现有解决方案的生命,还是提供一条迁移路径或者设计一种方法允许遗留解决方案能够与现代解决方案共存。这样的决定在商业和技术的角度上往往存在很大的分歧。但是,决定通常是从商业的角度作出的,开发人员和工程师必须照办(注1)。出现这种情况时,负责创建实际实现方案的人们就会产生这样一个印象,就是决定已经作出,他们只要照章办理就可以了,不需要进一步的评估或考虑。 想象一下有这样一个决策,在进行技术替换时要求维护与旧技术的兼容。管理层进一步决定,以后不会再向遗留解决方案提供进一步的开发或支持工作,这是为了鼓励现有的顾客迁移到新的替代解决方案。 尽管这种决策在许多方面向开发过程施加了压力(涉及安全问题),但是当一个解决方案(通常是新技术)比其他解决方案更为安全时,无疑会更加引人注目。事实上,新技术的开发常常明确要求满足更高的安全需求,但是仍然必须支持旧技术。在这种情况下会产生什么安全问题呢? 实现向后兼容可以采取不同的方法,有些方法较之其他方法更为安全。但是,一旦开发人员理解了需要让更旧、更缺乏安全的技术继续存活时,那些常常可以缓解这种风险的解决方案往往就不在考虑之列。焦点集中在新技术上,遗留技术将在最大限度地减少遗留效果的情况下被嵌入到新技术中(或反过来)。总之,实际新技术的开发队伍通常并不是开发遗留代码的队伍,他们的最终目标是想方设法移植遗留解决方案,是不是这样呢? 最直接的解决方案是对新技术的健壮性和安全强度作出妥协,以匹配遗留解决方案。在本质上就是允许现代技术和遗留技术共存。当开发人员在迁移遗留代码的漏洞时想不出可以做什么(或更糟,想不出应该做什么)时,就出现了习得性无助。遗留代码对他们施加了压力,他们觉得这不应该在他们的职责范围之内(即使把新技术降低到旧技术的水平而影响了它的安全性)。对于公司的决策,他们觉得不知道做什么好,感觉力不从心。