最近一个项目申报请示的时候,我下面的一个研发卖力人被老板“骂”了一顿,缘故原由是老板认为这个功能之前某某项目,某某系统做过了,为啥要重新开拓,拿来用就行,结果这位研发卖力人讲不清楚,或者技能职员太实在而不知道该如何表达,末了也把我叫过去数落一番。
我不怪老板,她的想法是可以理解的,站在投入和产品角度,不要重复制造轮子是没有错的;我也不能完备怨我的下属,有些东西的复用和集成的确是不像做PPT那样东拼西凑那样随意马虎的。
双方都没错,那问题出在哪呢?我将这个问题发到老谭的读友群里,大家谈论的也挺热烈,看来这个问题的确也是大家普遍存在的问题。

有人吐槽老板不懂技能,须要上课的;有人建议须要沟通,须要不断磨他,盘他的;还有人还建议让老板参与几个范例项目,让他多体会体会的;末了我们把问题归结到“信赖”二字,原来所有的问题都可以通过“信赖”来办理的。
的确信赖可以办理任何问题,老板如果一点不懂,他可以信赖他的CTO能很好的办理这个事情;如果老板很懂,他就会亲自办理这个问题了。本日我们不谈论老板的问题,他的需求本身没有问题,如果我是老板我也会哀求不做重复投入。本文我更多要站在技能领导者的视角去考试测验解析这个问题,寻求一定的办理方案。
一、系统复用为什么难?
还是从事例提及,我们做医疗行业的运用系统,康健档案的管理是一个非常普遍的功能,我们在某系统里已经开拓了轻微完全点的模块,于是乎只要其他运用要开拓康健档案的功能,老板就会说这个我们都做过了,拿过来用就好了,为什么要重新开拓?我来考试测验的回答下这个为什么很难复用。
这个别系由于历史缘故原由,是.net开拓,而我们团队主流的技能栈是Java,开拓措辞都不一样,没法复用,只能参考。虽然都叫康健管理,但是不同的运用系统,他们的差异化还是非常大,慢病管理和专病管理有差异,在基层医疗和等级医疗有差异,纵然同构系统,实在也无法直接复用,须要二次改造。如果这个模块不因此公共组件的办法进行抽象设计的话,它实在和当前系统是紧密耦合的,数据层的耦合,业务逻辑层的耦合,视图层的耦合,特殊是代码级的耦合,如果在其他系统复用,首先要去除这种耦合然后在做适应化改造,复用的本钱有时候不比重新开拓低。1. 复用是有本钱的DRY原则(Don’t Repeat Yourself)相信每一位程序员都该当知道。其指代的是我们写程序时,不要一遍又一各处编写相似的代码。当涌现某些相似功能的代码时,我们该当将通用部分代码与特异部分代码分离,以达到复用通用代码,降落整体繁芜度的目的。
复用这个道理我们都懂,我们也在实际的开拓过程中真正去践行的,但复用实在是有本钱的,这也是为什么我们知道重复制造轮子不好,但却又一直的的在制造轮子,由于很多时候造一个新轮子比改造一个轮子可能更快,本钱更低。
复用有哪些本钱呢?
创造可复用组件的本钱!
很多时候我们并不是不想复用,而是不知道是不是存在我们须要的轮子,从哪里可以找到这个轮子,正如本文最开始的那位研发卖力人,他可能真的不清楚哪个团队有他可复用的轮子,而老板看到的范围更广,以是她更清楚。这个和组织管理和知识管理有关。
学习可复用组件的本钱!
别人造的轮子有时候很难明得它内部的布局和逻辑,就要去学习别人造轮子的设计和逻辑,这个本身是存在学习本钱的,如果对方的设计和实现与自己的思路存在出入的时候,又会非常的别扭。
扩展可复用组件的本钱!
古人造的轮子都是用在他当时的那个场景或者业务中,当这个轮子切换到新的场景和业务中的时候,你会创造100%的可复用基本上是没有的,这时候就牵扯到对付这个轮子的扩展以适用新的业务,先不说这个扩展改造是所有者实行还是利用者实行(后面有一个章节专门谈论组织的逻辑),扩展总是有本钱。
修正可复用组件的本钱!
有时候组件的抽象能力不足,无法扩展,或者扩展的韶光本钱太高,或者组件所有者不愿意支持,复用者可能采取直接拿过来修正的情形。修正的本钱是一个层面,但把韶光拉长来看,组件修正后就和原组件分解了,未来双方的新功能也无法相互复用了。
2. 复用是有级别的
一样平常情形,复用的本钱会由于复用的组件的内容不同,所在组织的关系亲密,它的本钱是不一样的。比如只是复用一段程序,就相称大略,如果复用一个别系功能就很困难;如果复用同一个团队的组件就相称大略,如果跨团队跨组织的复用就会变得困难,以是复用也是有级别的,为了更好的理解我把复用分成了一下5个级别。
级别越低,粒度越小,复用的范围越广,但代价表示较低;级别越高,粒度越大,复用的代价越高,但复用范围也比较局限。以是站在业务和代价角度上,都是先从最高的层次上去复用。只有上层无法实现复用,我们才会逐步向下层去探求。但是有时候站在技能角度,我们习气在低层次上去复用,由于这里最靠近自己的事情,粒度越小,技能上越可控。
回到本节开始的问题,B系统的功能要复用A系统的功能,这个复用级别是最高的,如果能复用那会极大减少事情量降落本钱,但这个级别的复用难度也是最大的,特殊是异构系统,就险些没有可能了。
3. 复用是有粒度的
影响复用达成韶光的成分很多,这些成分叠加起来可能导致复用所花费的韶光更多。因此对付一些韶光特殊敏感、由其决定死活的业务,在可复用组件未成熟,或者可复用组件支持团队的支持力度不足时,可以不考虑复用。
不复用的情形便是我们常日讲的烟囱系统,现在大环境的论调是烟囱系统不好,其在一个业务成熟的公司里确实不好。但是烟囱系统在业务早期变革大,快速野蛮成长时,由于不须要考虑复用,没有太多的条条框框限定,供应了高效的开拓效率支持,为业务的存活做了主要贡献。
Gartner 在研究报告里提出了宏做事、小做事和微做事的粒度划分:
宏做事——一种传统的 Web 做事,支持将功能封装于单体运用内。宏做事不支持独立支配或扩展, 它们只能支配为单体运用的一部分,而且它们不须要微做事根本架构。小做事——就做事粒度范围而言,小做事是一种粗粒度、疏松耦合、支持独立支配的运用组件。小做事须要微做事根本架构。微做事——微做事处于粒度范围的远端,是一种可独立支配的组件,能够支持单个运用功能的履行。微做事可直接支配到微做事运行时环境中,也每每具备专用数据存储区。微做事须要微做事根本架构。如果我们想对已存在系统的能力进行复用,可以采取宏做事模式进行,宏做事的模式适宜做系统的集成和管理。我们对付新的业务和项目,刚开始建议采取小做事的办法进行业务领域的拆分,不建议拆分的过细,这个小做事能知足该需求的基本抽象即可。从适中的粒度开始,做事的粒度一定是业务推进的过程中不断蜕变的,创新业务推动做事的粒度向更细的粒度裂变,而业务成熟稳定后,又推动做事向粗粒度方向聚合。站在复用的角度,优先级是宏做事>小做事>微做事,当然难度反之。
以是复用要根据自身团队发展情形,业务实际须要灵巧把握,也要根据公司的发展阶段,逐步的实现复用,总体来说复用的优先级技能层面复用优先于业务层面复用,团队内的复用优先于团队间的复用,项目级复用优先于产品级复用。
二、如何更好的复用
老板哀求复用有没有错?没有错!
员工说复用太难是不是实情?是实情!
作为技能领导者,我们的职责便是办理团队的困难,实现老板的目标。详细如何更好的复用,老谭根据自己的事情履历和对该问题的深度思考,供应一定的思路仅供参考。
1. 不要忽略技能栈的管理
站在复用的角度,不同的开拓措辞之间是很难复用的,虽然对付互联网或者自运营的信息化而言,还可以通过做事共享的办法实现复用,而对付我们更多以本地化交付的软件产品研发而言,技能体系分歧一对付复用和协同兼职便是噩梦。
老谭在卖力公司研发之前,全体公司没有统一的技能栈,每个部门险些都有自己的技能栈,当时存在.net,java,php等多种措辞开拓的系统,主流的Java措辞还存在Jfinal、springboot、dubbo平分歧的框架。
对付技能团队最随意马虎的代码程序级别的复用由于技能体系的分歧一而导致无法复用,团队资源无法流动平衡的问题,这对付我们中小规模的研发团队来说便是灾害。分散的组织一定带来分歧一的技能架构,这便是有名的康威定律(后面还会详细先容)。
结合我自己的事情经历,对付技能栈的管理供应以下思路供参考。
确定团队主流措辞,主流开拓框架,主流数据库等;
我们确定了Java措辞为主流措辞;springboot为紧张开拓框架;采取SpringCloud的微做事架构体系,;数据库第一选择为MySQL,新项目全部统一到MySQL。
减少非主流技能体系的资源投入,新的业务逐步以主流技能进行;
老谭之前团队利用比较小众的JFinal,同样向主流框架springboot切换;减少Dubbo的利用范围;严格掌握非Java体系的资源投入,新业务可以采取Java开拓的稠浊体系。
逐步向前后端分离的开拓办法转变,大后端体系之后实施大前端;
我们做技能的都清楚,后端稳定,前端变革多端,前真个复用的优先级是远弱于后真个,但是对老板们可就不一样,后面的数据库,做事接口啥的他们也看不见,最直不雅观的便是前端,以是不能忽略。我们最先确定下前真个开拓框架VUE,防止前端技能的分解,传统的前端开拓根据实际须要有准备实现架构的转变。实在这个转变在前期是须要增加投入的,毕竟两套体系前期要并行,老板质问为何要切换前后端分离,当然她不知道的是,如果我们不转变,我们现在连人(前后通吃)都招不到。
中间件不能滥用,新技能引进须要走技能评审。
技能职员都比较热衷各种中间件的利用,对新技能如蚁附膻,追求新技能没有错,创新也须要鼓励。但这些都须要管理,由于作为技能领导人,我们必须站在团队整体角度平衡本钱、效率、效益的关系,以是通过技能评审,我们既能引进新技能,又能管理技能引进带来的学习本钱,大面积推广的机遇和条件。
通过这一系列的方法,我们至少在技能底层取得了适度的统一,不同团队之间的技能互换就肃清了障碍,大家就随意马虎共同积累,促进共享。
2. 统一架构,构建平台级运用
技能栈的统一,只能让我们做到LV1和LV2层级的复用能力,再往上走就涉及到功能层面和业务层面了,而这更靠近老板的视角了。以是实现更高层次的复用是每个技能领导人的追求,也是发挥自身专业能力的舞台。
但在这个环节我们每每会涌现大问题,便是不能根据实际情形因时制宜,架构体系的弹性很大,没有严格的标准,只有根据实际情形的平衡,平衡是磨练技能领导人的架构艺术,不要小瞧了这个能力。很多大厂的牛人去小企业做架构,太多失落败的案例,不是架构不好,是没有用对地方。
1)对付小团队而言,统一架构体系,单体运用一样很美
我们一向的知识便是,越是独立的,没有太多耦合关系的组件越随意马虎复用,过去烟囱似的单体系统难以复用便是模块和系统本身耦合太深而造成复用改造的本钱很大。这个理论是对的,但我认为不全面,完备去除耦合是不现实的,只是耦合的深浅和范围是须要管理的,如果复用组件的利用者一样耦合在同样一个环境中,实在也是可以复用的。这就像A系统要复用B系统的模块实在是很困难的,由于耦合的环境不一样,依赖的根本不同;但是A系统内要复用自身材系的某模块却非常随意马虎,由于依赖环境是一样的。以是,小团队如果在代码层级能够统一成一个运用,然后通过插件化、代码级的组件化对业务模块进行抽象和管理,单体系统依然是很美的。
我在七八年前带一个小型互联网团队,自己花了两三个月韶光写了一套基于JFinal(当时刚开始推出的小众框架,现在已经非常盛行了)插件化的脚手架系统作为我们团队所有业务开拓的载体,这么多年过去了,这个别系依然在健壮的运行,业务也在不断持续的开拓着。我们履行的泛微最新一代的OA系统,如此弘大的系统,通过支配构造来看,实在也是一个大单体运用。以是,不是单体系统不好,只是当它太大往后,我们没有能力管理好它而已。
2)有一定规模的技能组织,构建统一平台底座
复用的本钱以及难度每每都是组织规模扩大,尤其分解后才迅速提升的。在一个多组织中实现组件的复用须要建立统一的标准,也不要完备去除依赖,而是尽可能依赖单一,大家都依赖这个单一的东西,这个依赖对复用的影响就会降落,以是一定规模的技能组织,要通过构建统一的平台底座,将共享组件沉淀在平台底座上,让不同的业务共同依赖同一套底层的环境,通过平台底座的共享能力,实现各垂直业务的横向互换和协同。
这种模式特殊适宜软件产品研发的企业,构建在厚实的平台之上的产品研发,既高效又长于组合和扩展,产品的边界不会由于系统的隔离而变的僵化。
而且构建平台底座既适宜单体架构的运用也适宜分布式的微做事架构,平台底座实在一个组织有方案的复用的体系培植。下图是笔者团队培植的平台体系,后台引擎由架构团队紧张卖力培植,业务组件(属于中台范畴)由各研发团队根据业务领域分别卖力构建,供做参考。
3)企业级的复用体系–中台架构
中台的广义上的定义:企业级能力复用平台。
虽然我们的一体化平台涉及到中台做事部分,但是作为研发企业,我们的中台架构和做事是面向客户去交付的,帮助甲方客户构建中台能力。一样平常情形我们所说的中台,不是厂商的中台办理方案,而是一个互联网企业或者一个传统企业为了知足自身数字化转型的须要而构建的中台体系,它是面向企业运营的中台体系而不是面向项目交付的中台做事。
广义上的中台范围是非常大的,涵盖了企业运营的方方面面,而我们更关注的是企业中台的载体即数字化运营中台。企业首先通过信息化培植,将企业内在业务从线下搬到了线上,这个阶段我们构建了一个个的单体系统,这些系统集成都不随意马虎,复用险些就更没可能。终极导致大量的重复开拓培植,同时还带了更大的系统管理的本钱。
进入数字化时期,乃至是智能化时期,面对激烈的市场竞争,企业降本增效的需求愈着急切,更好的复用,更敏捷的培植是企业急迫的欲望,中台体系的提出,是顺应这个时期的产物,以是企业关注中台,考试测验中台是对的,至于为什么会失落败,后面的文章再去磋商。
对付一个有技能开拓能力的企业,比如互联网企业,科技企业等,中台的复用能力不要极度的追求新建,虽然这样比较大略,但对企业来说其实摧残浪费蹂躏,如上图所示,首先单体运用架构向业务中台架构演化,能利用则利用,能改造就只管即便不要新建,能沉淀就只管即便沉淀。
4. 根据康威定律,组织要支撑
被复用的组件须要进行修正定制时,我们须要组件的掩护方供应支持,此时就须要相应的沟通折衷本钱。若组件供应方与组件利用方没有任何利益关系,乃至于其利益是冲突的,那么组件供应方则缺少动力为利用者供应支持,乃至于谢绝供应做事。这时候沟通折衷本钱将会特殊的大。(本文提到的那位研发卖力人实在很大程度上也面临这个问题,折衷不动组件方修正,自己改又太有难度,与其不如自己造一个轮子了)
这个问题实际上不是一个软件技能问题,这涉及到组织架构的设计。因此要降落沟通折衷本钱,则须要更高一级的领导设计调度组件供应方与利用方之间的关系,使其达到利益干系、同等。如下图所示,每个人在自己统领的范围之内都相比拟较随意马虎复用和协作(对应颜色的横向箭头),而一旦超出了这个范围,复用和协同的难度和本钱就会急剧增加。
重温下康威定律:
Conway’s law: Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. – Melvin Conway(1967)
设计系统的组织其产生的设计等价于组织间的沟通构造。
已经五十多年的康威定律依然是辅导我们做系统设计和企业架构的主要定律,它诠释了系统架构和组织架构的对应关系,实在这非常随意马虎理解,任何事情都是有人去实行的,人的组织构造决定了系统的架构设计,一个分散型的组织很难有高度统一的架构,也注定难以复用。当然一个集权化的组织,复用和协作的本钱就很低,相反组织的活性会降落,自主性和创新性不敷。
老板最主要的任务实在是通过设计组织的构造,来匹配干工作的逻辑,终极实现自己想要的效果,否则在一个人、物、事不匹配的环境里,只有一腔的热血、殷切的希望和愤怒的咆哮也是无济于事,这便是规律的不可违背性。
正如阿里巴巴履行中台计策,CTO行癫(张建峰)亲自挂帅卖力中台奇迹群,卖力中台计策的推进。同时作为当时全体集团的CTO,在各奇迹部横向实行中台架构体系又有谁不合营呢,可见阿里中台计策的实行力有多强,这也是为什么阿里的中台能够成为行业的标杆,这与其组织的设计是分不开的。
末了总结一下,复用是老板的合理需求,是技能领导人的核心职责,是所有技能人的全局意识。但复用的达成,不是老板的念念不忘,不是技能领导人的行政哀求,也不是所有技能人的满腹牢骚,它须要一个体系的设计,一个组织的支撑,一个相互信赖的团队文化,一个不断完善的过程。任重而道远,让我们励志前行!
#专栏作家#
菜根老谭,微信公众年夜众号:CGLT_TAN,大家都是产品经理专栏作家。经历程序员、技能Leader、产品经理、研发Leader等多种岗位。现卖力某科技公司整体产品研发,善于企业IT架构及互联网产品架构。
本文原创发布于大家都是产品经理。未经容许,禁止转载
题图来自Unsplash,基于CC0协议