当前位置: 首页 > news >正文

几种软件开发方法对比

几种软件开发方法对比

1 综述

软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过程。

本文对净室方法、结构化方法、面向对象方法、原型法、逆向工程等方法进行梳理,并对各种开发方法特点、优点进行对比。

2 净室方法

2.1 特点

净室软件工程(Cleanroom Software Engineering, CSE)是软件开发的一种形式化方法,可以开发较高质量的软件。它使用盒结构规约进行分析和建模,并且将正确性验证作为发现和排除错误的主要机制,使用统计测试来获取认证软件可靠性所需要的信息。CSE强调在规约和设计上的严格性,还强调统计质量控制技术,包括基于客户对软件的预期使用测试。

2.2 缺点

CSE太理论化,需要更多的数学知识。其正确性验证的步骤比较困难且比较耗时。CSE要求采用增量式开发、采用盒子结构、采用统计测试方法,普通工程师必须经过加强训练才能掌握。

CSE开发小组不进行传统的模块测试,这是不现实的。工程师可能对编程语言和开发环境还不熟悉,而且编译器或操作系统的bug也可能导致未预期的错误。

CSE毕竟脱胎于传统软件工程,不可避免地带有传统软件工程的一些弊端。

3 结构化方法

3.1 特点

结构化方法的主要特点是:开发目标清晰化、开发工作阶段化、开发文档规范化和设计方法结构化。结构化方法特别适合于数据处理领域的问题,但是不适应于规模较大、比较复杂的系统开发。

由结构化分析、结构化设计、结构化程序设计组成,是一种面向数据流的开发方法。

结构化分析是根据分解与抽象的原则,按照系统中数据处理的流程,用数据流图来建立系统的功能类型,从而完成需求分析工作。结构化方法分析模型的核心是数据字典,围绕这个核心,有三个层次的模型,分别是数据模型、功能模型和行为模型(也称为状态模型)。在实际工作中,一般使用E-R图表示数据模型,用DFD表示功能模型,用状态转换图表示行为模型。这三个模型有着密切的关系,它们的建立不具有严格的时序性,而是一个迭代的过程。

结构化设计是根据模块独立性准则、软件结构优化准则将数据流图转换为软件的结构体系,用软件结构图来建立系统的物理模型,实现系统的概要设计。

结构化程序设计使用3种基本控制结构构造程序,任何程序都可以由顺序、选择和重复3种基本控制结构构造。

自顶向下方法是一种决策策略。软件开发涉及作什么决策、如何决策和决策顺序等决策问题。

自顶向下方法在任何时刻所作的决定都是当时对整个设计影响最大的那些决定。如果把所有决定分组或者分级,那么决策顺序是首先作最高级的决定,然后依次地作较低级的决定。同级的决定则按照随机的顺序或者按别的方法。一个决策的级别是看它距离要达到的最终目的(因此是软件的实际实现)的远近程度。从问题本身来看,或是由外(用户所见的)向内(系统的实现)看,以距离实现近的决定为低级决定,远的为高级决定。

3.2 缺点

对系统分析和设计人员的要求较高。

开发周期长,系统复杂,一般属于一种高成本、大投资的工程。

对于大系统而言,自上而下的规划对于下层系统的实施往往缺乏约束力,

从经济角度来看,很难说自顶向下的做法在经济上市合算的。

4 面向对象方法

4.1 特点

面向对象方法是系统的描述及信息模型的表示与客观实体相对应,符合人们的思维习惯,有利于系统开发过程中用户与开发人员的交流和沟通,缩短开发周期,提高系统开发的正确性和效率。

面向对象方法包含面向对象分析OOA、面向对象设计OOD、面向对象程序设计OOP。

面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成。用例建模用来描述待开发系统的功能需求,主要元素是用例和参与者。参与者是指系统以外的,需要使用系统或与系统交互的事物,包括:人或组织、设备、外部系统等,比较隐晦的参与者包括:时间、温度;用例是对系统行为的动态描述,用例获取是需求分析阶段的主要任务之一,用例之间的关系包括:包含、扩展、泛化。

