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

目录

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.mzph.cn/web/32558.shtml

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

相关文章

leetcode 二分查找·系统掌握 有效的完全平方数

题目: 题解: 就是一个非常普通的二分查找,但是需要注意的是查找的上下界,因为是完全平方,所以可以把上界设为这个数的一半,但是要特殊处理num等于1的时候。 bool isPerfectSquare(int num) {if(num1)retur…

element-plus form表单组件之el-date-picker日期选择器组件

el-date-picker日期选择器组件可根据年,月,日期,时间范围来进行选择,可以自定义日期格式,和样式,还提供多种内置事件。 主要属性如下 属性名说明类型可选值默认值model-value / v-model绑定值&#xff0c…

qt开发-11_Dialog 仿苹果支付界面

QDialog 是 Qt 框架中用于创建对话框的一个基类。对话框是一种特殊类型的窗口,通常用于短暂的交互和信息交换,如接收用户输入、显示消息、询问用户决定等。QDialog 提供了一种方便的方式来实现这些功能,并能够控制用户与其他窗口的交互性&…

自动更新阿里云CDN SSL证书

deploy-certificate-to-aliyun 随着各大CA机构开始收割用户,云厂商们提供的免费SSL证书也由之前的12个月变成现在的3个月。笔者一直使用阿里云的OSS作为图床,说实话在如果继续在阿里云上三个月免费一换也太频繁了 笔者在这里使用github action来每隔两个…

C++ (week9):Git

文章目录 1.git介绍2.git安装3.git配置4.获取自己的SSH公钥5.新建仓库6.邀请开发者7.克隆远程仓库到本地8.在本地进行开发9.本地项目推送到远程仓库10.git的工作原理11.分支管理(1)合作开发的方式(2)分支管理(3)分支合并的原理、冲突管理 12.git 与 svn 的区别13.设置alias别名…

内容安全复习 8 - 视觉内容伪造与检测

文章目录 研究背景内容伪造方法虚假人脸生成人脸替换属性编辑表情重演跨模态人脸编辑 伪造检测方法眨眼检测交互式人脸活体检测一些了解方法挑战 研究背景 图像内容篡改造成新闻报道的偏颇易导致社会和公共秩序的不安,对公共安全产生不良影响。 造成的影响&#x…

达梦8 通过日志解释数据守护系统的关闭顺序

关闭守护系统时,必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换 模式,如果退出守护进程或主备库的顺序不正确,可能会引起主备切换,甚至造成守护进程 DM 数据守护与读写分离集群组分裂。 官方推荐通过在监视器执行…

macbook配置adb环境和用adb操作安卓手机

(参考:ADB工具包的安装与使用_adb工具箱-CSDN博客) 第一步:从Android开发者网站下载Android SDK(软件开发工具包)。下载地址为: 第二步:解压下载的SDK压缩文件到某个目录中。 进入解…

现在的Android程序员为什么会感到焦虑?焦虑的源头在哪里?该怎么去缓解焦虑呢?——没有无中生有的贩卖焦虑,只有你的挣扎和不甘。

二、知识为何产生焦虑 先说两个世界,知识的世界和现实的世界。 知识的世界,由承载知识的那些载体组成,比如图书、音视频、报刊、自媒体等。 现实的世界,就是我们每天生活的、做出各种行为的世界。 学习的目的是什么呢&#xff1…

[spring] Spring MVC Thymeleaf(下)

[spring] Spring MVC & Thymeleaf(下) 上篇笔记讲了一下怎么使用 thymeleaf 作为 HTML 模板,与 Spring MVC 进行沟通,这里主要说一下验证的部分 常用表单验证 一些 Spring MVC 内置的常用验证注解如下: Annota…

[面试题]MongoDB

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

uniapp运行到模拟器(联想模拟器)

记录一下uniapp项目运行到联想模拟器的流程 先配置一下模拟器端口 填写对应的adb路径,也就是模拟器安装路径下的adb.exe的路径 然后打开模拟器的设置,搜索版本找到版本号,多次点击打开开发者模式 进入开发者选项,打开USB调试 …

Android实战之app版本更新升级全文章(二)

BaseAndroid.checkUpdate(MainActivity.this, 2, “http://f5.market.mi-img.com/download/AppStore/0f4a347f5ce5a7e01315dda1ec35944fa56431d44/luo.footprint.apk”, “更新了XXX\n修复OOO”, false); 看看效果图 界面有点丑,自己修改下吧 当然啦&#xff0c…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

Ubuntu系统通过GRUB引导菜单进入恢复模式修改账户密码

当在Ubuntu系统中忘记了账户密码时&#xff0c;有几种方法可以破解或重置密码。 本指引文档方法&#xff1a;通过GRUB引导菜单进入恢复模式 实践环境为&#xff1a;20.04.6 LTS (Focal Fossa) 1. 重启Ubuntu系统&#xff1a;首先&#xff0c;你需要重启你的Ubuntu系统。 2. …

Redis 7.x 系列【3】多种连接方式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. Redis Cli3. 可视化管理工具3.1 Redis Insight3.2 RedisDesktopManager 4. …

Windows环境利用 OpenCV 中 CascadeClassifier 分类器识别人眼 c++

Windows环境中配置OpenCV 关于在Windows环境中配置opencv的说明&#xff0c;具体可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程。 CascadeClassifier 分类器 CascadeClassifier 是 OpenCV 库中的一个类&#xff0c;它用于实现一种快速的物体检测算法&#xff0c;称…

day41--Redis(三)高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

腾讯Hardcoder-Android通讯框架简介

APP 的功能和业务特性不依赖于该框架。 总而言之&#xff0c;由于Hardcoder是腾讯主导的&#xff0c;所以我们不用太担心兼容性问题&#xff0c;腾讯会和手机厂商进行洽谈并提供解决方案&#xff0c;并且目前已经支持Hardcoder框架的手机厂商有OPPO、vivo、华为、小米、三星、…

【C++】————类和对象(中)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月22日 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#x…