【架构艺术】代码架构治理之四层境界

2024-06-02 15:52

本文主要是介绍【架构艺术】代码架构治理之四层境界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近逐渐开始写一些简单且稍微务虚的文章。原因有挺多,其一是,自己的工作内容和企业的内部情况绑定的更加深入了,许多信息如果要在互联网上分享,需要考虑在很多地方做加工;其二是,过分拘泥于非常深度的技术挖掘,可能只能涉及到一些特定的领域,不利于技术博客的持续运营,并且从读者的视角,形式简单但内容富有思考的干货,才是真正有价值的产出。

因此,今天这篇文章,就从笔者自己的角度,谈一下代码架构治理的四层境界,把读者自己最深层的思考内容给解剖出来。希望这篇文章能够帮助到一些在代码架构治理工作方面,感受到痛点的同行们,让大家可以通过文章提到的一些思维工具,去解决实际工作中代码架构治理方面的问题。

这四层境界分别是:

  1. 套设计模式
  2. 自上而下需求拆解
  3. 自底向上模块抽象
  4. 网状概念聚类分层

第一层境界是套设计模式。犹记得刚开始接触代码工程架构的时候,我们都被灌输了很多设计模式相关的概念,小到工厂、责任链,大到DDD、BDD。这些看起来很高大上的名字,它们的实质是什么?是工具,是最为基础的代码架构思维工具。一个工具要有用武之地,必然有其背后合适的业务场景。理论上来讲,大多数的代码架构问题,通过套设计模式,遵循基本的重构原则,都是可以解决的。

设计模式不能解决的问题是什么呢?答案是:未知的领域。通俗地理解,设计模式就是前人已有的经验,在某类业务或者技术场景之下,沉淀出来的一套代码范式。但面对未知的领域,以前的设计模式是否可以起作用,哪些设计模式最为适合,都不是能够直接无脑确定的。未知的领域背后,本质上是未知的概念联系,如果直接套用某类设计模式,那么将来如果引入新的需求场景,既往的设计模式不适用,就会出现重构成本。

现今有很多技术同行的简历或者PPT上,都可能写通过DDD、BDD的思想,解决了某类技术问题。从笔者的角度认为,不同领域的概念模型其实是五花八门的,如果真的某类场景用了经典方法解决,要么是这类场景已经被研究透了,架构层面缺乏创新潜质,要么是自身实力不足,对技术缺乏独立思考,没有能力去灵活调配代码的架构,只能通过既有的思维去生搬硬套。如果有意识在简历或PPT重突出这类信息,这样的人才,假使面对未知的业务或技术领域,一定很难有能力去cover住代码架构。套设计模式的是一类人,如今,套GPT的也是这一类人。

第二层境界是自上而下需求拆解。需求拆解可以解决未知领域代码建模的问题,弥补纯设计模式的不足。做代码架构,本身即是对某类业务或技术场景的建模,当我们需要解决某些具体的问题时,一个最简便的办法是对需求本身做拆解,比如用金字塔模型,把大的问题划分为小的问题,然后分而治之。这样的一个好处是,我们很容易去构建出模块化、低耦合的代码架构模型,因为每一个需求的子问题都可以用单独的一套代码去解决。并且,在协同开发场景下,还能够保证各司其职,互不干扰,形成一套很完善的开发体系。

自上而下需求拆解,解决不了的问题是什么?答案是:认知的一致性。在先前的一篇文章里,通过一个自动化框架的例子就说明了这个道理,需求拆解是自上而下的,但技术实现是自底向上的。为什么要自底向上,其本质诉求就是在工程初始化环节,把最基础的认知概念给统一抽象起来,认知的一致性越多,代码需要受迫维护的内容就会越少。如果在工程代码开发方面,无脑通过需求拆解的方式构建不同的模块,那么必然会出现很多具备重复意义的代码。久而久之,就会形成技术债。

因此,要解决这个问题,我们需要踏入第三层境界,自底向上模块抽象。当需求自上而下拆解完成后,还有一个重要步骤是,把最底层需求涉及的共性概念给抽象出来,构建成一套公用基架。这套基架不仅是提升了代码的易维护性,而且更重要的,是决定了这个领域的基本概念认知。以游戏开发为例子,一个客户端研发团队,除了业务Gameplay研发的成员之外,一定还有部分成员会专攻游戏引擎的研发,去做好整块客户端代码的基架。有了这个基架,就不容易出现你实现一套,我实现一套的问题,从而让整个工程架构的底层逻辑都通顺起来。

对于一些小的研发团队,或者是个人开发者,在工程代码的呈现方面,很容易出现踏入第二层境界,但无法踏入第三层境界的情况,导致工程能力不能长久迭代。解决这个问题的方法就是,下手慢一拍。如果是在时间紧张的情况下,需要注意在写完demo期代码之后,顺便构思好代码重构的路径,留有后手。做出10分,交付7分,这样就能够保证工作产出的弹性。

当然,自底向上模块抽象,也有解决不了的问题,那就是概念分层。如果一味陷入共性抽象,一味通过【加一层】的方法解决技术问题,就容易出现层次冗余,难以重构的情况。一套抽象下来,看起来代码可读性不错,但整个工程的内在结构太复杂,就会导致可读性不高。虽然每块代码的责任是分明了,但不同模块之间的关系很不清晰。A调了B,B调了C,C又调了A,从而导致代码之间出现循环依赖的风险。然后,哪天项目需要升级了,要么就是弄个V2,要么还往原来的层次上加,这样就会降低整个项目的可迁移可复用能力。

要解决这个问题,我们就需要踏入第四层境界,网状概念聚类分层。我们需要了解一个本质是,不论是那种业务或技术领域,底层概念之间的关系,都是网状结构的。通过纯代码的方式,不可能模拟网状结构的概念,但是我们可以通过聚类分层的方式,把一些同质的概念放到相同的层次,并且同时保证层次的数量尽量少,从而在尽可能简明工程架构的同时,达到需求预期的效果。

那么,如何去把聚类分层这个事情给做好呢?一个重要的关键点就是,根据不同的视角,来划分不同的层次。举个例子,一个后端服务,从服务框架的视角,可以分出来handler/service/dal/util几个层次;从业务视角,可以在service内部,分出来app/core/3rd等几个层次(当然,微服务的话,可以把3rd提到外面,app跟core都不要)。基本上一个后端项目,代码最多3~4层就可以解决问题,如果还存在需要加一层的情况,就从更高的服务架构维度去解决,而不是再拘泥于已有的代码项目。

分清每块代码的责任很重要,但如何构建每块代码的层次梯度也很重要。解决了低耦合问题,也要解决高内聚问题,这样才能让整个代码的架构变得游刃有余。

这篇关于【架构艺术】代码架构治理之四层境界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024412

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1