首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

是否一定那么困难呢?—— 根本困难

不仅仅是在目力所及的范围内没有发现银弹,软件的特性本身也导致不大可能有任何的发明创新—— 能够像计算机硬件工业中的电子器件、晶体管、大规模集成一样—— 提高软件的生产率、可靠性和简洁程度。我们甚至不能期望每两年有两倍的增长。

首先,我们必须看到这样的畸形并不是由于软件发展得太慢,而是因为计算机硬件发展得太快。从人类文明开始,没有任何其他产业技术的性价比,能在30年之内取得6个数量级的提高,也没有任何一个产业可以在性能提高或者成本降低方面取得如此的进步。这些进步来自计算机制造产业的转变,从装配工业转变成流水线工业。

其次,让我们了解中间的困难,来看看我们能期待什么样的软件技术产业发展速度。效仿亚里士多德,我将它们分成根本的(essence)—— 软件特性中固有的困难,次要的(accident)—— 出现在目前生产中,但并非那些与生俱来的困难。

我们在下一节中讨论次要问题。首先,来关注根本问题。

一个相互牵制关联的概念结构是软件实体必不可少的部分,它包括:数据集合、数据条目之间的关系、算法和功能调用等等。这些要素本身是抽象的,体现在不同的表现形式下的概念构造是相同的。尽管如此,它仍然是内容丰富和高度精确的。

我认为软件开发中困难的部分是规格说明、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。当然,我们还是会犯一些语法错误,但是与绝大多数系统中的概念错误相比,它们是微不足道的。

如果这是事实,软件开发总是非常困难的,天生就没有银弹。

让我们来考虑现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和不可见性。

复杂度。规模上,软件实体可能比任何由人类创造的其他实体更复杂,因为没有任何两个软件部分是相同的(至少在语句的级别上)。如果有相同的情况,我们会把它们合并成供调用的子函数。在这个方面,软件系统与计算机、建筑或者汽车大不相同,后者往往存在着大量重复的部分。

数字计算机本身就比人类建造的大多数东西复杂。计算机拥有大量的状态,这使得构思、描述和测试都非常困难。软件系统的状态又比计算机的状态多若干个数量级。

同样,软件实体的扩展也不仅仅是相同元素重复添加,而必须是不同元素实体的添加。大多数情况下,这些元素以非线性递增的方式交互,因此整个软件复杂度要比非线性增长多得多。

软件的复杂度是根本属性,不是次要因素。因此,抽掉复杂度的软件实体描述常常也去掉了一些本质属性。数学和物理学在过去三个世纪取得了巨大的进步,数学家和物理学家们为复杂的现象建立了简化的模型,从模型中抽取出各种特性,并通过试验来验证这些特性。这些方法之所以可行,是因为模型中忽略的复杂度不是被研究现象的根本属性。当复杂度是本质特性时,这些方法就行不通了。

上述软件特有的复杂度造成了很多经典的软件产品开发问题。由于复杂度,团队成员之间的沟通非常困难,导致了产品瑕疵、成本超支和进度延迟;由于复杂度,使列举(还远远不是理解)所有可能的状态变得十分困难,影响了产品的可靠性;由于函数的复杂度,函数调用变得困难,导致程序难以使用;由于结构性复杂度,程序难以在不产生副作用的情况下用新函数扩充;由于结构性复杂度,造成很多安全机制状态上的不可见性。

复杂度不仅仅导致技术产生困难,还引发了很多管理上的问题。它使全面理解问题变得困难,从而妨碍了概念上的完整性;它使所有离散出口难以寻找和控制;它引起了大量学习和理解上的负担,使开发慢慢演变成了一场灾难。

一致性。并不是只有软件工程师才面对复杂度问题。物理学家甚至在非常“基础”的级别上,也会面对异常复杂的事物。不过,物理学家坚信,必定存在着某种通用原理,或者在夸克中,或者在统一场论中。爱因斯坦曾不断地重申自然界一定存在着简化的解释,因为上帝不是专横武断或反复无常的。

软件工程师却无法从类似的信念中获得安慰,他必须掌握的很多复杂度是随心所欲、毫无规则可言的,来自若干必须遵循的人为惯例和系统。它们随接口的不同而改变,随时间的推移而变化,而且,这些变化不是必需的,仅仅由于它们是不同的人—— 而非上帝—— 设计的结果。

许多情况下,因为是开发最新的软件,它必须遵循各种接口。另一些情况下,软件的开发目标就是兼容性。在上述的所有情况中,很多复杂性来自保持与其他接口的一致方面,对软件的任何再设计,都无法简化这些复杂特性。

可变性。软件实体经常会遭受到持续的变更压力。当然,建筑、汽车、计算机也是如此。不过,工业制造的产品在出厂之后不会经常地发生修改,它们会被后续模型所取代,或者必要更改会被整合到具有相同基本设计的后续产品系列中。汽车的更改十分罕见,计算机的现场调整有时发生。然而,与软件的现场修改比起来,它们都要少很多。

其中的部分原因是因为系统中的软件包含了很多功能,而功能是最容易感受变更压力的部分。另外的原因是因为软件可以很容易地进行修改—— 它是纯粹思维活动的产物,可以无限扩展。日常生活中,建筑有可能发生变化,但众所周知,建筑修改的成本很高,从而打消了那些想提出修改的人的念头。

所有成功的软件都会发生变更。现实工作中,经常发生两种情况。当人们发现软件很有用时,会在原有应用范围的边界,或者在超越边界的情况下使用软件。功能扩展的压力主要来自那些喜欢基本功能,又对软件提出了很多新用法的用户们。

其次,软件一定是在某种计算机硬件平台上开发,成功软件的生命期通常比当初开发软件所用的计算机硬件平台要长。即使不是更换计算机,也有可能是换新型号的磁盘、显示器或者打印机。软件必须与各种新生事物保持一致。

简言之,软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等等。后者持续不断地变化着,这些变化无情地强迫着软件也随之变化。

不可见性。软件是不可见的和无法可视化的。例如,几何抽象是强大的工具。建筑平面图能帮助建筑师和客户一起评估空间布局、进出的运输流量和各个角度的视觉效果。这样,矛盾变得突出,遗漏的地方可以捕捉到。同样,机械制图、化学分子模型尽管是抽象模型,但都起了相同的作用。总之,都可以通过几何抽象来捕获物理存在的几何特性。

软件的客观存在不具有空间的形体特征。因此,没有已有的几何表达方式,就像陆地海洋有地图,硅片有膜片图,计算机有电路图一样。当我们试图用图形来描述软件结构时,发现它不仅仅包含一个,而是很多相互关联、重叠在一起的图形。这些图形可能代表控制流程、数据流、依赖关系、时间序列和名字空间的相互关系等等。它们通常不是有较少层次的扁平结构。实际上,在上述结构上建立概念控制的一种方法是强制将关联分割,直到可以层次化一个或多个图形。[2]

除去软件结构上的限制和简化方面的进展,软件仍然保持着无法可视化的固有特性,从而剥夺了一些具有强大功能的概念工具的构造创意。这种缺憾不仅限制了个人的设计过程,也严重地阻碍了思路相互之间的交流。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论