软件设计师(5) – 软件工程

一、软件过程

1、能力成熟度模型(CMM)

是用来评价软件组织(公司)的模型;

  • 初始级:项目依赖个人努力和英雄式核心人物;
  • 可重复级:重复之前同类项目的成功;
  • 已定义级:管理和工程两方面的软件过程已经文档化、标准化;
  • 已管理级:指定了软件过程和产品质量的详细度量标准;
  • 优化级:加强了定量分析,持续改进;

2、能力成熟度模型集成(CMMI)

CMMI和CMM一样,是适用不同学科领域的模型;CMMI是若干过程模型的综合和改进;分为阶段式模型和连续式模型

阶段式模型,类似CMM

  • 初始的:过程不可预测且缺乏控制;
  • 已管理的:过程为项目服务;纪律化
  • 已定义的:过程为组织服务;标准一致
  • 定量管理的:过程已度量和控制;可预测
  • 优化的:集中于过程改进;不断改进

连续式模型

  • CL0:未完成
  • CL1:已执行的
  • CL2:已管理的
  • CL3:已定义级的
  • CL4:定量管理的
  • CL5:优化的

二、软件过程模型

1、瀑布模型

分为三个阶段:定义、开发和维护阶段;

需求分析 -> 设计 -> 编码 -> 测试 -> 运行维护;

用于解决需求是完整、简明、一致的系统开发问题;

优点:容易理解,管理成本低;强调开发的阶段性早期计划及需求调查和产品测试;

缺点:客户必须能够完整、正确和清晰地表达他们的需要;直到项目结束之前,都不能演示系统的能力;在瀑布模型中,需求或设计的错误往往只有到了项目后期才能被发现,对于项目风险的控制能力较弱,常常延期完成;

V模型

瀑布模型的变体,细化了测试类型,将测试分为单元测试、集成测试、系统测试和验收测试,但测试还是在编码之后;

2、增量模型

瀑布模型的变体,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发; 开发的流程还是按照瀑布模型的流程:分析 -> 设计 -> 编码 -> 测试;

优点:第一个可交付版本所需要的成本和时间很少;开发增量所承担的风险不大;减少用户需求变更;运行增量投资;

缺点:若没有对用户需求进行规划,后期可能会造成系统不稳定;如果需求不像早期那样稳定完整,一些增量可能需要重新开发;管理能力要求较高;

3、原型模型

沟通,快速构建原型;

适用于用户需求不清、需求经常变化的情况。当系统规模不是很大也不太复杂时,采用该方法比较好;

根据原型目的不同,可以分为探索型模型、实验型模型和演化型模型

  • 探索型原型:弄清目标的要求,确定所希望的特性,并探讨多种方案的可行性;
  • 实验型原型:验证方案或算法的合理性,是在大规模开发和实现前,用于考察方案是否可行;
  • 演化型模型:将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统;

4、螺旋模型

将瀑布模型和演化模型结合起来,加入两种模型均忽略的风险分析,弥补了两种模型的不足;强调风险分析;

适用于庞大、复杂并且具有高风险的系统;

  • 制订计划:确定目标,选定方案,明确限制条件;
  • 风险分析:分析方案,识别风险,消除风险;
  • 实施工程:实施开发,验证阶段性产品;
  • 用户评估:评价开发工作,提出修正建议,建立下一个周期的开发计划;

优点:支持需求动态变化,降低风险;

缺点:需要开发人员具有相当丰富的风险评估经验和专门知识;迭代次数会增加开发成本,延迟交付时间;

5、喷泉模型

用户需求为动力,以对象作为驱动的模型,适合于面向对象开发;各个阶段没有明显的界限,开发人员可以同步进行;

优点:提高效率,节省时间;

缺点:需要大量开发人员,不利于项目管理;这种模型要求严格管理文档,使得审核难度加大;

6、统一过程(UP)模型

是基于构建的开发模型,典型代表是RUP,是UP的商业扩展,更完整、详细;

