第一章 概述
一.软件工程概念的提出
1968年NATO(North Atlantic Treaty Organization,北大西洋公约组织)会议首次提出“软件工程”概念。
软件工程是为了解决开发成本效益和软件质量的问题而产生。
二.软件
1.什么是软件?
《IEEE Standard Glossary of Software Engineering Terminology》给出了有关软件的如下定义:
软件是计算机程序、规程以及运行计算机系统可能需要的相关文档和数据。(软件≠程序)
根据软件服务对象的范围不同,一般可以将软件划分为通用软件和定制软件两种类型。
2.通用软件(Generic Software)
通用软件是由软件开发组织开发,面向市场用户公开销售的独立运行系统。有时,通用软件也被称为套装软件(Packaged Software)
3.定制软件(Customised Software)
定制软件是由某个特定客户委托,软件开发组织在合同的约束下开发的软件。
4.软件的特性
①软件是复杂的,软件是人类思维和智能的一种延伸和在异体上的再现。
雪崩效应:由于软件结构及其依赖关系的复杂性,软件的任何更改和扩充都有可能带来灾难性的后果,形成所谓的“雪崩效应”。
②软件是不可见的,软件是客观世界空间和计算机空间之间的一种逻辑实体,不具有物理的形体特征。
③软件是不断变化的,软件是纯粹思维活动的产物。
④大多数软件任然是定制的,而不是通过已有构建组装而成的。
5.软件的发展
Ⅰ.第一阶段:20世纪50-60年代
在计算机发展的早期阶段,计算机的主要应用是快速计算,出现了以Algol、Fortune等编程语言为标志的算法技术。在这一时期,程序设计被认为是一种任人发挥创造才能的活动,不存在什么系统化的方法和开发管理,程序的质量完全依赖于程序员的个人技巧。
软件危机:指在计算机软件的开发和维护过程中遇到的一系列严重问题。软件危机在20世界60年代末全面爆发。
⑴软件开发的成本和进度难以准确估计,延迟交付甚至取消项目的现象屡见不鲜。
⑵软件存在错误多、性能低、不可靠、不安全等质量问题。
⑶软件成本在计算机系统的整个成本中所占比例越来越大。
⑷软件维护及其困难,而且很难适应不断变化的用户需求和使用环境。
Ⅱ.第二阶段:20世纪70年代
计算机开始涉及到各个以非数值为特征的商业事物领域,交互技术、多用户操作系统、数据库系统等随之发展起来。
Ⅲ.第三阶段:20世纪80年代
微处理器的出现与应用使计算机真正成为大众化的东西,而软件系统的规模、复杂性以及在关键领域的广泛应用,促进了软件开发过程的管理及工程化的开发。在这一时期,软件工程开发环境CASE及其相应的集成工具大量涌现,软件开发技术中的度量问题受到重视,出现了著名的软件工作量估计COCOMO模型,软件过程改进模型CMM等。20世纪80年代后期,以Smalltalk、C++等为代表的面向对象技术重新崛起,传统的结构化技术受到严峻的考验。
Ⅳ.第四阶段:20世纪90年代至今
Interent技术的迅速发展使软件系统从封闭走向开放,Web应用成为人们在Interent上最主要的应用模式,异构环境下分布式软件的开发成为一种主流需求,软件复用和构件技术成为技术热点。
三.软件工程
软件工程是采用工程的概念、原理、技术和方法来开发与维护软件,将经过时间考验而证明正确的管理技术与当前能够得到的最好的技术方法结合起来,其目的在于提高软件的质量与生产效率,最终实现软件的工业化生产。
1.软件工程的概念
引用《IEEE Standard Glossary of Software Engineering Terminology》给出的定义:
软件工程是①将系统化的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化应用到软件上;②对①中所述方法的研究。
软件工程包括以下两个方面的内容:
⑴软件工程是工程概念在软件领域里的一个特定应用。
⑵软件工程涉及软件产品的所有环节。
2.软件工程的三要素
软件工程以关注软件质量为目标,由过程(关键)、方法和工具三个要素组成。
3.软件质量的特性
软件工程的一个重要目标是“开发出高质量的软件”,那么如何看待“软件质量”的含义呢?
简单地说,软件质量是软件产品与明确的和隐含的需求相一致的程度,它通过由一系列的质量特性来描述,例如,除了要求软件正确运行之外,人们可能还希望软件运行的响应时间符合要求、软件使用方便快捷、程序代码易于理解等,而“程序代码易于理解”往往是一种用户没有明确提出的需求,但却是影响软件质量的重要因素。
4.软件工程的方法
传统软件开发方法主要是以功能分析和数据分析为基础的结构化方法。它以算法作为基本构造单元,强调自顶向下的功能分解,对功能和数据进行了一定程度的分离。
面向对象方法从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。按照人类的自然思维方式,面对客观世界建立软件系统模型,有利于对问题域和系统责任的理解,有利于人员交流。
▪在整个开发过程中采用统一的概念和模型表示,填平了语言之间的鸿沟,使得开发活动之间平滑过渡。
▪在面向对象的方法中,系统由对象构成,对象是一个包含属性和操作两方面的独立单元,对象之间通过消息联系。这样的系统一旦出错,容易定位和修改,系统的可维护性好。
▪对象所具有的封装性和信息隐蔽等特性,使其容易实现软件复用。
5.计算机辅助软件工程CASE
计算机辅助软件工程(Computer Aided Software Engineering ,CASE)是一组工具和方法的集合,用于辅助软件开发、维护、管理过程中的各项活动,促进软件过程的工程化和自动化,实现整个高效率和高质量的软件开发。
根据所支持活动的范围不同,CASE系统可以分为工具、工作台和环境三个层次。
6.软件工程当前面临的主要挑战
①遗留系统的问题
遗留系统(Legacy System)是指那些过时或存在问题的计算机系统,它们往往是许多年以前开发出来的,在长期的使用过程中不断地被人们修改。
不能直接丢弃和替换过时系统的原因:
遗留系统已经经历了太多的改变,可能无法再容纳新的变化,高昂的维护费用也难以满足新的商业需求。
替换遗留系统不就需要花费巨大的财力,也会产生极大的风险,不仅丢失了遗留系统中蕴含的知识,也有可能信的系统依然不能满足新的需求。
②高可信软件的开发的要去
随着软件在信息社会中发挥日益重要的作用,人们更加关注软件的正确性、可靠性、可靠安全性和保密安全性等可信性质。
③软件开发方式的变化
由于网络应用的普及,软件开发由过去集中在专门的机构中封闭实施,转变为在网络环境下以开放源码的方式由许多独立的开发者协作完成。
四.软件工程知识体系(SWEBOK)
1.SWEBOK项目介绍
1998年,由SWECC发起研究和制定软件工程知识体系SWEBOK(Software Engineering Body of Knowledge)的项目。
SWEBOK项目的目的是为软件工程学科的边界提供一致确认的特征,为支持该学科的知识体系提供指导,其具体目标如下:
⑴描述软件工程学科的内容和特征;
⑵确定软件工程知识体系的各个专题;
⑶促进软件工程知识体系在世界范围内的共识;
⑷明确软件工程与其他相关学科(诸如计算机科学、项目管理、计算机工程、数学等)的关系,并设定软件工程学科的边界;
⑸为软件工程学科课程计划的开发和职业资格的认证提供依据。
2.SWEBOK的组成
在SWEBOK中,软件工程知识体系被划分为10个知识域,即软件需求(Software Requirements)、软件设计(Software Design)、软件构造(Software Construction)、软件测试(Software Testing)、软件维护(Software Maintenance)、软件配置管理(Software Configuration Management)、软件工程管理(Software Engineering Management)、软件工程过程(Software Engineering Process)、软件工程工具和方法(Software Engineering Tools and Methods),软件质量(Software Quality)。
3.软件工程与其他相关学科的关系
软件工程是一门交叉性学科,它将计算机科学,数学,工程学和管理学等基本原理应用于软件开发的工程实践中,并借鉴传统工程的原则和方法,以系统的、可控的、有效的方式产生高质量的软件。
软件工程以计算机科学和数学为基础。
五.软件工程职业道德规范
1.IEEE/ACM职业道德准则
IEEE计算机学会和ACM联合制定了《软件工程职业道德和职业行为准则》,包括有关专业软件工程师行为和决断的8项原则,要求软件工程人员应履行其实践承诺,使软件的需求分析、规格说明、设计、开发、测试和维护成为一项对社会有益和受人尊敬的职业。
⑴公众:软件工程人员应该始终与公众利益保持一致;
⑵客户和雇主:在与公众利益保持一致的原则下,软件工程人员应满足客户和雇主的最大利益;
⑶产品:软件工程人员应当确保他们的产品及其改进符合尽可能高的专业标准;
⑷判断:软件工程人员应当具备公正和独立的职业判断力;
⑸管理:软件工程管理者和领导者应拥护和倡导合乎道德的有关软件开发和维护的管理方法;
⑹职业:在与公众利益一致的原则下,软件工程人员应当提高职业的信誉;
⑺同行:软件工程人员对其同行应持平等和支持的态度;
⑻自我:软件工程人员应当终身学习专业知识,促进合乎道德的职业实践方法。