软件工程导论(第6版)整理 第一章 软件工程概述

本文内容来自于对《软件工程导论》(第6版,张海潘 牟永敏 编著),仅为个人学习记录。如涉及版权问题请版权方联系我。


1.1软件危机

软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
软件危机包含两方面的问题:
    如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。
软件危机有一下的典型表现:
    (1)对软件成本和进度的估计常常很不准确。
    (2)用户对“已完成的”软件系统不满意的现象经常发生。
    (3)软件产品的质量往往靠不住。
    (4)软件常常是不可维护的。
    (5)软件通常没有适当的文档资料。
    (6)软件成本在计算机系统总成本中所占的比例逐年上升。
    (7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。
软件生命周期:
    软件开发最初的工作应是问题的定义;然后要进行可行性研究;接下来应该进行需求分析。进过上述软件定义时期的准备工作才能进入开发时期,而在开发时期,首先要对软件进行设计(通常又分为概要设计和详细设计两个阶段),然后才能进入编写程序的阶段,程序编写玩之后还必须经过大量的测试工作(需要的工作量通常占软件开发全部工作量的40%~50%)才能最终交付使用。所以,编写程序只是软件开发过程中的一个阶段,而且在典型的软件开发工程中,编写程序所需的工作量只占软件开发全部工作量的10%~20%。
软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。
消除软件危机的途径:
    首先应该对计算机软件有一个正确的认识。应该彻底消除在计算机系统早期发展阶段形成的“软件就是程序”的错误观念。一个软件必须由一个完整的配置组成,事实上,软件是程序、数据及相关文档的完整集合。其中,程序是能够完成预定功能和性能的可执行的指令序列;数据是是程序能够适当地处理信息的数据结构;文档是开发、使用和维护程序所需要的图文资料。1983年IEEE为软件下的定义是:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必需的数据。

1.2软件工程
    概括地说,软件工程是指导计算机软件开发和维护的一门工程学科。
    采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
    1968年在第一界NATO会议上曾经给出了软件工程的一个早期定义:“软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。”
    1993年IEEE进一步给出了一个更全面更具体的定义:“软件工程是:①把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;②研究①中提到的途径。”
软件工程具有下述的本质特性:
    1.软件工程关注于大型程序的构造
    2.软件工程的中心课题是控制复杂性
    3.软件经常变化
    4.开发软件的效率非常重要
    5.和谐地合作是开发软件的关键
    6.软件必须有效地支持它的用户
    7.在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品
软件工程的7条基本原理:
    1.用分阶段的生命周期计划严格管理
    2.坚持进行阶段评审
    3.实行严格的产品控制
    4.采用现代程序设计技术
    5.结果应能清楚地审查
    6.开发小组的人员应该少而精
    7.承认不断改进软件工程实践的必要性
软件工程方法学:
    通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也成为范型(paradigm)。在软件工程领域中,这两个术语的含义基本相同。
    软件工程方法学包含3个要素:方法、工具和过程。其中,方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题;工具是为了运用方法二提供的自动的或半自动的软件工程支撑环境;过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
目前使用得最广泛的软件工程方法学,分别是传统方法学和面向对象方法学:
    传统方法学也称为生命周期方法学或结构化范型。
    面向对象方法学具有下述4个要点:
        (1)把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。
        (2)把所有对象都划分成类(class)。
        (3)按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。
        (4)对象彼此间仅能通过发送消息互相联系。

1.3软件生命周期
软件生命周期由软件定义、软件开发和运行维护(也成为软件维护)3个时期组成,每个时期又进一步划分成若干个阶段。
    软件定义时期的任务是:确定软件开发工程必须完成的总目标;确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制定工程进度表。这个时期通常又称为系统分析,由系统分析员负责完成。软件定义时期通常进一步划分成3个阶段,即问题的定义、可行性研究和需求的分析。
    开发时期具体设计和实现前一时期定义的软件,它通常由下述5个阶段组成:总体设计,详细设计,编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。
    维护时期的主要任务是使软件持久地满足用户的需求。
下面简要介绍软件生命周期每个阶段的基本任务:
    1.问题定义
    问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”如果不知道问题是什么就试图解决这个问题,显然是盲目的,只会白白浪费时间和金钱,最终得到的结果很可能是毫无意义的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。
    通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规范的书面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。
    2.可行性研究
    这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决方法吗?”为了回答这个问题,系统分析员需要进行一次大大压缩和简化了的系统分析和设计过程,也就是在较抽象的高层次上进行的分析和设计过程。可行性研究应该是比较简短的,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决方法。
    可行性研究的结果是客户做的是否继续进行这项工程的决定的重要依据,一般说来,只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那些阶段需要投入更多的人力物力。及时终止不值得投资的工程项目,可以避免更大的浪费。
    3.需求分析
    这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。
    用户了解他们面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。因此,系统分析员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法表示系统的逻辑模型。
    在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的需求。这个阶段的一项重要任务,使用正式文档准确地记录对目标系统的需求,这份文档通常称为规格说明书(specification)。
    4.总体设计
    这个阶段必须回答的关键问题是:“概括地说,应该怎样实现目标系统?”总体设计又称为概要设计。
    首先,应该设计出实现目标系统的集中可能的方案。通常至少应该设计出低成本、中等成本和高成本3中方案。软件工程师应该用适当的表达工具描述每种方案,分析每种方案的优缺点,并在充分权衡各种方案的利弊的基础上,推荐一个最佳方案。此外,还应该制定出实现最佳方案的详细计划。如果客户接受所推荐的方案,择应该进一步完成下述的另一项主要任务。
    上述设计工作确定了解决问题的策略及目标系统中应包含的程序,但是,怎样设计这些程序呢?软件设计的一条基本原理就是,程序应该模块化,也就是说,一个程序应该由若干个模块适中的模块按合理的层次结构组织而成。因此,总体设计的另一个主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成一级模块间的关系。
    5.详细设计
    总体设计阶段以比较抽象概括的方式提出了解决问题的方法。详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”
    这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
    详细设计也成为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。
    6.编码和单元测试
    这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。
    程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必要时使用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写的每一个模块。
    7.综合测试
    这个阶段的关键人物是通过各种类型的测试(及相应的调试)使软件打到预定的要求。
    最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配的过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在用户积极参加下)对目标系统进行验收。
    必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。
    为了使用户能够积极参加验收测试,并且在系统投入生产性运行以后能够正确有效地使用这个系统,通常需要以正式的或非正式的方式对用户进行培训。
    通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求,也可以决定测试和调试过程什么时候可以结束。
    应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,作为软件配置的一个组成部分。
    8.软件维护
    维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需求。
    通常有4类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化;完善性维护,即根据用户的要求改进或扩充软件使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。
    虽然没有把维护阶段进一步划分成更小的阶段,但是实际上每一项维护活动都应该经过提出维护要求(或报告问题),分析维护要求,提出维护方案,审批维护方案,确定维护计划,修改软件设计,修改程序,测试程序,复查验收等一系列步骤,因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。
    每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。