用例和风险驱动,以架构为中心,迭代并且增量的开发过程,由UML方法和工具支持;包含4个阶段:

  • 起始阶段:生命周期目标;确定项目范围和边界,识别系统的关键用例,展示系统的候选架构,估计费用和时间,评估风险;
  • 精化阶段:生命周期架构;建立软件架构基础
  • 构建阶段:初始运作功能;开发剩余构件,组装和测试;
  • 移交阶段:产品发布;β测试,制作发布版本,文档定稿,培训、调整产品

7、敏捷方法

总体目标是通过“尽可能早地、持续地对有价值的软件的交付”是客户满意;典型主要有下面几个:

7.1、极限编程(XP)

4大价值观:沟通、简单、反馈、勇气;

5大原则:快速反馈、简单性假设、逐步修改、提倡更改和优质工作;

12大量实践:……

在一些对费用控制严格的公司中使用,非常有效;

7.2、水晶法(Crystal):用最少的纪律约束而仍能成功的方法;

7.3、并列争求法(Scrum):明确定义了的可重复的方法过程只限于在明确定义了的可重复环境中,解决重复问题;

7.4、自适应软件开发(ASD):猜测、合作和学习;

7.5、敏捷统一过程(AUP)

三、软件测试

1、测试方法

分为静态和动态测试;

静态测试指被测试程序不在计算机上运行,而采用人工检测和计算机辅助静态分析;

动态测试:通过运行程序发现错误,黑盒和白盒测试;

黑盒测试:等价类划分、边界值分析、错误推测、因果图;

白盒测试:逻辑覆盖(语句、判定、条件、条件判定、路径覆盖法)、循环覆盖、基本路径测试;

2、软件测试策略

单元测试:模块内部的测试;模块接口、局部数据结构、边界条件、出错处理、重要的执行路径;

集成测试:模块间的接口和通信;自顶向下集成测试、自底向上集成测试、回归测试、冒烟测试;

系统测试:真实环境下的测试;恢复测试、安全性测试、性能测试(压力测试、负载测试)、部署测试;

验收测试:用户主导的测试;

* 回归测试:测出来的问题,修复后的再次测试;

四、运行和维护、软件项目管理

1、运行和维护

可维护性评价指标:可理解、可测试、可修改性;

软件维护内容:正确性维护(25%)、适应性维护(20%,外部因素)、完善性维护(50%,扩充功能和改善性能)、预防性维护(5%,为了将来的使用);

2、项目管理-进度管理

总时差(松弛时间):在不延误总工期的前提下,该活动的机动时间;等于该活动的 最迟完成时间 减去 最早完成时间

关键路径:由总时差为零的活动组成的路径,它是工期最长的一条路径;组成关键路径的活动就是关键活动;

3、项目管理-进度管理

风险曝光度 = 风险出现的概率 X 风险可能造成的损失;

五、软件质量

软件质量分为内部和外部质量,ISO/IEC 9126软件质量模型分为三个层次:质量特性、质量子特性、度量指标;6大特性及其子特性如下:

  • 功能性:适合性、准确性、互用性、依从性、安全性;
  • 可靠性:成熟性、容错性、易恢复性;
  • 易使用性:易理解性、易学性、易操作性;
  • 效率:时间特性、资源特性;
  • 可维护性:易分析性、易改变性、稳定性、易测试性;
  • 可移植性:适应性、易安装性、一致性、易替换性;

六、软件度量

软件复杂性度量参数主要有:规模、难度、结构、智能度;

McCabe度量法:有向图中,环路复杂度为 V(G) = 边 – 节点 + 2,也可以用有向图中的封闭区间 + 1 得到环路复杂度;

七、软件开发方法

  • 结构化开发方法:由结构化分析、结构化设计、结构化程序设计构成,是一种面向数据流的开发方法,自顶向下,逐步分解。不适用于开发大的项目;
  • 原型法:
  • 面向对象法:更好的复用性,分析、设计、实现三个阶段,界限不明确;喷泉模型;
  • 面向服务方法:SOA

如果这篇文章对你有用,可以点击下面的按钮告诉我

0

发表回复