1、第一章绪言1.1 软件工程学的背景和目的1.2 软件和软件生命期模型1.3 软件质量的评价1.4 软件开发方法和软件自动工具习题一第一章绪言 计算机专业的学生在修完编程(Programming)等课程之后,对编写小型程序,例如字符编辑程序或报表打印程序等,一定是很有把握了。但是,如果需要研制一个大型的软件系统,例如飞机订票系统或学校管理系统(包括教务、财务、人事、物资等各系科的全面管理),相信会遇到许多困难,因此还必须学习“软件工程学”。“软件工程”(Software Engineering)是从“编程”演变过来的,后者一般考虑小型程序的编写,前者则考虑大型软件系统的研制。“软件工程学”出现至
2、今只有二十余年,是一门新的学科。本节先讨论软件工程学产生的背景及这门学科的目的。1.1 软件工程学的背景和目的软件工程学的背景和目的第一章绪言60年代以来,在一些技术领先的国家中,计算机的应用领域越来越广,它几乎涉及到社会生活的各个方面,如工厂管理、银行事务、病人监护、学校档案、图书馆流通、旅馆预订,这些系统的软件规模都相当大,逻辑很复杂,而且功能上需要不断更改和扩充。至于军事方面的导弹防御系统、宇航方面的飞行控制系统,其软件就更为庞大和复杂了。由于软件是非实物性、不可见的,开发软件本质上又是一个“思考”的过程,很难进行管理,开发人员可以按各自的爱好和习惯进行工作,没有统一的标准可以遵循,只能
3、以手工艺的方式进行。管理人员事前很难估计项目所需的经费和时间,技术人员在项目完成之前也难以预料系统是否能成功。第一章绪言 人们在开发上述大型软件系统时遇到了许多困难,有的系统最终彻底失败了;有的系统虽然完成了,但比原定计划迟了好几年,而且经费上大大超过了预算;有的系统未能完满地符合用户当初的期望;有的系统则无法进行修改维护。更糟的是,失败的系统往往无可挽回,除非再从头做起,但由于时间和经费的限制,这又是不可能的。IBM公司的OS360系统和美国空军某后勤系统在开发过程中遭受的挫折是众所周知的。以OS360为例:它由4000个模块组成,共约100万条指令,人工为5 000人年(一个人工作一年其工
4、作量相当于一个人年),经费达数亿美元,但结果却是令人沮丧的,人们在程序中发现的错误达2000个以上。第一章绪言 OS360系统的负责人Brooks曾生动地描述了开发过程中的困难和混乱:像巨兽在泥潭中作垂死挣扎,挣扎得越猛,泥浆就沾得越多,最后没有一个野兽能逃脱淹没在泥潭中的命运程序设计就像是这样一个泥潭一批批程序员在泥潭中挣扎没人料到问题竟会这样棘手”。人们发现,研制软件系统需要投入大量的人力和物力,但系统的质量却难以保证,也就是说,开发软件所需的高成本同产品的低质量之间有着尖锐的矛盾,这种现象就是所谓的“软件危机”(Software crisis)。第一章绪言 与此同时,由于新的电子元器件的
5、出现,计算机硬件的功能和质量在不断地提高,而价格却在大幅度地下降,因此同硬件投资相比,软件投资比例上升极快,图11是Boeh-m在l 976年对美国计算机总投资的统计和预测,从图中可以看出,在50年代,软件投资约占20,至70年代已超过60,当时预测到1985年软件投资将高达85。硬件价格的大幅度下降意味着计算机可以广泛使用,因此对软件的需求量将会迅速上升,但是软件危机的事实告诉人们:软件技术没有跟上硬件技术的高速发展,人们意识到计算机要推广使用,其关键在于软件开发技术的革新。第一章绪言图1.1第一章绪言 Parnas认真分析了开发大型软件和编制小型程序之间的差别,他发现,从所需人力来看,小型
6、程序从确定要求、编制、使用、直至修改往往是由同一个人完成的,因此只要他本人心里明白程序的构思就够了,而大型系统则必须由许多人(包括用户、项目负责人、分析员、高初级程序员、资料员、操作员等)组成一支开发队伍来协同完成,所以人与人之间必须准确地进行协商讨论;另外,从产品使用情况来看,小型程序往往是“一次性”的,意即如果需要作较大的修改,人们通常宁可丢弃旧的程序而重新编写,但大型系统的开发耗费了大量的人力与物力,所以人们一般不会轻易将其抛弃,而总是在旧程序的基础上一改再改,希望延长它的使用期,因而是“多个版本”的。第一章绪言 所以,Parnas将大型软件开发的特点总结为:由“多个人”来开发具有“多个
7、版本”的程序。大型软件系统的开发提出了许多新的问题,诸如:如何将一个系统分解成若干个部分,以便各人分工开发;如何精确地说明每个部分的规格要求;怎样才能使软件产品易于修改维护;。显然,传统的“编程”没有考虑这些问题。量变带来了质变,系统规模的增大使问题的性质发生了变化,人们认识到:正像不能用造独木船的手工艺方式来研制航空母舰一样,沿用50年代个人编写小型程序的那种手工艺方式来开发大型软件系统也是不行的,必须寻找新的技术来指导软件的大规模生产。第一章绪言 考虑到机械、建筑等领域都经历过从手工艺方式演变成严密完整的工程科学的过程,一些有识之士认为大型软件系统的开发也应该向“工程化”方向发展,逐步发展
8、成一门严格的工程科学。1968年在北大西洋公约组织的学术会议上有人第一次提出了“软件工程”这个词,还提出了一些软件工程化的技术并进行了讨论。第一章绪言 60 年代末至70年代初,“软件工程学”还处于学术研究阶段,但已对软件开发的实践产生了巨大的影响。l 971年IBM公司运用一些软件工程技术成功地研制了纽约时报情报库系统和空间实验室的飞行模拟系统。这也是两个著名的例子,尽管两个系统都很庞大,用户要求又有很多变化,并又减少了人力和削减了经费,但由于适当地采用了工程化的技术,还是按时、高质量地完成了,软件生产率比以前提高了一倍。第一章绪言 这些事实说明用“工程化”的思想作指导,可以大大减少软件开发
9、成本并提高软件质量,“工程化”为人们开辟了新的道路,“软件工程学”这门富有潜力的学科就此蓬勃地发展起来了。在我国,计算机领域近年来迅猛发展,前面讨论的种种问题和矛盾也就在国内暴露出来了。国内的软件工作者也意识到要进一步发展我国的计算机事业,软件工程学是个关键。目前国内、国外都有许多人在从事这一领域的研究,软件工程学已成为计算机学科中的一个重要分支。第一章绪言 作为一门学科,软件工程学研究的是:如何应用一些科学理论和工程上的技术来指导大型软件系统的开发,使其发展成一门严格的工程科学;软件工程学的最终目的是以较低的成本研制具有较高质量的软件。所以,研究软件工程学无疑将促进计算机推广应用的步伐,直接
10、或间接地产生巨大的社会效益和经济效益。第一章绪言表表 1.1第一章绪言 软件工程学包括的面很广,有基础理论研究,也有应用研究以及实际开发;除了技术问题之外,它还涉及与开发软件有关的所有活动,例如管理学、心理学、经济学法律、道德等方面。本书只讨论软件工程中的技术问题,重点是软件产业界近年来较流行的实用技术。第一章绪言 计算机领域从5 0年代到9 0年代有了突飞猛进的发展,人们对许多问题的看法也发生了根本的变化。所以,在学习具体的软件开发技术之前,我们有必要对软件的一些基本概念,如什么是软件、软件开发过程包括哪些活动、如何评价软件产品的质量等,重新进行讨论。读者将会看到目前的看法同传统的观点已有了
11、相当大的差别。软件和软件生命期模型是软件工程学中两个重要的概念。过去,人们一般认为所谓“软件”就是指“程序”,所谓“开发软件”也仅仅就是“编程序”而已。但是,对于大型软件系统而言,这样的理解是不合适的。1.2 软件和软件生命期模型软件和软件生命期模型第一章绪言众所周知,凡是工业产品都有其生命周期,即要经过分析要求、设计、制造、测试、运行(此时需要不断地维护)等几个阶段。软件也是一种产品,同样存在生命周期。那什么是软件生命期呢?一个软件从被提出开始研制至软件最终被废弃不再使用为止的全过程,称为软件生命期。软件生命期的划分应该适应软件生产工程化的需要,而不是千篇一律的。图1.2是一种典型的软件生命
12、期模型(software Life cycle Model)示意图,由于其形状似多级瀑布,常称为“瀑布模型”。这种模型把软件生命期划分为可行性研究与计划、需求分析、设计、编程、测试、运行与维护等六个阶段,每个阶段都有明确的任务,并需产生一定规格的文档资料交付给下一阶段,下一阶段在上阶段交付的文档的基础上继续开展工作。第一章绪言 图 1.2第一章绪言 在图1.2生命期模型中,第一个阶段有时又称为计划期,中间四个阶段总称为开发期,最后一个阶段称为运行期。表1.2概括地列出了每个阶段的基本任务、工作结果(即提交的文档)以及参加人员。第一章绪言第一章绪言 1.可行性研究与计划阶段可行性研究与计划阶段
13、当准备接受一个软件开发任务时,首先要确定是否值得去开发,如果不值得去开发,那么花费在这项开发工程上的任何时间、资源、人力和经费都是无谓的浪费。可行性研究与计划阶段的基本任务是搞清问题的性质,确定系统的目标和规模,从技术、经济和社会因素等方面分析论证本软件项目的可行性,并最终产生一份可行性分析报告。可行性研究的结果是使用部门负责人做出是否继续进行这项工程的决定的重要依据。第一章绪言 2.需求分析和规格说明阶段需求分析和规格说明阶段(简称需求分析阶段简称需求分析阶段)在设计软件系统之前,首先必须确定用户究竟要求软件系统做什么,所以分析阶段的基本任务是理解用户的需求,并将用户的需求用书面形式表达出来
14、。这一阶段产生的文档是需求规格说明书(简称需求说明书),它明确地描述了用户的要求。需求说明书是以后备阶段工作的基础。用户和软件人员双方都应有代表参加这一阶段的工作,需求说明书就是双方充分讨论交流后达成的协议。第一章绪言3.设计阶段设计阶段 在设计阶段,要在需求说明书的基础上建立软件系统的“结构,包括数据结构和模块结构。设计阶段一般又可分为两步:概要设计(或称为总体设计)和详细设计,前者主要考虑模块的分解,后者考虑每个模块内部的细节。本阶段产生的文档包括模块说明书、数据库或文件结构说明等。由于软件产品的质量在很大程度上取决于设计方案的质量,所以设计工作要由经验较丰富的高级软件人员来完成。第一章绪
15、言 4.编程阶段编程阶段 在编程阶段,按模块说明书的要求为每个模块编写程序。相对地说,这个阶段是最简单的,初级程序员可以参加编程阶段的工作。5.测试阶段测试阶段 由于前面三个阶段都可能产生各种各样的错误,所以测试阶段的任务就是发现并排除这些错误。静态检验工作实际上在上述每个阶段的最后就必须进行,而测试阶段则进行最后的动态检验。测试通常又可分为模块测试、集成测试和系统测试等几步。测试应该由另一个独立的部门(如不参加系统的设计或编程的人员)来完成。经过测试就得到了软件系统的第一个版本。第一章绪言 zelkowity对一些软件项目中各阶段的工作量进行了统计,图1.3是他给出的结果。图1.3(a)说明
16、在整个生命期中,开发期和运行期所占的工作量,可以看出维护工作量要占一半以上。图1.3(b)说明在开发期中各阶段所占的工作量,可以看出,测试工作量约占其中的一半。图1.3告诉我们,编程工作在整个生命期中只占很小的比例,所以“开发软件仅仅是编程”的想法显然是错误的。第一章绪言 图 1.3第一章绪言 图1.2的瀑布模型将软件生命期组织成六个阶段,这是比较有代表性的模式。也有人提出其他一些模式,表1.3列出了Freeman、Metzger、Boehm等人的模式,可以看出,各种模式基本上是类似的。第一章绪言第一章绪言 由于软件规模大、逻辑复杂,且生命期又长,而人的记忆力是有限的,所以有关软件系统的所有资
17、料,必须以书面文档的形式记录下来,这样开发人员就能以文档为基础协同工作,各阶段之间也可通过文档实现过渡。显然,文档健全与否直接影响着最终产品的质量。为了强调软件产品除程序之外还必须包括各种文档资料,Boehm为软件给出了新的定义:“软件是程序以及开发、使用和维护程序所需的所有文档”,因此,需求说明书、模块说明书、数据库和文件说明、程序、测试计划、测试用例、使用手册、维护手册各阶段交付文档的全体就是“软件”。第一章绪言 由此可见,作为一名称职的软件开发人员,光会编程是不够的,他还必须掌握分析、设计、测试等方法和工具,学会编写上述各种文档。培养学生掌握这些技术就是本书的目的。与传统的手工艺开发方式
18、相比,上述生命期模型有两个明显的长处,第一,由于强调要将每个阶段的工作结果用书面形式描述出来,这就使原来“不可见”的软件变成了“可见”的文档资料;第二,开发过程分阶段按步骤进行,以交付某种特定规格的文档作为标志某个阶段完成的里程碑,这就使原来“难以管理的思考过程”变为“可以管理的生产过程”了。第一章绪言显然,这两点长处为提高软件生产率和改进软件质量创造了极为有利的条件。必须指出的是,实际软件系统的开发不可能是理想化地按瀑布模型进行,由于人们理解问题总有一个反复的过程,所以从后阶段回复到前阶段是不可避免的。例如在设计阶段发现需求说明书有不完整或不正确之处,就必须进行“再分析”,测试阶段发现模块界
19、面有错误,就必须进行“再设计”,在运行阶段为了扩充系统的功能又要进行“再分析”、“再设计”、“再编程”等。另外,阶段之间也没有明确的界线,如分析阶段需要考虑系统的可行性,就一定会涉及一些设计方面的问题;又由于采用了模块化的技术,某些模块的编程有可能与另一些模块的测试并行进行。第一章绪言 软件工程学的最终目标是获得高质量的软件,所以如何评价软件质量是一个重要的问题。以前,对小型程序,人们一般比较强调程序的正确性和效率,近年来随着软件规模的增大和复杂性的上升,对问题的看法已发生了变化。目前,软件质量的定义还是非常模糊的,人们对此尚未形成一致的看法,但一般说来倾向于从可维护性、可靠性、可理解性和效率
20、等方面对软件作较全面的评价,下面分别讨论之。1.3软件质量的评价软件质量的评价第一章绪言 1.可维护性可维护性(Maintainability)软件在运行阶段尚需不断“修正”,因为软件虽经测试但不可避免地总还隐含着各种错误,这些错误在运行阶段会逐步暴露出来,因而就要进行排错。例如1BM公司的0s360系统,据说每个版本中约有成千个错误;又如某军事系统在运行初期,平均每月发现900个错误,纠正一个错误平均需修改l 7条指令。第一章绪言 软件在运行阶段尚需不断“完善”,因为系统经过一个时期的使用后,用户必然会逐步提出一些更改或扩充要求,软件就需要相应地不断作修改。软件在运行阶段往往还需作“适应性”
21、修改,因为近年来计算机业发展迅速,一般在3至5年内,硬件或系统软件就会出现更新换代的新产品,于是应用软件系统也就需要作相应的调整或移植。在运行期中,对软件所作的上述修正性、完善性和适应性修改,总称为“维护”,它涉及再分析、再设计、再编程、再测试等活动。考虑到大型软件系统的运行期可达10年以上,所以维护的工作量是极大的。第一章绪言 另外,维护工作也是相当困难的,由于软件逻辑上的复杂性,修改往往会带来新的错误。据统计,软件错误中有1 9是由于修改造成的;有人还统计出,如果一个修改涉及5至l0个语句,修改成功的可能性是50,如果一个修改涉及4 0至50个语句,则修改成功的可能性下降至2 0,因此软件
22、维护是很困难,很冒风险的。第一章绪言 图1.4说明了在计算机软硬件的总投资中,软件维护所占的比例。可以看出,维护费用近年正在迅速上升,按这样的趋势发展下去,现有的人力物力将全部被束缚在维护原有系统上,就可能再也没有力量去开发新的系统了。因此软件维护引起了人们的普遍关注,人们已意汉到,一个软件系统即使其他方面都相当理想,但是如果不容易维护,它将不会有什么实际使用价值,所以,“可维护性”应该作为评价软件质量的重要准则。第一章绪言图1.4第一章绪言“可维护性”通常包括了“可读性”(Readability)、“可修改性”(Modifiability)、“可测试性”(Testability)等含义。为了
23、使软件具有较好的可维护性,早在开发期的各个阶段就应采取一系列技术措施。这样做虽然开发期的工作量也许会大些,但考虑到维护工作在整个生命期中所占的比例,总的看来还是值得的。反之,如果开发时目光短浅,不考虑长远利益,就可能在维护时遭受重大挫折,到时就无法挽救了。本书第七章还要进一步讨论软件维护问题。第一章绪言 2.可靠性可靠性(Reliability)可靠性通常包括正确性(Correctness)和健壮性(Robustness)这两个相互补充的方面。正确性是指软件系统本身没有错误,所以在预期的环境条件下能够正确地完成期望的功能。毋庸置疑,正确性对系统正常发挥作用是完全必要的。对于一个小型程序,我们可
24、以希望它是完全正确的,但对长达几万行甚至几十万行的大型软件,我们一般不能奢望它是“完全”正确的,而且这一点也是无法证实的。第一章绪言 此外,一个大型系统运行时,完全可能遇到一些意外,例如:某部分硬件出现故障,软件中某个隐含的错误暴露出来,或者操作员无意地输入了一个离奇古怪的数字或符号。有的系统虽然是正确的,但是它非常“脆弱”,一旦发生上述异常情况,就可能遭到意想不到的破坏。1972年6月的计算机世界刊有一则报导:“操作员手指的一滑使税收损失30万美元”,据载,1972年6月美国woonsocket市在用计算机计算税率时,由于操作员的右手小拇指无意滑到键P上,使汽车价格950美元误为7 000
25、950美元,从而导致了巨大的财政损失。第一章绪言 这就产生了一个新的概念“健壮性”,其含义是指:当系统万一遇到意外时(具体是什么意外,事先是很难预料的)能按某种预定的方式作出适当的处理,如能立即意识到异常情况的出现,保护起重要的信息,隔离故障区防止事故蔓延,并能及时通知管理人员请求人工干预,事后从故障状态恢复到正常状态亦比较容易,所以健壮的系统应该能避免出现灾难性的后果。第一章绪言 正确性与健壮性是相互补充的,前面计算税收的系统可能是正确的,但它不是健壮的;而健壮的程序并不一定是绝对正确的,例如一个计算工资的程序,它可能错误地计算了某种罕见的病假折扣值,但它对输入数据以及系统内部的数据状态都进
26、行仔细的查核,因而在绝大多数情况下能够可靠地工作。总的说来,可靠的软件系统在正常情况下能够正确地工作,而且在意外情况下,亦能适当地作出处理,因而不会造成严重的损失。第一章绪言当代计算机使用的范围很广,有些软件系统的故障可能造成生命财产的巨大损失,如核反应堆泄漏,飞船失事爆炸等,所以,“可靠性无疑是绝对重要的。人们宁可在开发时多花些代价,提高系统的可靠性,与发生事故后造成的损失相比,这些代价还是值得的。第一章绪言 3.可理解性可理解性(Understandability)在相当长一段时间中,人们一直认为程序只是提供给计算机的,而不是给人阅读的,所以只要它逻辑正确,计算机能按其逻辑正确执行就足够了
27、,至于它是否易于被人理解则是无关紧要的。但是随着软件规模的增大,人们逐步看到,在整个软件生命期中,为进行测试、排错或修改,开发人员经常需要阅读本人或他人编写的程序和各种文档。如果软件易于理解,无疑将提高开发和维护的工作效率,而且出现错误的可能性也会大大下降。所以,可理解性应该是评价软件质量的一个重要方面。第一章绪言 可理解性通常是指简单性和清晰性,对于同一用户要求,解决的方案可以有多个,其中最简单、最清晰的方案往往被认为是最好的方案。第一章绪言 4.效率效率(Efficiency)效率是指系统能否有效地使用计算机资源,如时间和空间等。这一点以前一直是非常强调的,这是过去硬件价格昂贵造成的结果。
28、由于以下一些原因,目前人们对效率的看法已有了变化:首先,硬件价格近年来大幅度下降,所以效率已不像以前那样举足轻重了。第一章绪言 第二,人们已认识到,程序员的工作效率比程序的效率远为重要,程序员工作效率的提高不仅能减少开支,而且出错率也会降低。从汇编语言发展到高级语言以至超高级语言就是一个很好的说明。第三,追求效率同追求可维护性、可靠性等往往是相互抵触的,例如片面地强调节省时间和空间,设计出来的系统可能结构复杂,难以理解和修改;又如高度可靠的程序中一般需要含有冗余,如为一种帐目保存几个副本等,这就要以一定的时间和空间作代价。第一章绪言 所以,效率虽然是衡量软件质量的一个重要方面,但在硬件价格下降
29、、人工费用上升的情况下,人们有时也宁可牺牲效率来换取其他方面的得益。除了这里讨论的可维护性、可靠性、可理解性和效率之外,软件系统的许多其他性质也反映了软件的质量。图1.5是Boehm提出的软件质量图,下面只解释图中最右边各因素的含义,不再作详细讨论。第一章绪言图1.5第一章绪言 1)设备独立性(DeViceindepenl=!ence):不依赖于特定的硬件设备而能工作的程度。2)自包含性(selfeontaine(】ness):不依赖于其他程序仅靠自身能实现功能的程度。3)精确性(AccLtracy):能产生具有必要精确度之正确输出的程度。4)完整性(Cornpleteness):所有部分是否
30、齐全。每个部分是否充分。5)健壮性合理性(RobLlstnessIntegrjty):即使前提条件不符合规格也能继续合理运行的程度。第一章绪言 6)一致性(Cotlsistency):程序和文档中所用的记号、术语和表示方式的一致的程度。7)计测性(ACCOuntabillity):能够在多大程度上观察、统计程序的工作状况。8)设备效率(Deviceefficiency):使有关设备的功能发挥到什么程度。9)可访问性(Accessibility):能够在多大程度上选择和使用程序的功能和设备。10)通讯性(Communicativeness):输入输出的形式,内容是否统一,使用是否方便。11)自我
31、描述性(Selfdescriptiyeness):程序中以一目了然的形式记述它的目的、条件和输入输出。第一章绪言 12)结构性(StructureneSS):是否结构化,修改是否只涉及局部。13)简洁性(Conciseness):以紧凑的方式表达必要的信息,并且没有多余的东西。14)明了性(Legibility):程序是否便于阅读,注解是否充分、妥当。15)可扩充性(Augmentability):扩充是否方便。第一章绪言 综上所述,一个大型软件系统的质量应该从可维护性、可靠性、可理解性、效率等多个方面全面地进行评价。这些目标是既有联系又有矛盾的,例如可理解性是可维护性的必要前提,可维护性、可
32、靠性同效率往往有抵触,效率中时间和空间两个因素又常常是冲突的。对于不同的软件系统,各个目标的重要程度是不同的,每个目标要求达到什么程度又受经费、时间等因素的限制,例如游戏程序同空中交通控制系统的质量要求显然是不同的。所以在开发具体软件系统的过程中,开发人员应该充分考虑各种不同的方案,在各种矛盾的目标之间作权衡,并在一定的限制条件下(经费、时间、可用的软硬件资源等)使可维护性、可靠性、可理解性和效率等性质最大限度地得到满足。第一章绪言 必须强调的是:为了保证软件质量,在软件开发过程的各个阶段,尤其是早在分析阶段和设计阶段,就应该采取多种有效的技术和一系列质量保证措施,精益求精、一丝不苟,绝对不能
33、急于求成,也不能存有侥幸心理,开发过程中任一环节的疏忽,到后期都可能造成无法弥补的缺陷,甚至是终生遗憾。所以,“先苦后甜、“先忧后乐可以作为软件工作者的座右铭。第一章绪言 软件工程学的最终目标是以较少的投资获得质量较高的软件产品,也就是说要“高产优质”。同其他工程学科一样,达到这个最终目标的两个主要途径是“纪律化”和“自动化”。研究软件方法的目的是使开发过程“纪律化”,就是寻找一些规范的“求解过程”,使开发工作能够有计划、有步骤地进行。研究软件工具的目的是使开发过程“自动”,就是使开发过程中的某些工作用计算机来完成或用计算机来辅助。方法和工具之间有着密切的联系。1.4 软件开发方法和软件自动工
34、具软件开发方法和软件自动工具第一章绪言 下面分别讨论软件开发方法和软件自动工具这两个概念。1.软件开发方法软件开发方法(software Development Methods)几十年以来,程序设计一直是一种个体的、手工艺方式的劳动,对于一个提出的问题,程序员可以任意地“发明”出一个解答,而没有任何规章制度需要遵循。但是当软件进入大规模生产时期,软件就不再是个人的成果而是集体的劳动成果了,所以软件产业面临的第一个问题就是“纪律化”。第一章绪言 一项软件产品的诞生涉及到许多人,包括用户和软件人员两方面。每一方又有许多人,每人对问题的理解可能不同,每人对问题的处理方式也可能不同;软件产品的开发周期
35、又较长,即使是同一个人,在不同的时期,对问题的理解和处理还有可能不一样;而且随着计算技术的发展,处理问题的选择余地又更大了。软件开发过程中,缺乏强有力的内部纪律,各个可以任意地自行其事,这是造成软件危机的主要原因。第一章绪言 为了使软件研制走上工程化的轨道,我们必须寻找一些标准的规程,以便为开发人员给出指导和约束,使他们遵照一定的方式来理解和处理问题,这是使开发获得成功的关键。软件方法就是指导研制软件的某种标准规程,它告诉人们:“什么时候做什么以及怎么做。由于软件研制过程毕竟是相当复杂的,它涉及的因素很多,所以各种软件方法又有不同程度的灵活性、试探性。软件方法不可能像自动售货机的使用规程那样用
36、简单的几句话叙述清楚,也不应该像机器的操作规程那样机械地使用。一般说来,一个软件方法往往规定了:明确的工作步骤、具体的描述方式以及确定的评价标准,下面分别说明这三个方面。第一章绪言 1)明确的工作步骤:研制一个软件系统要考虑并解决许多问题,如果同时处理这些问题,我们将会束手无策,或者造成混乱。正确的方式是将这些问题分成先后次序,每一步集中精力解决一个问题。像为加工机械产品规定一道道工序那样,软件方法也提出了处理问题的基本步骤,这包括每一步的目的是什么,每一步应产生什么工作结果,每一步需具备的条件以及要注意的问题等。第一章绪言 2)具体的描述方式:工程化生产必须强调文档化,即每人必须将每一步的工
37、作结果以一定的书面形式记录下来,以保证开发人员之间有效地进行交流,也有利于维护工作的顺利进行。软件方法规定了描述软件产品的格式,这包括每一步应产生什么文档,文档中记录哪些内容,采用哪些图形、符号等。3)确定的评价标准:对于同一个问题,其解决方案往往不是唯一的,选取哪一个方案较好呢?有些软件方法提出了比较确定的评价标准,因而可以指导人们对各个具体方案进行评价,并从中选取一个较好的方案。第一章绪言在软件方法的指导和约束之下,面对错综复杂的问题,开发人员就可按统一的步骤、统一的描述方式,纪律化地开展工作。毫无疑问,这是“高产优质”的有力保证。近年来,人们陆续研究总结出多种软件方法。70年代初,出现了
38、编写程序的一些方法,主要是“结构化程序设计”;70年代中期人们认识到编程仅仅是软件开发的一个环节,合理地建立软件结构比编写程序更为重要,所以研究重点前移到设计阶段,出现了用于设计阶段的“结构化设计”。和Jackson方法等;70年代后期,人们又意识到在设计阶段之前必须先对用户的要求进行分析,所以研究重点又前移到分析阶段,出现了用于分析阶段的“结构化分析”、sADT、sREM等方法。80年代,又出现了面向对象的软件开发方法。目前,用什么方法来分析和说明用户的要求,用什么方法对软件进行测试和维护,仍是软件工作者感兴趣的问题。第一章绪言 各种软件方法的适用范围是各不相同的,有的方法适用于实时控制系统
39、,如sREM;有的方法适用于数据处理系统,如结构化分析和Jackson方法。各种软件方法的风格也是很不相同的,有的方法仅仅是一组指导性的原则,如Parnas的方法;有的方法则有较具体的处理规则,如Jackson方法;有的方法建立在严密的数学基础之上;有的方法则是实际经验的总结。第一章绪言 现有的软件方法相当多,在一本书中不可能全面地介绍,本书将以70年代以来在国外软件界相当流行的“结构化方法”(包括结构化分析、结构化设计、结构化程序设计等)为主,配合一些其他方法作较系统的介绍。必须指出的是:这些方法都是近年来技术发展的新成果,它们还不是完美的;另外每个软件系统都有各自的特点,例如飞机订票系统、
40、人口普查系统、疾病诊断系统和天气预报系统都是很不相同的.所以任一软件方法都不能机械地用于某个实际系统的开发过程中,开发人员必须结合具体情况(系统的性质、规模、开发人员的素质等)参考方法的精神灵活应用,方法的一些具体细节完全可以作适当的修改和裁剪。第一章绪言 2.软件自动工具软件自动工具(Automated t00ls)由于所需工作量极大,我们常称软件开发是“劳力密集”的工作。为提高生产率并保证质量,人们很自然地希望能够实现开发过程的自动化。几十年来的实践已经证明,用计算机来完成数据处理工作是非常有效的。从图1.2可以看出,软件开发本身也是一种数据处理工作,如设计阶段的任务是将需求说明书处理成模
41、块说明书,编程阶段的任务是将模块说明书加工成程序,所以开发过程中不少机械性、规律性的工作可以用计算机来完成。第一章绪言 软件工具就是指软件开发、维护和分析中使用的程序系统。7 0年代以来,人们已研制了不少软件工具,它们分别在软件生命期的各个阶段辅助开发人员开展工作,例如:编程阶段有编辑程序、编译程序、连结程序等工具。编辑程序使人们可以方便地输入和修改源程序,编译程序免除了人们用机器指令编程的重荷。测试阶段有测试数据产生器、排错程序、跟踪程序以及静态分析工具和覆盖监视工具等。第一章绪言 近年来,人们又为设计阶段和分析阶段研制了一些工具,如PsLPsA、AlDEs和sDLPAD等系统。众多的软件工
42、具组成了“工具箱”,在生命期的各个阶段人们可根据不同需要,从“工具箱”中选择合适的工具来使用,这就提高了生产率并改进了产品的质量。但是应该认识到,软件开发过程毕竟是极复杂的,这里有许多工作需要人的创造能力,所以软件开发全部自动化看来是不可能的,计算机只能起到一定的辅助作用。第一章绪言软件方法和软件工具之间有着密切的联系。方法是主导,工具则是辅助的,软件方法提出了明确的工作步骤的标准的文档格式,这是设计软件工具的基础,所以研究方法是研究工具的先导,而工具的实现又将促进方法的发展。目前人们热心研究的“软件工程环境”正是方法和工具的结合。人们希望研究出一套系统的软件方法、一组配套成龙的软件工具,再加
43、上一个由计算机管理的文档库,为开发人员提供一个能覆盖整个软件生命期的良好的工作环境,这样开发人员就可以像工人在自动流水线上生产电视机那样来生产软件了。第一章绪言 软件方法和软件工具是软件工程学中的两个重要内容,推广使用方法和工具必将为我国的软件产业打下良好的思想基础和物质基础。本书第二至八章将介绍一些常用的软件方法,第九章简单介绍面向对象开发技术,第十章将介绍一些典型的软件工具及软件工程环境。第一章绪言1.什么是软件危机?为什么会产生软件危机?怎样克服软件危机?2.什么叫软件工程?软件工程的诞生是否从根本上消除了软件危机?为什么?3.软件生存周期为什么要划分阶段?各个阶段的任务是什么?4.什么是软件?如何评价软件的质量?习习 题题 一一