【软考中级攻略站】-软件设计师(5)- 软件工程

软件生存周期

什么是软件生存周期?

软件生存周期指的是一个软件从开始构思到最终停止使用(或被替换)的整个过程。就像人的生命一样,软件也有一个从出生到死亡的过程。

软件生存周期的几个阶段

软件生存周期通常可以分为以下几个阶段:

  1. 需求分析

    • 做什么:在这个阶段,我们需要弄清楚软件需要完成哪些功能,解决哪些问题。
    • 例子:假设你要做一个新的购物网站,你需要先确定这个网站需要有哪些功能,比如商品展示、购物车、支付功能等。
  2. 设计

    • 怎么做:在这个阶段,我们要设计软件的架构,确定软件的外观和内部结构。
    • 例子:继续购物网站的例子,你需要设计网站的页面布局、数据库结构和后台管理系统等。
  3. 编码

    • 编写代码:在这个阶段,程序员根据设计好的方案开始写代码。
    • 例子:程序员开始用编程语言(如Java、Python等)编写代码,实现之前设计的功能。
  4. 测试

    • 检查问题:在这个阶段,我们需要测试软件是否正常工作,找出并修复错误。
    • 例子:测试人员会尝试使用网站的各种功能,看看有没有bug,比如支付功能是否正常、商品信息是否正确显示等。
  5. 部署

    • 上线发布:在这个阶段,软件准备好后会被发布到生产环境中,供用户使用。
    • 例子:购物网站完成后,发布到互联网上,用户可以通过网址访问这个网站。
  6. 维护

    • 持续改进:软件发布后,还需要不断改进和修复问题。
    • 例子:网站上线后,根据用户的反馈和使用情况,不断改进功能,修复新发现的bug。
  7. 退役

    • 停止使用:当软件不再满足需求或有更好的替代品时,软件会被停止使用或替换。
    • 例子:如果新的购物平台出现了,原来的网站可能会被淘汰,不再使用。

能力成熟度模型CMM

什么是能力成熟度模型(CMM)

能力成熟度模型(CMM)是一种评估和改进软件开发和维护过程的方法。它提供了一套标准,帮助软件开发团队评估他们的工作流程,并逐步提升其管理水平和效率。

CMM的五个级别

CMM通常分为五个级别,每个级别代表了软件开发和维护过程的不同成熟度水平。级别越高,表示管理水平和流程越规范、高效。

1. 初始级(Level 1)
  • 特点:没有固定的流程,每个人都有自己的一套做法。
  • 例子:一个小团队刚开始开发软件,大家各自为战,没有统一的开发流程。
2. 可重复级(Level 2)
  • 特点:开始有一些基本的管理流程,项目可以重复成功。
  • 例子:团队开始使用版本控制系统(如Git),并制定了一些基本的项目管理规定,比如每周开会讨论进度。
3. 已定义级(Level 3)
  • 特点:建立了标准的开发流程,并且这些流程在整个组织内被广泛采用。
  • 例子:公司制定了详细的软件开发手册,每个项目都遵循这套手册中的规定。
4. 量化管理级( Level 4)
  • 特点:不仅有标准的流程,还能通过量化指标来监控和改进流程。
  • 例子:团队不仅制定了流程,还定期收集数据,分析项目的成功率、缺陷率等指标,并据此调整流程。
5. 优化级( Level 5)
  • 特点:能够持续改进流程,引入新技术和方法,不断提高效率。
  • 例子:团队不仅能够量化管理,还会主动寻找新的技术和方法来改进现有的流程,比如引入敏捷开发方法。

例子

假设一个软件开发公司从零开始,经历以下几个阶段:

  1. 初始级:公司刚开始成立,每个人都按自己的习惯做事,没有固定的流程。
  2. 可重复级:公司开始制定一些基本的规定,比如使用版本控制系统,每周开会讨论进度。
  3. 已定义级:公司制定了一套详细的软件开发手册,每个项目都按照这套手册执行。
  4. 量化管理级:公司开始收集数据,分析项目的成功率、缺陷率等指标,并根据这些数据调整流程。
  5. 优化级:公司不仅能够量化管理,还会主动寻找新的技术和方法来改进现有的流程,比如引入敏捷开发方法。

