特征驱动开发

FDD 方法来自于一个大型的新加坡银行项目。FDD 的创立者 Jeff De Luca 和 Peter Coad 分别是这个项目的项目经理和首席架构设计师。在 Jeff 和 Peter 接手项目时,客户已经经历了一次项目的失败,从用户到高层都对这个项目持怀疑的态度,项目组士气低落。随后, Jeff 和 Peter 采用了特征驱动、彩色建模等方法,最终获得了巨大成功。
FDD 是也是一个迭代的开发模型。FDD的每一步都强调质量,不断地交付可运行的软件,并以很小的开发提供精确的项目进度报告和状态信息。同敏捷方法一样,FDD 弱化了过程在软件开发中的地位。虽然 FDD 中也定义了开发的过程,不过一个几页纸就能完全描述的过程深受开发者的喜爱。
1.FDD 角色定义
FDD 认为,有效的软件开发不可缺少的三个要素是:人、过程和技术。软件开发不能没有过程,也不能没有技术,但软件开发中最重要的是人。个人的生产率和人的技能将会决定项目的成败。为了让项目团队能够紧密地工作在一起,FDD 定义了 6 种关键的项目角色:
(1)项目经理。项目经理是开发的组织者,但项目经理不是开发的主宰。对于项目团队来说,项目经理应该是团队的保护屏障。他将同团队外界(如高层领导、人事甚至写字楼的物业管理员)进行沟通,努力为团队提供一个适宜的开发环境。
(2)首席架构设计师。不难理解,首席架构设计师负责系统架构的设计。
(3)开发经理。开发经理负责团队日常的开发,解决开发中出现的技术问题与资源冲突。
(4)主程序员。主程序员将带领一个小组完成特征的详细设计和构建的工作,一般要求主程序员具有一定的工作经验,并能够带动小组的工作。
(5)程序员。若干个程序员在主程序员的带领下形成一个开发小组,按照特征开发计划完成开发。
(6)领域专家。领域专家是对业务领域精通的人,一般由客户、系统分析员等担当。领域专家作为关键的项目角色正是敏捷宣言中“业务人员同开发人员紧密合作”的体现。
根据项目规模的大小,有些角色是可以重复的。例如在一个小规模项目中,项目经理自身的能力很强,他就可以同时担当项目经理、首席架构设计师和开发经理的角色。
2.核心过程
FDD 共有 5 个核心过程,如图 6-6 所示。
在这里插入图片描述
(1)开发整体对象模型。开发整体对象模型也就是业务建模的阶段。不过 FDD 强调的是系统地完整地面向对象建模,这种做法有助于把握整个系统,而不仅仅关注系统中的若干个点。在这一阶段,领域专家和首席架构设计师相互配合,完成整体对象模型。
(2)构造特征列表。完成系统建模后,需要构造一个完整的特征列表。所谓特征指的是一个小的、对客户有价值的功能。采用动作、结果和目标来描述特征,特征的粒度最好可以在两周之内实现。在这一阶段中,可以整理出系统的需求。
(3)计划特征开发。很少看到有哪个软件在开发过程中明确包含计划过程,其实任何一个软件项目都必须有计划——无论是重载方法还是敏捷方法。在这一阶段中,项目经理根据构造出的特征列表、特征间的依赖关系进行计划,安排开发任务。
(4)特征设计。在这一阶段,主程序员将带领特征小组对特征进行详细设计,为后面的构建做准备。
(5)特征构建。特征构建和特征设计这两个阶段合并起来可以看做特征的实现阶段,这两个阶段反复地迭代,直到完成全部的开发。
3.最佳实践
组成 FDD 的最佳实践包括:领域对象建模、根据特征进行开发、类的个体所有、组成特征小组、审查、定期构造、配置管理、结果的可见性。
其中,最有特色的莫过于类的个体所有。几乎所有的开发模型都是代码共有,程序员们负责开发系统中的全部代码,并通过配置管理和变更控制来保持代码的一致性。在 FDD 中,将类分配给特定的任何小组,分配给 A 成员的代码将全部由 A 来维护,除 A 外的角色都不能修改它,只能使用它。这样做当然有它的优点:个人对所分配的类很容易保持概念的完整性;开发类代码的人肯定是最熟悉这个类的主人;而对这个类的支配感会促使开发人员产生自豪感,从而更出色地完成任务。不过 FDD 也提到了类个体所有的缺陷:项目中的依赖关系增强、当 A 需要 B 修改他自己的类时,必须等待 B 完成修改才能使用;类的个体所有增加了员工离职的损失。面对这些优点和缺陷,显然 FDD 认为类的个体所有对系统开发更有帮助。
除类的个体所有外,审查也是 FDD 中很具特色的一项实践。不少人都认为审查是非常严格的软件过程所特有的,因为进行审查不但要花费不少的人力和时间,对审查者本身的素质也有要求。然而在 FDD 中,明确地将审查作为一项最佳实践提出。审查是一种很有效的发现缺陷的手段,但经常被忽视,国内的软件组织中很少有严格审查制度保证软件质量。有效的审查可以发现很多潜在的问题,而这些问题往往是无法通过测试发现的,例如建模、需求和设计期的缺陷。这些潜在的缺陷大多要到系统测试甚至发布后才能发现,修正这些缺陷的代价是很大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql面试题——日志

