一、概述
软件=程序+数据+文档
优良软件的属性:
可维护性:按需求变更不断进化
可依赖性:可靠性、保密性、安全性
有效性:对系统资源的利用率
可用性:易用
软件工程:涉及软件生产各个方面的一门工程学科
涉及开发中的人为因素、经济因素、法律因素
软件过程:描述、开发、有效性验证、进化
软件方法四个阶段:面向过程、面向对象、面向构建、面向服务
软件项目成果三要素:按时交付、不超预算、满足用户需求
二、软件过程
1.模型
(1)瀑布模型
特点:把软件过程划分为几个界限清晰的阶段,阶段前后有严格的顺序,很难对用户的需求变更做出及时调整
适用情况:需求非常清晰和需求变更被严格限制的情况
(2)进化式模型(原型式开发)
特点:通过开发系统原型和用户反复交互从而明确需求,使系统在不断调整与修改中得以进化成熟
两种基本类型:探索式开发;抛弃式原型法
优点:①降低了需求变更的成本,变更分析与修改文档的工作量比瀑布模型少很多;
②用户的深度参与可以提供更及时有效的反馈,并能体现在不同版本的开发进度中;
③相比于瀑布模型,能更早的交付和部署有用的软件给客户。
缺点:①过程缺乏可见性
②系统结构通常会较差
③需要一些特别的技术,通常与主流技术不兼容
适用情况:
①中小规模的交互系统
②大型系统的局部开发,可以同瀑布模型混合适用
③声明周期较短的系统
(3)增量式开发
特点:①系统被分解成可以单独交付的模块-增量
②用户需求按照优先级排序,优先级高的需求更早交付,得到更多的测试,系统可靠性更高。
基于构件的软件工程:
软件复用:两次或多次不同开发的软件过程中重复使用相同或相似的软件元素
软构件标准的、可换的、经过装配可随时使用的软件模块
软件复用的意义:充分利用已有的知识和经验
避免重复劳动,提高开发效率
避免引入错误,提高开发质量
(4)螺旋式开发
敏捷式开发建立在增量式开发和迭代开发的概念上
敏捷开发的基本原则:客户参与、增量式交付、人非过程、接受变更、保存简单性
适用情况:中小规模的开发团队
每个团队成员都可以参与决策
需求变更更频繁的项目
风险高的项目
三、需求工程
用户需求、系统需求
功能需求(全面性、一致性)、非功能需求(设定明确目标、可测试的度量标准)、领域需求
需求工程过程
可行性研究
信息评估(同信息持有者进行沟通)
信息汇总(同信息持有者进行沟通)
书写报告
需求导出与分析
需求发现
需求的分类与组织(最关键)*
信息来源:已有文件、信息持有者、相近系统的规约描述
优先排序和冲突解决
需求文档化
多视点+访谈(封闭式访谈+开放式访谈)
需求描述
需求有效性验证
目的:检验需求描述是否正确地反映了客户的意愿
需求文档的检查:有效性、一致性、完备性、现实性、可检查性
需求管理
结构化分析建模
面向数据流
核心:数据词典
三种图:ER图(数据建模)、数据流图(功能建模)、状态-迁移图(行为建模)
面向对象分析方法
UML 统一建模语言
四、设计工程
设计解决的是如何实现系统的问题
概要设计+细节设计
模块化:一个复杂问题分割为若干个容易解决、容易管理的小问题侯
信息隐藏原理:
-
(1)设计的模块的信息(过程和数据)对于不需要这些信息的模块来说是不可见的
(2)每个模块只完成一个相对独立的特定功能
(3)模块之间只交换为为完成系统功能必须交换的信息
-
好处
(1)支持模块的并行开发
(2)减小测试和后期维护的工作量
(3)扩充功能只需要“插入”新模块
衡量模块独立性的准则:耦合性(模块之间独立性)、内聚性(模块功能相对想读—)
抽象:抽出事物的本质特性而暂时不考虑它们的细节
逐步求精:针对功能的宏观描述,用逐步求精的方法不断分解,主板确立过程细节,直至该功能用撤销语言描述的算法实现为止。
体系结构设计
任务:识别出组成系统的子系统并建立子系统 的控制和通信框架
(1)数据中心体系结构(容器模型)
所有共享数据放到一个中心数据库中(容器中)
所有子系统都能从中存取数据
使用条件:系统中存在大量的数据共享
(2)客户/服务器体系结构
分布式系统模型,数据和加工过程在多个处理器之间分配
主要组成:1、服务器 2、客户机 3、网络
(3)抽象机或分层系统结构
将系统组织成一系列的层次,每层提供一组服务
支持增量式开发
层与层之间以接口相联系
体系结构视图:
对于从某一视角或某一点看到的系统所作的简化描述
控制模型
集中式控制
调用返回模型
管理者模型
基于事件的控制
广播模型
中断驱动模型
用户设计的一般原则:
用户熟悉
一致性
意外最小化
可恢复性
用户差异性
UI设计的有效方式是利用原型、探索式开发
错误消息
礼貌的、简明的、一致的、建设性的
软件帮助系统不能是用户手册的简答赋值
五、软件实现与验证
程序设计:编程+测试
验证和有效性确认
验证:检查软件是否符合它的规格描述(缺陷测试)
有效性确认:检查软件是否满足客户的期待(有效性测试)
*软件审查:通过对系统的各种静态成果进行检查和分析问题
*软件测试:通过使用测试数据执行系统,检查运行结果来发现问题
测试和调试:
缺陷测试是确定系统中存在的缺陷
调试是定位和修改缺陷
集成测试:
把组件集成为系统和对合成的系统进行测试,以发现组件集成过程中带来的问题
1.自顶向下集成
2.自底向上集成
测试用例设计
设计测试用例的常用方法:划分测试与边界值分析;结构化测试(白盒测试)
黑盒测试(功能测试)着眼于程序外部结构,不考虑内部逻辑结构
白盒测试(结构测试)全面了解程序内部逻辑结构,对所有逻辑路径进行测试
1.逻辑覆盖法
语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖及路径覆盖
2.基本路径测试法
简述测试用例的基本构成和等价类划分的基本思想
设计输入数据 预计输出数据
等价类划分的基本思想:
设计测试用例时按特征将数据输入域划分成尽可能少的若干子域,每个子域称为一个等价类。
等价类中的每个数据应该以同样的方式得到处理,因此对于解释程序中的错误是等效的。
六、软件维护
软件系统随变更要求不断更新改进的过程就是系统的进化过程(系统随需求变化而变化)
软件维护是指在软件交付使用之后为了改正错误和满足新的需求而修改软件的过程
四种类型:纠正性维护、适应性维护、完善性维护、预防性维护(再工程)
维护成本一般会高于开发成本
影响维护成本的有技术因素也有非技术因素
团队稳定性
合同责任
人员技术水平
程序年龄与结构
系统规模
程序设计语言
先进的软件开发技术
开发阶段投入越多、有助于减少维护成本
软件年龄越大、维护成本越高
软件再工程:把今天的方法学应用到昨天的系统上,以支持明天的需求
正向工程、 库存目录分析、文档重构、逆向工程、代码重构、数据重构
七、软件项目管理
是为了使软件项目能够按照规定的成本、进度、质量顺利完成
而对成本、人员、进度、质量、风险等进行分析和管理的活动
软件项目管理主要考虑如何保证软件能够按时、按计划、满足用户需求规格的交付
4 P's 人员、产品、过程、项目
项目策划任务集
(1)确定项目范围
(2)确定可行性
(3)分析风险
(4)确定所需的资源
1.人力资源
2.可复用的软件资源
3.标识环境资源
(5)估算成本和工作量
(6)指定项目进度计划
软件项目的成本构成
硬件和软件成本
差旅费和培训费用
工作成本
经常性的管理费用