软件工程概述
软件工程:
软件工程概述
什么是软件:
软件是计算机系统中与硬件相互依存的另一部分,是指挥控制计算机系统工作的神经中枢
从计算机专业角度看,软件包括什么?
从专业角度看,软件包括程序、数据以及相关文档的完整
程序是按事先设计的功能和性能要求执行的指令序列。
数据是使程序能正常操作信息的数据结构。即数据的组织形式
文档是与软件开发及过程管理、维护和使用有关的图文材料
软件有哪些基本的特点?
软件是逻辑实体
软件是开发出来的,而不是制造出来的
软件具有柔性 (如果需要修改,可以直接修改程序本身,而不需要修改设计)
没有磨损(应用程序某些地方可能需要修改,软件不会坏,会退化)
软件不允许误差
软件产品的高质量取决于好的设计
依赖于人
需要对产品进行构造需要对产品进行构造
产生软件危机的原因:
- 软件本身的复杂度高、规模大
- 软件产品的特殊性
- 开发技术落后
- 开发方式落后
- 开发工具落后
- 维护方法不到位
软件危机的主要表现?
软件产品生产低劣,甚至开发过程中就夭折。(主要表现)
软件产品生产率低,不能满足需要(主要表现)
软件可重用性差
软件没有合适的文档
用户对“已完成的”软件不满意的现象经常发生
软件开发的成本预算经常被突破,完成时间一拖再拖
解决软件危机的办法
- 在软件开发的各个阶段采用好的工具;
- 对软件的实现提供有效的构件块;
- 为保证软件质量提供自动设计和测试技术;
- 为协调、控制、管理提供基本理论和技术。
- 把管理、控制、评审等方法与分析、设计、编码、测试、维护等技术有效地结合起来。
什么是软件工程:
- 所谓“软件工程”就是,将与软件开发和维护相关的理论、方法、技能等进行体系化,并将这些体系化的内容能够实际运用于软件开发现场。
软件工程的目的:
- 将用户的需求毫无遗漏的放音3到软件系统中
- 开发出没有缺陷(BUG)的软件系统开发出没有缺陷(BUG)的软件系统
- 软件开发的自动化和系统维护的高效化。
IEEE的软件工程的标准定义是什么?
- 揭示与软件开发・运行・维护相关的、具有系统化的规律,将可量化的方法加以应用,工程在软件中的应用。
软件生命周期
1.软件生命周期有哪七个主要阶段?
软件定义: 可行性分析、需求分析、系统设计(详细设计、总体设计)
软件开发:编码、测试(集成、系统)
软件维护: 部署、维护
2.在软件生命周期的七个阶段中,最重要的阶段是哪几个?
需求分析、系统设计
3、什么是过程?
针对一个给定目标的一系列实施步骤
4、为什么软件开发强调过程、需要过程?
分工明确、方便管理、有计划实施
1.可以明确软件开发的步骤。
2.便于制定软件开发计划。
3.可以使软件开发过程可视化,便于管理和控制。
4.便于细化和安排工作任务,使每个人职责明确。
5、瀑布模型的两大特点是什么?
成果物驱动 (前阶段完成的成果物作为下一阶段开始的前提。)
过程逆转性很差或者说不可逆转。(瀑布往下流,具有不可逆性)
缺点: 造成问题堆积
适用:
开发周期需求没有或很少变化
应用领域熟悉
低风险项目等
优点: 开发阶段清晰,便于评审、审计、跟踪、管理和控制。
6、V模型
强调验证活动,主要思想是开发与测试同等重要
针对每一个开发阶段都有一个测试活动与之相对应。
模型适用于需求明确和需求变更不频繁的情形。
航天飞机等
公司的财务系统
7、快速原型模型
快速建立一个能够反映用户需求的系统,通过 用户评估测试,建立最终的需求分析
需求规格说明文档
适用场景:
在项目开发的初期,需求通过一般的沟通没有办法明确,或者用户提不出具体需求的场景
小型或中等规模的交互式系统
弊端:
会出现较多的质量问题
需要足够的人力资源
需要快速掌握快速原型的开发和工具
8、增量模型
适用于软件需求不明确、设计有一定风险的软件项目
瀑布模型属于整体开发模型,规定下一个 阶段之前,必须完成前一个阶段的所有细节
增量模型属于非整体开发模型,可以推迟某些阶段,或者所有阶段中的细节
对系统进行分模块测试。系统集成陈功后,再进行系统集成测试
优点:
分块开发,可以将大风险分解为多个小风险,从而降低开发的难度
缺点:
如果软件系统的组装和拆卸不强,或者开发的全局把握水平不高,或者客户不同意分阶段提交产品
迭代与增量;
9、螺旋模型
将瀑布模型与快速原型结合,强调其模型所忽视的风险分析,适合大型的复杂系统
强调持续的判断、确定和修改用户的任务目标,每次经历一个螺旋,系统就会得到优化
螺旋模型强调的是什么?适合什么类型的系统开发?
- 强调的是风险分析
- 适合大型复杂的系统
优点:
减低开发风险
缺点:
对已有软件的重用
10、喷泉模型
11、RUP模型
一边吸收实际开发 的有效经验的同时一边成长起来的软件开发过程模型
迭代
系统在这样的反复迭代过程中,按增量方式实现功能的扩张,最终成长为一个完成的产品。
整体结构:
先启、精化、构建、产品化
先启:确定系统的工作范围—计划书(风险、资源估算、阶段计划)
精华:分析 定义 处理 建立(对项目真正构建做出判断与决定),可执行的系统架构原型被一次或者多次迭代开发
构建: 实时软件的编码和测试
产品化: 交付软件质量,编写相关文档
RUP模型的主要特征是什么?
迭代+增量;
采用UML描述软件开发的过程;
有功能强大的软件开发工具Rational Rose做支撑。
RUP模型中动态构造的4个阶段是什么?
先启(初始)、精化、构建、产品化
RUP静态构造的九个核心工作流程是什么?
业务建模、需求获取、分析/设计、实施、测试、部署、配置与变更管理、项目管理、环境
核心工作流程 核心支持工作流程
优点:
12、敏捷开发


