软件工程个人总结
第一章
1. 什么是软件危机?它们有哪些典型表现?为什么会出现软件危机?如何克服软件危机?
“软件危机” 是指计算机软件的“开发”和“维护”过程中所遇到的一系列 “严重问题” 。
(1)对软件开发成本和进度的估计常常很不准确;
(2)用户对“已完成的”软件系统不满意的现象经常发生;
(3)软件通常没有适当的文档资料导致不可维护;
出现软件危机的主要原因
(1)与软件本身的特点有关(难于维护、逻辑复杂)
(2)与软件开发和维护过程中使用的方法不正确有关(忽略需求分析重要性、轻视软件维护)
如何克服软件危机?
(1)消除对软件工程错误的思想观念
(2)要有技术措施和组织管理措施。
2. 什么是软件工程?它有哪些本质特征?怎么用软件工程消除软件危机?
答:软件工程是指导软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把正确的管理技术和最好的技术方法结合起来,经济的开发高质量软件并有效地维护它。
本质特征:
(1)关注于大型软件的构造
(2)中心课题是控制复杂性
(3)和谐地合作是开发软件的关键
(4)软件经常变化
消除软件危机的原理:即软件工程的七条基本原理
(1)用分阶段的生命周期计划严格管理
(2)坚持进行阶段评审
(3)实行严格的产品控制
(4)采用现代程序设计技术
(5)结果应能清楚地审查
(6)开发小组的人员应该少而精
(7)承认不断改进软件工程实践的必要性
3. 简述结构化范型和面向对象范型的要点,并分析他们的优缺点。
答:传统方法学:也称为生命周期方法学或结构化范型。
优点:把软件生命周期划分成基干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协作,从而降低了整个软件开发过程的困难程度。
缺点:当软件规模庞大或对软件的需求模糊时,开发出的软件往往不成功,而且维护困难。
面向对象方法学:
优点:与人类的思维一致。降低了软件产品的复杂性,提高了软件的可理解性,促进了软件重用。
缺点:需要一定的软件支持环境,初学者不易理解。
4.什么是软件过程?它与软件工程方法学有何关系?
答:软件过程是为了开发出高质量的软件产品所需完成一系列任务的框架,它规定了完成一系列任务的工作步骤。
软件工程法学:通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称范型。软件过程是软件工程方法学的3个重要组成部分之一。
(补充:软件工程方法学包含3个要素:方法、工具和过程)
4.什么是软件生命周期?
答:软件生命周期中软件定义、软件开发和软件维护3个时期组成。
软件定义由问题定义、可行性研究、需求分析组成
软件开发由总体设计、详细设计、编码和单元测试,综合测试组成。
问题定义回答“要解决的问题是什么?”写出关于问题性质、工程规模和目标的书面报告
可行性分析回答“对于问题是否有行得通的解决办法?“,即探索问题是否值得去解,是否有可行的办法。
需求分析确定“为了解决这个问题,目标系统必须做什么'',确定目标系统必须具各哪些功能,得到需求规格说明书。
总体设计回答"概括地说,应该怎样实现目标系统?",确定程序由哪些模块组成以及模间的关系。
详细设计回答“应该怎样具体地实现这个系统呢?",确定实现模块功能所需要的算法与数据结构。
编码和单元测试是写出正确的容易理解、容易维护的程序模块,然后仔细测试每个模块
综合测试通过各种类型的测试(及相应的调试)是软件达到预定要求
软件维护通过各种必要活动是系统持久地满足用户需求
5.试比较瀑布模型、快速原型模型,增量模型和螺旋模型的优缺点,说明每种模型的使用范围。
传统瀑布模型特点:(需求分析-规格说明-设计-编码测试-综合测试-维护)
(1)阶段间具有顺序性与依赖性(2)推迟实现的观点 (3)质量保证的观点
瀑布模型优点:可强迫开发人员使用规范的方法(例如;结构化技术);严格规定每个阶段必须提交的文档,要求每个阶段交出的所有产品都必须通过验证。
缺点:"瀑布模型是由文档驱动的"成为主要缺点。
适用范围:适合于用户需求明确、完整、无重大变化的软件项目开发。
快速原型模型:(快速原型-规格说明-设计-编码测试-综合测试-维护)比如Unix Shell
快速原型是什么:快速原型是快速建立在计算机上运行的程序,它的功能往往是最终产品功能的一个子集。原型是为了获得用户的真正需求。
主要优点:在结构上看,快速原型模型不带反馈环,使得软件产品的开发基本上是线性顺序的。只有在产品发布运行之后才需要再来维护。
优点:克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险。
缺点:所选用的开发技术和工具不一定符合主流的发展;快速建立起来的系统结构加上连续的修改可能会导致产品质量低下。客户与开发者对原型理解不同;原型设计比较困难;
适用范围:对所开发的领域比较熟悉而且有快速的原型开发工具;可以以原型模型作为软件的开发模型;
增量模型(需求分析—规格说明—概要设计—针对每个构件。完成详细设计、编码和集成。经测试交付给用户)
特点:把软件产品作为一系列的增量构件来设计、编码、集成和测试。分批地逐步向用户提交产品。
优点:在较短时间内向用户提交可完成部分工作的产品。逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击;
缺点:软件体系结构必须是开放的;开发人员既要把软件系统看作整体。又要看成可独立的构件,相互矛盾:多个构件并行开发,具有无法集成的风险。
增量模型的使用范围:进行已有产品升级或新版本开发,增量模型是非常适合的;
螺旋模型(相当与快速原型模型每个阶段都加了风险分析)
基本思想:使用原型或其他方法来降低风险。
优点:1、对可选方案和约束条件的强调有利于己有软件的重用,也有助于把软件质量作为软件发的一个重要目标2、减少了过多测试或测试不足所带来的风险3、维护和开发没有本质区别
缺点:风险驱动,需要相当丰富的风险评估经验和专门知识,否则风险更大。
适用范围:适用于内部开发大规模软件项目。
喷泉模式特点:喷泉模型是一种以用户需求为动力,以对象为驱动的模型,主要用于采用面向对象技术的软件开发项目。
特性:无缝和迭代特性,因为使用面向对象方法学开发软件,各个阶段使用统一的概念和表示符号,因此,整个开发过程都是吻合一致的,或者说是无缝连接的,这自然就很容易实现各个开发步骤的反复多次迭代,达到认识的逐步深化,而喷泉模型则很好的体现了面向对象软件开发过程迭代和无缝的特性。
Rational统一过程:RUP重复一系列周期,每个周期由一个交付给用户的产品结束。每个周期划分为初始、细化、构造和移交四个阶段,每个阶段围绕着五个核心工作流(需求、分析、设计,实现、测试)分别迭代。
优点:提高了团队生产力,在迭代式开发、需求管理、基于构件的体系结构、可视化建模、验证软件质量及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模版和工具指导,并确保全体成员共享相同的知识基础.它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。(6条最佳实践)
缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,他没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。
适合范围:大型的需求不断变化的复杂软件系统项目
8.说明敏捷过程的适用范围(极限编程)
适用于商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束
9.说明微软过程(每一个生命周期发布一个版本)
微软过程把生命周期分为五个阶段 规划阶段 设计阶段 开发阶段 稳定阶段 发布阶段
优点:综合了Rational统一过程和敏捷过程的许多优点,是成功的总结。
缺点:不如Rational统一过程和敏捷过程全面,人们对它的某些准则看法也不同。
适用于商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式
第二章(可行性研究)
目的:用最小的代价在尽可能短的时间内确定问是否能够解决。
任务:对软件开发以后的行动方针提出建议。
研究内容:技术可行性、经济可行性、操作可行性、法律可行性。
研究过程:(1)复查系统规模和目标(2)研究目前正在使用的系统(3)导出新系统的高层逻辑模型(4)进一步定义问题(5)导出和评价供选择的解法(6)推荐行动方案(7)草拟开发计划(8)书写文档提交审查
系统流程图:概括的描绘物理系统的传统工具,表达的是数据在系统各部件之间的流动情况。
数据流图(DFD):描绘信息流和数据从输入移动到输出的过程所经受的变换。没有任何具体的物理部件,知识描绘数据在软件中流动和被处理的逻辑过程。
数据字典:关于数据的信息的集合,也就是数据流图所包含的所有元素的定义的集合。
与数据流图构成系统的逻辑模型。(自顶向下的分解)
组成:数据流、数据流分量(即数据元素)、数据存储、处理
作用:对于数据流图中出现的所有被命名的图形元素在字典中作为一个词条加以定义,使得每一个图形元素都有一个确切的定义。
需求分析
为什么要进行需求分析:了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件,不论我们把设计和編码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望,给开发者带来烦恼。
定义:“为了解决这个问题,目标系统必须做什么'',确定目标系统必须具各哪些功能,得到需求规格说明书。
任务:确定对系统的综合要求、分析系统的数据要求、导出系统的逻辑模型、修正系统的开发步骤
其中系统的综合要求包括功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束、逆向需求、将来可能提出的要求。
分析系统的数据要求:常用的工具是层次方框图和Warnier图
导出系统的逻辑模型:通常用数据流图、实体联系图、状态转换图、数据字典。
和用户沟通获取需求的方法:(1)访谈 (2)面向数据流自顶向下求精(3)简易的应用规模说明技术(4)快速建立软件模型
面向数据流自顶向下求精(分治法,比如结构化分析方法):目标之一就是把数据流和数据存储定义到元素级别。
过程如下
简易的应用规模说明技术:面向团队的需求收集法。
过程如下:初步访谈并确定会议方案。进行会议准备。开会讨论。会后总结起草需求规格说明书。优点:开发者与用户齐心协力。即时讨论并求精。
快速建立软件模型:特性快速容易修改,使用第四代技术、可重用的软件构件和形式化规格说明和原型环境
数据模型:由数据对象、数据对象的属性和数据对象彼此间相互连接的关系组成。
数据对象:只封装了数据没有施加与数据上的操作的引用。也就是和类的显著差别。(最大的特点)
实体-联系图(E-R图):实体、关系、属性3个基本成分。描绘数据对象及数据对象之间的关系,用于建立数据模型。
优点:接近人的思维方式,简单的符号表达,便于用户理解
状态转换图:通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。
活动表事件说明/动作表达式
活动表事件说明/动作表达式
其他图形工具:层次方框图
Warnier(瓦尼耶)图
IPO图
改进的IPO图
验证软件需求:一致性、现实性、完整性、有效性。
PSL:用来描述系统的形式语言
PSA:是处理PSL描述的分析程序
第五章 总体设计
总体设计基本目的就是回答系统应该如何实现这个问题,主要任务是划分系统,确定系统程序由哪些模块组成。这样可以站在全局高度上,花费较少成本,选择最合理的软件结构,开发出高质量的软件系统。
总体设计过程:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构。
设计原理有模块化(程序划分独立访问的模块,每个模块完成一个子功能),抽象(抽出事物本质特征而暂时不考虑它们的细节),逐步求精(集中解决主要问题而推迟细节的考虑)、信息隐藏(一个模块内的信息对于其他不需要此信息的模块是不能访问的)、模块独立(每一个模块有相对独立的功能,而且和其他模块之间的关系很简单,之间的关系互联程度可成为耦合分别等级为—完全独立、数据耦合、控制耦合、特征耦合、公共环境耦合、内容耦合。一个模块内元素彼此结合的紧密程度叫做内聚,等级分别为—偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚)
图形工具:
层次图是描绘软件的层次结构,一个方框图代表一个模块,连线是调用关系,而层次方框图是组成关系。适合自顶向下设计软件的过程中使用,通常为描绘软件结构的文档。
HIPO图是层次图加输入/处理/输出图(在层次图的基础上加上编号)
结构图与层级结构类似,多了空心圆表示传递的是数据,实心圆传递的是控制信息。
面向数据流的设计方法:
把信息流映射成软件结构。有交换流、事物流。
第六章 详细设计
任务就是如何具体的实现所要求的系统,任务就是设计出程序蓝图。
工具:
结构程序设计:顺序、选择、循环、DO UNTIL 和DO CASE、LEAVE和BREAK
人机界面设计:系统响应时间、用户帮助设施、出错信息处理和命令交互。
程序流程图,盒图(N-S图)、PAD图问题分析图(二维树形结构)、判定表、判定树、过程设计语言PDL即伪码
方法:Jackson图(顺序结构、选择结构、重复结构)改进的Jackson图可以有可选结构。
程序复杂度的定量度量:McCabe方法(环形复杂度 边-结点 +2)和Halstead方法(N=N!+N2 运算符和操作数的总数)
第七章
7.1什么是编码?编码风格应该怎么样?
编码是把软件设计结果翻译成用程序设计语言书写的程序。源程序代码的逻辑清晰、易读易懂。
7.2什么是软件测试?软件测试的准则有哪些?你知道有哪些测试方法?测试步骤是什么?
软件测试:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
准则:1)测试与用户需求有关。2)在测试之前由测试计划。3)Pareto原理(帕累托)
测试方法:黑盒测试和白盒测试
测试步骤:1)模块测试(单元测试) 2)子系统测试3)系统测试4)验收测试5)平行运行。
7.3什么是单元测试?测试最重点是是什么?单元测试方法有哪些?
单元测试:对软件中的最小可测试单元模块进行检查和验证。(通常使用白盒测试技术)
测试重点:模块接口,边界测试来发现错误。
单元测试方法:代码审查和计算机测试
7.4什么是集成测试(子系统和系统测试)?渐增式测试有哪些策略?策略的优缺点?
集成测试:就是把一堆模块组成子系统或系统进行测试,是测试和组装软件的系统化技术。模块组装成程序有两种方法分别为非渐增方法和渐增方法。
渐增式策略:自顶向下集成(主控制模块进行深度优先或宽度优先的策略),自底向上集成(最底层的模块进行形成族向上)
优缺点:自顶向下集成不需要测试驱动程序,而且早期发现上层模块错误,就是需要存根程序,底层关键模块错误发现晚。
自底向上集成:不需要根程序,较早发现底层关键模块错误。就是需要测试驱动程序,不能早期发现上层模块错误。
7.5什么是确认测试(通常使用黑盒测试)?确认测试方法有哪些?
确认测试:验证软件的有效性。
方法:Alpha(α)测试——用户在开发者场所进行,并且在开发者的指导下进行测试。
Beta(β)测试——由用户在客户场进行。开发者不在现场。
7.6什么是白盒测试技术?有哪些方法?
白盒测试:已知产品的内部工作过程,可以进行测试证明每种内部操作是否符合设计规格要求,所有内部成分是否经过检查。
方法:逻辑覆盖(一系列测试的总称比如语句覆盖和判定覆盖和条件覆盖),控制结构测试(有基本路径测试和条件测试和循环测试)
7.7什么是黑盒测试技术?有哪些方法?
黑盒测试技术:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
方法:等价划分(把程序的输入域划分成若干个数据类)、边界值分析(比如大于小于等于)、错误推测(列举可能的错误)
7.8什么是调试?有什么方法?
调试:在测试发现错误之后,修正语法错误和逻辑错误的过程。
方法:蛮干法(处处输出语句,海量输出数据找问题。)、回溯法(发现问题的地方开始,人工沿程序的控制流往回追踪分析源程序代码)、原因排除法(比如对分查找法,归纳法,演绎法)
7.9什么是软件可靠性?什么是软件可用性(改为时间点即可)?
软件可靠性:程序给定的时间间隔内(时间点),按照规格说明书成功运行的概率。
第八章 维护
8.1什么是软件维护?有几种类别?
软件维护:软件交付使用后,为了改正错误或满足新的需求而修改软件的过程。
类别:改正性维护、适应性维护、完善性维护、预防性维护
8.2软件维护的特点?
特点:结构化维护和非结构化维护差别巨大、维护的代价高昂、维护存在的问题(比如不理解别人写的程序)
8.3软件维护的过程?
过程:维护组织、维护报告、维护事件流、保存维护记录、评价维护活动。
8.4什么是软件的可维护性?由哪些决定?对于文档你知道些什么?
软件的可维护性:维护人员理解、改正、改动或改进的难易程度。
决定因素:可理解性、可测试性、可修改性、可移植性、可重用性
文档是影响软件可维护的决定因素。分为用户文档(系统功能和使用方法)和系统文档(开发过程中一系列和系统有关的文档)
8.5什么是预防性维护?有什么方法(修改,利用工具辅助重新设计)?
预防性维护:把今天的方法学应用到昨天的系统上,以支持明天的需求。
8.6什么是软件再工程?过程是怎么样的?
软件再工程:指对既存系统进行调查,并将其重构为新形式代码的开发过程。
过程:库存目录分析(选出再工程的候选者)、文档重构、****(分析程序以便在比源代码更高的抽象层次上创建出程序的某种表示的过程,就是升级)、代码重构、数据重构、正向工程(改变或重构现有系统,就是革新或改造)
第九章 面向对象方法学引论
9.1 什么是面向对象方法学?有什么优缺点?
面向对象方法学:是把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法。即OO=对象+类+继承性+封装性(彼此之间只能靠传递信息交流)
优点:1)与人类的思维一致2)稳定性好(需求变换不会引起软件结构的整体变换)3)可重用性好4)较易开发大型软件产品。5)可维护性好
9.2面向对象的概念?
对象:对问题域中某个实体的抽象。
类:是对具有相同数据和相同操作的一组相似对象的定义。
实例:类所描述的一个具体的对象。
消息:要求某个对象执行操作的规格说明。
方法:对象所能执行的操作。
属性:类中定义的数据。
封装:把数据和实现操作的代码集中在对象的内部。隐藏了对象的实现细节。
继承:直接获得已有的性质和特征。
多态性:子类对象可以像父类那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。
重载:同样的名字,不同的参数。
9.3面向对象建模分类?
分类:对象模型(系统数据结构)、动态模型(系统控制结构)、功能模型(系统功能)。
9.4什么是对象模型?类与类之间的关系?
对象模型:静态的、结构化的系统的数据性质。
关系:关联(特例是聚集)、泛化(继承)、依赖(语义连接关系)、细化(A比B描述更细化)。
9.5什么是动态模型?(状态图)
动态模型:瞬时的、行为化的系统的控制性质。
9.6什么是功能模型?(用例图由系统、行为者、用例三部分组成)
功能模型:表示软件系统的功能性质。