首页 > 范文大全 > 正文

软件开发中使用系统化方法的真正原因

开篇:润墨网以专业的文秘视角,为您筛选了一篇软件开发中使用系统化方法的真正原因范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

1 人固有能力的局限性以及使用工具后产生的力量

人类的劳动总的来说可以分为两种:一种是体力劳动;另一种是脑力劳动。相应地,人的能力总的来说也可以分为两种:一种是人体活动产生的力量,即体力;另一种是使用大脑产生的记忆、理解、想象等的能力,即脑力。

看看最能代表人的体力极限的世界纪录(如跳高、举重等),就可以很容易做出判断,人的体力相当有限。然而,要人们承认这个事实却很困难,各种小说,电影等更是极力地夸大人体的力量。

人的脑力也相当有限,因涉及记忆、理解、想象甚至与智力有关的问题,人们更难接受这个事实。

就体力而言,举个例子,目前,跳高的世界纪录是2.45米(1993年,古巴人哈维尔・索托马约尔创造),而对一个普通的成年人,要想跳过1米的高度,并不困难。现在,如果我们借鉴算法大O的表示,那么,显然,世界冠军与我们一般的成年人,其体力处在同一个数量级。

就脑力而言,要说人的能力处在同一个数量级更是让人难以接受,然而,如果能像体育运动那样明确比赛规则的话,就不得不接受人固有的脑力也处在同一个数量级的事实。比如,1加2加3一直加到N,规定必须一步一步相加,当N确定时,人们所花费的时间,不会相差太多,更一般的,当用同一个算法解决同一个问题时,不同的人所花费的时间,大致在一个数量级之中。换言之,在这种意义上,人的脑力处于同一个数量级。

既然人的体力和脑力极其有限,人固有体力和脑力又处在同一个数量级上,那又如何解释人类在认知和改造客观世界中所产生的巨大力量?答案在于,依靠工具,人能够创造工具又能够使用工具。

尽管人还未能跳过2.45米的高度,计算的速度也不快(智力本质上可以看作是一个认知过程,所有的智力过程,就时间而言,都是不可逆的、确定的计算过程,也就是一种计算),然而,若使用有形的工具,如飞机,人就可以飞得很高;使用无形的工具,如数学理论,就可以在较短的时间内,解决一些复杂的计算问题。

2 复杂性

根据信息论的观点,复杂度可以定义为系统表明自身方式数目的对数,或是系统可能状态数目的对数:K=logN,式中K是复杂度,N是不同的可能状态数。一般来说,一个系统越复杂,它所携带的信息越多。若两个系统各自有M个和N个可能状态,那么,组合系统的状态数目是两者之积M×N,其复杂度为,K=logM×N。

从可操作性的角度,复杂性可以定义为:寻找最小的程序或指令集来描述给定的“结构”,即一个数字序列。若用比特计算的话,这个程序的大小相对于数字序列的大小就是其复杂性的量度。克拉默在其著作《混沌与秩序-生物系统的复杂结构》(Chaos and Order: The Complex Structure of Living Systems)一书中,给出了几个简单例子,用于分析相应程序的复杂性。

例1:序列aaaaaaa……

这是一个亚(准)复杂性系统,相应的程序为:在每一个a后续写a。这个短程序使得这个序列得以随意复制,不管要多长都可以办到。

例2:序列aabaabaabaab……

与第1个例子相比,该例要复杂一些,但仍可以很容易地写出程序:在两个a后续写b并重复这一操作。

例3:aabaababbaabaababb……

这个例子与例2相似,也可以用很短的程序来描述:在两个a后续写b并重复。每当第三次重写b时,将第二个a替换为b。这样的序列具有可定义的结构,有对应的程序来表示。

例4:

aababbababbbabaaababbab……

这个例子,无结构,若想编程,则必须将字符串全部列出。结论:一旦一个程序的大小与试图描述的系统相提并论时,则无法编程。或者说,当系统的结构不能被描述,或描述它的最小算法与系统本身具有相同的信息比特数时,则称该系统为根本复杂系统。在达到根本复杂之前,人们仍可以编写出能够执行的程序,否则,做不到。

3 软件系统的复杂性

人固有的能力极其有限,但是,这种有限的能力可以用来创造工具和使用工具,最后产生巨大的力量。一个典型的使用工具的案例,就是阿基米德给出的一个利用杠杆原理的案例:给我一个支点,我就能撬起地球。

谈到力学、物理学,就不得不提到一个近代科学的巨人,那就是牛顿。牛顿给出过一个著名的定律万有引力定律。利用它,可以解决复杂的行星的轨迹问题。温伯格(Gerald M.Weinberg)在其著作《系统化思维导论》(An Introduction to General Systems Thinking)一书中,对牛顿的贡献进行了分析。他认为,牛顿是个天才,但他的才能并不在于他的大脑计算能力特别突出,而在于懂得如何对问题做合理的简化和理想化,从而把复杂的问题转化为普通人的大脑可以处理的、相对简单的问题。牛顿是这样,爱因斯坦其实也是这样。