面向对象的设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。在面向对象设计中,类可以分为三种类型:实体类、边界类和控制类。类之间的关系包括6种:关联、聚合、组合、依赖、泛化、实现。

4.2 缺点

类和继承等特点使得程序会多很多指针操作来定位函数入口和自身要维护虚拟方法表等额外的工作,程序的处理效率相对要低(但程序开发效率高)。

5 原型法

5.1 特点

原型是软件系统的初始版本,用来演示概念并尝试设计选择,通常用来发现更多的问题和可能的解决方案。快速迭代式的原型开发能够有效控制成本,根据原型与最终产品之间的关系,原型开发分为三类:抛弃式原型开发利用原型验证和澄清系统的需求描述,重新构造系统:演化式原型开发逐步改进和细化原型,将原型进化直至产生出目标系统;增量式原型开发在建立软件总体设计的基础上,采用增量开发方法,使原型成为最终系统。

以原型开发思想为基础,提出了螺旋模型、敏捷方法等。

5.2 缺点

原型法不适用于开发大型的信息系统;系统难于维护;如果用户合作不好,盲目纠错,会拖延开发进程。

6 逆向工程

6.1 特点

逆向工程与重构工程是目前预防性维护采用的主要技术。所谓软件的逆向工程就是分析已有的程序,寻求比源代码更高级的抽象表现形式。一般认为,凡是在软件生命周期内将软件某种形式的描述转换成更为抽象形式的活动都可称为逆向工程。逆向工程导出的信息可以分为:实现级、结构级、功能级、领域级,信息的抽象级别越高,它与代码的距离就越远,通过逆向工程恢复的难度亦越大,而自动工具支持的可能性相对变小,要求人参与判断和推理的工作增多。

7 敏捷方法

7.1.1 Scrum

Scrum是橄榄球比赛中“争球”的意思,你可以脑补争球时的敏捷、激情和你争我夺。现在Scrum是广泛应用于IT界的一套项目管理工具

Scrum的核心,是把整个项目分成若干个冲刺,每次2-4周,冲完一次再来一次。

Scrum的本质,是把一次漫长的长跑,分割成一段段全力以赴的冲刺,通过一套标准流程方法,提高效率。

Scrum是由三个角色(产品负责人,Scrum Master,团队成员)、四个仪式(冲刺计划会,每日站会,冲刺评审会,冲刺回顾会)和三个物件(产品积压,冲刺积压,燃尽图)组成的一套项目管理方法。

产品负责人,召开冲刺计划会,定下三件事:冲刺目标。定下目标后,把它们从“产品积压”,移入“冲刺积压”。

冲刺方法。选定冲刺方法。

分配任务。团队成员若干人,在6个步骤中,各自主动领取任务。

燃尽,是烧完了的意思。随着时间推移,剩余工作量越来越少。把计划进度,画成一根从左上到右下的直线。然后,把实际进度用红线标在旁边,看着工作量像蜡烛一样,不断燃尽。

冲刺评审会,由主编负责主持,一起审阅最终交付的文章。冲刺回顾会,讨论开始做什么,停止做什么,继续做什么。

7.1.2 极限编程

XP (Extreme Programming,极限编程)在所有的敏捷型方法中,XP是最引人瞩目的。它源于Smalltalk圈子,特别是Kent Beck和Ward Cunningham在20世纪80年代末的密切合作。XP在一些对费用控制严格的公司中的使用,已经被证明是非常有效的。

7.1.3 水晶方法

Cockburn的水晶系列方法,水晶系列方法是由AlistairCockburn提出的。它与XP方法一样,都有以人为中心的理念,但在实践上有所不同。Alistair考虑到人们一般很难严格遵循一个纪律约束很强的过程,因此,与XP的高度纪律性不同,Alistair探索了用最少纪律约束而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡。也就是说,虽然水晶系列不如XP那样的产出效率,但会有更多的人能够接受并遵循它。

