敏捷开发笔记(第7章节)--什么是敏捷设计

news2024/11/25 11:32:12

目录

1:PDF上传链接

7.1: 软件出了什么错

7.2: 设计的臭味--腐化软件的气味

7.2.1: 什么激化了软件的腐化

7.2.2: 敏捷团体不允许软件腐化

7.3: “copy”程序

1: 初始设计

2: 需求在变化

3: 得寸进尺

4: 期望变化

7.3.1: “copy”程序的敏捷设计

7.3.2: 敏捷开发人员如何知道要做什么

7.4: 保持尽可能好的设计

7.5: 结论


 

1:PDF上传链接

【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库

        “在按照我的理解方式审查了软件开发的生命周期后,我得出一个结论:实际上满足工程设计标准的唯一软件文档,就是源代码清单。”

                                                                                        --Jack Reeves

7.1: 软件出了什么错

        项目开始的时候,软件设计就会存在脑中,有了初步的设计与规划。

        接着,在后续的项目进行中,使得它越来越难维护,最后即使进行简单的更改,也要需要花费巨大的努力,以至于管理人员强烈要求进行重新设计。

        这样的重新设计很少会成功,虽然设计人员开始时出于好意,但是他们发现自己正照一个移动的目标射击。老系统不断地发展,变化而新的设计必现跟上这些变化。这样甚至在第一次发布前,新的设计中就累积了很多的瑕疵和弊病。

7.2: 设计的臭味--腐化软件的气味

        当软件出现下面任何一种气味时,就表明软件正在腐化。

        僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。

        脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。

        牢固性:很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。

        粘滞性:做正确的事比做错误的事情要困难。

        不必要的复杂性:设计中包含有不具任何直接好处的基础结构。

        不必要的重复:设计中包含有重复的结构,而该重复的结构体可以使用单一的抽象进行统一。

        晦涩性:很难阅读、理解。没有很好地表现意图。

7.2.1: 什么激化了软件的腐化

        在非敏捷环境中,由于需求没有按照初始设计遇见的方式进行变化,从而导致设计的退化。通常的修改都是急迫的,在还不是很了解开发者最开的设计思路进行修改,修改的时候会违反原始的设计,随着改动的不断进行,这些违反渐渐地积累,设计开始出现臭味。

        我们必须要设法找到一种方法,使得设得对于这种变化具有弹性,并且应用一些实践来防止设计腐化。

7.2.2: 敏捷团体不允许软件腐化

        敏捷团队依靠变化来获取活力。团队利用灵活性,持续的改进设计,以便于每次迭代结束所生成的系统都具有最适合于那次迭代中的需求的设计。

7.3: “copy”程序

        观看一个设计的腐化过程会有助于阐述上述的观点。比如老板要求写一个从键盘输入字符并输出到打印机的程序。经过考虑后,判断代码不会超过10行,时间不会超过1个小时。但是考虑到交叉会议、质量教育会议,日常小组会议以及当前正在处理的难题,要完成这个程序要花费大约一个星期的时间---如果你下班后仍坚持工作的话。不过你总是把估值乘以3

        “需要3周时间”,你告诉老板,老板哼着走开了,把任务留给你了。

1: 初始设计

    图7.3.1.1

2: 需求在变化

        几个月后,老板说希望copy程序能从纸带读入机中读入信息。你咬咬牙翻着白眼,你想知道为何人民总是改变需求。你的程序不是为了纸带读入机设计的。

        开始修改方案,在copy的函数中添加一个boolean变量,如果变量为true就从纸带读入机中读取信息,否则就像之前一个从键盘从读取信息。槽糕的是很多人程序都在使用copy程序,你不能改变copy程序的接口。改变接口会导致长时间的重新编译和重新测试,但但是系统测试工程师就会痛恨你更别提配置控住组的7个家伙了。并且过程控制部门会专门的一天时间来对所调用了copy的模块进行各种各样的代码评审。

        不能改变接口使用C语言的操作符;

图7.3.2.1

3: 得寸进尺

        几周后,老板又提了新的需求,客户希望copy程序可以输出到纸带穿孔机上。

        你告诉老板不断地变更会对设计的优雅性造成极度的负面影响,你警告的说这样继续变更,那么年底前,软件会变得难以维护。老板心照不宣的点点头,然后说就是要改。