一:为什么需要REDO日志 缓冲池可以帮助我们消除CPU和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘,然而由于checkpoint 并不是每次变更的时候就触发 的,而是master线程隔一段时间去处理的。所以最坏的情况就是事务提交后…

持续集成交付CICD:Jenkins配置Nexus制品发布

目录 一、实验 1.Jenkins配置Nexus制品发布 一、实验 1.Jenkins配置Nexus制品发布 (1)策略 发布其实就是下载制品,然后将制品发送到目标主机,最后通过脚本或者指令启动程序。 (2)安装Maven Artifact …

前端知识(十一)———js判断上传的文件是GBK编码还是UTF-8

1、获取文件二进制数据,这里只做示例,例如element-ui中文件上传的beforeUpload方法,返回的file对象,然后使用FileReader对其进行转换,再进行后续判断 function beforeUpload(file: File) { const reader new FileRe…

uniapp图片预览

用的是Uview组件库里面的 直接在页面写上&#xff1a; <u-album singleSize"100" :urls"[https://lxt.jingyi.icu/item.img]"></u-album> 这图片路径是我自己的 你们可以按照组件库里面的方法去实现

DataFrame的使用

查看数据类型及属性 # 查看df类型 type(df) # 查看df的shape属性&#xff0c;可以获取DataFrame的行数&#xff0c;列数 df.shape # 查看df的columns属性&#xff0c;获取DataFrame中的列名 df.columns # 查看df的dtypes属性&#xff0c;获取每一列的数据类型 df.dtypes df.i…

标准成本核算基础知识 – 了解间接费用成本流程 - Part4

原文地址&#xff1a;Basics of Standard Costing – Understanding overhead cost flow-Part 4 | SAP Blogs 这是我理解标准成本计算及其流程的另一篇文档的延续。 标准成本核算基础知识 - 了解成本构成结构 - 第 3 部分 管理费用是只能间接归因于产品的成本&#xff0c;例如…

react中使用react-konva实现画板框选内容

文章目录 一、前言1.1、API文档1.2、Github仓库 二、图形2.1、拖拽draggable2.2、图片Image2.3、变形Transformer 三、实现3.1、依赖3.2、源码3.2.1、KonvaContainer组件3.2.2、use-key-press文件 3.3、效果图 四、最后 一、前言 本文用到的react-konva是基于react封装的图形绘…

基础课20——从0-1客服机器人生命周期

温馨提示&#xff1a;篇幅较长&#xff0c;可点击目录查看对应节点。 1.机器人搭建期 搭建机器人包含&#xff1a;素材整理、问题提炼、相似问题补充、答案编辑、问题分配引擎等等步骤&#xff0c;不同厂商可能有所区别&#xff0c;但关键功能的实现离不开以下步骤。 1.1素材…

Flutter路由的几种用法

Flutter路由跳转 基本路由跳转 ElevatedButton(onPressed: () {//基本路由跳转Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return const SearchPage();}),);},child: const Text("基本路由跳转"), ), search.dart页面 impo…

说说react的事件机制?

React的事件机制是一种用于处理用户界面事件的方式&#xff0c;它建立在原生DOM事件的基础上&#xff0c;提供了一种更高级、更一致的方式来处理事件。 1. 合成事件&#xff08;Synthetic Events&#xff09;&#xff1a;React引入了合成事件的概念&#xff0c;它是一种React自…

K8S学习指南(3)-minikube的安装

这里写自定义目录标题 简介Windows 系统安装步骤 1&#xff1a;安装 Hypervisor步骤 2&#xff1a;安装 kubectl步骤 3&#xff1a;安装 Minikube步骤 4&#xff1a;启动 Minikube CentOS 系统安装步骤 1&#xff1a;安装 Hypervisor步骤 2&#xff1a;安装 kubectl步骤 3&…

《形式语言与自动机理论(第4版)》笔记(三)

文章目录 [toc]前导《形式语言与自动机理论&#xff08;第4版&#xff09;》笔记&#xff08;一&#xff09;《形式语言与自动机理论&#xff08;第4版&#xff09;》笔记&#xff08;二&#xff09; 第四章&#xff1a;正则表达式4.1|启示4.2|正则表达式的形式定义正则表达式性…

排序算法之四:直接选择排序

1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 2.直接选择排序 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的…

练习:最大公约数

1.什么是公约数 公约数&#xff0c;亦称“公因数”。 它是指能同时整除几个整数的数 。 如果一个整数同时是几个整数的 约数 &#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。 2.辗转相除法 辗转相除法之所以有效是因为其基于一个核心原…

给定有n个结点的树和长度为n的排列,q次询问:l, r, x, 若p[l, r]中存在至少一个结点是x的后代,输出yes,否则输出no

题目 #include<bits/stdc.h> using namespace std; const int maxn 1e6 5; int n, q; vector<int> G[maxn]; int L[maxn], R[maxn];//L[i]表示结点i的时间戳&#xff0c;R[i]表示结点i的后代中时间戳的最大值 int p[maxn]; int t[maxn]; struct Node{int id, fl…

MapReduce

1. 请解释MapReduce的工作原理。 MapReduce是一种编程模型&#xff0c;主要用于大规模数据集&#xff08;特别是非结构化数据&#xff09;的并行处理。这个模型的核心思想是将大数据处理任务分解为两个主要步骤&#xff1a;Map和Reduce。 在Map阶段&#xff0c;输入数据被分解…

ssm的健身房预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; ssm的健身房预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spring…

AI模型平台Hugging Face存在API令牌漏洞;大型语言模型与任务模型

&#x1f989; AI新闻 &#x1f680; AI模型平台Hugging Face存在API令牌漏洞&#xff0c;黑客可窃取、修改模型 摘要&#xff1a;安全公司Lasso Security发现AI模型平台Hugging Face上存在API令牌漏洞&#xff0c;黑客可获取微软、谷歌等公司的令牌&#xff0c;并能够访问模…

c++中的内联函数和编译器

内联函数和编译器&#xff1a; 内联函数并不是何时何地都有效&#xff0c;为了理解内联函数何时有效&#xff0c;应该要知道编译器碰到内联 函数会怎么处理&#xff1f; 对于任何类型的函数&#xff0c;编译器会将函数类型(包括函数名字&#xff0c;参数类型&#xff0c;返回值…

Unknown parameter in InstanceGroups[0]: “Configurations“, must be ... 解决方法

使用 aws emr modify-instance-groups 更新集群配置时可能会遇到如下错误信息&#xff1a; Unknown parameter in InstanceGroups[0]: “Configurations”, must be one of: InstanceGroupId, InstanceCount, EC2InstanceIdsToTerminate, ShrinkPolicy 这一报错其实和提供的j…