程序员基操——如何应对需求变更的“范畴”和“形状”

2023-09-20 09:42:41

前言

架构整洁之道读后感,随笔

原文引用有删减,虽然我认为原文每一个字都很有价值,值得推敲,但是考虑到自己程序员的身份,必须懒点,才能融入大家

喜欢交流的小伙伴私信加群

引用文字

为了达到软件的本来目的,软件系统必须够“软”——也就是说,软件应该容易被修改。当需求方改变需求的时候,随之所需的软件变更必须可以简单而方便地实现。变更实施的难度应该和变更的范畴成等比关系,而与变更的具体形状无关。

需求变更的范畴与形状,是决定对应软件变更实施成本高低的关键。这就是为什么有的代码变更的成本与其实现的功能改变不成比例。

从系统相关方的角度来看,他们所提出的一系列的变更需求的范畴都是类似的,因此成本也应该是固定的。但是从研发者角度来看,系统用户持续不断的变更需求就像是要求他们不停地用一堆不同形状的拼图块,拼成一个新的形状。整个拼图的过程越来越困难,因为现有系统的形状永远和需求的形状不一致。

问题的实际根源当然就是系统的架构设计。如果系统的架构设计偏向某种特定的形状,那么新的变更就会越来越难以实施。所以,好的系统架构设计应该尽可能做到与“形状”无关。

原文

原文如下:
在这里插入图片描述在这里插入图片描述

感悟

这段文字我大概来来回回读了三五遍。

习惯了项目开发的程序员,抱怨最多的一句可能就是需求为什么总是不固定,来回变更,用户和产品经理都太不专业了。

殊不知,这是他架构设计的问题。

我们习惯了用解耦、分层等等词汇来掩盖我们贫瘠的思维,实际真正设计的时候,也不过是照猫画虎,真的问过自己这里为什么要解耦,那里为什么要分层吗。

业务和代码是没有办法完全割裂的,毕竟代码最终就是为了实现业务。但是代码里,究竟是百分百和业务关联,还是只有百分之一必须关联,是我们架构设计时必须要考虑的。

业务千变万化,我们控制不了和它相关联的代码大概率会有变动,但是我们可以控制,这部分代码尽可能控制在极小的范围内。而这极小的变动,又以一种极小的代价去适配新的“形状”变化,比如策略模式,比如“形状”的实现和“形状”的使用分离。

这里可以套用我曾经做过的比喻:程序员的工作就像是在做车轮,当不同的用户提出不同的需求,我们需要重新设计车轮的大小与品牌,这是“形状”的实现;但我们不需要重新设计车轮和汽车之间的螺丝,因为那是在架构设计之初就确定的输入与输出,这是“形状”的应用。

更多推荐

2023 Google开发者大会:你了解机器学习的新动向吗?

目录0年度科技盛会1生成式机器学习2无障碍游戏体验3跨平台机器学习总结0年度科技盛会2023Google开发者大会在上海浦东举办,为开发者和科技爱好者们带来新技术、新产品、新动向可能很多同学对Google开发者大会还不熟悉,Google开发者大会是Google展示最新产品和平台的年度盛会,为开发者提供丰富的学习资源、实

【力扣周赛】第 363 场周赛(完全平方数和质因数分解)

文章目录竞赛链接Q1:100031.计算K置位下标对应元素的和竞赛时代码写法2——手写二进制中1的数量Q2:100040.让所有学生保持开心的分组方法数(排序后枚举分界)竞赛时代码Q3:100033.最大合金数(二分答案)竞赛时代码Q4:8041.完全子集的最大元素和竞赛时代码——质因数分解+哈希表解法2——定义cor

深度学习编译器关键组件

1高层中间代码为了克服传统编译器中采用的IR限制DL模型中复杂计算的表达的局限性,现有的DL编译器利用高层IR(称为图IR)进行高效的代码优化设计。1.1图表示基于DAG的IR:基于DAG的IR是编译器构建计算图的最传统方法之一,它将节点和边组织为有向无环图(DAG)。在DL编译器中,DAG的节点表示原子DL运算符(卷

git使用详解

目录一,什么是git?二,如何安装git三,git的基本操作1.创建git本地仓库2.配置本地仓库3.认识工作区,暂存区,版本库。4.基本操作-添加文件5.基本操作-查看文件6.基本操作-修改文件7.版本回退8.撤销修改四.分支管理1.创建分支2.删除分支3.合并冲突4.分支管理策略5.bug分支6.强制删除分支五,远

网络爬虫-----初识爬虫

目录1.什么是爬虫?1.1初识网络爬虫1.1.1百度新闻案例说明1.1.2网站排名(访问权重pv)2.爬虫的领域(为什么学习爬虫?)2.1数据的来源2.2爬虫等于黑客吗?2.3大数据和爬虫又有啥关系?2.4爬虫的领域,前景3.总结什么是爬虫?爬虫能抓取拿些数据?1.什么是爬虫?本节课程的内容是介绍什么是爬虫?爬虫有什么

【内网穿透】Python一行代码实现文件共享,并实现公网访问

目录1.前言2.本地文件服务器搭建2.1.python的安装和设置2.2.cpolar的安装和注册3.本地文件服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用,对于个人用户也有很强的实用意义。也正

前端--HTML

文章目录HTML结构快速生成代码框架HTML常见标签表格标签编写简历信息填写简历信息Emmet快捷键HTML特殊字符一、HTML结构1.认识HTML标签HTML代码是由"标签"构成的.形如:<body>hello</body>标签名(body)放到<>中大部分标签成对出现.<body>为开始标签,</body>为结束标

机器学习实战:Python基于NN神经网络进行分类(十一)

文章目录1前言1.1神经网络的介绍1.2神经网络的应用2.Tensorflow实战演示2.1导入函数2.2导入数据2.3数据预处理2.4建立神经网络2.5训练模型2.6评估模型2.7预测3.讨论1前言神经网络(Neuralnetwork,NN)机器学习是一种基于人工神经网络的机器学习方法,它模拟了人类神经系统的工作原理

Go expvar包

介绍与使用expvar是exposedvariable的简写expvar包[1]是Golang官方为暴露Go应用内部指标数据所提供的标准对外接口,可以辅助获取和调试全局变量。其通过init函数将内置的expvarHandler(一个标准httpHandlerFunc)注册到http包ListenAndServe创建的默

学Python的漫画漫步进阶 -- 第十五步.访问数据库

学Python的漫画漫步进阶--第十五步.访问数据库十五、访问数据库15.1SQLite数据库15.1.1SQLite数据类型15.1.2Python数据类型与SQLite数据类型的映射15.1.3使用GUI管理工具管理SQLite数据库15.2数据库编程的基本操作过程15.3sqlite3模块API15.3.1数据库

MyBatis获取参数值的两种方式#{}和${} 以及 获取参数值的各种情况

一、参数值的两种方式#{}和${}在MyBatis中,可以使用两种方式来获取参数值:#{}和${}。1.#{}:这是MyBatis推荐使用的方式。在SQL语句中使用#{},MyBatis会自动将参数值进行预编译处理,防止SQL注入攻击,并且可以处理各种类型的参数(如字符串、数字、日期等)。例如:<selectid="g

热文推荐