Redian新闻
>
架构设计:为什么说复用是邪恶的?

架构设计:为什么说复用是邪恶的?

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:zhuanlan.zhihu.com/
p/508877002

在系统设计和写代码的过程中,我经常会听到「复用」这个词,以「复用」为目的来设计技术,业务,组织架构。例如:

  • 抽象出一个类,函数,UI 组件,用于不同的场景
  • 抽象出一个微服务,越细越好,这样可以灵活的组合
  • 抽象出一个业务中台,沉淀各种基础业务功能,供全公司使用
  • 组织(管理)架构中,抽象出一个职能竖井(后端,前端,QA,财务),被不同的产品使用
  • 产品设计中要完成一个性能功能,发现跟之前一个功能相似,就复用之前的功能设计,改改继续用

为什么我们喜欢复用呢?

  • 主要目的:既然一部分功能已经存在,为什么还要自己造呢?直接拿来用,这样我可以做得更少,所以能够提升个人的生产效率。
  • 接受的教育:一直以来的教育,大部分工程师都学习过 DRY principle;《设计模式》的的英文书名就是 《可复用面向对象软件的基础》,都在强调复用。
  • 编程习惯:在面向对象语言里,工程师习惯了继承,而继承对于大部分人来说的目的就是复用

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

认为复用可以提高效率的推理逻辑是怎样的?

  • 如果我们要写一个系统的所有代码,我们需要写大量的代码。
  • 如果我们能从其他地方重用一些以前写过的代码,我们就能写更少的代码。
  • 我们能重用的代码越多,我们写的代码就越少。
  • 我们写的代码越少,我们就会越早完成系统!

这样的推理逻辑是存在如下误区:

  • 所有的代码(功能)需要相同的时间来写
  • 写代码是完成系统的最主要工作

如果你要写得代码依赖很多其他的「复用」模块,你就要去理解不同的「复用」模块提供的接口,很多时候只看文档都不行;如果「复用模块」的接口不是正好是适用你的场景,你就必须在讲究使用接口和对方排期之间进行选择。

此外对于如何抽象出一个公共业务模块,大部分人都没什么标准,公共业务模块的负责人成了业务的外包,效率更低。

另一点是任何维护生产环境系统的人都知道写代码只是整个工作中一小步,而且是确定性最高的一步,之后维护才是最占用时间的。我们需要不断地进行调试,部署,再调试,部署。一个用于很多依赖的模块相对依赖少的模块做这些工作的难度是高很多的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

你说复用带来了这么多问题,那我们平时使用各种框架,基础算法库都要自己写一份吗?

肯定不需要自己再写一份,我们平时会使用各种编程语言(Java,Go),框架,库。我们使用这些没有任何问题,因为这是共识和标准,他们是足够「通用,一般化」,并不是为了某个业务或者某个公司定制的。先有「共识,标准」,再谈复用,绝对不是随意的拿过来用。

那我设计系统时,尽量将我的设计通用化就好了(例如拆很多个 CRUD 的微服务),这样就能更多的进行复用,提高生产效率对吗?

复用不是系统要追求的目标。很多人认为更多模块的「复用」,就可以做到像乐高一样快速搭建系统,但是很多复用并不是乐高,而是器官移植,不仅不能提高效率,要不断面对各种各样的排异反应,降低了速度和稳定性。很多创业公司快速发展时系统腐化的主要问题就出现在了强行复用上。强行复用的案例很常见,例如:

  • 上百个字段的数据表(例如订单表,数据表),不清楚哪个字段在哪个场景下有效
  • 根据名词来设计系统,出现业务中台,例如订单中台,电商中台,各部门之间不断地扯皮
  • 出来无数个小的微服务,然后搞个统一的业务编排调度层(所谓的 gateaway)来处理业务,可能还抽象 DSL;上线十分复杂,需要发布 N 各模块;调度模块是系统大单点,稳定性迭代速度都是问题

如果有一个好的设计,我们需要谨记《Hints for Computer System Design》中的「Use a good idea again instead of generalizing it. A specialized implementation of the idea may be much more effective than a general one.」