7.1.4 开源界的开发方法

开放式源码,这里提到的开放式源码指的是开放源码界所用的一种运作方式。开放式源码项目有一个特别之处,就是程序开发人员在地域上分布很广,这使得它和其他敏捷方法不同,因为一般的敏捷方法都强调项目组成员在同一地点工作。开放源码的一个突出特点就是查错排障(debug)的高度并行性,任何人发现了错误都可将改正源码的“补丁”文件发给维护者。然后由维护者将这些“补丁”或是新增的代码并入源码库。

7.1.5 FDD

Coad的功用驱动开发方法(FDD-Feature Driven Development),FDD是由Jeff DeLuca和大师Peter Coad提出来的。像其他方法一样,它致力于短时的迭代阶段和可见可用的功能。在FDD中,一个迭代周期一般是两周。在FDD中,编程开发人员分成两类:首席程序员和“类”程序员(classowner)。首席程序员是最富有经验的开发人员,他们是项目的协调者、设计者和指导者,而“类”程序员则主要做源码编写。

相关文章:

几种软件开发方法对比

几种软件开发方法对比 1 综述 软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过程。 本文对净室方法、结构化方法、面向对象方法、原型法、逆向工程等方法进行梳理,并对各种开发方法特点、优点进行对比。 2 净室方法 2.1 特点 净…...

在Maven中发布项目到Nexus私有服务器

一、测试环境 Sonatype Nexus 3.61.0-02 Maven 3.9.2 二、环境配置 2.1找到maven的配置文件 2.2添加私有仓库账户密码 <servers><server><id>nexus</id><username>admin</username><password>admin</password></server&…...

TypeScript - 类 -类的继承

浅谈类的继承 类的继承 就是对一个类进行扩展&#xff0c;可以扩展属性、方法。 类的继承 可以很好的解决代码冗余的问题。比如 &#xff1a; 【学生】类 拥有 基本的 姓名、年龄 两个属性&#xff0c; 【体育生】类也属于【学生】类&#xff0c;有 姓名、年龄、训练项目 三个…...

QT: QLineEdit 密码模式、QLineEdit输入模式

setEchoMode(QLineEdit::Normal) 是一个函数&#xff0c;用于设置 QLineEdit 对象的输入模式。具体用法如下&#xff1a; lineEdit->setEchoMode(QLineEdit::Normal);该函数的作用是将 QLineEdit 对象的输入模式设置为“正常模式”&#xff0c;在此模式下&#xff0c;用户的…...

ES6中Map集合

Map集合是一个新的数据结构&#xff0c;它可以存储键值对&#xff0c;并且可以使用任何类型的值作为键&#xff0c;包括对象、数组和函数。Map也是一种可迭代的结构&#xff0c;可以使用for...of循环遍历。 在ES6中&#xff0c;我们可以使用Map构造函数来创建一个Map集合&…...

【Leetcode Sheet】Weekly Practice 13

Leetcode Test 1155 掷骰子等于目标和的方法数(10.24) 这里有 n 个一样的骰子&#xff0c;每个骰子上都有 k 个面&#xff0c;分别标号为 1 到 k 。 给定三个整数 n , k 和 target &#xff0c;返回可能的方式(从总共 kn 种方式中)滚动骰子的数量&#xff0c;使正面朝上的数…...

技术贴 | 一文掌握 Google Test 框架

一、简介 1. 引言 在开发过程中&#xff0c;如何保证代码的质量以及程序的正确性成为了我们亟需解决的问题&#xff0c;其中测试用例成为了不必可少的一部分。测试用例不仅可以帮助我们验证代码的正确性&#xff0c;还能帮助我们捕获潜在的错误&#xff0c;提高代码的可靠性和…...

基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类 计算机竞赛

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…...

非线性时滞系统的无模型预测控制

