复杂的问题是指那些不可预知的问题。软件开发中任何事情都可能是复杂的。当复杂的事情交互时,复杂的程度就难以形容了。软件开发中复杂性有三个维度:需求,技术和人。
软件需求是复杂的,因为他们不但不明确,而且经常变化。许多需求不同且需求经常变动的干系人常常很难把需求表达清楚。而且客户只有在听取了别人的意见,或者使用了软件的初版之后,才真正开始明白他们需要的是什么。
软件开发使用先进的技术帮助应对商业挑战并占得市场先机。这些先进技术跟新换代快,并且常常不可靠。事实上,有着新优势新技术甚至是技术革新都是常见的。软件技术的复杂性经常被混合。因为经常有许多不同技术的需求(来自不同的源头或公司),用接口把它们连接起来是一件更为复杂的事情。
在下图中,纵轴表示需求的复杂度,横轴表示技术的复杂度。两种复杂度的交点定义了整个项目的复杂度。现今几乎所有的软件开发项目都是复杂的。
管理复杂项目
如果用某一个流程能重复的产出质量可接受的结果,这个流程叫做预定义流程控制。当预定义流程控制由于一些中间活动的复杂性而不能成功时,就需要使用经验主义流程控制。
—B. A. Ogunnaike and W. H. Ray,
Process Dynamics, Modeling, and Control
我们无时无刻不在使用定义流程,因为有了它们的帮助,我们可以不用照看生产过程也可以组装出高质量低价格的产品,比如日用品。然而,当产品的质量差到无法使用时,反攻会使价格无法接收,或者产量低到的平摊成本过高。从长远角度来看,第一次制造成功新产品时,经验主义流程相比用预定义流程控制之后的反攻代价来得更低。