五一的学术交流会把我打击了不少,不过通过听大家的讲解和讨论,我还是收获了很多的。尤其在向阳师哥和坤哥、大勇讲软工和项目经理时,更是有共鸣,因为自己刚刚复习到软件工程这块知识。现在把自己对于软工的理解总结一下。
为什么会有软件工程?
为了解决“软件危机”,“软件工程”的概念被提了出来。早期的软件开发缺少文档,开发成本与进度与预计相差甚远,软件质量得不到保证,需求增长,软件规模扩大,开发生产率相对下降了……没有好的指导方法和辅助工具,软件开发难、维护难,软件危机越来越严重!
软件工程正是为了解决软件危机的种种问题,于是有了开发模型(瀑布模型、演化模型、螺旋模型、喷泉模型等),有了开发方法(面向数据流、面向数据结构、面向对象方法等)、开发工具的研究,有了文档和规范,有了……
软件工程概述
1.生存周期(原则上不超过5个,否则归纳总结)
1). 分析——可行性分析——可行性分析报告
需求分析——软件需求说明书
2). 设计——概要设计——概要设计说明书
详细设计(数据库设计)——详细设计说明书
3). 编码——程序
4). 测试——测试计划、测试用例、测试报告
5). 维护——维护记录
2.生存周期模型
1). 瀑布模型——这个名字起得好,如同瀑布流水、逐级向下,规定了由前至后的连接次序,不可改变。这是一种以文档为驱动、适合于软件需求很明确的软件项目的模型,要求项目开发过程中每个阶段都有评审和确切的文档。
2). 演化模型——因为瀑布模型过于理想化,所以开发实践经常要不断明确需求,于是,开发人员在获取一组基本的需求后,快速开发一个软件的初始可运行版本(原型),然后和用户交流,之后对原型改进,重复多次,最终得到用户满意的软件。
3). 螺旋模型——相当于瀑布模型+原型模型+风险分析,适合于复杂的大型软件。
4). 喷泉模型——适合于面向对象的开发方法,克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,该模型具有迭代性(开发活动可以重复很多很多次)和无间隙性(交叉进行,不一定分析完才能设计、设计完成才能编码)。
3.开发方法
1). 结构化:
分析(数据流图)——设计(软件结构图)——程序设计(控制结构)
指导思想:自顶向下、逐层分解
基本原则:分解和抽象
2). Jackson(JSP):
输入输出数据结构
现实世界模型——功能需求——————————>程序结构
3). 原型化
适用于需求不清、业务理论不确定、系统规模不大不复杂的情况。
4). 面向对象
分析——设计——实现
Booch方法、Coad方法、OMT方法
需求分析
开发项目管理
向阳师哥说,看你够不够做一个项目经理,先看你会不会对成本的估算。
1. 成本估算
方法:自顶向下(不会遗漏集成、配置管理之类的系统级事务,却往往不清楚低级别上的技术困难问题)、自底向上(每一个子任务工作量估算准确,易忽略系统级工作量)、差别估算(与已完成的类似项目比较,估算准确度高)。
模型:Putnam、COCOMO
2. 风险分析
识别、预测、评估、控制
3. 进度管理
Gantt图:清楚描述每个任务何时开始、何时结束,任务进展情况和并行性,不能反映任务之间的依赖关系。话不多说,看图形象。
PERT图:给出了每个任务的开始时间、结束时间和完成该任务所需的时间以及任务间的关系。
4. 人员管理
配置管理
SCM用于整个软件过程,管理整个软件生存期各阶段变更的活动。有以下几个概念需要注意:
1. 基线——可以作为一个检查点,当开发出现错误时可以返回到最近和最恰当的基线上,类似还原点的概念。
2. 软件配置项——软件工程中产生的信息项(各种文档等)都可以作为SCM的对象,他们可以被修改,但必须经过评估和确认.
3. 版本控制
4. 变更控制——配置数据库分为三类:开发库、受控库、产品库。
过程管理
1. 软件能力成熟度
CMMI(0-5)能力等级:0——未完整级,表明过程域的一个或多个特定目标没有被满足;1——已执行级;2——已管理级,针对单个过程实例的能力;3已定义级,关注过程的组织级标准化和部署;4——量化管理级;5——优化级。
2. 统一过程(UP)
五个阶段及其里程碑分别是:
i. 起始阶段——生命周期目标
ii. 精化阶段——生命周期架构
iii. 构建阶段——初始运作功能
iv. 移交阶段——产品发布
v. 产生阶段
3. 敏捷方法
i. 极限编程
ii. 水晶法
iii. 并列争球法
iv. 自适应软件开发
质量管理与质量保证
1. 质量特性
i. 功能性
ii. 可靠性
iii. 易使用性
iv. 效率
v. 可维护性
vi. 可移植性
2. 质量保证
3. 复杂性
i. 代码行度量法
ii. McCabe度量法
4. 评审
5. 容错技术
容错的一般方法有以下几种:
i. 结构冗余
ii. 信息冗余
iii. 时间冗余
iv. 冗余附加技术