今晚准备在家作饭,但少了一把菜刀,你会问邻居家借么?git
DRY原则(Don't Repeat Yourself)相信每一位程序员都应该知道。其指代的是咱们写程序时,不要一遍又一遍地编写类似的代码。程序员
当出现某些类似功能的代码时,咱们应该将通用部分代码与特异部分代码分离,以达到复用通用代码,下降总体复杂度的目的。算法
按照个人理解里,一个好的程序,压缩率应该接近于0,没有任何能够精简的部分(变量名、方法名等除外)微信
复用带来不少好处,如:架构
然而达到复用的目的并不是没有成本,从总体上看 复用的成本包含:eclipse
若是整个系统是SOLO的,那么发现和学习的成本近乎于0(前提是你还记得你写过什么东西),进行复用只包含扩展和修改代码的成本。分布式
但一个系统可能很大,完成系统所需的人数多是:微服务
当咱们能在公司级或者集团级较好地处理复用这件事件时,咱们就称其为 中台(固然,部门中台、室中台也能够,只是复用在企业级别时换个名称显得更高大上)工具
但让咱们回想一下本身所在的小组里,已经处理掉了重复代码,达到了完美的复用了么?若是已经完美复用了,那你所在的室呢?学习
咱们发现,随着人数的增长以及代码数量的增长,未通过良好设计及组织,发现及使用可复用代码的难度将会急剧增长。
同时,若复用发生在利益关系不一致的不一样组织(室、部门、公司、集团)里,则复用不必定能被执行。即便复用能够执行,但需求方与提供方对任务的优先级定义不一致,提供方响应速度跟不上时,那也可能使得复用没法产生。
实现DRY可能只须要一个优秀的程序员,但实现Don't Repeat Ourselve就没这么简单了。
对于需求方团队是否要复用某个其余团队的组件,能够由一个公式来表示:
实现复用所需时间 <= 业务容许的响应时间
AND (发现成本 + 学习成本 + 沟通协调成本 + 使用成本) <= 从新作的成本
当上述表达式为“真”,那么咱们就能够考虑复用。
下面针对这个公式,进行分段讨论。
复用并非总能节约开发时间:
影响复用达成时间的因素不少,这些因素叠加起来可能致使复用所消耗的时间更多。所以对于一些时间特别敏感、由其决定生死的业务,在可复用组件未成熟,或者可复用组件支持团队的支持力度不够时,能够不考虑复用。
不复用的状况就是咱们一般讲的烟囱系统,如今大环境的论调是烟囱系统很差,其在一个业务成熟的公司里确实很差。可是烟囱系统在业务早期变化大,快速野蛮生长时,因为不须要考虑复用,没有太多的条条框框限制,提供了高效的开发效率支持,为业务的存活作了重要贡献。
是什么影响了复用的发现成本?我认为主要是:
在几我的的小组维护的系统里,咱们倾向于不产生任何重复代码。在实现某些功能时,须要肯定有没有已有的枚举、类、方法、DAO时咱们会问小组长,或者直接在小群里吼一声。
在几十我的的室里,咱们小组要用其余小组系统的接口时,一般会由小组负责人之间拉会议沟通协调,确认对应接口是否存在,是否合适,如何使用,改造方案等。
这些发现都依赖于人,但而人的记忆是不可靠的,可能会遗忘记错,而且一旦涉及到人之间的交流的话,效率就会下降(要打断对方工做、等对方回应、要组织会议等)。所以咱们要下降复用发现成本最好的方式是下降对人的依赖。
下降单一系统(单个git repo/单个eclipse项目)的复用发现成本的一种作法就是合理分包,在写好代码的同时,就把复用发现的手段给完善了。
一个合理分包的代码里,咱们可以快速地推断出咱们所须要的东西在哪里、是否存在。
而一个不合理分包的代码,咱们会看到几十上百个类平铺于一个层级,用人眼根本找不到想要的类,必须依靠记忆中依稀记得的关键字来进行搜索。
那怎么作到合理分包?很简单,只要保持一个简单的原则
每一个包的文件数量不超过10个,若超过10个则分裂成两到三个子包
但固然,包的名字必须是有含义且一眼能看明白的,这样才能让咱们逐层找到咱们要的文件。这实际上是一种通用的控制复杂度的方法,可见文末另一篇文章《从分治的思想到架构的设计》
下降多个系统间复用发现成本的一种作法是搭建一个WEB系统用于统一发现可复用组件。
这个管理系统应该能够按照分类逐层查找复用组件,也能够按照关键字查找对应的复用组件。阿里云官方网站咱们能够做为一种参考。
但固然,构造这么一个系统也是须要消耗大量人力物力的,在初期使用Wiki+Swagger的形式将接口信息提供出去也是不错的选择。
一个接口学习的成本大小与接口大小成正比。
接口大小指代要正确使用该接口所需具有的知识,如:
这些知识,咱们也能够称其为“耦合”。
咱们知道,耦合要越小越好,这样才能让经过接口交互的两个模块更容易地独立演进。
同时,耦合越小,咱们学习这个接口的成本就越小。
固然,影响学习的成本除了接口自身要良好设计以外,还须要完善的文档与例子,这也是下降学习成本的关键。
复用的沟通协调成本在越大的组织里有可能越大。
被复用的组件须要进行修改定制时,咱们须要组件的维护方提供支持,此时就须要相应的沟通协调成本。
若组件提供方与组件使用方没有任何利益关系,甚至于其利益是冲突的,那么组件提供方则缺少动力为使用者提供支持,甚至于拒绝提供服务。这时候沟通协调成本将会特别的大。
这个问题实际上不是一个软件技术问题,这涉及到组织架构的设计。所以要下降沟通协调成本,则须要更高一级的领导设计调整 组件提供方与使用方之间的关系,使其达到利益相关、一致。
这实际上也是不少文章讲的,(企业级)中台是一把手工程的由来,其并不是由技术人员就能推进的事情。
当咱们使用各类云服务时,咱们须要付费,在一些较大的公司里,使用别的部门的服务也是须要付出相关成本的,当复用这些组件的成本超过本身从新作一份的成本时,咱们就会考虑本身再搞一套
如下是阿里谢纯良分享的一个关于系统复用的图:
图中包含几层
如下是我以前公司系统间进行复用的图:
图中最顶端的对应的是阿里图中的应用层,其他的对应的是共享业务能力层。
这里共享能力层里的各类能力也有可能互相组合造成一些新的能力,如图中的投资组合服务 以及 套利工具服务。
若是咱们愿意,能够把没有依赖于其余服务的服务叫原子能力服务,组合了其余原子能力服务的服务叫作组合能力服务,但这些名词仅仅在特定场景特定公司内起做用,咱们做为一个程序员要穿透这些名词看到本质。
就像中台这个名词同样,它的本质就是企业级的复用,达到这个复用目的途径有千万种,只要达到这个目的他就是中台。
就像微服务这个名词同样,它的本质目的就是为了应对业务快速变化,而不得已地将服务作小。只要咱们达到了应对业务快速变化这个目的,咱们就成功了。而其中带来的所谓 配置中心、注册中心、熔断、分布式事务等等,他们是不得不引入的一些额外成本,而不是成果。
中台是最近火起来的概念,但它只是新瓶装旧酒,本质是在企业层级进行复用的一个描述。
复用则是每个程序员应有的觉悟,但规模是万恶之源,任何事情规模增大了,实施的难度都会急剧增长。
进行复用(或者说进行中台建设)并不是没有代价,咱们须要权衡复用的利弊后,才能作出正确的决策。
在两家排名前三的股份制商业银行及互金创业公司工做过,目前在排名前二的互联网银行工做,作过业务,作过中间件,作过架构,也带太小团队。
欢迎加微信及公众号交流技术,请备注名字+公司。
我的微信:
公众号