图7.3.3.1

4: 期望变化

        请读着自行判断上述说的有多少是夸大之词,上面主要说明在变化面前,程序的设计退化的速度是多么的快。copy程序的原始设计师简单并且优雅的。但是经过两次变更它就会出现僵化性、脆弱性、牢固性、不必要的复杂性、不必要的重复及晦涩性的病症。这种趋向继续下去,程序将会变得混乱不堪。

        我们可以坐下来去指责变化,可以抱怨程序对于最初的要求是设计良好的,是因为后来对要求的改变导致了设计的退化。然而就是忽略了这个变化的重要原因:需求总是在变化。

        记住,在大多数项目中最不稳定的东西就是需求。需求处于在一个持续变动的状态中。这个是我们作为开发人员必须得接受的事实!我们生存在一个需求不断变化的实际中,我们的工作是要保证我们的软件能够经受得住那些变化。如果我们软件的设计由于需求的变化而退化,那么我们就不是敏捷的。

7.3.1: “copy”程序的敏捷设计

        

图7.3.1.1 

        团队遵循了开发-封闭原则(简称OPC)我们将在第九章学习它。这个原则指导我们设计出无需修改即可扩展的模块,这个正式团队已经完成的,无需修改copy程序就可以使用老板要求的每种新的输入设备。

        有人认为他们仅仅完成了一半的工作,他们在使自己免于不同的输入设备带来的麻烦时,本可以也使自己免于不同的输出设备带来的麻烦。然而,团队实在不知道输出设备是否会变化,现在就添加而外的保护没有任务实现意义。很明显,如果需要这种保护时,以后可以非常容易的添加。因此,实在没有现在就添加的理由。

7.3.2: 敏捷开发人员如何知道要做什么

        在上面的例子中,敏捷开发人员构建了一个抽象类,来使他们免于输入设备的变化带来的麻烦,他们如何知道要那样做呢?这和面对对象设计的基本原则中的一个有关。

        程序在设计的时候,我们知道copy模块依赖键盘和打印机的底层细节。因而当底层细节变化的时候,上层的应用模块会受到影响。

        一旦暴露出了这个不灵活性,敏捷开发人员应该知道从copy模块到输入设备的依赖关系需要被倒置,这样copy模块就不再依赖输入设备。于是他们就应用STRATEGY模式创建了想要的倒置关系。

        因此,简而言之,敏捷开发人员知道要做什么,是因为:

                (1)遵循敏捷实践去发现问题;

                (2)应用设计原则去诊断问题;

                (3)应用适当的设计模式去解决问题;  

7.4: 保持尽可能好的设计

        敏捷开发人员致力于保持设计的干净。每时每刻都在遵守这个原则,不会让腐化出现。

        设计必须要保持干净、简单,并且由于源代码是设计最重要的表示,所有它同样保存干净。职业特性要求我们,作为软件开发人员,不能忍受代码腐化。

7.5: 结论

         那么,什么是敏捷设计呢?敏捷设计就是一个过程,不是一个事件。它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程。它致力于保持系统设计在任何时间都尽可能得到简单、干净以及富有表现力。

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

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

相关文章

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中,我遇到过一位特别引人注目的同事,我们都叫他李经理。他的工作能力并不差,但他有一个习惯,那就是喜欢邀功。他的这种习惯,不仅让我印象深刻,也让我在合作中学会了不少东西。 恶心的四件事 …

MySQL学习笔记-进阶篇-视图和存储过程

四、视图和存储过程 视图 存储过程 基本语法 创建 CREATE PROCEDURE ([参数列表]) BEGIN --SQL END; 调用 CALL 存储过程名([参数列表]) 查看 --查看指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SHCEMA…

AI-智能体

什么是 AI 智能体? 「AI 智能体」这个术语并没有真正被定义,对智能体究竟是什么也存在很多的争议。 AI 智能体可以定义为「一个被赋予行动能力的 LLM(通常在 RAG 环境中进行函数调用),以便在环境中对如何执行任务做出…

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing,所以了解了一下~ 了解: Swing是Java的标准库(Java Foundation Classes, JFC)的一部分,用于构建桌面应用程序的图形用户界面(GUI)。它是Java AWT…