敏捷开发的最大特点是什么?
以小功能为单位迭代(重复)实施“需求分析->设计->实现->测试->发布->运行”的开发过程。
所谓的“敏捷软件开发宣言”的内容是什么?
个体和交互胜过过程和工具;
可以工作的软件胜过面面俱到的文档;
与客户合作胜过合同谈判;
响应变化胜过 遵循计划。
什么是用户故事?
就是对“用户想要实现的东西”和“对用户有价值的东西”(意图/要求)的简要概述。
极限编程所倡导的团队内部共享的四个价值观是什么?
极限编程强调的是技术方面,以程序员为中心
沟通:重视项目干系人之间的沟通;
简单:将设计控制在最低程度;
反馈:反复测试并重视反馈;
勇气:用于面对需求和设计变更。
敏捷开发的主要优点有哪些?
减少开发时间
灵活应对变化;
开发速度快效率高;
能够最大程度满足客户需求。
敏捷开发中三个具有代表性的方法是什么?
Scrum开发、极限编程、用户功能驱动开发






可行性分析:
问题:
可行性分析的主要任务是什么?
可行性分析的主要任务就是用最小的代价在尽可能短的时间内确定问题是否能够得到解决(是否可解?是否值得解?)(可行性分析的目的不是解决问题,而是确定问题是否值得去解决)
对可行性分析过程中提出来的解决方案通常从哪几个方面进行评估?
技术可行性
经济可行性
社会可行性
操作可行性等
在可行性分析过程中通常采用一些什么工具?
系统流程图(业务流程图)
数据流图
数据字典等
系统(业务)流程图在可行性分析过程中的用途是什么?
用来表述系统(包括人工系统)的业务工作流程,通过绘制系统流程图,分析现有业务工作流程的不足,优化业务处理过程
数据流图是一种什么样的工具?
是一种用来描述系统逻辑模型的图形工具。从数据传递和处理的角度,来描述数据流从输入到输出的变换过程。描述信息在系统流动和处理的情况
数据流图在可行性分析中的用途是什么?
用来描述新系统的高层次逻辑模型
数据流图有哪几种符号?
数据流:系统内传播的路径
加工或处理:对数据流进行某种变化
数据存储:暂时保存的数据
外部实体(数据的源点或终点):
什么是数据流图的层次化?
对于大型复杂的业务系统,需要将数据流图的某些处理进行分解,从而得到更加详细的数据流图,这种逐步求精的绘制方法就是数据流图的层次化。
数据字典的作用是什么?
对于数据流图中出现的所有被命名的图形元素作为一个词条以字典的方式加以定义,使得每一个图形元素的名字都有一个确切的解释。对数据流图中出现所有被命名图形元素以字典的方式应用
数据流图和数据字典是什么关系?
数据流图和数据字典共同构成系统的逻辑模型。没有数据字典的数据流图是不严格的,反之没有数据流图数据字典也没有意义。
需求分析:
结构化开发方法:
结构化分析方法(SA法)
结构化设计方法(SD)法
结构化程序程序设计
什么是需求?
用户对软件的功能性和非功能性要求。功能性要求定义了系统做什么,非功能性要求定义了系统工作时的特性。
结构化分析方法创建主要模型:
功能模型:数据流图
数据模型: E-R图
行为模型:状态转换图
数据字典: 模型中心
软件需求规格说明书
什么是需求分析?
理解、分析和表达“系统必须做什么”的过程。
什么是需求规格说明?
将需求进行严密的定义,并将其文书化的东西就是需求规格说明。
(数据以文字形式进行定义)
好的需求规格说明应具备的条件是什么?
正确性 完整性说明内容没有自相矛盾
严密性 内容必须完整,毫无遗漏
可理解性 没有模糊不清的地方,说明的内容无二义性
有效性:所定义需求确实能够解决用户所面临的问题
可实现性:要求的东西具体可以实现。再正确再严密的需求规格说明如果实现不了没有任何意义。另外,依赖于特定的实现方法,束缚设计的需求规格说明也是尽量要避免的。
需求分析的主要任务是什么?
确定对系统的综合要求。
分析系统的数据模型。
在可行性分析的基础上分析系统的功能模型。
分析系统的行为模型。
编写需求规格说明书。
ER图是由哪三种相互关联的信息组成的
对象、属性、关系
数据对象
描述数据对象的属性
数据对象之间的关联关系
什么叫数据对象?
具有一系列不同性质或属性的事务。
什么是数据规范化?
为了使数据没有重复,而对数据结构(或者表)进行适当地分割的过程。
非规范型」的数据结构存在什么样的问题?
「非规范型」的数据结构由于存在数据的重复,从而容易引起数据的矛盾或数据的不一致,不容易正确地进行管理。
数据规范化的目的是什么?
消除存储在数据结构(或者表)中的数据的重复或矛盾。由于没有了数据的重复,同一数据结构(或者表)可以在多种场合被利用。
状态转换图是用来做什么的?
通过描绘系统的状态以及引起系统状态转换的事件来表示系统行为的一种图形工具。
IPO图是一种什么样的工具?
IPO图是输入/处理/输出图的简称。是用来描绘输入数据、处理或加工数据、输出数据关系的一种图形工具。(主要用于需求分析阶段,描绘处理和加工的过程) Input /process /OutPut
需求分析有哪些基本过程?
需求计划→需求获取→需求分析→需求规格说明→需求验证。
总体设计:
需求分析阶段和设计阶段的工作分别解决要开发软件系统的什么问题?
需求分析阶段要解决让软件“做什么”的问题,设计阶段要解决对软件系统“怎么做”的问题。
用一句话阐述软件设计的任务是什么?
以软件需求规格说明书为基础设计出满足用户需求的软件(软件结构等),给出软件实现的解决方案,做成软件设计规格说明书
软件设计的工作具体主要做哪些方面设计?
方案设计:确定系统的具体的实施方案,包括总体布局、系统的处理方式和计算模式
软件结构设计:软件系统的功能模块
数据设计:将需求分析的数据模型转化为数据结构
接口设计: 描述软件内部、软件相关和相关协作之间以及人之间是如何通信的
过程设计: 对系统结构的部件或模块的处理过程进行描述
软件设计阶段通常分为哪两个子阶段?
总体设计阶段和详细设计阶段
总体设计的主要目的是什么?
对软件系统实施模块分解,并将系统的所有功能合理地分配到模块或部件中去。
详细设计的主要目的是什么?
纤细设计是面向程序员的,能够将软件系统的模块或部件进行编程实现设计,用以指导程序人员编写代码。
什么是结构化设计方法,包括软件结构设计、接口设计数据设计、过程设计,面向数据流的设计方式
什么是软件设计原理?
各种软件设计方法都应该遵守的共同基本原理。
模块化、抽象、逐步求精、信息隐藏和局部化、模块独立
在软件设计过程中的实施模块化的好处是什么?
能够大大降低软件系统的开发难度。,
模块具有哪几个基本特征?
外部特征:接口、功能、状态。
内部特征:逻辑。
逐步求精的思想是什么?
为了能集中精力解决当前主要问题而尽量推迟对问题细节的考虑。
信息隐蔽的原理是什么?
应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。
把信息隐藏原理作为模块化系统设计的原理的好处是什么?
提高软件的可测试性、可维护性。
衡量模块独立性的两个定性指标是什么?
耦合、内聚
什么是耦合?
一个软件结构内各个模块之间互联程度的度量。
什么是内聚?
一个模块内各个元素彼此结合的紧密程度的度量。
衡量耦合强弱的七项指标是什么?
非直接耦合、数据耦合、特征耦合、控制耦合、外部耦合、公共环境耦合、内容耦合。
各项耦合指标的具体含义是什么?
特征耦合
模块间通过复杂数据参数交换信息。
衡量内聚强弱的七项指标是什么?
偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚
各项内聚指标的具体含义是什么?
各组成部分顺序执行,前一个的输出数据是后一个的输入数据。
偶然内聚:将毫无关系的各成分放在一个模块中
逻辑内聚: 将几个逻辑上相似的功能放在一个模块中,调用时由调用模块传递的参数确定执行的功能
时间内聚: 将同时执行的成分放在一个模块中,各模块需要在同一个时间点进行执行
过程内聚:模块内各处理成分相关,且必须以特定次序执行。
通信内聚: 模块中的成份引用共同的输入数据,或者产生相同的输出数据
顺序内聚 : 模块的各处理成份与统一功能相关
常用的用来描述软件结构的图形工具有哪些?
层次图(H图)、HIPO图、软件结构图。
软件结构图的主要构成有哪些?
模块、模块间的调用关系、模块间的信息传递。
什么是面向数据流的设计方法?
以数据流图为基础,定义了把数据流图变换成软件结构图的映射方法。
面向数据流的设计方法包含哪两种分析方法?
变换分析方法、事物分析方法。
课堂上给大家介绍的七个启发规则有哪些?
改进软件结构提高模块独立性
模块规模应该适中
深度、宽度、扇出和扇入都应适当
宽度越大系统越复杂.对宽度影响最大的因素是模块的扇出。
- 力争降低模块接口的复杂程度
- 模块的功能应该能够预测
什么是软件结构的宽度?
软件结构中同一层次上模块总数的最大值
什么是软件结构的深度?
软件结构的层次数。
什么是软件结构的扇出?
一个模块直接控制的下属模块的个数。
什么是软件结构的扇入?
一个模块的直接上级模块数。
什么是软件结构中一个模块的控制域
一个模块的控制域就是模块本身加上其下级模块,即可供它调用的模块。
什么是软件结构中一个模块的作用域?
一个模块的作用域,是受这个模块中的判定所影响的模块。
好的软件结构的控制域和作用域关系应该是什么样的?
模块的作用域应该在模块的控制域之内。
详细设计
详细设计的主要目的是什么?
为软件结构图(SC)中的每一个模块或类中的每一个服务确定采用的算法和模块内数据结构,用某种选定的表达工具给出清晰的描述。
什么是结构化程序设计?
如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的
什么是过程设计工具?过程设计工具有哪些类型?
用来描述程序处理过程的工具。
有图形、表格和语言三种类型。
过程设计有哪些常用工具?
程序流程图、盒图( N-S图)、PAD、判定表、判定树、过程设计语言。
判定表和判定树是用来做什么用的工具?
它们是用来表述复杂的条件组合与应做动作之间对应关系的工具。
面向对象设计:
什么是面向对象的方法?
封装:
封装可以提高重用性,并且让程序易于维护
对象具有哪两个特征?
静态特征(用数据描述)、动态特征(功能)
封装的作用是什么?
让对象的细节受到保护,从而提高软件的重用性和易维护性。
什么是继承?
继承是用来描述类的层次关系的,是指子类可以自动拥有父类的全部属性和方法。
什么是继承?
继承是用来描述类的层次关系的,是指子类可以自动拥有父类的全部属性和方法
什么是多态性?
指相同的操作、函数或过程作用于不同类型的对象上并获得不同的结果。
面向对象的方法需要建立哪三种形式的模型?
- 用来描述系统数据结构的对象模型。
- 用来描述系统功能的功能模型。
- 用来描述系统控制结构的动态模型。
UML是一种什么样的语言?
是一种可视化的、明确化的、构造化的和文档化的通用建模语言。
面向对象分析建模主要有哪几个过程?
回答:
建立对象模型、建立功能模型(用例模型)、建立动态模型、评审建立的模型。
建立对象模型后的结果主要采用UML的什么工具来表示?
类图
建立功能模型后的结果主要采用UML的什么工具来表示?
用例图、用例说明
编码:
好的软件代码应具备什么样的特性?
代码简单、清晰,具有良好的可读性。
软件编码有哪些具体工作?
设计、编写代码、代码走查、对代码实施单元测试并调试代码
什么是软件测试?
发现并指出软件系统缺陷的过程。
依据测试过程是否在实际应用环境中来分,软件测试技术分为哪两种?
静态测试技术、动态测试技术。
什么是静态测试技术?
不实际运行程序,而是通过检查和阅读等手段来发现错误并评估代码质量的软件测试技术。****
静态测试技术有哪些基本方法?
走查、审查、评审。
什么是动态测试技术?
实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术。
动态测试技术有哪些基本方法?
白盒测试、黑盒测试、灰盒测试。
什么是黑盒测试方法?
在不知道程序内部结构,只知道程序规格的情况下采用的测试方法或策略。
软件测试都有哪些基本阶段?
单元测试、集成测试、系统测试、验收测试。
单元测试主要采用什么测试方法?
白盒测试方法
黑盒测试方法主要用于哪些测试阶段?
集成测试、系统测试、验收测试。
维护
按照不同的维护目的,维护工作可分成哪4类?
完善性维护、纠错性维护,适应性维护、预防性维护。
软件维护的技术包括哪几个方面?
面向维护的技术、维护支援技术、维护档案记录、软件维护评价。
什么是面向维护的技术?
面向维护的技术涉及到软件开发的所有阶段。在软件开发的各个阶段用来减少错误,提高软件可维护性的技术。