软件工程
什么是软件工程,这门课讲的什么?
软件工程就是把软件的开发、运行、维护的各个阶段进行系统化和规范化的过程,也就是把工程化的方法运用在软件技术之中,以构建和维护高质量的软件。
进一步,什么是工程化思想?
我认为工程化的思想核心就是标准化和文档化,要建立一个标准,明确把一个大项目的开发分成了哪些小阶段,确定每个阶段应该利用什么工具、完成什么任务,然后就是要产生对应的规范文档。
进一步,软件工程包含哪几个阶段?
见如下
软件生命/生存周期(SDLC)
总体上分为:软件定义、软件开发和软件运行与维护阶段
具体可分为:两分析(可行性分析和需求分析)、两设计(概要设计和详细设计)、开发(编码和测试)、运维(运行和维护)
1、可行性研究(问题定义、可行性研究)
内容:从经济、技术、人员各个方面分析项目可行性,并做风险预估
文档:可行性研究报告
图表:业务流程图、系统流程图
2、需求分析
内容:收集用户的需求,并把需求转化成对软件系统(功能、性能、操作上的)完整、准确的描述,用于确定软件规格
文档:需求分析说明书(开发依据+验收依据)
图表:数据流图+数据字典(结构化开发)或者用例图模型(面向对象)
3、软件设计(概要设计和详细设计)
1)概要设计(图最多)
内容:对系统模块的设计和模块之间接口的设计
文档:概要设计说明书
图表:功能结构图(体现模块)、系统流程图(整个系统)类图、活动图、状态图、时序图、ER图
2)详细设计
内容:对软件模块内的算法和数据结构等细节做出设计
文档:详细设计规格说明书
图表:程序流程图(各个模块内)
4、程序编码
内容:开发人员按照“详细设计说明书”把软件进行编码实现
5、软件测试
内容:对软件的各个部分进行测试,包括单元测试、集成测试、系统测试
单元测试:对软件各个模块单独进行测试
集成测试:把各个模块集成在一起测试,主要是测试模块间的接口是否正确
系统测试:集成度最高的测试,把模块集成成完整的系统,在真实的系统运行的环境下测试,包括软件硬件之间的配合
6、运行与维护
内容:运行就是正式上线的过程,然后软件上线后可能会出现各种各样的问题,需要长期维护
CMM软件能力成熟度模型是什么?
一种评价企业开发的软件开发能力的模型,他将软件成熟度分成了五个层次,分别是初始级、可重复级、定义级、管理级、优化级。
初始级:软件过程基本是无序的,进度、预算、质量都不可预测,成功不可复现,任何项目都拥有这一级别
可重复级:有了基本的项目管理过程,项目的成功可以在未来重现,能够将项目经验用于未来【可复现==可重复】
定义级:项目拥有文档化、标准化的软件过程。用于未来的成果经验经过标准化【标准化==可以作为定义了】
管理级:软件过程和产品质量得到定量的估计和控制,能够按时、保质保量的完成。【管理==项目可控】
优化级别:能将软件过程涉及到的技术、方法作为示范,加入企业标准中,达到优化企业标准的效果【好到可以优化别人了】
结构化分析和结构化设计?
软件开发模型?
瀑布模型——阶段性的过程模型,严格按照各个阶段顺序进行开发,向瀑布一样自上而下,不能跨越阶段开发
特点:开发规范但灵活性差
适用场景:需求稳定、编程人员有丰富经验的项目
原型模型——项目前期,快速搭建出项目的原型,用来获取用户的需求,解决了需求模糊的问题
特点:快速构建、方便修改
适用场景:用户需求不明确;对现有产品进行升级时,即有模板;开发人员对技术不够熟悉
增量模型——将软件系统按功能划分成一个个构件,分批次、按构件提交给用户,直到全部构件提交完成
特点:可以灵活安排开发顺序、功能容易拓展
适用场景:软件系统可以模块化、支持分批次交付
螺旋模型——包含分析分析和风险规避,花大量成本去做风险管理
特点:安全性高、风险管理成本高
适用场景:软件项目风险大的大型项目
喷泉模型——最主要的特点就是迭代、反复,每个阶段建立在前一个阶段之上,而且各个阶段可以相互折叠,多次反复,就像水喷上去又可以落下来,可以落在中间,也可以落在最底部。
适用场景:适用于面向对象软件开发,因为对象的分析和设计是可以迭代的
RUP统一软件开发过程
是一种基于面向对象的软件开发过程,结合了瀑布模型和迭代思想。
四个阶段:
- 初始阶段(Inception):分析业务风险
- 细化阶段(Elaboration):对体系结构作出决策,包括其范围、主要功能和诸如性能等非功能需求
- 构造阶段(Construction):把各个功能模块集成成产品,并对功能做测试
- 交付阶段(Transition):交付阶段的重点是确保软件对最终用户是可用的。交付阶段可以跨越几次迭代,包括为发布做准备的产品测试,基于用户反馈的少量的调整。
六个最佳实践:
(1)迭代式开发。
(2)需求管理。
(3)使用以组件为中心的软件架构。
(4)可视化软件建模。
(5)验证软件质量。
(6)控制软件变更。
其它模型:
边做边改模型——在这个模型中,开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本。在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户满意为止。
演化/迭代模型——用户先给出核心需求,实现后再向用户询问意见,再修改,再询问,直到演化成最终的软件
敏捷开发模型——为了适应快速变化的需求,需要频繁地更新软件版本的一种开发模型,需要团队有很好的团队协作能力
什么是软件危机?
定义:软件危机泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题(定义)。主要表现为:开发成本难以控制、开发进度难以预测、软件质量无法保证、软件产品难以维护、缺少文档等方面(特点)。
原因:软件规模越来越大、复杂度越来越高(外部原因)、用户需求不明确、缺乏正确的理论指导(内部原因)
解决方法:使用更高效的软件工具,并且开始学习软件项目管理理论,将工程化思想用于软件技术当中,规范的开发流程和标准。
什么是UML,介绍下常用UML图?
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,UML是面向对象设计的建模工具,独立于任何具体程序设计语言。
用例图:用于描述系统参与者及与系统用例之间的交互关系。它展示了参与者可以使用系统执行哪些功能。
类图:描述系统中的类之间的关系,是一种静态模型类型。
对象图:与类图相似,它是类图的实例,显示类的多个对象之间的关系。
活动图:描述系统用例中涉及的活动及其顺序,有助于识别并行活动。
状态图:描述系统对象的所有可能状态及其状态间的转移条件。它帮助理解对象的行为和生命周期。
顺序图:显示参与者与系统对象之间的一系列在时间上的顺序交互。
耦合级别与内聚级别
耦合是指模块与模块之间的紧密程度,内聚是指一个模块内的紧密程度。
最强:内容耦合,最弱:非直接耦合
非直接耦合:两个模块之间没有直接关系,只是都被主模块调用
数据耦合:指两个模块之间有调用关系,传递的是简单数值
标记耦合:是指两个模块之间有调用关系,传递的是数据结构
控制耦合:是指两个模块之间有调用关系,传递的是控制变量,比如标记值,被调模块通过该控制变量的值有选择地执行块内某个功能。
外部耦合:是指一组模块都访问同一全局简单变量,而且不通过参数表传递全局变量的信息,称之为外部耦合。
公共耦合:一组模块都访问同一全局数据结构
内容耦合:指模块之间有直接数据关系,可以直接使用另一个模块的数和代码,
最强:功能内聚,最弱:偶然内聚
功能内聚:指模块内所有元素共同完成一个功能,缺一不可。
顺序内聚:是指一个模块中各个元素必须顺序执行
通信内聚:是指一个模块的所有元素都在同一数据结构上操作(通信==有公共数据结构)
过程内聚:是指模块有多个需要按一定的步骤一次完成的功能。
时间内聚:是指一个模块完成的功能必须在同一时间内执行,称之为时间内聚。
逻辑内聚:是指模块内有多个逻辑相似的功能,通过参数确定该模块完成哪一个功能。
偶然内聚:是指模块中的机能只是刚好放在一起
什么是软件测试?
就是在特定的环境下,对软件的实际输出和预计输出做比较的过程,其目的是减少程序的错误,防止后期出现大量返工,减慢工作进度。软件测试从整体上可分为黑盒测试和白盒测试,从测试的阶段/范围上可分为单元测试、集成测试、系统测试、验收测试,从测试的指标上可以分为功能性测试、安全性测试、稳定性测试、性能测试、稳定性测试、压力测试等等。
测试分类有哪些?
按照测试的阶段/范围可分为:
单元测试:对软件各个模块单独进行测试
集成测试:把各个模块集成在一起测试,主要是测试模块间的接口是否正确
系统测试:集成度最高的测试,把模块集成成完整的系统,在真实的系统运行的环境下测试,包括软件硬件之间的配合
验收测试:是一种以用户为主体的测试,让用户参与测试用例设计,根据用户的参与程度,分为α测试和β测试
- α测试:开发、测试人员和用户都在场,用户在在开发环境下进行的测试,有专业人员进行记录,测试环境可控
- β测试:测试人员不在场,直接发布测试版本给用户体验,然后根据用户的反馈进行改进的测试,也就是我们常说的某某软件测试版
回归测试:回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
软件测试方法有哪些?
从整体来说分为黑盒测试和白盒测试。
黑盒测试:从用户的角度出发,把测试对象看出一个黑盒子,不用关心里面的结构,只需要关注程序的输入输出
黑盒测试技术包括:边界值法、等价类划分、错误推断
白盒测试:也叫结构化测试,把测试对象看成一个透明的盒子,要知道它的内部细节和逻辑结构,然后根据内部逻辑设置测试方法
按覆盖程度可以分为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、
如何选用两者:
-
模块较小,内聚程度高,适合使用白盒测试,减少错误。
-
模块较大,逻辑复杂,测试代价较大的,适合使用黑盒测试,提高效率。
什么是测试用例?由于什么组成,举例说明?
测试用例:就是用于测试的一组输入信息,主要包括测试环境和输入值以及预期输出,体现了一组测试方案
组成:测试目标、测试环境、输入数据、预期结果、测试脚本
等价类划分和边界值法?
等价类划分:思想就是就是用少量的、有代表性的数据进行测试,尽量减少测试用例的次数。
基本步骤:
- 根据输入数据的各个规则,划分有效等价类和无效等价类。比如规定输入的是-99到900之间的数字,有效等价类就是这个范围内的数字,无效等价类就有很多,比如范围之上/范围之下的数字、输入为空、输入带有其它字符等等。
- 细分有效等价类和无效等价类,对每个等价类编号,形成表格。
- **设计测试用例,**在测试有效等价类的时候,可以尽量覆盖多的测试用例。但是对于无效等价类,每一测试数据只能覆盖一个无效等价类,否则分辨不了错误的原因。
边界值法::因为程序错误一般都是在边界上出现的,所以边界值法就是对输入**【边界】、【边界内】以及【边界周围】**进行测试。
比如说要求输入的数字范围是0-20,那不仅要测试0和20,0周围的1和-1,20周围的19和21都要测试,在0到20内也要测试一个值。边界值法是对等价类划分的一种补充,可以和等价类划分一起使用。
白盒测试的覆盖率要求有哪些?
语句覆盖:程序中每个语句至少都能被执行一次
判定覆盖:每个判定结果取各种值
条件覆盖:判定中的每个条件取各种值
判定/条件:判定中每个条件取各种值+每个判定结果取各种值
条件组合覆盖:每个条件的各种可能排列组合可能的取值。
路径覆盖:程序中每条路劲都需要覆盖,不一定覆盖条件组合