那系统设计好的标准是什么?衡量的维度有优先级吗?

两个评价标准自治性和一致性:

  • 自治性:受其他模块的影响程度,观测模块的接口是否稳定。可以使用AutonomyMetrics[1] 进行衡量
  • 一致性:应该使用一个模块的地方使用一个模块的程度,也可以衡量是否过早,过度抽象了。可以使用 ConsistencyMetrics[2]

在业务层次是否要从多个业务模块中抽象出一个底层模块,可以通过多个业务模块的这部分公共逻辑部分是否要一起进行改变进行判断,如果不是需要一起变化的就不要抽象出公共模块。

根据个人经验如果你在要从各个业务模块进行抽象出一个模块保持一致与保持在模块保持自治之间犹豫时,要毫不犹豫优先选择「自治」。

总结

大部分情况下系统的核心复杂度不会减少, 只是转移;不会因为所有代码一个人写,会比分成两个人写更快,分工是应该且必须的。但是请注意的是:

  • 不要为了复用随意通用化,抽象化,复用不是目的。如果要通用化就拿ConsistencyMetrics[2] 来判断是否是抽象合理的。
  • 不要随意复用其他的模块,自治优先,用 AutonomyMetrics[1] 衡量;如果要复用一定要确保共识和标准优先,形不成共识和标准就不用复用。

相关链接:

  1. https://autonomy.design/Part1/AutonomyMetrics.html
  2. https://autonomy.design/Part1/ConsistencyMetrics.html

参考链接:

  1. https://zhuanlan.zhihu.com/p/356202989
  2. https://udidahan.com/2009/06/07/the-fallacy-of-reuse/
  3. https://zhuanlan.zhihu.com/p/138145081
  4. https://zhuanlan.zhihu.com/p/410049005


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
没戴口罩,在六千人的游轮上浪了十天,说说复阳的情况世界上最伟大最邪恶的软件发明大温新移民发帖:为啥大家买房一定都要买这种?有什么说法吗?是不是大陆人真的不行俄乌战争启示录:为什么说全世界的陆军都过时了贝特曼直播预告:为什么说在美留学,身份规划至关重要?保持善良,但请具备对恶人作恶的能力:感谢我的敌人芯片架构设计的新趋势武大教授的肺腑之言:为什么说新冠病毒一点都不可怕?李显龙盛赞:“对抗冠病大流行,它的作用是无价的!”宇宙人(1174期)加拿大创企开发可预测卫星运营商之间无线电干扰的软件;TAS获得在轨制造可复用航天器的研究合同新作速览丨“不正经的”建筑设计:折叠公园 / 靠近设计4只腊肠排队下坡去睡觉,主人爆贴心设计:爬楼梯会伤脊椎如何在面试中巧妙展现架构能力?附200道面试真题+100例经典架构案例拆解 | 极客时间“武大名嘴”赵林教授:为什么说“言必称希腊”?非常规移民背后的谎言后续:为什么说不要轻易相信“亲测有效”?支撑千亿级日交易额,平安科技分布式数据库架构设计燕王的形象为什么越变越邪恶?超融合架构与云、传统架构对比维也纳的音乐之夜 两条马腿上的国王 奥匈帝国4日游(4)计算机架构设计的 8 个伟大思想现场&直播|理想之城与家园设计:《建筑师的家园》新书分享会流程引擎的架构设计哈里王子自传爆猛料:在阿富汗杀了25人,曾担心卡米拉变成“邪恶的继母”,还被威廉动过手宋方金:为什么说现在的影视行业需要给编剧更多闪耀的瞬间?大佬思想:为什么说生成式 AI 正在催生科技业的回升如果面试官让你设计美团外卖的分库分表架构,就该这么说!壬寅球道仲秋-桂枝香新上任的财务总监,对财务部组织结构设计的调整川普推特帐号复活 马斯克称先前禁用是大错权力就是邪恶的一剂春药【庆生】半岛明珠酒家饮早茶场地规划与设计:宾大x清华,重新编著60年经典著作,一套全面、最新的工作指南​汽车芯片的可靠性设计:控制亚稳态,提升稳定性
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。