能力成熟度模型CMMI

CMMI 是一种用于改进组织过程的框架,它不仅仅局限于软件开发领域,而是适用于任何类型的工程或业务过程。

CMMI 的模型结构

CMMI 模型可以分为两个主要部分:过程域实践。过程域是指需要改进的具体方面,而实践则是实施这些改进的具体步骤。

过程域(PA)
  • 过程域 是指为了实现特定目标所需要关注的关键过程区域。
  • 例子:如需求管理(Requirement Management)、项目规划(Project Planning)、风险管理(Risk Management)等。
实践(Practices)
  • 实践 是指为了改进某个过程域所采取的具体行动。
  • 例子:为了改进需求管理,可能会有记录需求、验证需求是否正确等具体实践。

CMMI 的成熟度等级

CMMI 的成熟度等级分为五个级别,与 CMM 类似,但更加细化和全面:

  1. 初始级(Level 1)

    • 特点:没有固定的过程,项目结果难以预测。
    • 例子:小团队各自为政,没有统一的工作流程。
  2. 已管理级(Level 2)

    • 特点:有了基本的管理流程,可以重复成功。
    • 例子:团队开始使用版本控制工具,并且有基本的项目管理规定。
  3. 已定义级(Level 3)

    • 特点:建立了标准的开发流程,并且这些流程在整个组织内被广泛采用。
    • 例子:公司制定了详细的软件开发手册,每个项目都遵循这套手册中的规定。
  4. 定量管理级(Level 4)

    • 特点:不仅有标准的流程,还能通过量化指标来监控和改进流程。
    • 例子:团队不仅制定了流程,还定期收集数据,分析项目的成功率、缺陷率等指标,并据此调整流程。
  5. 优化级(Level 5)

    • 特点:能够持续改进流程,引入新技术和方法,不断提高效率。
    • 例子:团队不仅能够量化管理,还会主动寻找新的技术和方法来改进现有的流程,比如引入敏捷开发方法。

统一过程模型

统一过程模型(RUP)是由 Rational Software Corporation 开发的一种软件开发过程框架。

RUP 强调的是在软件开发过程中采用迭代增量 的方式进行开发,这意味着不是一次性地完成所有的工作,而是分成多个阶段,每个阶段完成一部分功能,并且在每个阶段结束时都有可工作的软件版本。

RUP 的组成部分

RUP 主要由以下几个部分组成:

1. 工作流

工作流描述了在软件开发过程中应该进行的主要活动。RUP 将这些活动分为六个核心工作流:

  • 业务建模:了解和分析业务需求。
  • 需求:收集和分析用户需求。
  • 分析与设计:设计软件的架构和组件。
  • 实现:编写代码。
  • 测试:验证软件是否满足需求。
  • 部署:发布软件并支持用户。
2. 阶段

RUP 将软件开发过程分为四个主要阶段:

  • 初始阶段:确定项目的范围、目标和可行性。

    • 例子:决定做一个新的移动应用,明确它的目标用户是谁,需要解决什么问题。
  • 细化阶段:进一步明确需求,建立初步的架构设计。

    • 例子:详细列出应用的功能列表,确定技术栈和基础架构。
  • 构建阶段:实际开发软件,进行多次迭代。

    • 例子:开发团队开始编写代码,每完成一部分就进行测试和集成。
  • 交付阶段:准备和部署软件,进行用户培训和支持。

    • 例子:将应用发布到应用商店,为用户提供使用指南和技术支持。
3. 迭代

在构建阶段,RUP 强调采用迭代的方式进行开发。每次迭代都会完成软件的一个子集,并且每次迭代结束时都应该有一个可运行的软件版本。这样做的好处是可以及时发现问题并进行修正。

4. 制品

