0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-12-02 14:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

为什么我们喜欢复用呢?

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

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

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

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

总结

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

抽象出一个类,函数,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] 衡量;如果要复用一定要确保共识和标准优先,形不成共识和标准就不用复用。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2849

    浏览量

    53436
  • 函数
    +关注

    关注

    3

    文章

    4422

    浏览量

    67847
  • 架构设计
    +关注

    关注

    0

    文章

    33

    浏览量

    7255

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

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何确保微电网标准化架构设计流程的完整性?

    当前,微电网建设普遍存在设计流程碎片化、环节衔接不畅、标准执行不到位、成果追溯缺失等问题,导致架构设计与实际需求脱节、工程落地困难、运维成本偏高,甚至影响系统长期稳定运行。GB/T
    的头像 发表于 04-24 11:19 42次阅读
    如何确保微电网标准化<b class='flag-5'>架构设</b>计流程的完整性?

    交直流混合微电网:混合架构的设计挑战与解决方案

    “交直流协同、源荷直连、高效节能”为核心,其混合架构的合理设计成为关键,但在工程实践中,混合架构设计面临诸多技术挑战,如何破解这些难题、优化架构设计,成为推动交直流混合微电网规模化落地的核心命题。本文
    的头像 发表于 04-20 16:47 902次阅读
    交直流混合微电网:混合<b class='flag-5'>架构</b>的设计挑战与解决方案

    交流微电网架构设计:拓扑结构、核心组件与适配场景

    “双碳”目标实现的重要载体。交流微电网架构设计的核心,是通过合理规划拓扑结构、科学配置核心组件,实现与应用场景的精准适配,最终达成安全稳定、高效经济的运行目标。拓扑结构决定架构的整体布局与运行特性,核心
    的头像 发表于 04-09 16:54 817次阅读
    交流微电网<b class='flag-5'>架构设</b>计:拓扑结构、核心组件与适配场景

    西格电力微电网总体架构设计:分层分布式控制体系构建

    随着分布式新能源规模化渗透、负荷需求多元化升级,微电网作为整合“源、储、荷、网”多单元的新型能源系统,其安全稳定、高效经济运行的核心诉求,对总体架构设计与控制体系提出了更高要求。微电网总体架构是系统
    的头像 发表于 03-31 11:44 511次阅读
    西格电力微电网总体<b class='flag-5'>架构设</b>计:分层分布式控制体系构建

    2022全新版!Java分布式架构设计与开发实战(完结)

    2022全新版!Java分布式架构设计与开发实战(完结) 分库分表实战:Java海量数据存储架构设计 在现代互联网应用中,随着业务规模的指数级增长,数据库性能瓶颈已成为制约系统发展的关键因素。当单
    发表于 03-30 15:20

    微电网总体架构设计原则:安全、高效、灵活的三重导向

    的运行稳定性、能源利用效率与场景适配能力。在微电网架构设计中,“安全、高效、灵活”三大导向并非孤立存在,而是相互支撑、协同统一的有机整体——安全是底线,筑牢微电网运行的根基;高效是核心,彰显微电网的能源
    的头像 发表于 03-27 14:12 275次阅读
    微电网总体<b class='flag-5'>架构设</b>计原则:安全、高效、灵活的三重导向

    X (Twitter) 推荐系统架构设计深度解析

    推荐系统到底是如何理解海量用户与内容的?本期文章带你深入 X (前 Twitter) 推荐算法库的底层源码。解构推荐系统关键的“漏斗型”架构——从高效的双塔召回到复杂精妙的 Transformer
    的头像 发表于 02-25 23:56 5145次阅读

    全液冷服务器系统架构设计案例分享

    服务器的全液冷,一般都需要液冷板覆盖CPU、内存(DIMM)、硬盘(SSD)、电源、IO以及其他SOC的散热。今天给大家分享一款浪潮的全液冷冷板服务器的液冷系统架构
    的头像 发表于 01-27 15:33 789次阅读
    全液冷服务器系统<b class='flag-5'>架构设</b>计案例分享

    嵌入式软件分层架构设计原则

    嵌入式软件分层架构的设计原则如下: 模块化和可扩展性:每一层应当保持松耦合,这样当硬件变化或某些功能扩展时,只需要修改对应的层次,而不影响整体架构。 硬件无关性:上层代码应当尽量避免直接依赖硬件
    发表于 11-28 07:05

    TensorRT-LLM的大规模专家并行架构设

    之前文章已介绍引入大规模 EP 的初衷,本篇将继续深入介绍 TensorRT-LLM 的大规模专家并行架构设计与创新实现。
    的头像 发表于 09-23 14:42 1380次阅读
    TensorRT-LLM的大规模专家并行<b class='flag-5'>架构设</b>计

    光伏电站中应用的无人机AI巡检系统架构设

    维护提供数据支持,在当下的电站运营中发挥着重要的作用。 从系统架构设计方面来说,通过硬件层、软件层以及云平台层各层不同功能模块部署设计,实现智能化的巡检流程应用。首先是硬件层,通过构建无人机平台适应如沙漠、山地
    的头像 发表于 09-02 14:13 552次阅读
    光伏电站中应用的无人机AI巡检系统<b class='flag-5'>架构设</b>计

    深入剖析RabbitMQ高可用架构设

    在微服务架构中,消息队列故障导致的系统不可用率高达27%!如何构建一个真正可靠的消息中间件架构?本文将深入剖析RabbitMQ高可用设计的核心要点。
    的头像 发表于 08-18 11:19 1091次阅读

    同一水平的 RISC-V 架构的 MCU,和 ARM 架构的 MCU 相比,运行速度如何?

    ARM 架构与 RISC-V 架构的 MCU 在同一性能水平下的运行速度对比,需从架构设计原点、指令集特性及实际测试数据展开剖析。以 ARM Cortex-M33 这类 ARMv8M 架构
    的头像 发表于 07-02 10:29 1731次阅读
    同一水平的 RISC-V <b class='flag-5'>架构</b>的 MCU,和 ARM <b class='flag-5'>架构</b>的 MCU 相比,运行速度如何?

    聚徽解码——从嵌入式到模块化:国内工控平板的柔性技术架构设

    在工业 4.0 与智能制造蓬勃发展的浪潮下,国内工控平板作为工业自动化与智能化的关键设备,其技术架构设计正经历着从嵌入式到模块化的深刻变革。这一转变旨在赋予工控平板更强的柔性,使其能够更高效、灵活
    的头像 发表于 06-13 16:24 743次阅读

    光伏运维管理系统架构设计及其应用分析

    开展。 光伏运维管理系统集成先进的数据监测、故障诊断、运维任务管理等多种功能内容,为光伏电站提供全面、高效、智能的运维服务。其系统分层架构设计,覆盖感知层、网络层、平台层和应用层。感知层通过传感器和摄像头等设
    的头像 发表于 06-10 11:34 770次阅读
    光伏运维管理系统<b class='flag-5'>架构设</b>计及其应用分析