1、软件工程
根据IEEE的定义,软件工程就是把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是说把工程应用于软件。
2、传统软件开发过程及其文档(瀑布模型)
1)可行性研究 技术、经济、操作可行性
形成可行性研究报告
2)需求分析 确定系统要完成的工作
形成软件规格说明书(软件需求说明书)
3)总体设计(概要设计) 设计软件的总体结构
形成概要设计说明书
4)详细设计 怎么具体实现系统(决定软件质量)
形成详细设计说明书和用户操作手册
5)编码 用程序设计语言实现设计
6)测试 发现程序中的错误
测试之前有测试计划书,测试之后形成测试分析报告
7)维护
形成软件维护手册、软件问题报告和软件修改报告
此外还有项目开发计划表、开发进度月报、软件开发总结报告
3、软件的生命周期
一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,通常把它称为生命周期。
概括地说,软件生命周期由软件定义、软件开发和运行维护(也称为软 件维护) 3 个时期组成,每个时期又进一步划分成若干个阶段。
软件定义::确定软件开发的总目标; 确定工程的可行性;估计完成该项工程需要的资源和成本,并且制定工程进度表
软件开发:具体设计和实现在前一个时期定义的软件
软件维护:不断修改软件来满足用户需求
4、什么是软件过程
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。即什么人在什么时候做什么事以及怎么做这些事来实现满足客户需求的软件。
通常使用生命周期模型概括地描述软件过程。
5、生命周期模型(过程模型)——瀑布模型 最广泛
阶段间具有顺序性,必须等前移阶段的工作完成之后,才能开始后一阶段的工作。前一阶段的输出文档是后一阶段的输入文档。但是并不是完全线性顺序进行,瀑布模型带有反馈环,后面阶段发现前面阶段的错误时,会返回前面的阶段进行修正。
瀑布模型规定:每个阶段都必须完成规定的文档;每个阶段结束前都要对所完成的文档进行评审。
优点:强迫开发人员采用规范的技术方法
缺点:瀑布模型几乎完全依赖与书面的规格说明,开发人员和用户之间缺乏有效的沟通,可能导致最终开发出的软件不能满足用户需要
瀑布模型适用于项目开始时需求已经确定的情况
阶段:需求分析 概要设计 详细设计 编码测试 维护
5、快速原型模型 还有增量模型、螺旋模型、喷泉模型
快速原型模型的第一步就是建立一个原型系统,让用户试用,开发人员根据用户的修改意见开修改原型系统再让用户试用,直到满足用户需求。之后便开始软件开发。
软件开发基本上是顺序进行的。
开发出的软件产品通常能满足用户的需求。
6、RUP
RUP全称Rational Unified Process,统一软件开发过程。RUP 描述了如何有效地利用商业的可靠的方法开发和部署软件,适用于大型软件开发。
主要有以下几个方面:
迭代式开发:
软件开发的早期就能精准捕获用户的需求是几乎不可能的。采用迭代式开发,每个迭代过程以可执行版本结束,根据用户使用后的意见和需求来迭代下一个版本。
管理需求:
RUP描述了如何提取和组织用户需求并把它们文档化
使用基于构件的体系结构:
系统是由一个个模块(构件)来构成的,提高了软件重用率
可视化建模:
用UML来建立软件系统的可视化模型
验证软件质量:
软件质量评估不再是事后进行。而是贯穿于开发始终
控制软件变更:
RUP 描述了如何控制、跟踪、监控、修改以确保成功的迭代开发。
7、敏捷软件开发(敏捷过程)
1)团队成员间的合作比编程能力更重要
2)主要精力放在软件上,而不是文档
3)注重开发团队与客户的合作
4)软件应该能够及时响应变化
8、极限编程
广泛应用于需求模糊且经常改变的场合;极限编程的主要目标在于降低因需求变更而带来的成本
至少一名客户作为团队开发人员
在较短的周期内完成一次迭代,即家偶发目标系统的一个可执行的版本
9、需求设计中怎么获取用户需求
1)访谈
访谈有两种基本形式,分别是正式和非正式的访谈。正式访谈时,系统分析员将提出一些事先准备好的具体问题。非正式访谈中,分析员将提出一些用炉可以自由回答的开放性问题,以鼓励被访问者说出自己的想法
当需要调查大量人员的意见时,可以发放调查表
2)面向数据流自顶向下求精(结构化分析方法)
根据可行性研究阶段的数据流图,从数据流图的输出端着手分析,从输出端往输入端回溯,定义相关的数据元素和相关的算法。把数据元素的信息记录在数据字典中,将算法的描述记录在IPO图中。将补充的数据流、数据存储和处理完善到数据流图中。
3)简易的应用规格说明技术
提倡用户与开发者密切合作,共同发现问题解决问题,使开发者和用户不分彼此
4)快速建立软件原型。
尽快向用户提供一个可在计算机上运行的目标系统的模型,以便使用户和开发者在目标系统应该做什么这个问题上尽可能快地达成共识
10、需求分析过程中建立的三种模型
数据模型:用ER图来描绘数据对象以及数据对象之间的联系
功能模型:用数据流图来描绘数据在系统中移动时变换的逻辑过程
行为模型:用状态转换图(一个初始状态,0个或多个最终状态)来描绘系统的状态以及引起系统状态转换的事件
其他图形工具:层次方框图、Warnier图都是用树形结构来描绘数据;IPO图是输入、处理和输出的简称,能方便的描绘输入数据、对数据的处理和输出数据之间的关系。
11、验证软件需求的正确性
一致性:任何一条需求不能和其他需求冲突
完整性:规格说明书应该包括用户所需求的每一个功能
现实性:需求能用现有的技术实现
有效性:需求确实是能解决用户问题的
12、形式化说明技术
需求分析:
非形式化方法:用自然语言描述需求规格说明(二义性、模糊性、不完整性)
半形式化方法:用数据流图、ER图建模
形式化方法:基于数学的描述系统性质的技术
有穷状态机:类似于状态转换图,当前状态+事件+谓词=下一个状态
Petri网:主要处理定时问题(同步问题、死锁问题等)
Z语言
13、耦合和内聚
模块的独立程度由耦合和内聚来度量
耦合:是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
内聚:内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系;
软件开发要高内聚,低耦合
14、详细设计
1)结构程序设计:程序设计主要使用顺序、选择和循环三种基本控制结构,二尽可能少的使用go to语句
2)过程设计工具:描述程序处理过程的工具
程序流程图 盒图 PAD图 判定表/判定树 过程设计语言PDL
3)一般信息都有清楚的层次结构,可以采用面向数据结构的设计方法完成过程设计,面向数据结构的设计方法也是对程序处理过程的描述,主要有Jackson方法和Warnier方法
15、详细设计的文档内容有哪些
详细设计说明书,数据库设计说明书,函数伪代码设计,数据流图,数据字典
16、详细设计做的事情
不时具体编程,而是设计出程序的蓝图,以后程序员将根据这个蓝图写出实 际的程序代码。就是对概要设计的一个细化,就是详细设计每个模块实现算法,所需的局部 结构。对数据库进行设计,即确定数据库的物理结构。传统软件开发方法的详细设计主要是 用结构化程序设计法。详细设计的表示工具有图形工具和语言工具。图形工具有业务流图、 程序流程图、NS 图。语言工具有伪码等。还有人机界面的设计。
17、程序复杂程度的定量度量
1)McCabe方法
根据流图中程序控制流的复杂程度来计算程序的环形复杂度,环形复杂度越高,程度越复杂
2)Halstead方法:根据程序中运算符和操作数的总数来度量程序的复杂程度
18、软件测试的定义和目标
测试是为了发现程序中的错误而执行程序的过程
好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
成功的测试是发现了至今为止尚未发现的错误的测试
19、软件测试的方法
黑盒测试
把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程,黑盒测试只是在程序接口进行测试。
白盒测试
测试者完全知道程序的结构和处理方法。白盒测试按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。
20、软件测试的步骤(大规模软件的测试)
1)单元测试(模块测试)
检测每一个模块,保证每个模块都能正确运行;采用白盒测试,发现的是编码和详细设计的错误
两种方法:人工代码审查:一次审查可发现多个错误
计算机测试:错误一个一个发现,改正这个错误后才能继续测试
2)集成测试
测试模块间的接口,采用黑盒测试
采用渐增式测试,把下一个要测试的模块用已经测试好的哪些模块结合起来一起测试,测试完后再把下一个模块结合进来测试
两种方法:
自顶向下:从主控制模块开始,采用DFS或者BFS沿着程序的控制层次向下移动,逐渐把各个模块结合起来
自底向上:从最底层的模块开始组装测试
回归测试:在集成测试过程中每当一个新模块结合进来时,程序就发生了变化,所谓回归测试是指重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的效果。
3)确认测试(验收测试)
确认是在用户的积极参与下进行的,或者说是用户主导的。目的是验证系统确实能满足用户需要。
如果一个软件是为许多客户开发的,分为Alpha测试和Beta测试
Alpha测试:用户在开发者的场所进行
Beta测试:用户在一个或多个客户场所进行,客户不在Beta测试现场
4)平行运行
同时运行新开发出来的系统和将被他取代的系统,比较新旧系统的处理结果
21、白盒测试中设计测试数据的典型技术
1)逻辑覆盖:如语句覆盖(使被测程序中的每个语句至少执行一次)、路径覆盖(使程序每条可能的路径至少执行一次)(什么是全路径测试)
2)控制结构测试:根据程序的控制结构来设计测试数据
基本路径测试:首先根据流图来计算程序的环形复杂度,并用该复杂度为指南定义执行路径的基本集合,从该集合导出的测试用例可以保证程序中的每条语句至少执行一次
条件测试:检查程序中包含的逻辑条件
魂环测试:测试循环结构
22、黑盒测试中设计测试数据的典型技术
1)等价划分:将程序的输入域(所有可能的输入数据)划分为若干个等价类,使得每个类有个典型值可以代替整个类的所有值,也就是说该典型值的作用于其他值相同(因为无法穷举测试)
2)边界值分析:测试程序运行在边界情况
3)错误推测法:根据测试人员的直觉经验来列举程序可能发生错误的情况
23、软件可靠性和软件可用性
软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功运行的概率
软件可用性:程序在给定的时间点,按照规格说明书的规定成功运行的概率
评价标准:平均无故障时间MTTF
24、决定软件可维护性的因素
1)可理解性:读者理解软件结构、功能等的难易程度
2)可测试性
3)可修改性
4)可移植性
5)可重用性
25、软件维护的类型
改正性维护:纠正正在使用过程中暴露出来的错误
适应性维护:为了适应外部环境变换
完善性维护:改进原有软件
预防性维护:改进将来的可维护性和可靠性
26、预防性维护----软件再工程
对一些老的软件的维护
预防性维护方法:把今天的方法学应用到昨天的系统上,以支持明天的系统
软件再工程过程:
1)库存目录分析:分析库存目录,按照业务重要程度、寿命等标准把库中的应用系统排序,再分配相应的资源
2)文档重构:老程序一般缺少文档
3)逆向工程:从现存的程序代码中抽取有关数据、体系结构和处理过程的设计信息
4)代码重构
5)数据重构
6)正向工程:从现有程序中恢复设计信息,而且使用该信息去改变或重构现有系统
27、面向对象方法学的优点(Simula第一个)
1)传统的程序设计是面向过程的,将数据和过程作为相互独立的部分,体现了计算机的观点。而面向对象技术是以对象为核心,使用现实世界的概念抽象去思考问题,与人类的思维方法一致
2)传统方法建立的软件系统紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。而面向对象方法以对象为中心,用对象模拟实体,用对象间的联系刻画实体间的关系,当功能需求变化时一般不会引起软件结构的整体变化
3)面向对象由于对象固有的封装性和信息隐藏的机制,从而使得对象具有较高的独立性,进而使得面向对象方法适用于大型软件开发,其可维护性和可重用性也更好,传统方法的可重用性是靠库函数实现,而面向对象在此基础上使用继承和多态机制增强了可重用性。
28、面向对象建模(什么是UML)
Unified Modeling Language UML是面向对象设计的建模工具
三种模型从不同角度描述了要开发的软件系统
对象模型(最基本、最重要):定义了做事情的实体
使用UML的类图来建立对象模型(类图包含类名、属性和服务)
动态模型:规定什么时候做
使用UML状态图来建立动态模型
功能模型:系统应该做什么
使用数据流图或者UML用例图来建立功能模型
UML 可以贯穿软件开发周期中的每一个阶段。UML 作为一种模型语言,它使开发人员专注于建立产品的模型和 结构,而不是选用什么程序语言和算法实现。当模型建立之后, 模型可以被 UML 工具转化成指定的程序语言代码
29、类与类之间的关系
1)关联关系:两个类的对象之间存在某种语义上的联系,如用户使用计算机
2)包含关系:类与类之间是整体与部分之间的关系
3)泛化关系:继承关系
4)依赖关系:如一个类用另一个类的对象作为自己的数据成员
5)细化关系:两个类对同一事物上的不同抽象层次上的描述
30、UML用例图用例之间的关系
用例:系统完成的一系列动作,且动作的结果能被用户感受到
1)扩展关系:
向一个用例中添加一些动作后构成了另一个用例,则两个用例之间的关系就是扩展关系
2)使用关系:
当一个用例使用另一个用例,则两个用例之间构成使用关系
31、复杂问题(大型系统)的对象模型的五个层次
主题层
类与对象层
结构层
属性层
服务层
32、估计软件规模
1)代码行技术:根据程序代码的行数来估计
2)功能点技术:对软件信息域特性(输入、输出项数等)和软件复杂性来评估
33、工作量的估算
1)静态单变量模型
2)动态多变量模型
3)COCOMO2模型