您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 软件工程导论-软件工程-沈师(第1章)
软件工程(SoftwareEngineering)课程介绍课程主要内容:第一部分:软件工程的基本定义、基本原理和软件过程模型(对应第一章)第二部分:从可行性研究、需求分析、总体设计、详细设计、编码实现、维护六个步骤来说明软件开发过程中的具体问题和具体解决方法(对应第二、三、四、五、六、七、八章)——结构化分析设计第三部分:面向对象方法概论、面向对象分析、设计、实现(对应第九、十、十一、十二章)第四部分:软件项目管理基本概念(对应第十三章)考核方式考试方法:采用百分制,满分为100分。(1)闭卷考试:占总评成绩的50%。(2)期中考试:占总评成绩的30%。(3)课堂作业、平时考勤、提问:占总评成绩的10%;课后作业、实验报告:占总评成绩的10%。第1章:软件工程学概述1.1软件危机60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。60年代中期到70年代中期:软件作坊。这时软件危机出现,随之而来人们开始研究消除危机的途径,从而形成一门新的学科——软件工程学。软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问题。(正常、不正常运行软件都具有这种问题)1.1.1软件危机的介绍软件危机的实质:如何开发软件,以满足对软件日益增长的需求如何维护数量不断膨胀的已有软件1)对软件开发成本和进度的估计常常很不准确;2)用户对完成的软件系统不满意的现象经常发生;3)软件产品的质量往往靠不住;4)软件常常是不可维护的;5)软件通常没有适当的文档资料;6)软件成本在计算机系统总成本中所占的比例逐年上升;7)软件开发生产率提高的速度跟不上计算机应用的发展趋势。软件危机的典型表现:1.1.2产生软件危机的原因1)软件本身特点造成;①程序规模庞大;②程序复杂性随着程序规模的增加而呈指数上升。2)软件开发与维护的方法不正确。主要表现:(a)忽视软件需求分析;(b)认为软件开发就是写程序并使之运行;(c)轻视软件维护;在软件开发的不同阶段进行修改需要付出的代价很不相同:高中低早期中期后期软件开发时期代价引入同一修改的代价随时间变化的趋势1.组织管理:软件开发不是某种个体劳动的神秘技巧,软件开发应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。2.方法:应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。3.工具:应该开发和使用更好的软件工具。在软件开发的每个阶段都有许多繁琐重复的工作需要做,在适当的软件工具辅助下,开发人员可以把这类工作做得既快又好。1.1.3解决软件危机的途径如果把各个阶段使用的软件工具有机地集合成一个整体,支持软件开发的全过程,则称为软件工程支撑环境。为了解决软件危机产生的问题,软件工程与方法学逐渐形成,然后出现了两个相互相承又各有侧重的学科:1)软件工程学:主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门交叉学科。2)程序设计方法学:主要应用数学的方法研究程序的性质以及程序设计的理论和方法的学科。1.2软件工程1.2.1软件工程的介绍1968年NATO会议:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。1993年IEEE:软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;(2)研究(1)中提到的途径。1.软件工程关注于大型程序的构造;2.软件工程的中心课题是控制复杂性;3.软件经常变化;4.开发软件的效率非常重要;5.和谐地合作是软件开发的关键;6.软件必须有效地支持它的用户;7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。软件工程的本质特性:1.2.2软件工程的基本原理1.用分阶段的生命周期计划严格管理;2.坚持进行阶段评审;3.实行严格的产品控制;4.采用现代程序设计技术;5.结果能清楚地审查;6.开发小组的人员应该少而精;7.承认不断改进软件工程实践的必要性。1.2.3软件工程方法学软件工程包括:技术和管理两个方面的内容,是技术和管理紧密结合所形成的工程学科。通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。软件工程方法学的3要素:方法、工具和过程一.传统方法学也称为生命周期方法学或结构化范型。从时间角度对软件开发和维护的复杂问题进行分解,把软件生命的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。文档是通信的工具,它们清楚准确地说明了到这个时候为止,关于该项工程已经知道了什么,同时确立了下一步工作的基础。此外,文档也起备忘录的作用,在完成生命周期每个阶段的任务时,应该采用适合该阶段任务特点的系统化的技术方法——结构分析或结构设计技术。结构化方法(StructureMethod)有:1)结构化设计方法(SD);2)结构化分析方法(SA);3)结构化分析与设计技术(SADT)4)JACKSON方法5)WARNIER方法二.面向对象方法学把数据和对数据的操作紧密结合起来的方法,模拟人类认识世界解决问题的方法和过程。面向对象的方法=对象(属性与服务的封装)+分类+继承+通过消息的通讯面向对象方法把数据和行为看成同等重要,是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。其具有如下4个要点:①把对象(Object)作为融合了数据及在数据上的操作行为的统一的软件构件。用对象分解取代传统方法的功能分解。②把所有对象划分为类(Class):每个类定义了一组数据和一组操作。③按照父类(基类)和子类(派生类)的关系,把若干个相关类组成一个层次结构的系统。子类能够继承。④对象彼此间仅能通过发送消息互相联系。对象是数据处理的主体,具有封装性特点。复杂性降低、可理解性、简化开发与维护、软件重用。1)适用于实时事物处理系统的有限状态机方法(FSM);2)适用于并发软件系统的PETRI网方法;3)以数学概念和理论为基础的形式化方法,如SDC公司的形式化开发方法FDM:(FormalDevelopmentMethodology)IBM公司的维也纳开发方法VDM:(ViennaDevelopmentMethod)三.其他开发方法1.3软件生命周期软件生命周期:指软件从提出到最终被淘汰的这个存在期。软件生命周期由软件定义、软件开发和运行维护三个时期组成,每个时期又划分若干个阶段。软件生命周期组成:1)软件定义时期的主要任务为:A.问题定义B.可行性研究C.需求分析2)软件开发时期的主要任务为:D.总体设计E.详细设计F.编码和单元测试G.综合测试3)运行维护时期的主要任务为:H.使软件持久地满足用户的需要①问题定义问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”。通过问题定义阶段的工作,系统分析员应该提出关于问题性质、工程目标和规模的书面报告。通过访问调查,分析员扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,得出一份双方都满意的文档。②可行性研究这个阶段要回答的关键问题是:“对上一阶段所确定的问题有行得通的解决办法吗?”系统分析员需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。在问题定义阶段提出的对工程目标和规模的报告通常比较含糊。可行性研究阶段应该导出系统的高层逻辑模型(通常用数据流图表示),并且在此基础上更准确、更具体地确定工程规模和目标。然后分析员更准确地估计系统的成本和效益,对建议的系统进行仔细的成本/效益分析是这个阶段的主要任务之一。软件定义可行性研究的结果是使用部门负责人做出是否继续进行这项工程的决定的重要依据,一般说来,只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那些阶段将需要投入更多的人力物力。及时终止不值得投资的工程项目,可以避免更大的浪费。③需求分析这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。因此,系统分析员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法表示系统的逻辑模型。在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。④总体设计这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?”。总体设计阶段的第一项主要任务就是应该考虑几种可能的解决方案。(1)低成本的解决方案。系统只能完成最必要的工作,不能多做一点额外的工作。(2)中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务,而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。(3)高成本的“十全十美”的系统。系统分析员应该使用系统流程图或其他工具描述每种可能的系统,估计每种方案的成本和效益,还应该在充分权衡各种方案的利弊的基础上,推荐一个较好的系统(最佳方案),并且制定实现所推荐的系统的详细计划。软件设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。软件开发⑤详细设计详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。通常用HIPO图(层次图加输入/处理/输出图)或PDL语言(过程设计语言)描述详细设计的结果。⑥编码和单元测试这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必要时用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。⑦综合测试这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。最本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在用户积极参加下)对目标系统进行验收。必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。通常需要以正式的或非正式的方式对用户进行培训。通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求,也可以决定测试和调试过程什么时候可以结束。应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,做为软件配置的一个组成部分。⑧软件维护维护阶段的关键任务是通过各种必要的维护活动使系统持久地满足用户的需要。通常有四类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误适应性维护,即修改软件以适应环境的变化完善性维护,即根据用户的要求改进或扩充软件使它更完善预防性维护,即修改软件为将来的维护活动预先做准备。每一项维护活动都应该经过提出维护要求(或报告问题)、分析维护要求、提出维护方案、
本文标题:软件工程导论-软件工程-沈师(第1章)
链接地址:https://www.777doc.com/doc-213137 .html