一、 软件特点
无形性(抽象性),比如人的大脑为硬件,软件则是大脑产生的思想。
二、 软件分类
1.功能划分
(1)系统软件:系统软件是计算机系统的必要成分,它跟计算机硬件紧密配合,以使计算 机系统的各个部分协调、高效地工作。例如操作系统、数据库管理系统等。
(2)支撑软件:用于协助用户开发与维护软件系统的一些工具性软件。例如程序编译器、 源程序编辑器、错误检测程序、程序资源库等。
(3)应用软件:用于为最终用户提供数据服务、事务管理或工程计算的软件。例如商业数 据处理软件、工程设计制图软件、办公管理自动化软件、多媒体教学软件等。
2. 按软件工作方式划分
(1)实时处理软件:能够及时进行数据采集、反馈和迅速处理数据的软件。其主要用于特 殊设备的监控,例如,自动流水线监控程序、飞机自动导航程序。
(2)分时处理软件:能够把计算机 CPU 工作时间轮流分配给多项数据处理任务的软件。例 如,多任务操作系统。
(3)交互式软件:能够实现人机对话的软件。这类软件往往通过一定的操作界面接收用户 给出的信息,并由此进行数据操作;其在时间上没有严格的限定,但在操作上给予了用户很大 的灵活性。例如,商业数据处理软件系统中的客户端程序。
(4)批处理软件:能够把一组作业按照作业输入顺序或作业优先级别进行排队处理,并以 成批加工方式处理作业中数据。例如,汇总报表打印程序。
3.软件规模划分
(1)微型软件:一个人几天内即可完成的源程序在 500 行语句以内的软件。这种软件主要 供个人临时性使用,软件任务单一,操作简单。一般没有必要建立系统文档。
(2)小型软件:一个人半年之内即可完成的 2 000 行以内的程序。这种软件通常没有与其 他软件的数据接口,主要用于用户企业内部专项任务,大多由最终用户自主开发,软件使用周 期短,但软件运行过程中产生的数据则可能在今后系统扩充中有一定的价值。考虑到系统今后 有扩充的可能性,软件创建过程中应该提供必要的系统文档支持。
(3)中型软件:由一个项目小组在一年时间内完成的 5 万行源程序以内的软件系统。中型 软件在项目实施过程中有了软件人员之间、软件人员与用户之间的通信,软件开发过程中需要 进行资源调配。因此,软件开发过程中已需要系统地采用软件工程方法,例如,项目计划、技 术手册、用户手册等文档资源,以及技术审查制度等,都需要比较严格地建立起来。
(4)大型软件:由一个至几个项目小组在两年时间内完成的 5 万行源程序以上的软件系统。 当有多个项目小组共同参入软件开发时,需要对参加软件开发的软件工程人员实施二级管理, 一般将项目按功能子系统分配到各个项目小组,然后再在项目小组内将具体任务分配到个人。 由于项目周期较长,在项目任务完成过程中,人员调整往往不可避免,并会出现对新手的培训 和逐步熟悉工作环境的问题。对于这样大规模的软件,采用统一的标准,实行严格的审查是绝 对必要的。由于软件的规模庞大以及问题的复杂性,往往在开发的过程中会出现一些事先难以 预料的不测事件,对此需要有一定的思想与工作准备。
4.按服务对象进行划分
(1)通用软件:由软件开发机构开发出来的直接提供给市场的软件。例如通用财务软件、 通用字处理软件,杀毒软件等。这类软件通常由软件开发机构自主进行市场调查与市场定位, 并由此确定软件规格,大多通过一定的商业渠道进行软件销售。
(2)定制软件:受某个或少数几个特定客户的委托,由一个或多个软件开发机构在合同的 约束下开发出来的软件。例如,某专门设备的控制系统、某特定企业的业务管理系统、某智能大厦的监控与管理系统、某城市的交通监管系统。这类软件通常由用户进行软件描述,并以此 为基本依据确定软件规格。作为软件开发机构,则必须按照用户要求进行开发。
5.软件发展历程
(1)程序设计时代
科研工作者 开发者即使用者
(2)程序系统时代
个人创作 软件作坊 用户意图忽略
(3)软件工程时代
工程原理、技术、方法
三、 软件危机
1.危机现场
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。例如,软件的 开发成本、进度,软件质量,等等。这些问题绝不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都不同程度地存在这些问题。
(1) 软件开发成本、进度的估计很不准确;
(2) 软件产品常常与用户的要求不一致;
(3) 软件产品质量可靠性差;
(4) 软件文档不完整、不一致
(5) 软件产品可维护性差
(6) 软件生产率低
2.产生危机的原因
(1) 软件的不可见特性;
(2) 软件系统规模庞大;
(3) 软件生产工程化管理程度低;
(4) 对用户需求关心程度不够;
(5) 对软件维护重视程度不够;
(6) 软件开发工具自动化程度低;
四、 软件工程
1.软件工程概念
软件工程是一门关于软件开发与维护的工程学科,它涉及软件生产的各个方面,包括:工 程过程、工程原则、技术方法与工具,以及工程项目管理等,能够为经济、高效地开发高质量 的软件产品提供最有效的支持。 实际上,我们可以从多个不同的角度来认识软件工程。 1983 年国际权威机构 IEEE 给软件工程下的定义是:软件工程是开发、运行、维护和修复 软件的系统方法。其中的“软件”被定义为:计算机程序、方法、规则、相关的文档资料,以 及计算机程序运行时所需要的数据。 Fairly 给出的定义是:软件工程学是为了在成本限额以内按时完成开发和修改软件产品 时,所需要的系统生产和维护技术及管理学科。 FritZ Baner 则给出了下述定义:软件工程是为了经济地获得可靠的且能在实际机器上有 效运行的软件,而建立和使用的完善的工程化原则。
2.软件工程技术
软件工程技术是指软件工程所具有的技术要素。作为软件开发与维护的工程方法学,软件工程具有三个方面的技术要素,即软件工程方法、软件工具和软件工程过程。
软件工程方法 软件工程方法是指完成软件开发与维护任务时,应该“如何做”的技术方法。它所涉及的 任务贯穿于软件开发、维护的整个过程之中,包括:软件需求分析、软件结构设计、程序算法 设计等诸多任务;而其方法则体现在使用图形或某种特殊语言的方式来表现这些任务中需要建 立的软件系统模型,如:数据流模型、软件结构模型、对象模型、组件模型等。主要的软件工 程方法有:结构化方法、JSD 方法和面向对象方法。
(1)结构化方法 结构化方法是传统的基于软件生命周期的软件工程方法,自 20 世纪 70 年代产生以来,获 得了极有成效的软件项目应用。结构化方法是以软件功能为目标来进行软件构建的,包括:结 构化分析、结构化设计、结构化实现和结构化维护等内容,能够很好地适应结构化编程工具, 例如:C、Pascal 语言等。它主要使用数据流模型来描述软件的数据加工过程,并可以通过数 据流模型,由对软件的分析顺利过渡到对软件的结构设计。
(2)JSD 方法 JSD 方法主要用在软件设计上,1983 年由法国科学家 Jackson 提出。它以软件中的数据结 构为基本依据来进行软件结构与程序算法设计,是对结构化软件设计方法的有效补充。在以数 据处理为主要内容的信息系统开发中,JSD 方法具有比较突出的设计建模优势。
(3)面向对象方法 面向对象方法是以软件问题域中的对象为基本依据来构造软件系统模型的,包括:面向对 象分析、面向对象设计、面向对象实现和面向对象维护等内容。确定问题域中的对象成分及其 关系,建立软件系统对象模型,是面向对象分析与设计过程中的核心内容。自 20 世纪 80 年代 以来,人们提出了许多有关面向对象的方法,其中,由 Booch、Rumbaugh、Jacobson 等人提出 的一系列面向对象方法成为了主流方法,并被结合为统一建模语言(UML),成为了面向对象方 法中的公认标准。面向对象方法能够最有效地适应面向对象编程工具,例如:C++、Java 等, 并特别适用于面向用户的交互式系统的开发。
- 软件工具
软件工具是为了方便软件工程方法的运用而提供的具有自动化特征的软件支撑环境。 软件工具通常也称为 CASE,它是计算机辅助软件工程(Computer-Aided Software Engineering)的英文缩写。CASE 工具覆盖面很广,包括:分析建模、设计建模、源代码编辑 生成、软件测试等。表 1-1 所列是一些常用的 CASE 工具类别。
1.软件过程
软件工程过程并不是完全固定的,每个软件开发机构都可以专门制定更加适合自身特点的 软件工程过程。实际上,软件产品不同,软件工程过程也可能会有所不同。但是,以下四项基本活动,则是绝大多数软件过程所必须的。
(1)软件定义:进行软件规格和使用限制的定义。
(2)软件开发:根据软件规格定义制作出软件产品。
(3)软件验证:确认软件能够满足用户提出的要求。
(4)软件维护:修正软件缺陷,并能根据用户需求变化改进软件。
五、 软件工程管理
工程项目总是离不开管理,软件项目也是如此。应该讲,软件项目的管理质量将直接决定 软件项目的成败。 软件项目所涉及的管理是多方面的,但概括地看,则主要体现为以下几个方面的管理。
1.软件项目规划 项目规划就是在项目开始的时候制定出项目开发计划,以明确项目中的人员、任务、进度、 费用、文档和目标等,用来指导项目往既定的目标推进。 项目的有效管理直接依赖于项目规划。当面对一个有一定规模的项目时,往往需要针对以 下一些问题给出规划。
(1)计划项目参入人员的构成、分工与组织方式。
(2)对项目所需的硬件、软件资源,以及其他各项费用开支作出估计。
(3)进行项目任务分解,明确项目里程碑及其文档成分。
(4)制定工作步骤,安排工作进程和人员配备。
(5)对项目风险作出估计,并对降低风险给出计划。
(6)制定项目监督措施。
2.项目资源调配 软件项目资源涉及的内容有:
(1)硬件设备,如:计算机、打印机、绘图仪等。
(2)支撑软件,如:开发工具、数据库系统等。
(3)技术资料,如:技术标准手册、参考文献等。
(4)项目队伍,如:技术人员、管理人员、协作人员等。 在项目实施的不同阶段对资源的需求是不同的。项目资源调配也就是以项目计划为基本依 据,使各个方面资源需求按时到位,并可以根据项目的实际进行情况,对资源作出合理的调整, 以保证项目能够按计划顺利进行。
3.软件产品控制 软件产品控制就是对软件生产过程、软件产品规格等实施有效的控制,并涉及以下两个方 面的管理问题。
(1)软件质量管理。例如,对软件开发中形成的各类文档进行阶段性质量审查,以保证软 件开发的规程与标准能够被严格执行;对已经产生的软件产品及其相关文档进行软件评估,以保证开发出来的软件产品与软件的需求规格定义能够保持一致。
(2)软件配置管理。例如,制定有关软件产品的各项标准,跟踪并记录软件生产过程中发 生的变更,标识与存档正在开发的软件的各种不同版本等。
六、 软件工程基本原则
软件工程是关于软件项目的工程方法学,其价值只能通过具体的软件项目才能真正体现出 来。为保证在软件项目中能够有效地贯彻与正确地使用软件工程规程,需要有一定的软件工程 原则来对软件项目加以约束。 一些研究软件工程的专家学者分别从不同的角度陆续提出过许多关于软件工程的原则或 “信条”,其中,著名的软件工程专家 B.W.Boehm 经过总结,提出了以下 7 条基本原则。
1.采用分阶段的生命周期计划,以实现对项目的严格管理 软件项目的开展,需要计划在先,实施在后。统计表明,50%以上的失败项目是由于计划 不周而造成的。在软件开发、维护的漫长生命周期中,需要完成许多性质各异的工作,假若没 有严格有效的计划对项目工作的开展加以约束,则必将使今后在项目中的诸多工作处于一种混 乱状态。 采用分阶段的生命周期计划,实现对项目的严格管理,即意味着:应该把软件项目按照软 件的生命周期分成若干阶段,以阶段为基本单位制定出切实可行的计划,并严格按照计划对软 件的开发、维护实施有效的管理。
2.坚持阶段评审制度,以确保软件产品质量 软件质量是通过软件产品反映出来的,但是,软件质量的形成将贯穿于整个软件开发过程 之中。大量的软件开发事实表明,软件中的许多错误是在开始进行编码之前就已经形成了。根 据有关统计:软件设计错误占了软件错误的 63%,而编码错误则仅占 37%。 采用阶段评审制度,也就是要求在软件产品形成过程中,能够对其质量实施过程监控,以 确保软件在每个阶段都能够具有较高质量。 实际上,软件错误发现得越早,则错误越容易修正,为此所需付出的代价也就越少。因此, 在每个阶段都进行严格的评审,也有利于从管理制度上去减少质量保证成本代价。
3.实行严格的产品控制,以适应软件规格的变更 软件规格是软件开发与软件验收的基本依据,是不能随意变更的。在软件开发过程中若出 现了软件规格的变更,也就意味着,软件的开发费用由此增加了。 但是,在软件开发过程中,改变软件规格有时又是难免的,特别是那些需要较长的开发周 期的软件项目。例如,那些由专门用户定制开发的软件系统,就有可能因为用户的业务领域、 服务方式发生了改变,而使软件功能有了新的要求。面对用户的新要求显然不能硬性禁止,而 只能依靠科学的产品控制技术来适应。实际上,许多通用软件产品也存在规格变更这个问题。 例如,软件开发机构为了使自己的软件产品能够在更多的环境下工作,而不得不针对所开发的 软件产品推出诸多不同的版本。 实行严格的产品控制,就是当软件规格发生改变时,能够对软件规格进行跟踪记录,以保 证有关软件产品的各项配置成分保持一致性,由此能够适应软件规格的变更。
4.采用先进的程序设计技术 许多先进的软件工程方法往往都起源于先进的程序设计技术。例如,20 世纪 70 年代初出 现的 C、Pascal,这些结构化的程序设计语言,不仅成为了当时先进的程序设计技术,而且由 此带来了结构化的软件分析、设计方法。自 20 世纪 80 年代以来,随着 C++、Java 等程序设计语言的产生,面向对象程序设计技术成为了更加先进的技术,并由此推动了面向对象软件分析、 设计方法的发展。自 20 世纪 90 年代开始,建立在面向对象程序设计技术基础上的组件技术又 随之诞生了,于是,基于组件技术的软件工程方法学也就不断涌现了出来。 采用先进的程序设计技术会获得诸多方面的好处。它不仅会带来更高的软件开发效率,而 且所开发出的软件会具有更好的质量,更加便于维护,并且也往往会具有更长久的使用寿命。 例如,组件技术,通过创建比起“类”来更加抽象、更具有通用性的基本组件,可以使软件开 发如同可插入的零件一样装配。这样的软件,不仅开发容易,维护便利,而且可以根据特定用 户的需要,更加方便地进行改装。
5.软件成果应该能够清楚地审查 软件成果是软件开发的各个阶段产生出来的一系列结果,是对软件开发给出评价的基本依 据。包括:系统文档、用户文档、源程序、资源数据和最终产品等内容。 针对软件开发给出有效的评价,是软件工程必须关注的重要内容。但是,软件产品是无形 的逻辑产品,缺乏明确的物理度量标准。比起一般物理产品的开发来,软件开发工作进展情况 可见性差,其开发更难于管理与评价。因此,为了提高软件开发过程的可见性,更好地管理软 件项目和评价软件成果,应该根据软件开发项目的总目标及完成期限,规定软件开发组织的责 任和软件成果标准,从而使所得到的结果能够清楚地审查。
6.开发小组的人员应该少而精 这条基本原则具有以下两点含义。 其一,软件开发小组的组成人员的素质应该好。软件开发是一种需要高度负责、高度协作 的高智力劳动。因此,其对人员素质的要求也就主要体现在智力水平、协作能力、团队意识和 负责态度等几个方面。实际上,由高素质人员组成的开发队伍能够形成为一支很强的开发团队, 具有比由一般人员组成的开发队伍高出几倍,甚至几十倍的开发效率,也能够完成更加复杂的 项目任务。 其二,软件开发小组的成员人数不宜过多。软件的复杂性和无形性决定了软件开发需要大 量的通信。随着软件开发小组人员数目的增加,人员之间因为交流信息、讨论问题而造成的通 信开销会急剧增大,这势必影响人员之间的相互协作与工作质量。因此,为了保证开发小组的 工作效率,开发小组成员人数一般不应超过 5 人。由于这个原因,一些有许多成员参入的大型 项目,也就需要将一个项目分成多个子项目,然后分别交给多个项目小组去完成。
7.承认不断改进软件工程实践的必要性 软件工程的意义重在实践,作为一门工程方法学,它所推出的一系列原则、方法和标准, 不仅来源于工程实践,而且也需要在工程实践中不断地改进、完善。实际上,不同的软件开发 机构可以根据自己的具体情况,建立起具有自己特征的软件工程规程体系。 应该讲,上述的六条基本原则,是实现软件开发工程化这个目标的必要前提。但是,仅有 上述六条原则,还不足以保证软件开发工程化进程能够持久地进行下去。因此,Boehm 提出了 “承认不断改进软件工程实践的必要性”,这表明:软件工程在实际应用中,应该积极主动地采 纳新的软件技术,并不断总结新的工程经验。 软件技术在不断进步,软件的应用领域也在不断拓宽。软件工程必须紧紧跟上新时代软件的发展,才能获得更加持久的生命力。
七、 软件工程目标
软件工程目标是基于软件项目目标的成功实现而提出的,主要体现在以下几个目标上。
(1)软件开发成本较低。
(2)软件功能能够满足用户的需求。
(3)软件性能较好。
(4)软件可靠性高。
(5)软件易于使用、维护与移植。
(6)能按时完成开发任务,并及时交付使用。
应该说,企图让以上几个目标都能够达到理想程度的想法往往是难以实现的。在一个具体 项目中,以上几个目标之间很可能会出现冲突,例如,若只顾降低开发成本,则可能会由此导 致软件的性能与可靠性也随之降低;另一方面,如果太过于追求软件的性能,则可能会使得开 发出来的软件对硬件有较大的依赖,导致软件的可移植性下降。因此,在实际的软件项目中, 往往需要针对以上几个目标进行符合实际应用需要的平衡选择。 软件工程的首要问题是软件质量。因此,在涉及平衡软件工程目标这个问题的时候,软件 的质量应该摆到最重要的位置加以考虑。例如,软件的可用性、有效性、可靠性和可维护性等, 它们需要给予特别关注。
八、 软件工程文化
早期软件工程主要谋求解决的是技术问题,但是,随着软件技术的进步,软件质量要求的 提高和软件产业的发展,软件工程不得不考虑工程中的文化因素。例如,工程人员在软件开发 中所应该具备的产品质量观、价值观、道德准则和团队意识等。 软件企业中的工程文化需要逐渐积累。首先是价值观,软件企业上下对软件工程价值需要 有一致的认同,假如某个软件企业没有真正认识到软件工程对自己企业发展的影响,则不可能 形成自己的软件工程文化。 接着是工程思想与工程行为,软件工程文化是通过一系列具有工程特征的制度、标准展现 出来的,例如,工作制度、工程规则、质量标准等。这些东西不仅需要以文件形式印发出来, 而且需要被所有员工学习、理解,并成为他们的行为指南。当诸多工程思想被所有员工接受而 影响到他们的行为,并由此转化为软件产品的质量与价值之时,软件工程文化的作用也就体现 出来了。 观察许多成功的软件企业可以发现,当软件工程在软件企业得到有效应用以后,软件企 业中的工程人员会显得更具有工程意识,会更加关心自己的工作质量,也会更加注重同事之 间的相互协作。为了提高软件产品的先进性和竞争力,他们会更加积极主动地应用新方法与 新技术。 应该说,软件工程文化是企业文化的重要内容之一,它为软件企业中软件工程应用的不断 深入创造了非常有利的现场工作环境,随着软件企业中工程经验的积累,这种工程文化氛围会 不断地得到加强。
小结:
1.软件特点
软件是计算机系统中的逻辑成分,具有无形性。其主要内容包括:程序、配置文件、系统 文档、用户文档等。
2.软件分类
(1)按功能划分:系统软件、支撑软件、应用软件。
(2)按工作方式划分:实时处理软件、分时处理软件、交互式软件、批处理软件。
(3)按规模划分:微型软件、小型软件、中型软件、大型软件。
(4)按服务对象划分:通用软件、定制软件。
3.软件发展阶段
(1)程序设计时代(20 世纪 50 年代)。
(2)程序系统时代(20 世纪 60 年代)。
(3)软件工程时代(20 世纪 70 年代起)。
4.软件危机
(1)危机现象:开发成本与进度估计不准确,产品与用户要求不一致,产品质量可靠性差, 文档不完整不一致,产品可维护性差,生产率低。
(2)危机原因:软件的不可见性,系统规模庞大,生产工程化程度低,对用户需求关心不 够,对维护不够重视,开发工具自动化程度低。
5.软件工程 软件工程是一门关于软件开发与维护的工程学科,它涉及软件生产的各个方面,能够为经 济、高效地开发高质量的软件产品提供最有效的支持。
(1)工程方法:结构化方法、JSD 方法、面向对象方法。
(2)软件工具:具有自动化特征的软件开发集成支撑环境。
(3)工程过程:在软件工具支持下的一系列工程活动,基本活动是软件定义、软件开发、 软件验证、软件维护。
(4)工程管理:项目规划,项目资源调配,软件产品控制。
(5)工程原则:分阶段生命周期计划,阶段评审制度,严格的产品控制,采用先进的技术, 成果能清楚地审查,开发队伍精练,不断改进工程实践。
(6)工程目标:开发成本较低,软件功能能满足用户需求,软件性能较好,软件可靠性高, 软件易于使用、维护与移植,能按时完成开发任务并及时交付使用。
(7)工程文化:包括工程价值、工程思想和工程行为三个方面的内容。