第一章 软件工程概述 一、复习要求 1. 了解软件概念、特点及分类方法。 2. 了解软件发展及软件危机的起因。 3. 了解软件工程过程及软件生存期的概念。 4. 了解软件工程的概念及其要素。 5. 了解软件工程的基本目标和原则。 二、内容提要 1. 软件的概念、特点 软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料。 软件的特点是: (1) 软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性。 (2) 软件的生产与硬件不同,它没有明显的制造过程。对软件的质量控制,必须着重在软件开发方面下功夫。 (3) 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。任何机械、电子设备在运行和使用中,其失效率大都遵循如图1.1(a)所示的U型曲线(即浴盆曲线)。而软件的情况与此不同,因为它不存在磨损和老化问题。然而它存在退化问题,必须要多次修改(维护)软件,如图1.1(b)所示。  图1.1 失效率曲线 (4) 软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖性。为了解除这种依赖性,在软件开发中提出了软件移植的问题。 (5) 软件的开发至今尚未完全摆脱手工艺的开发方式。 (6) 软件本身是复杂的。软件的复杂性可能来自它所反映的实际问题的复杂性,也可能来自程序逻辑结构的复杂性。 (7) 软件成本相当昂贵。软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动,它的成本是比较高的。 (8) 相当多的软件工作涉及到社会因素。许多软件的开发和运行涉及机构、体制及管理方式等问题,甚至涉及到人的观念和人们的心理。它直接影响到项目的成败。 2.软件的分类 (1) 按软件的功能进行划分: ·系统软件: 能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和数据协调、高效地工作的软件。例如,操作系统、数据库管理系统、设备驱动程序以及通信处理程序等。 ·支撑软件: 是协助用户开发软件的工具性软件,其中包括帮助程序人员开发软件产品的工具,也包括帮助管理人员控制开发的进程的工具。 ·应用软件: 是在特定领域内开发,为特定目的服务的一类软件。 (2) 按软件规模进行划分: 按开发软件所需的人力、时间以及完成的源程序行数,可确定六种不同规模的软件。 表1.1软件规模的分类 类别 参加人员数 研制期限 产品规模(源程序行数)  微型 1 1~4周 0.5k  小型 1 1~6月 1k~2k  中型 2~5 1~2年 5k~50k  大型 5~20 2~3年 50k~100k  甚大型 100~1000 4~5年 1M(=1000k)  极大型 2000~5000 5~10年 1M~10M   规模大、时间长、很多人参加的软件项目,其开发工作必须要有软件工程的知识做指导。而规模小、时间短、参加人员少的软件项目也得有软件工程概念,遵循一定的开发规范。其基本原则是一样的,只是对软件工程技术依赖的程度不同而已。 (3) 按软件工作方式划分: ·实时处理软件: 指在事件或数据产生时,立即予以处理,并及时反馈信号,控制需要监测和控制的过程的软件。主要包括数据采集,分析,输出三部分。 ·分时软件: 允许多个联机用户同时使用计算机。 ·交互式软件: 能实现人机通信的软件。 ·批处理软件: 把一组输入作业或一批数据以成批处理的方式一次运行,按顺序逐个处理完的软件。 (4) 按软件服务对象的范围划分: ·项目软件: 也称定制软件,是受某个特定客户(或少数客户)的委托,由一个或多个软件开发机构在合同的约束下开发出来的软件。例如军用防空指挥系统、卫星控制系统。 ·产品软件: 是由软件开发机构开发出来直接提供给市场,或是为千百个用户服务的软件。例如,文字处理软件、文本处理软件、财务处理软件、人事管理软件等。 (5) 按使用的频度进行划分: 有的软件开发出来仅供一次使用。例如用于人口普查、工业普查的软件。另外有些软件具有较高的使用频度,如天气预报软件。 (6) 按软件失效的影响进行划分: 有的软件在工作中出现了故障,造成软件失效,可能给软件整个系统带来的影响不大。有的软件一旦失效。可能酿成灾难性后果。例如财务金融、交通通信、航空航天等软件。我们称这类软件为关键软件。 3.软件的发展和软件危机 自20世纪40年代中出现了世界上第一台计算机以后,就有了程序的概念。其后经历了几十年的发展,计算机软件经历了三个发展阶段: ·程序设计阶段,约为50至60年代 ·程序系统阶段,约为60至70年代 ·软件工程阶段,约为70年代以后 几十年来最根本的变化体现在: (1) 人们改变了对软件的看法。50年代到60年代时,程序设计曾经被看做是一种任人发挥创造才能的技术领域。当时人们认为,写出的程序只要能在计算机上得出正确的结果,程序的写法可以不受任何约束。随着计算机的广泛使用,人们要求这些程序容易看懂、容易使用,并且容易修改和扩充。于是,程序便从个人按自己意图创造的“艺术品”转变为能被广大用户接受的工程化产品。 (2) 软件的需求是软件发展的动力。早期的程序开发者只是为了满足自己的需要,这种自给自足的生产方式仍然是其低级阶段的表现。进入软件工程阶段以后,软件开发的成果具有社会属性,它要在市场中流通以满足广大用户的需要。 (3) 软件工作的范围从只考虑程序的编写扩展到涉及整个软件生存周期。 在软件技术发展的第二阶段,随着计算机硬件技术的进步,要求软件能与之相适应。然而软件技术的进步一直未能满足形势发展提出的要求。致使问题积累起来,形成了日益尖锐的矛盾。这就导致了软件危机。问题归结起来有: (1) 缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定。致使经费预算常常突破,进度计划无法遵循,开发完成的期限一拖再拖。 (2) 软件需求,在开发的初期阶段提得不够明确,或是未能得到确切的表达。开发工作开始后,软件人员和用户又未能及时交换意见,造成开发后期矛盾的集中暴露。 (3) 开发过程没有统一的、公认的方法论和规范指导,参加的人员各行其事。加之设计和实现过程的资料很不完整;或忽视了每个人工作与其他人的接口,使得软件很难维护。 (4) 未能在测试阶段充分做好检测工作,提交用户的软件质量差,在运行中暴露出大量的问题。 如果这些障碍不能突破,进而摆脱困境,软件的发展是没有出路的。 4. 软件工程过程和软件生存周期 许多计算机和软件科学家尝试,把其它工程领域中行之有效的工程学知识运用到软件开发工作中来。经过不断实践和总结,最后得出一个结论:按工程化的原则和方法组织软件开发工作是有效的,是摆脱软件危机的一个主要出路。 (1) 软件工程过程 (Software Engineering Process) 软件工程过程是为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工程活动。软件工程过程通常包含四种基本的过程活动: ·P (Plan) : 软件规格说明。规定软件的功能及其运行的限制; ·D (Do) : 软件开发。产生满足规格说明的软件; ·C (Check) : 软件确认。确认软件能够完成客户提出的要求; ·A (Action) : 软件演进。为满足客户的变更要求,软件必须在使用的过程中演进。 事实上,软件工程过程是一个软件开发机构针对某一类软件产品为自己规定的工作步骤,它应当是科学的、合理的,否则必将影响到软件产品的质量。 (2) 软件生存周期 (life cycle) 正如同任何事物一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程。我们称其为计算机软件的生存周期。根据这一思想,把上述基本的过程活动进一步展开,可以得到软件生存周期的六个步骤。 ·制定计划 : 确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等方面的要求;研究完成该项软件任务的可行性,探讨解决问题的可能方案;制定完成开发任务的实施计划,连同可行性研究报告,提交管理部门审查。 ·需求分析 : 对待开发软件提出的需求进行分析并给出详细的定义。编写出软件需求说明书及初步的用户手册,提交管理机构评审。 ·软件设计 : 把已确定了的各项需求转换成一个相应的体系结构。进而对每个模块要完成的工作进行具体的描述。编写设计说明书,提交评审。 ·程序编写 : 把软件设计转换成计算机可以接受的程序代码。 ·软件测试 : 在设计测试用例的基础上检验软件的各个组成部分。 ·运行/维护 : 已交付的软件投入正式使用,并在运行过程中进行适当的维护。 (3) 软件生存周期模型 软件生存周期模型是从软件项目需求定义直至软件经使用后废弃为止,跨越整个生存周期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。 a) 瀑布模型 : 瀑布模型规定了各项软件工程活动,包括:制定开发计划,进行需求分析和说明,软件设计,程序编码。测试及运行维护,参看图1.2。并且规定了它们自上而下,相互衔接的固定次序,如同瀑布流水,逐级下落。          图1.2 软件生存周期的瀑布模型 然而软件开发的实践表明,上述各项活动之间并非完全是自上而下,呈线性图式。实际情况是,每项开发活动均处于一个质量环(输入-处理-输出-评审)中。只有当其工作得到确认,才能继续进行下一项活动,在图1.2中用向下的箭头表示;否则返工,在图1.2中由向上的箭头表示。 b) 演化模型 : 由于在项目开发的初始阶段人们对软件的需求认识常常不够清晰,因而使得开发项目难于做到一次开发成功,出现返工再开发在所难免。因此,可以先做试验开发,其目标只是在于探索可行性,弄清软件需求;然后在此基础上获得较为满意的软件产品。通常把第一次得到的试验性产品称为“原型”。 c) 螺旋模型 : 对于复杂的大型软件,开发一个原型往往达不到要求。螺旋模型将瀑布模型与演化模型结合起来,并且加入两种模型均忽略了的风险分析。螺旋模型沿着螺线旋转,如图1.3所示,在笛卡尔坐标的四个象限上分别表达了四个方面的活动,即: ( 制定计划──确定软件目标,选定实施方案,弄清项目开发的限制条件; ( 风险分析──分析所选方案,考虑如何识别和消除风险; ( 实施工程──实施软件开发 ( 客户评估──评价开发工作,提出修正建议。 沿螺线自内向外每旋转一圈便开发出更为完善的一个新的软件版本。   图1.3 螺旋模型 d) 喷泉模型 : 喷泉模型对软件复用和生存周期中多项开发活动的集成提供了支持,主要支持面向对象的开发方法。“喷泉”一词本身体现了迭代和无间隙特性。系统某个部分常常重复工作多次,相关功能在每次迭代中随之加入演进的系统。所谓无间隙是指在开发活动,即分析、设计和编码之间不存在明显的边界。如图1.4所示。 图1.4 喷泉模型 e) 智能模型 : 智能模型是基于知识的软件开发模型,它综合了上述若干模型,并把专家系统结合在一起。该模型应用基于规则的系统,采用归约和推理机制,帮助软件人员完成开发工作,并使维护在系统规格说明一级进行。 5. 软件工程的目标和原则 (1) 软件工程的定义 Fritz Bauer曾经为软件工程下了定义:“软件工程是为了经济地获得能够在实际机器上有效运行的可靠软件而建立和使用的一系列完善的工程化原则。” 1983年IEEE给出的定义为:“软件工程是开发、运行、维护和修复软件的系统方法”,其中,“软件”的定义为:计算机程序、方法、规则、相关的文档资料以及在计算机上运行时所必需的数据。 后来尽管又有一些人提出了许多更为完善的定义,但主要思想都是强调在软件开发过程中需要应用工程化原则的重要性。 软件工程包括三个要素:方法、工具和过程。 软件工程方法为软件开发提供了“如何做”的技术。它包括了多方面的任务,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计、算法过程的设计、编码、测试以及维护等。 软件工具为软件工程方法提供了自动的或半自动的软件支撑环境。目前,已经推出了许多软件工具,这些软件工具集成起来,建立起称之为计算机辅助软件工程(CASE)的软件开发支撑系统。CASE将各种软件工具、开发机器和一个存放开发过程信息的工程数据库组合起来形成一个软件工程环境。 软件工程的过程则是将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各个阶段完成的里程碑。 (2) 软件工程项目的基本目标 组织实施软件工程项目,最终希望得到项目的成功。所谓成功指的是达到以下几个主要的目标: ·付出较低的开发成本; ·达到要求的软件功能; ·取得较好的软件性能; ·开发的软件易于移植; ·需要较低的维护费用; ·能按时完成开发工作,及时交付使用。 在具体项目的实际开发中,企图让以上几个目标都达到理想的程度往往是非常困难的。           图1.5 软件工程目标之间的关系 图1.5表明了软件工程目标之间存在的相互关系。其中有些目标之间是互补关系,例如,易于维护和高可靠性之间,低开发成本与按时交付之间。还有一些目标是彼此互斥的,例如,低开发成本与软件可靠性之间,提高软件性能与软件可移植性之间,就存在冲突。 (3) 软件工程的原则 以上的软件工程基本目标适合于所有的软件工程项目。为达到这些目标,在软件开发过程中必须遵循下列软件工程原则。 ·抽象 : 抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象,自顶向下、逐层细化的办法控制软件开发过程的复杂性。 ·信息隐蔽 : 将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。这就是信息封装,使用与实现分离的原则。使用者只能通过模块接口访问模块中封装的数据。 ·模块化 : 模块是程序中逻辑上相对独立的成分,是独立的编程单位,应有良好的接口定义。如C语言程序中的函数过程,C++语言程序中的类。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统。 ·局部化 : 要求在一个物理模块内集中逻辑上相互关联的计算机资源,保证模块之间具有松散的耦合,模块内部具有较强的内聚。这有助于控制解的复杂性。 ·确定性 : 软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。这有助于人们之间在交流时不会产生误解、遗漏,保证整个开发工作协调一致。 ·一致性 : 整个软件系统(包括程序、文档和数据)的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致。 ·完备性 : 软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审。 ·可验证性 : 开发大型的软件系统需要对系统自顶向下、逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性。 使用一致性、完备性和可验证性的原则可以帮助人们实现一个正确的系统。 三、例题分析 【例1】软件是计算机系统中与硬件相互依存的另一部分,它是包括( A )、( B )及( C )的完整集合。其中,( A )是按事先设计的功能和性能要求执行的指令序列。( B )是使程序能够正确操纵信息的数据结构。( C )是与程序开发、维护和使用有关的图文材料。 供选择的答案: A(C. ① 软件 ② 程序 ③ 代码 ④ 硬件 ⑤ 文档 ⑥ 外设 ⑦ 数据 ⑧ 图表 答案:A. ②, B. ⑦, C. ⑤ 分析:软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及相关文档的完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列。数据是使程序能够正确操纵信息的数据结构。文档是与程序开发、维护和使用有关的图文材料。需要注意的是,程序与算法在含义上有不同:算法的每一条指令必须是最基本的、必须通过有限步做完,而程序没有这个要求。 【例2】开发软件时对提高软件开发人员工作效率至关重要的是( A )。软件工程中描述生存周期的瀑布模型一般包括计划、( B )、设计、编码、测试、维护等几个阶段,其中设计阶段在管理上又可以依次分成( C )和( D )两步。 供选择的答案: A. ① 程序开发环境 ② 操作系统的资源管理功能 ③ 程序人员数量 ④ 计算机的并行处理能力 B. ① 需求分析 ② 需求调查 ③ 可行性分析 ④ 问题定义 C、D.① 方案设计 ② 代码设计 ③ 概要设计 ④ 数据设计 ⑤ 运行设计 ⑥ 详细设计 ⑦ 故障处理设计 ⑧ 软件体系结构设计 答案:A. ①, B. ①, C. ③, D. ⑥ 分析:有合适的程序开发环境可以提供有用的工具,大大提高开发人员的工作效率。 软件工程中描述软件生存周期的瀑布模型一般包括计划、需求分析、设计、编码、测试和运行维护等六个阶段。需求分析完成对软件产品在功能、性能、用户接口、运行环境、可靠性、安全性、开发资源、开发进度、开发成本等方面的需求定义。问题定义、可行性分析、需求调查都可能是需求分析中要做的一部分工作。 软件设计在管理上划分为概要设计与详细设计两个步骤。概要设计的目标是建立软件的体系结构,完成全局数据结构设计,同时进行处理方式设计、运行配置设计、出错处理设计、故障恢复设计等。详细设计是对每一个模块的操作的控制流程和局部数据结构进行设计。 【例3】从供选择的答案中选出适当字句填入下列关于软件发展过程的叙述中的( )内。 有人将软件的发展过程划分为4个阶段: 第一阶段(1950~1950年代末)称为“程序设计的原始时期”,这时既没有( A ),也没有( B ),程序员只能用机器指令编写程序。 第二阶段(1950年代末~1960年代末)称为“基本软件期”。出现了( A ),并逐渐普及。随着( B )的发展,编译技术也有较大的发展。 第三阶段(1960年代末~1970年代中期)称为“程序设计方法时代”。这一时期,与硬件费用下降相反,软件开发费急剧上升。人们提出了( C )和( D )等程序设计方法,设法降低软件的开发费用。 第四阶段(1970年代中期~现在)称为“软件工程时期”。软件开发技术不再仅仅是程序设计技术,而是包括了与软件开发的各个阶段,如( E )、( F )、编码、单元测试、综合测试、( G )及其整体有关的各种管理技术。 供选择的答案: A ( D:① 汇编语言 ② 操作系统 ③ 虚拟存储器概念 ④ 高级语言 ⑤ 结构式程序设计 ⑥ 数据库概念 ⑦ 固件 ⑧ 模块化程序设计 E ( G:① 使用和维护 ② 兼容性的确认 ③ 完整性的确认 ④ 设计 ⑤ 需求定义 ⑥ 图象处理 答案:A. ①, B. ④, C. ⑤, D. ⑧, E. ⑤, F. ④, G. ①。注意,C与D的答案顺序可互换。 分析:在软件发展的早期,汇编语言和高级语言尚未出现,人们只能用机器指令来编写程序。为了好读,有的指令系统可以用八进制代码书写。其后,由于汇编语言的出现,人们摆脱了繁重的地址分配等工作,可以用符号编程。随着高级语言的出现和普及,人们用近似于自然语言的语句编写程序,大大减轻了程序员的负担。高级语言的处理,从解释执行到编译执行,处理效率和存储利用率不断提高。 结构化程序设计和模块化程序设计是科学家为解决软件危机,借用其它领域的技术改进程序设计方法而提出来的。由于这些技术的使用,提高了程序的可读性、局部性、抽象性、清晰性、简单性、确定性、一致性等,降低了程序开发的费用。后来发展到软件工程阶段,明确地划分了软件开发阶段,规范了软件开发过程,明确了各个阶段的任务以及应交付的成果和里程碑,使得软件开发逐步达到工程化和标准化。 四、习题 【1-1】软件工程过程有哪几个基本过程活动?试说明之。 【1-2】试说明“软件生存周期”的概念。 【1-3】试论述瀑布模型软件开发方法的基本过程。 【1-4】软件工程是开发、运行、维护和修复软件的系统化方法,它包含哪些要素?试说明之。 【1-5】软件工程学的基本原则有哪些?试说明之。 【1-6】有人说:软件开发时,一个错误发现得越晚,为改正它所付出的代价就越大。对否?请解释你的回答。 五、习题解答 【1-1】软件工程过程的基本过程活动有4步: ·P (Plan) : 软件规格说明。规定软件的功能及其运行的限制; ·D (Do) : 软件开发。产生满足规格说明的软件; ·C (Check) : 软件确认。确认软件能够完成客户提出的要求; ·A (Action) : 软件演进。为满足客户的变更要求,软件必须在使用的过程中演进。 【1-2】软件与任何一个事物一样,有它的孕育、诞生、成长、成熟、衰亡的生存过程。这就是软件的生存周期。它主要分为6个阶段:软件项目计划、软件需求分析和定义、软件设计、程序编码、软件测试,以及运行维护。 (1) 软件项目计划 :在这一步要确定软件工作范围,进行软件风险分析,预计软件开发所需要的资源,建立成本与进度的估算。根据有关成本与进度的限制分析项目的可行性。 (2) 软件需求分析和定义 :在这一步详细定义分配给软件的系统元素。可以用以下两种方式中的一种对需求进行分析和定义。一种是正式的信息域分析,可用于建立信息流和信息结构的模型,然后逐渐扩充这些模型成为软件的规格说明。另一种是软件原型化方法,即建立软件原型,并由用户进行评价,从而确定软件需求。 (3) 软件设计 :软件的设计过程分两步走。第一步进行概要设计,以结构设计和数据设计开始,建立程序的模块结构,定义接口并建立数据结构。此外,要使用一些设计准则来判断软件的质量。第二步做详细设计,考虑设计每一个模块部件的过程描述。经过评审后,把每一个加细的过程性描述加到设计规格说明中去。 (4) 程序编码 :在设计完成之后,用一种适当的程序设计语言或CASE工具生成源程序。应当就风格及清晰性对代码进行评审,而且反过来应能直接追溯到详细设计描述。 (5) 软件测试 :单元测试检查每一单独的模块部件的功能和性能。组装测试提供了构造软件模块结构的手段,同时测试其功能和接口。确认测试检查所有的需求是否都得到满足。在每一个测试步骤之后,要进行调试,以诊断和纠正软件的故障。 (6) 软件维护 :为改正错误,适应环境变化及功能增强而进行的一系列修改活动。与软件维护相关联的那些任务依赖于所要实施的维护的类型。 【1-3】瀑布模型规定了各项软件工程活动,包括:制定软件项目计划,进行需求分析和定义,软件设计,程序编码,测试及运行维护。并且规定了它们自上而下,相互衔接的固定次序,如同瀑布流水,逐级下落。然而软件开发的实践表明,上述各项活动之间并非完全是自上而下,呈线性图式。实际情况是,每项开发活动均应具有以下特征: (1) 从上一项活动接受本项活动的工作对象,做为输入; (2) 利用这一输入实施本项活动应完成的内容; (3) 给出本项活动的工作成果,做为输出传给下一项活动; (4) 对本项活动实施的工作进行评审。若其工作得到确认,则继续进行下一项活动,否则返回前项,甚至更前项的活动进行返工。 【1-4】软件工程包括三个要素:方法、工具和过程。 软件工程方法为软件开发提供了“如何做”的技术。它包括了多方面的任务,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计、算法过程的设计、编码、测试以及维护等。软件工程方法常采用某一种特殊的语言或图形的表达方法及一套质量保证标准。 软件工具为软件工程方法提供了自动的或半自动的软件支撑环境。目前,已经推出了许多软件工具,已经能够支持上述的软件工程方法。特别地,已经有人把诸多的软件工具集成起来,使得一种工具产生的信息可以为其它的工具所使用,这样建立起一种被称之为计算机辅助软件工程(CASE)的软件开发支撑系统。CASE将各种软件工具、开发机器和一个存放开发过程信息的工程数据库组合起来形成一个软件工程环境。 软件工程的过程则是将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各个阶段完成的里程碑。 【1-5】在软件开发过程中必须遵循下列软件工程原则。 ·抽象 : 采用分层次抽象,自顶向下、逐层细化的办法进行功能分解和过程分解,可以由抽象到具体、由复杂到简单,逐步得到问题的解。 ·信息隐蔽 : 遵循信息封装,使用与实现分离的原则,将模块设计成“黑箱”,可以将实现的细节隐藏在模块内部,使用者只能通过模块接口访问模块中封装的数据。 ·模块化 : 按模块划分系统的体系结构,使得各模块间有良好的接口。这样有助于信息隐蔽和抽象,有助于表示复杂的系统。 ·局部化 : 按抽象数据类型思想及问题域中的概念来建立模块,确保模块之间低耦合,模块内部高内聚。这有助于控制解的复杂性。 ·确定性 : 软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。这有助于人们之间的沟通,保证整个开发工作协调一致。 ·一致性 : 强调软件开发过程的标准化、统一化。包括文档格式的一致,工作流程的一致,内、外部接口的一致,系统规格说明与系统行为的一致等。 ·完备性 : 软件系统不丢失任何重要成分,可以完全实现系统所要求功能。 ·可验证性 : 开发大型的软件系统需要对系统自顶向下、逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性。 【1-6】软件开发时,一个错误发现得越晚,为改正它所付出的代价就越大。这个说法是对的。在1970年代,GTE、TRW和IBM等三家公司对此问题做了独立研究,最后它们得到相似的结论: 阶段 需求分析 软件设计 程序编码 单元测试 验收测试  维 护   相对修复代价  0.1(0.2  0.5  1  2  5  20   从表中可以看出,在需求分析阶段检查和修复一个错误所需的代价只有编码阶段所需代价的1/5到1/10,而在维护阶段做同样的工作所付出的代价却是编码阶段的20倍。