以上根据应该完成的任务的性质,把软件生命周期划分成8个阶段。在实际从事软件开发工作时,软件规模、种类、开发环境以及开发时使用的技术方法等因素,都影响阶段的划分。事实上,承担的软件项目不同,应该完成的任务也有差异,没有一个使用于所有软件项目的任务集合。适用于大型复杂项目的任务集合,对于小型简单项目而言往往就过于复杂了。

1.4软件过程
    软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
大约有:瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型、Rational统一过程(RUP)、敏捷过程与极限编程、微软过程等过程框架。
    作为一名.NET程序猿。着重记录微软过程。
微软过程    
    作为世界上最大的同时也是最成功的的软件公司之一,Microsoft公司拥有自己独特的软件开发过程,几十年的实践证明微软过程是非常成功和行之有效的。下面简要地介绍微软过程。
    1.微软过程准则
    微软过程遵循下述的基本准则:
    项目计划应该兼顾未来的不确定因素。
    用有效的风险管理来减少不确定因素的影响。
    经常生成并快速地测试软件的过度版本,从而提高产品的稳定性和可预测性。
    采用快速循环、递进的开发过程。
    用创造性的工作来平衡产品特性和产品成本。
    项目进度表应该具有较高稳定性和 权威性。
    使用小型项目组并发地完成开发工作。
    在项目早起把软件配置项基线化,项目后期则冻结产品。
    使用原型验证概念,对项目进行早起论证。
    把零缺陷作为追求的目标。
    里程碑评审会的目的是改进工作,切忌互相指责。
    2.微软软件生命周期
    微软过程把软件生命周期划分成5个阶段,下面简述各个阶段的工作内容。
    (1)规划阶段
    这个阶段的主要任务是,根据从市场上获得的用户情况和用户需求等信息,在调查、统计和分析的基础上,完成下述工作。
    确定产品目标。
    获取竞争对手的信息。
    完成对客户和市场的调研分析。
    确定新版本产品应该具备的主要特性。
    确定相对于前一版本而言,新版本应该解决的问题和需要增加的功能。
    (2)设计阶段
    当项目团队已经确定了70%以上的产品需求时,开发工作就可以进入设计阶段了,这个阶段的主要工作内容如下:
    根据产品目标便携系统的特性规格说明书,这份规格说明书主要描述软件特性、系统结构、各构件间的相关性以及接口标准。
    从系统高层开始着手尽心系统设计,主要完成下述工作:简明扼要地描述整个系统的设计方案,绘制系统结构图,确定系统中存在的风险因素,分析系统的可重用性。
    划分出系统中的子系统,给出各个子系统和各个构建的规格说明。
    根据产品特性规格说明书制订产品开发计划。
    (3)开发阶段
    这个阶段的主要任务是,完成产品中所有构件的开发工作,包括编写程序代码和书写文档。一些开发工作可能会持续到稳定阶段,以便在那时对测试中发现的问题作出修改。
    (4)稳定阶段
    这个阶段的主要任务是对产品进行测试和调试,以确保已经正确地实现了整个解决方案,产品可以发布了。这个阶段测试的重点是,产品在真实环境下的使用和操作。
    (5)发布阶段
    在这个阶段项目组发布产品或解决方案,稳定发布过程,并把项目移交到运营和支持人员手中,以获得最终用户对项目的认可。

综上所述,作为另外一种适用于商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式,微软过程综合了Rational统一过程和敏捷过程的许多优点,是对众多成功项目的开发经验的正确总结;另一方面,微软过程也有某些不足之处,例如,对方法、工具和产品等方面的论述不如RUP和敏捷过程全面,人们对它的某些准则本身也有不同意见。在开发软件的实践中,应该把微软过程与RUP和敏捷过程结合起来,取长补短,针对不同项目的具体情况进行定制。

   

本文内容来自于对《软件工程导论》(第6版,张海潘 牟永敏 编著),仅为个人学习记录。如涉及版权问题请版权方联系我。

你可能感兴趣的:(学习脚步,编程问题)