上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 软件复杂度困局
针对传统事务,复杂问题一般都是肉眼可见的,可以及时找到处理和应对的方法,也能分清相关的责任。但是,软件研发是知识手工业者的大规模协作,随着需求的演进和设计的迭代,各种由复杂度产生的风险只是从眼前分摊出去,再在看不见的地方集聚起来。在这个过程中,每一个具体环节都在做看似正确的事,每一个具体的人都在推动项目的完善。但是整体的结果是,不仅累积了巨大的复杂度风险,而且再也找不到具体的人、具体的环节来对整个软件系统负责。因此,结果是不仅风险大,而且治理起来也特别困难。
软件的复杂度包含两个层面:软件系统层面的复杂度和软件研发流程层面的复杂度。
在软件系统层面上,针对大型软件,“when things work,nobody knows why”俨然已经是一种常态。随着时间的推移,现在已经没有人清楚系统到底是如何工作的,将来也不会有人清楚。
在软件研发流程层面上,一个简单的改动,哪怕只改动一行代码也需要经历一次完整的流程,涉及多个团队和多个工具体系的相互协作。
可以说,对于大型软件来讲,复杂才是常态,不复杂才不正常。
那么,为什么要将大型软件做得这么复杂?复杂度又从何而来?