【架构笔记1】剃刀思维-如无必要,勿增实体

2024-02-28 07:44

本文主要是介绍【架构笔记1】剃刀思维-如无必要,勿增实体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎来到文思源想的架构空间,前段时间博主做了一个工作经历复盘,10年开发路,走了不少弯路,也算积累了不少软件开发、架构设计的经验和心得,确实有必要好好盘一盘,作为个人的总结,同时也留给有缘读过的人,带给一丝启发或者少走一点坑,都是好事。于是有了这个文思架构笔记这个专题的想法,未来会陆陆续续梳理一些自己总结的东西和正在发生的事情,作为留存,也作为纪念。今天是第一篇——关于剃刀思维!

“如无必要,勿增实体” ,这句话来自奥卡姆剃刀原理的核心说明,针对云服务架构它也是非常必要。老子说大道至简,亚里士多德说自然界选择最短的道路,产品交互设计也有个理念叫less is more -- 少即是多。它不只是告诉人们要做减法,而是更多去思考我们实现功能外引入新的复杂度和问题,充分考虑和权衡。

在云服务架构演进中我们看到了许多演进共同的现象,为了多活我们引入了多活控制器,为了一个新增业务避免老功能受到影响,采用新增服务的方式隔离变化,为了调用尽量少的改动,我们将一个请求扩充到五六跳甚至更多。但是做法却同时也带了一些新的影响:

  • 首先服务调用链路更长了,这引入了更高的服务治理复杂度,我们不再是简单几跳解决一个请求,而是更多的中转也带了更多定位问题的复杂性,功能实现或许改动小了,但是未来压测、定位复杂问题更多了。
  • 其次引入新服务和模块,拆分微服务,更多的其实应该考虑的是业务的解耦,功能的复用,而不是站在小组的角度,考虑什么好做把几个功能聚合在一起,微服务架构设计虽然必然走向康威定律的方向(组织结构决定代码架构),但是实际上是需要有人做好评审和管控的。新增服务并不一定是好事,这个事情是需要评审和确定的,或者做一做减法,常常问一些新的问题:
    • 如果不要新增,是否能完成功能;
    • 如果新增服务带来哪些运维架构、安全、服务治理的隐患;
    • 是否还有其他更好的解决思路。

接着还有多活这个话题,通常多活在云服务架构里面有多种拆分方式,集群方案和多活控制器,当然采用上游负载均衡hash或者一致性hash找到下游服务的方式,这无疑是最常用的解决思路,但是他的问题也同样多:

  • 服务实体增多,部署复杂度、部署规格要求逐步放大,以前可能一个服务搞定的事情现在可能需要两个或者三个,这里是实打实的成本上升,私有云环境下以前可以四五十核搞定一个环境,而如今不下数百核一个最小系统都不能完备。诚然我们功能在增多、业务在复杂,但是我们每套云的用户数、规模并没有增大到数量翻倍的情况,这里的问题就是引入实体,但是没有做减法,没有定期回顾,看看哪里不合理。
  • 服务发现、服务间通信问题变得更加紧密,定位问题也成为了一个难点,再加上某些开源软件在调用链上的特殊性,导致治理和灰度成为了很棘手的问题。

最后我想到的则是设计和建模中的抽象,通常通过业务场景分析、用户动作行为拆解,我们会在概要设计中产生许多概念,但是落地的时候实际上是需要区分什么是视图层什么是核心层模型的,把变化留在视图层,而核心层模型的定义,我认为是要经过头脑风暴和反复核对的:

  • 把多余属性拆解到极致,去除掉一切冗余字段
  • 反思如何把业务用几句话说清楚,弄清楚关键模型和关键动作,然后还能看到未来的变化,以及未来我们怎么应对变化

虽然他们不全是领域驱动设计,但是也包含了领域驱动的一些思想。分析业务场景时候由少到多,遍历细节,建模归纳时候由多到少,用核心模型、动作,充分裁剪,最后通过考虑特殊情况,补充场景。最后的最后就是问一问能不能少一些实体,少一些不一样的接口,能否复用。

总之,接口、模型、字段、调用、服务、业务他们都是所谓的实体,如无必要勿增实体,我们设计时候就需要考虑这些实体存在的必要性,同时反思是否会带来影响其他必要实体的问题。功能实现简单性只是一个新增的理由,我们更多想想未来治理的代码,部署的复杂性,额外新增的机器和研发消耗更多的精力,以及冗余引起的争议和误会。我们不仅要实现功能,还需考虑业务的解耦,更要考虑实体的熵增。人熵增需要断舍离,软件系统熵增则需要重构,盘点、分析、归纳合并、设计、重构,这个事情是需要持续进行,是需要自上而下倡导,最终最下而上显现。

当然剃刀思维还有一个关键,就是我们有他,但是最好不需要它当一个不需要的实体存在,这个实体就会开始证明自己存在的必要,其他原来必要存在的实体也会因为他的存在而容易自发建立一套与它有关的新协作或者新习惯。老业务会通过新部门形成砍不掉的冗余流程,豆浆机也会在你买菜时候提醒你多买一些吃不完的豆子,这个时候在用剃刀就很难了,剃了就会很疼很受伤,然后就需要权衡有了犹豫。勿增实体而不是剃掉实体,是因为剃刀思维的关键是一开始就找到这些不需要的实体,防患于未然,所以需求评审、架构设计、模型设计、调用流程设计都需要有这样的思考和审核,从一开始就找到这些没有必要存在的实体。

剃刀的真意在于止“繁”存"简" ----心存一刀,只留必要,心中有刀无需用刀,才是最好的状态,或许这是必字的另一种解释,也是我们设计架构的一个需要重视的要诀。

这篇关于【架构笔记1】剃刀思维-如无必要,勿增实体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

mybatis的整体架构

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

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

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

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