华为某员工爆料:三年前985本科起薪30万,现在硕士起薪还是30w,感慨互联网行情变化

“曾经的30万年薪,是985本科学历的‘标配’,如今硕士也只值这个价?” 一位华为员工的爆料,揭开了互联网行业薪资变化的冰山一角,也引发了不少人的焦虑:互联网人才“通货膨胀”的时代,真的结束了…

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获 Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获一、前期准备二、案例分析1、不恰当的异常转换2、不充分日志记录3、过度或不当的异常捕获 三、正确处理方式1…

2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等

6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation LlamaGen,是一个…

C++20中的Feature Test Mocros

C20定义了一组预处理器宏,用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细…

Edge 浏览器退出后,后台占用问题

Edge 浏览器退出后,后台占用问题 环境 windows 11 Microsoft Edge版本 126.0.2592.68 (正式版本) (64 位)详情 在关闭Edge软件后,查看后台,还占用很多系统资源。实在不明白,关了浏览器还不能全关了,微软也学流氓了。…

计算机网络期末

1、IP 地址为:192.168.0.254,它的子网掩码应该为( ) A.255.255.255.0 B.255.255.254.0 C.255.255.252.0 D.255.255.0.0 2、最容易产生网络可靠性瓶颈问题的拓扑构型是( )。 A 总线型 B 星型 C 环型 D 网状型 3、HTTP 就是电子邮件阅读协议&#xff0…

Android开发实用必备的几款插件,提高你的开发速度

1.GsonFormat 使用方法:快捷键AltS也可以使用AltInsert选择GsonFormat,作用:速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。 2.ButterKnife Zelezny 又叫黄油刀 使用方法:CtrlS…

Java程序之动物声音“模拟器”

题目: 设计一个“动物模拟器”,希望模拟器可以模拟许多动物的叫声和行为,要求如下: 编写接口Animal,该接口有两个抽象方法cry()和getAnimalName(),即要求实现该接口的各种具体的动物类给出自己的叫声和种类…

PostgreSQL如何定义缓冲区管理器?

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统(RDBMS),它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

史上最强面试题,拿大厂京东,阿里offer全靠它。程序员必看。

答:对于short s1 1; s1 s1 1;由于1是int类型,因此s11运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 1; s1 1;可以正确编译,因为s1 1;相当于s1 (short)(s1 1);其中有隐含的强制类型转换。 #6、Java 有…

Trimesh介绍及基本使用

Trimesh介绍及基本使用 Trimesh是一个纯Python 工具库(支持3.7版本以上),用于加载和使用三角形Mesh网格,支持多种常见的三维数据格式,如二进制/文本格式的STL、Wavefront OBJ、二进制/文本格式的PLY、GLTF/GLB 2.0、3…

食谱API

在当今追求健康与美味完美结合的时代,获取准确而丰富的食品和营养信息变得至关重要。无论是热衷于探索世界各地美食的烹饪爱好者,还是对自身饮食营养严格把控的健康追求者,都离不开可靠的资源。幸运的是,现在有诸如 TheMealDB 和 …

测试辅助工具(抓包工具)的使用2 之 抓包工具的基本用法

1.过滤设置: Filters- --- 勾选use Filters- --- 下拉选择show only the following hosts ---- 输入域名或者ip地址(多个地址用;隔开) --- 点击action(Run filterset now) 2.删除数据 方式一:点击Remove all 方式二: 黑窗口输入cls,回车 删除一条数据:选中数据---右键选择Rem…

LabVIEW电路板故障诊断系统

基于LabVIEW软件开发的电路板故障诊断系统,涵盖功能测试、性能测试和通讯测试等多个方面。系统集成了多种硬件设备,包括NI PXI-1033机箱、NI PXI-4071数字万用表、NI PXI-4130电源模块、NI PXI-8512 CAN模块等,通过模块化设计实现了对电路板的…

Tortoise 删除文件

1、右击需要删除的文件,选择Delete 2、提交

0基础学习线段树

前言: 线段树:用树来表示一个一个的线段区间。 1、为什么要使用线段树? 题目:给定一个数组nums,我们有两种下面两种操作 1、查询nums数组下标i到下标j的和; 2、将nums数组指定下标的值改为指定的一个新…