RUP 中的制品是指开发过程中产生的文档和其他输出物,例如需求规格说明书、设计文档、测试计划等。

5. 活动

活动是指在各个阶段中需要完成的具体任务,如编写需求文档、设计类图、编写代码等。

RUP 的优点

  • 结构化:提供了清晰的过程结构,便于管理和跟踪。
  • 迭代式开发:通过迭代可以更快地得到用户反馈,并且更容易适应需求变化。
  • 风险驱动:早期识别和处理项目风险,减少后期出现大问题的可能性。

软件开发模型

瀑布模型

  • 特点:顺序进行,每个阶段完成后才能进入下一个阶段。
  • 流程:需求分析 -> 设计 -> 编码 -> 测试 -> 部署 -> 维护。
  • 优点:结构清晰,易于理解和管理。
  • 缺点:一旦进入下一阶段,很难返回修改之前的阶段;不适应需求变化。
  • 适用场景:需求明确且不易变更的项目。

2. 增量模型

  • 特点:将软件开发分解成一系列小的增量部分,每个部分可以独立开发。
  • 流程:需求分析 -> 设计 -> 第一个增量 -> 测试 -> 第二个增量 -> 测试 -> ... -> 最终产品。
  • 优点:可以快速发布初步版本,用户可以尽早看到成果。
  • 缺点:初期版本可能不够完善,整体协调性可能受影响。
  • 适用场景:大型项目,可以分阶段交付。

3. 迭代模型

  • 特点:在每次迭代中完成一部分功能,经过多次迭代最终完成整个软件。
  • 流程:需求分析 -> 设计 -> 第一次迭代 -> 测试 -> 第二次迭代 -> 测试 -> ... -> 最终产品。
  • 优点:灵活应对需求变化,每次迭代都有可用的产品。
  • 缺点:管理复杂,需要良好的迭代计划。
  • 适用场景:需求不完全明确或容易变化的项目。

4. 敏捷开发模型

  • 特点:强调团队合作、客户协作、响应变化和快速交付。
  • 流程:短周期迭代(Sprint) -> 定期回顾 -> 调整 -> 下一个迭代。
  • 优点:高度灵活,快速响应需求变化,鼓励团队沟通。
  • 缺点:对团队成员的要求高,需要持续投入。
  • 适用场景:需求经常变化的小型到中型项目。

5. 螺旋模型

  • 特点:结合了瀑布模型的阶段性和原型模型的风险分析。
  • 流程:需求分析 -> 风险评估 -> 构建原型 -> 用户反馈 -> 下一个螺旋。
  • 优点:在每个阶段都进行风险评估,适合复杂项目。
  • 缺点:成本和时间开销较大,不适合小型项目。
  • 适用场景:大型复杂项目,特别是涉及高风险的项目。

6. 原型模型

  • 特点:首先构建一个初步的原型,然后根据用户反馈进行修改。
  • 流程:需求分析 -> 快速原型 -> 用户反馈 -> 修改原型 -> 最终产品。
  • 优点:用户可以尽早看到软件的样子,反馈及时。
  • 缺点:可能会陷入不断的修改中,导致项目延期。
  • 适用场景:用户界面复杂的项目,需要用户频繁参与。

结构化方法

结构化方法是一种传统的软件开发方法论,它强调软件开发过程的顺序性和规范性。

通常适用于需求相对固定且明确的项目。

