软件危机和软件缺陷的特点和区别
由于软件危机和软件缺陷存在互相促进的可能性,很多情况下较难从事故现场对两者进行一个清晰、明确的划分,从软件开发的5个阶段——需求、设计、编码、测试和维度逐一讨论或许是个不错的尝试。
需求阶段
作为软件开发流程的排头兵,这一阶段累积的各种错误都会以不同的形式迁移转化为各种地雷在接下来的开发流程中引爆。最明显的一类就是软件缺陷需求范围上的错误,如“软件未达到产品说明书中已经注明的功能”、“软件未达到产品说明书中虽未指明但应明显达到的目标”、“软件功能超出产品说明书指明的范围”等等。具体分析各个案例可以发现,这些事故往往伴随着需求不清、需求频繁变更或需求广泛等特点。
虽然需求阶段的错误也会引发软件危机,但这往往是通过某种间接的机制实现的,不像软件缺陷一样是直接作用。如通过影响人事安排、经费预算、时间预期等来促使一线开发人员“走捷径”、不管“技术债”、疯狂赶ddl交付项目等。
此外,从交付结果来看,软件缺陷至少能够提交一个阉割版的产品,但软件危机往往导致项目延期,或者从此搁浅,成为“烂尾楼”。
设计阶段
在排除设计阶段极度压榨编码阶段的前提下,基本少见软件危机直接或间接在这一阶段产生影响。设计阶段出现的多数糟心事都是需求阶段进一步迁移转化而来的。可见连目标都不清楚,即使有鬼斧神工也白搭。
编码阶段
在较为大型、正规的互联网公司和组织中,这一阶段较少见到直接由软件缺陷造成的影响或故障,更多的案例是由软件危机导致的。外行领导内行、上级疯狂push疯狂pua、ddl越来越近……在这样的压力之下,很少还有程序员能坚守自己的技术操守继续做下去,要不提桶走人、要不置“技术债”于不顾,进而出现开发人员和开发过程管理不规范、约定不严密、文档书写不完整等问题。在这样的温床下,各种bug、各式的软件危机怎能不肆意生长。
此外也不能忽略软件史上的确存在许多由软件缺陷直接引发的故障(如三星手机的各种故障——截止2021年10月8日11:28:40 Google搜索“三星 故障”得到13, 900, 000条结果、C++编译器MinGW错误(如图1所示)等)。这部分案例普遍存在技术难度大、实现细节繁琐、复杂等特点,产生一些bug是在预期之中的。
图1. C++编译错误示例
测试阶段
对软件危机而言,基本没有测试阶段或缺乏严密有效的质量检测手段(中小型互联网公司和外包公司普遍偏爱全栈工程师、SDE (Software Development Engineer) 可以作为这种情况的一个有力证据)。这种环境下,大家只追求演示的5分钟内不要出错,哪还管的上软件是否好用,用户以后运行软件出现的各种bug。虽然有许多公司即使进行了合理的测试工作也难逃软件缺陷的结果(如IBM censor360操作系统),但他们的确会进行测试工作并反馈给开发团队、管理团队一些信息。(如软件难以理解、不易使用、用户反馈软件使用体验感较差)至于为什么还导致了软件缺陷,这也许是各部分互相角力的最终成果。
维护阶段
这一阶段少见软件危机的光顾,具体而言,如果相关核心人员还没有走光的话,估计也没人想碰这种维护难度大、几乎不可能更改、不计KPI或OKR的东西。即使是软件缺陷,也要具体情况具体分析。比较正规、大型的公司和组织虽然有能力重写,但更多是选择直接叫停项目(参见Microsoft、Google等公司);小公司只能直接放弃,进而演变为软件危机。从这里也可以看出,软件缺陷和软件危机两者之间存在相互促进的可能性。