温伯格的判断是有道理的,然而,相对于物理学科,计算学科却没那么幸运,计算机的软、硬件系统存在大量不能化简的状态,这就使得构思、描述和测试计算机系统,不能依靠像物理学那样简单的定律来完成,而必须另外寻找能够控制和降低复杂性的方法。

在计算机中,软件系统的状态又比硬件系统的状态往往要多若干数量级。另外,由于软件系统中的实体,其扩展不像硬件系统那样,可以由相同元素重复添加,从而使计算机中软件的复杂度呈非线性增长。因此,找到控制和降低软件复杂性的方法,也就找到了控制和降低计算机系统复杂性最根本的方法。于是,我们可以将问题的焦点放在计算机软件上。

关于软件的复杂性,布鲁克斯(Frederick P.Brooks)在其著作《人月神话》(The Mythical Man-month)一书中,从复杂度、一致性、可变性、不可见性等方面作了系统地分析,揭示了软件所固有的困难。下面,简单阐述一下。

3.1复杂度

布鲁克斯认为,没有两个软件部分是相同的(至少在语句级别上),若有相同的,人们会把它们合并成一个供调用的子函数,因此,认为复杂是软件的根本属性。

软件开发面对的是客观世界模型的构建问题,相对于物理学,物理学家可以忽视大量实体内容的描述,仅仅关注诸如质量、速度等非常有限内容的描述,从而大大降低问题的复杂度,而软件工程师却不能这样做。

构成软件复杂度的实体及其关系的描述不仅引发了大量学习和理解上的负担,而且随着软件规模的增长,使得团队成员之间的沟通以及管理变得越来越困难,从而使软件的开发逐渐地演变成一场灾难。要避免这场灾难,或者说,要顺利地完成一个软件系统的开发,其关键就在于能否控制和降低该软件系统的复杂性。

3.2一致性

大型软件开发中,为保持各子系统之间的一致性,软件必须随接口的不同、时间的推移而变化。这些变化不能被抽象掉,因此,又增加了软件的复杂性。

3.3易变性

与计算机硬件、建筑、汽车等实体相比,软件实体经常会面对持续的变更压力。人们一般认为,已购买的计算机硬件、建筑、汽车等实体修改起来成本太高,于是打消了修改这些产品的念头。而对软件实体,人们却不这样认为,因为它是一个纯粹思维活动的产物,可以无限扩展。

软件处于用户、法律、计算机硬件及其应用领域等各种因素融合而成的文化环境之中。该环境中的因素持续不断地变化着,这些变化无情地强迫着软件也随之变化。

3.4不可见性

软件是看不见的,当利用图示方法来描述软件结构时,也无法充分表现其结构,从而使软件的复杂度大大超过具有电路图表示的计算机硬件的复杂度,使得人们之间的沟通面临极大的困难。

布鲁克斯指出软件复杂度是软件生产的主要困难,不仅如此,他还分析了在软件领域,人们所取得的进展,并且认为,这些进展只是解决了软件复杂度的一些次要方面的问题,如果说有重大进展的话,那就是从汇编语言到高级语言的进展,其他的进展只能算是一种渐进。

的确如此,高级语言抽象掉了汇编语言所关心的寄存器、位、磁盘等概念,使软件开发的生产率提高了若干倍,同时,软件的可靠性、简洁性也大为提高,相对于汇编语言,高级语言有效地降低了软件的复杂性。

布鲁克斯认为,对于一个软件系统的开发来说,最为困难的是对其概念结构(概念模型)的规格、设计和测试,而不是对概念结构的实现,以及对这种实现的测试。当然,他也承认,在实现的过程中会出现语法的错误,但是,相对于概念结构方面的错误,则要小得多。

软件系统开发的难点在软件系统概念结构的规格、设计和测试上,因此,我们又可以将注意力更为集中。换言之,就是将重点尽可能放在软件开发的前端,而不是编码阶段。

在软件开发的前期,要对用户的需求进行分析,然后,将这种需求抽象为一种信息结构,这种结构被称为概念结构。其主要特点为:

(1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求;

(2)易于理解,从而可以用它和不熟悉计算机的用户交换意见;

(3)易于更改,当应用环境和应用要求改变时,能容易地对概念结构进行修改和扩充;

(4)易于向计算机支持的数据结构转换。

软件概念结构的特点决定了这种结构的设计在很多情况下是很难采用形式化的方法,而采用非形式化的系统化方法,如结构化方法、面向对象方法等,却可以有效地控制和降低概念结构设计的复杂性,最后,完成编码、使软件形式化。

系统化方法早已是大学“软件工程”等课程的主要内容,而使用系统化方法的真正原因却被人们忽视了,这样做会使人们过高的估计自己有限的能力,从而削弱了人们自觉地应用系统化方法的基本原理去控制和降低软件开发复杂性的巨大力量。

4 软件开发的系统化方法需要遵循的基本原则

在软件中,存在着大量不能简化的实体,我们把这些实体称之为元素,那么,软件系统就是由这些相互联系、相互作用的若干元素组成的,具有特定功能的统一整体。而软件系统的概念结构则是指系统内各组成部分(元素和子系统)之间相互联系、相互作用的框架。

在系统科学中,一个系统指的就是一个集合,或者说,指的是一个事物的集合。因此,我们可能用集合的思想来讨论系统的复杂性。根据笛卡尔积,由两个具有相互作用的元素构成的系统会有4种不同的状态,而由10个元素组成的系统存在210=1024个状态,64个元素组成的系统存在264个状态,即18446744073709551616(比搬迁著名的Hanoi塔的次数多1)。随着元素的不断增加,系统必将出现“组合爆炸”的问题。对于这种“组合爆炸”的问题,不要说人所固有的极其有限的计算能力,就是计算机也无法处理。

笛卡尔积具有重要的理论价值,可以说,事物之间所有的关联都在笛卡尔积之中。然而,人与机器对笛卡尔积产生的“组合爆炸”问题是无法进行处理的。因此,尽管笛卡尔积“完美无缺”,却无任何实际的应用价值。因此,在实际工作中,我们还要充分运用与集合相关的函数、关系、定义等数学工具,将注意力放在事物之间具有实质性关联的方面,最终控制和降低系统的复杂性。

对软件的分析,可以从系统的角度,也可以从集合的角度来分析。因此,控制和降低软件的复杂度的问题,就可以转化为如何降低系统的复杂性,或更为基础地如何降低集合复杂性的问题了。

要降低一个软件系统的复杂性,就要将该系统划分为若干小的子系统;类似的,要使一个大的、混杂的集合有序,就必须对它按某种性质进行分割,只有有序了,复杂性才能降下来,也才便于人们的理解和交流。下面,给出软件开发的系统化方法需要遵循的几个基本原则。

4.1 抽象第一的原则

所谓抽象,就是要对实际的事物进行人为处理,抽取所关心的、共同的、本质特征的属性,并对这些事物及其特征属性进行描述。由于抽取的是共同的、本质特征的属性,从而大大降低了系统元素的绝对数量。

4.2 层次划分的原则

如果一个系统过于复杂,以至于很难处理,那么,就得先将它分解为若干子系统。如何进行分解?什么样的分解是一个好的分解?

我们知道,一个系统其实就是一个集合。那么,一个系统的分解,也就是一个集合的分解。在集合分解中,有一个叫等价类的重要概念,使用满足等价关系的三个条件(自反性、对称性和传递性),就可以将一个集合划分为若干互不相交的子集(等价类),这样的子集不仅具有某种共同性质的属性,而且,还可以完全恢复到原来的状态。这种划分具有非常重要的意义,它可以使我们将注意力集中于子集中那些具有共同性质的属性以及子集之间实质性的关联,从而使无序变为有序,最终大大地降低系统的复杂性。

在计算机系统中,人们希望在层次的划分中遵循等价类划分的三个基本原则;另外,为便于记忆,还希望划分后的层次数目控制在心理学中有关短时记忆最大容量7±2的范围之内,像计算机网络的层次结构、计算机的体系结构等均遵循这样的原则。

4.3 模块化原则

模型化原则就是根据系统模型说明的原因和真实系统提供的依据,提出以模型代替真实系统进行模拟实验,达到认识真实系统特性和规律性的方法。模型化方法是系统科学的基本方法。

系统科学研究主要采用的是符号模型而非实物模型。研究系统的模型化方法,通常是指通过建立和分析系统的数学模型来解决问题的方法和程序。

用计算机程序定义的模型称为基于计算机的模型。所有的数学模型均可转化为基于计算机的模型,并通过计算来研究系统。另外,计算实验对一些无法用真实实验来检验的系统来说还是惟一可行的检验手段。

针对软件,在考虑模块化时,还要充分考虑来自Meyer给出的以下五个原则。

(1)模块可分解性。要控制和降低系统的复杂性,就必须有一套相应的将问题分解成子问题的系统化机制,这种机制是形成模块化设计方案的关键。

(2)模块可组装性。要充分利用现存的(可复用的)设计构件能被组装成新系统,要尽可能避免一切从头开始的模块化设计方案。

(3)模块可理解性。要使系统中的模块能够作为一个独立的单位(不用参考其他模型)被理解,从而使系统中的模块易于构造和修改。

(4)模块连续性。在对系统进行小的修改时,要尽可能只涉及到单独模块的修改,而不要涉及到整个系统,从而保证修改后副作用的最小化。

(5)模块保护。在模块出现问题时,要将其影响尽可能控制在该模块的内部,要使错误引起的副作用最小化。

5结束语

系统化方法针对的是复杂性问题,而复杂性又是相对于人的能力而言的。其实,人所固有的能力极其有限,然而,这种有限的能力可以用来创造工具和使用工具,从而产生巨大的力量。

系统化方法就是一类人们在生产过程中创造的有效工具,使用这种工具可以大大地降低软件系统的复杂性,从而使软件的研制处于某种可控的状态。

系统化方法进入大学“软件工程”等课程已有几十年的时间,然而,使用系统化方法的真正原因往往被人们忽视。只有深刻理解软件开发中使系统化方法真正原因,才能最大限度地增强人们使用系统化方法的自觉性和能动性。