结构化方法的核心思想是将复杂的问题分解为较小、更易于管理的部分,并且通过明确的阶段划分来逐步推进项目的发展。(自顶向下

结构化方法的优缺点

优点
  • 明确性:每个阶段都有明确的目标和产出物。
  • 可追踪性:详细的文档有助于追踪项目的进展。
  • 易于管理:阶段化的流程使得项目管理更加有序。
缺点
  • 灵活性差:一旦进入下一阶段,很难回到前一阶段修改。
  • 适应性弱:对需求变化的适应能力较差。
  • 周期长:每个阶段都需要详细文档,可能导致项目周期较长。

jackson方法

jackson方法是一种面向数据结构的开发方法。

jsp方法是以数据结构为驱动的。

Jackson方法的特点

优点
  • 易于理解:JSD方法通过直观的数据结构分析,使得设计过程更加清晰明了。
  • 数据驱动:以数据结构为中心的设计方式,使得软件更易于理解和维护。
  • 图形化工具:使用图形化工具辅助设计,使得设计过程更加直观。
缺点
  • 局限性:对于非数据驱动的系统,JSD方法可能不太适用。
  • 灵活性有限:相比敏捷开发方法,JSD方法在应对需求变化时灵活性较差。
  • 文档要求高:JSD方法要求大量的文档记录,这可能增加项目的文档负担。

原型化方法

原型化方法通过快速构建 一个简单的系统模型(即原型)来帮助开发者和用户更好地理解需求,并在实际开发前进行验证和调整。这种方法可以让用户尽早参与到开发过程中,通过互动和反馈来不断改进软件。

原型化方法的基本理念

原型化方法的核心理念是通过构建一个初步的系统来让各方(尤其是最终用户)能够看到并体验到系统的雏形,从而更快地识别和纠正需求上的误解或偏差。这种方法强调用户的参与和反馈循环,使得软件开发更加贴近用户的真实需求。

面向对象方法

面向对象方法是一种软件开发方法,它将现实世界中的事物抽象成"对象",并通过这些对象之间的交互来实现软件的功能。这种方法强调数据和行为的封装,以及对象之间的继承和多态性。

为了统一各种面向对象方法的术语、概念和模型,OMG1997年推出了统一语言模型(UML):是面向对象的标准建模语言,通过统一的语义和符号表示,使各种方法的建模过程和表示统一起来,已经成为面相对象建模的工业标准

面向对象方法的优点

  • 重用性:对象和类可以被重用,减少重复编码。
  • 模块化:对象之间相对独立,易于维护和修改。
  • 扩展性:通过继承和多态性,可以轻松扩展系统功能。
  • 安全性:封装机制可以保护内部数据不受外部直接访问。

面向对象方法的缺点

  • 复杂性:面向对象的设计可能比传统的结构化设计更复杂。
  • 学习曲线:面向对象的概念和设计模式需要时间去掌握。
  • 性能影响:某些情况下,面向对象的特性(如动态绑定)可能会影响程序的性能。

敏捷开发方法

敏捷开发方法是一种灵活的软件开发方法论,它强调快速响应变化、用户参与和持续交付。与传统的方法(如瀑布模型)不同,敏捷开发方法更加注重团队协作、快速迭代和用户反馈。

敏捷开发方法的常见框架

敏捷开发方法有多种具体的实践框架,其中最著名的包括:

  1. Scrum

    • 特点:使用短周期的冲刺(Sprint)来组织开发工作,每个冲刺通常是2-4周。
    • 角色:产品负责人(Product Owner)、Scrum Master、开发团队。
  2. 极限编程(Extreme Programming, XP)

    • 特点:强调持续集成、测试驱动开发(TDD)、重构等技术实践。
    • 实践:结对编程、持续集成、用户故事等。
  3. 精益软件开发(Lean Software Development, LSD)

    • 特点:减少浪费、提高价值流动速度。
    • 实践:价值流映射、持续改进等。
  4. Kanban

    • 特点:使用看板(Kanban Board)来可视化工作流程,限制在制品数量(WIP)。
    • 实践:工作项流动、限制在制品数量等。

敏捷开发方法的优点

  • 快速响应变化:能够快速适应需求变化。
  • 用户满意度:通过频繁交付和用户反馈,确保软件满足用户需求。
  • 团队协作:促进团队成员之间的沟通和协作。
  • 持续改进:通过不断的迭代和回顾,持续改进开发过程。

敏捷开发方法的缺点

  • 缺乏文档:可能缺乏详细的文档,这对于某些项目来说是个问题。
  • 依赖团队素质:对团队成员的技能和素质要求较高。
  • 管理难度:敏捷开发需要团队成员有较高的自我管理能力,管理难度相对较大。

需求分析-分类

(1)功能需求:考虑软件要做什么

(2)性能需求:考虑软件开发的技术性指标

(3)用户或人的因素:考虑用户的类型

(4)环境需求:考虑未来软件应用的环境,包括软件和硬件

(5)界面需求:考虑对数据格式、数据存储介质的规定

(6)文档需求:考虑需要哪些文档,针对哪些读者

(7)数据需求:考虑数据的格式、接收、发送数据的频率

(8)资源使用需求:考虑软件运行时所需要的数据、内存空间等资源

(9)安全保密要求

(10)可靠性要求:考虑系统的可靠性

(11)软件成本消耗与开发进度需求

(12)其他非功能性需求

系统设计-内聚和耦合

内聚类型表

内聚类型 定义 例子
偶然内聚 模块中的各个部分没有任何关联,只是碰巧被放在一起。 一个模块包含了打印、计算和网络通信等功能,这些功能之间没有直接关系。
逻辑内聚 模块中的各个部分是为了实现一个逻辑上的功能,但它们之间没有直接的关系。 一个模块负责处理所有的网络请求,但这些请求之间没有直接联系。
时间内聚 模块中的各个部分是为了在同一时间被调用的功能。 一个模块包含了一系列在系统启动时需要执行的操作。
过程内聚 模块中的各个部分是为了实现一个特定的顺序过程。 一个模块负责处理用户登录的过程,依次进行验证用户名、密码、发送验证码等操作。
通信内聚 模块中的各个部分是为了处理同一个输入或产生同一个输出。 一个模块负责处理用户上传的图片,包括读取、压缩和存储等操作。
顺序内聚 模块中的各个部分是为了实现一个顺序的操作流程。 一个模块负责处理订单,依次进行接收订单、验证订单、发货等操作。
功能内聚 模块中的各个部分是为了实现一个单一的功能。 一个模块专门负责计算用户的积分。

耦合类型表

耦合类型 定义 例子
内容耦合 一个模块直接访问或修改另一个模块的内容。 一个模块直接修改另一个模块中的变量值。
公共耦合 多个模块共享一个全局数据结构。 多个模块都使用同一个全局数组。
控制耦合 一个模块通过传递控制信息(如布尔值、枚举值等)来控制另一个模块的行为。 一个模块通过参数传递一个标志位来控制另一个模块的执行路径。
标记耦合 一个模块通过传递一组数据给另一个模块,但接收模块只使用了其中的一部分数据。 一个模块传递一个包含多个字段的对象给另一个模块,但后者只使用其中的一个字段。
数据耦合 一个模块通过传递简单数据(如数值、字符串等)来与其他模块交互。 一个模块通过函数参数传递一个整数给另一个模块。
无耦合 模块之间没有任何依赖关系。 两个模块完全独立,没有任何交互。
相关推荐
水木流年追梦几秒前
【python因果推断库16】使用 PyMC 模型进行回归拐点设计
开发语言·python·回归
scdifsn4 分钟前
动手学深度学习8.5. 循环神经网络的从零开始实现-笔记&练习(PyTorch)
pytorch·笔记·rnn·深度学习·梯度剪裁
只想摆烂@31 分钟前
C# winfrom 如何多窗体优雅的回调方法
开发语言·c#
西猫雷婶33 分钟前
python画图|中秋到了,尝试画个月亮(球体画法)
开发语言·python
星迹日35 分钟前
C语言:结构体
c语言·开发语言·经验分享·笔记
会敲代码的小张1 小时前
设计模式-观察者模式
java·开发语言·后端·观察者模式·设计模式·代理模式
宗浩多捞1 小时前
C++设计模式(更新中)
开发语言·c++·设计模式
学习使我变快乐3 小时前
C++:析构函数
开发语言·c++
我言秋日胜春朝★3 小时前
【C++】继承详解
开发语言·c++
+码农快讯+6 小时前
JavaScript 基础 - 第17天_AJAX综合案例
开发语言·javascript·ajax