摘 要 非线性时滞系统的预测控制应用广泛&#xff0c;比如电子设备、石油化工、造纸等行业&#xff0c;都会运用到非线性时滞系统的预测控制系统或工具。更高效率和更高精度的非线性时滞系统的预测控制一直是研究的热点。在我们日常生活中&#xff0c;非线性时滞系统的预测控制…...

局域网内两台电脑共享文件夹(通过网线直连共享数据)

文章目录 2.设置共享文件夹3.访问共享文件夹 1.将两台电脑置于同一局域网下 用网线将两台电脑连接关闭两台电脑防火墙将两台电脑IP地址设置在同一局域网下 测试是否在同一局域网下&#xff0c;使用ping命令 ping 192.168.0.122.设置共享文件夹 选择想要共享的文件夹&#xff…...

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)

参考视频&#xff1a;https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7&#xff1a;CNN 的全局架构 卷积层除了做卷积操作外&#xff0c;还要加上 bias &#xff0c;再经过非线性的函数&#xff0c;这么做的原因是 “scaled p…...

一致性hash负载均衡

Hash算法的问题 今天看下一致性hash&#xff0c;常见的负载均衡可能使用过hash&#xff0c;比如nginx中&#xff0c;如果使用session最简单就是通过hash&#xff0c;比如根据用户的请求ip进行hash&#xff0c;让不同用户的请求打到同一台服务器&#xff0c;这样状态处理起来最…...

MAC下安装Python

MAC基本信息&#xff1a; 执行命令&#xff1a; brew install cmake protobuf rust python3.10 git wget 遇到以下问题&#xff1a; > Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/rust-1.59.0 Already downloaded: /Users/xxxx/Library/Caches/Ho…...

Android NDK开发详解之JNI中的库文件

Android NDK开发详解之JNI中的库文件 简介工作原理流程原生 activity 和应用 简介 本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C&#xff08;“原生代码”&#xff09;嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下…...

KNN模型

使用K-Nearest Neighbors (KNN)算法进行分类。首先加载一个数据集&#xff0c;然后进行预处理&#xff0c;选择最佳的K值&#xff0c;并训练一个KNN模型。 # encodingutf-8 import numpy as np datas np.loadtxt(datingTestSet2.txt) # 加载数据集&#xff0c;返回一个numpy数…...

Python 学习1 基础

文章目录 基础字符串字面量常用的值类型注释变量print语句数据类型数据类型转换标识符运算符 字符串拓展小结 2023.10.28 周六 最近打算学一下Python&#xff0c;毕竟确实简单方便&#xff0c;而且那个编程语言排名还是在第一。不过不打算靠它吃饭&#xff0c;深不深入暂且不说…...

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…...

Thread

Thread 线程启动线程第一种创建线程线程的第二种创建方式使用匿名内部类完成线程的两种创建 Thread API线程的优先级线程提供的静态方法守护线程用户线程和守护线程的区别体现在进程结束时 多线并发安全问题同步块 线程 启动线程 启动线程:调用线程的start方法,而不是直接调用…...

FOC系列(二)----继续学习DRV8301芯片

一、 程序框图 跟随上篇博客咱们继续往下看&#xff0c;下面是芯片内部的程序框图&#xff1a; 1.1 BUCK电路 1.2 内部各电源 1.3 SPI通信、栅极驱动器和时序控制器 1.4 MOSFET驱动电路 1.5 电流采样放大电路 数据手册只是给出了这一部分框图&#xff0c;但是没有更加详细的介…...

A. Directional Increase -前缀和与差分理解 + 思维

题面 分析 观察指针移动的性质&#xff0c;可以发现每一段都是从起点走到终点&#xff0c;在原路返回&#xff0c;这样每一段也就表示&#xff0c;在起点处加一&#xff0c;在终点处减一&#xff0c;形成了很明显的差分结构&#xff0c;思考能否构造出a数组的关键就是他的前缀…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...