《面向对象分析与设计》
“系统越复杂,就越容易全面崩溃”
由于我们不能控制软件的复杂性,所以导致了项目延迟、超出预算,并在声称的需求中存在缺陷。我们常常把这种情况称为软件危机,但老实说,持续了这么长时间的问题必须称之为正常情况。不幸的是,这种危机导致了人力资源(最宝贵的商品)的浪费以及许多机会的丧失。没有足够好的开发者来创建用户需要的所有新软件,而且在任何组织机构中,相当一部分开发者必须经常维护或看护老的软件。
软件的复杂性是一个基本特征,而不是偶然如此。我们认为这种固有的复杂性有 4 个原因:问题域的复杂性、管理开发过程的困难性、通过软件可能实现的灵活性,以及刻画离散系统行为的问题。
问题域的复杂性
外部复杂性通常源自于系统用户和系统开发者之间的“沟通困难”:用户常常发现
很难用开发者能够理解的形式对他们的需求给出准确的表述。软件系统在开发过程中经常发生需求改变,主要是因为软件开发项目本身改变了问题的规则。
管理开发过程的困难性
有更多的开发人员就意味着更复杂的沟通,因此更难以协调,特别是当开发团队的地理位置分散的时候,而实际情况又常常如此。对于开发团队来说,主要的管理挑战总是维持设计的一致性和完整性。
通过软件可能实现的灵活性
软件提供了非常大的灵活性,所以开发者几乎有可能表达任何形式的抽象。但是,
这种灵活性变成了一种难以置信的诱人的属性,因为它也迫使开发者打造几乎所有的初级构建模块,高层的抽象将建立在这些初级构建模块之上。
刻画离散系统行为
在大型应用中,可能有成百上千个变量以及多个控制线程。系统中的这些变量、它们当前的值、当前的地址和每个过程的调用栈一起构成了应用当前的状态
在最坏的情况下,外部的事件可能会破坏系统的状态,因为它的设计者没有考虑到事件之间的相互作用穷尽所有可能的测试是无法做到的。既然数学工具和我们的智能都不能够对大型离散系统的完整行为进行建模,对于系统的正确性,我们必须满足于可接受的信心级别。