如果第二次看到我的文章,欢迎「文末」扫码订阅我个人的公众号(跨界架构师)哟~
每周五早8点 按时送达到公众号。当然了,也会时不时加个餐~
在一个分布式系统的开发团队中,有一些问题是很容易产生程序员之间矛盾的。
其中之一就是「业务归属」,就是当新加/修改一个业务的时候,代码变更应该放到你负责的系统还是我负责的系统里?
一些业务轮廓很清晰的就不用说了,大家的认定都是一样的。比如商品相关的放到商品服务,会员相关的放到会员服务。
但是对于轮廓模糊的业务,大家作出的决定就不一定相同了。
这个时候起决定性作用的并不是各自的工作经验,而是你的「业务思维」是否具有全局性,以及对全局业务的了解程度如何。
一旦草率的作出了“不合适”的归属划定,后续将会带来大量的额外成本,协作、更高的bug率等等。
看看以下的场景是不是平时有见到过?
-
嗨,小明,我这里有个bug需要你和我一起调试下。
-
当初如果这个业务在这里就好了,现在已经积重难返了,只能推倒重做了。
-
我觉得这个问题可能是这里导致的,也有可能是那里导致的。
所以,一个业务归属于哪个项目,看似是一个很简单的选择题。但是每个人心中的默认选择是不同的,比如以下两种截然不同的倾向。
-
我能解决的就我解决咯,实在解决不了的再给对方
-
只能我这里解决的就我这里解决,其它的全部对方来
其实这些选择都是因人而异的,很难形成一个放之四海而皆准的共识。
如果双方都选择第二点,产生冲突、争执是必然的。
哪怕大家都选择“为他人着想“的第一点,只是避免了相互扯皮,但还是无法避免后续业务边界混乱付出的额外成本。
所以,我们还是需要从中提炼出本质的东西作为决策的准则。
Z哥我认为思考业务归属的时候,本质上还是逃不开「高内聚低耦合」范围,一个合理的项目归属认定,会让软件系统离每个人所期望的「高内聚低耦合」更近一步。
因为「业务归属」和「高内聚低耦合」一样,都在“划线”,明确边界。
但是我们很多时候其实并不知道“线”应该具体画在什么位置,只是知道一个大概方位而已。
其实,如果当我们的系统只是一个单体应用的话,是不存在「业务归属」问题的。
因此它是在分工协作下所产生的一个副作用。
但是,只要我们继续保持分工协作来开发一个分布式系统,这个问题就是绕不开的一道坎。
在工作中,由于边界不清容易产生业务归属分歧的场景主要是以下两点。
-
一个新业务,需要两边配合完成
-
一个老业务,一部分在A处理,一部分在B处理。
这里先停顿一分钟,想一想,如果是你的话,该如何来作出选择?
Z哥我给你的建议是,你可以这样来考虑:哪边缺了这个业务的话,会导致至少一个流程走不通。
来举两个例子帮助你理解。
一个电商网站现在要上线一个会员卡的功能,类似阿里的88会员这种。
效果是买了这个会员卡的用户,在该平台购买自营商品时,享受8折优惠。
那么你来思考一下?这个业务到底是放到「会员服务」还是「促销服务」?
参照上面的建议来思考就是回答两个问题:
-
会员服务缺少了这个会员卡业务,是否有至少一个流程走不通?
-
促销服务缺少了这个会员卡业务,是否有至少一个流程走不通?
很显然,会员卡虽然有一个打折功能,但是这个打折是建立在一个身份标识上的。
那么就要思考一下,这个身份标识后续是否会在整个购物链路中的多个环节有露出展示或者对应的专属业务,比如专属客服、每月领福利等等。
另外你会发现,如果促销想实现打8折的效果,可以完全不需要有会员卡的存在也能做到。
所以,这个会员卡本质更像是会员属性的一个扩展,是跟着某个具体的会员走的。
假如最终不小心被归属到了促销服务,则每次围绕会员卡展开的业务都需要与促销服务产生耦合才能完成,很明显就背离了「高内聚低耦合」的初衷。
所以,对促销服务来说,会员卡业务并不是必不可少的。相对来说,会员服务与它的关系更紧密。
至此,第一个例子的答案就出来了,应该放到会员服务。
再来看第二个例子。
随着社交电商模式的崛起,该电商平台想上一个拼团功能。
那么这个功能该放到「购物车服务」里?还是「促销服务」里呢?
同样回答两个问题:
-
购物车服务缺少了这个拼团业务,是否有至少一个流程走不通?
-
促销服务缺少了这个拼团业务,是否有至少一个流程走不通?
首先,大家最容易想到的是,拼团一般都是直接下单,不经过购物车,自然不用放到购物车服务,放到促销服务才是合适的。
这个理解完全合理。但是我们可以再想一下,拼团就必须要放到促销服务里吗?
拼团其实也就是一口价,也不用经过促销的价格计算。
如此看来,拼团对促销来说也不是“刚需”。
这个时候将拼团服务独立出来才是更好的选择。因为在这个例子里,缺少拼团业务,对两个服务都不会产生流程上的阻碍。
反而独立出来后,后续对拼团业务的调整,会更容易进行。不用对购物车服务、促销服务产生任何影响。
至此,我相信你对如何判断一个业务的项目归属已经有感觉了。如果你想贯彻「高内聚低耦合」作为系统的设计方针,不妨学习一下「领域驱动设计」。
这是由Eric Evans提出的概念,将建模作为、划分系统边界等等作为最高优先级的开发模式。
我相信,随着未来的业务越来越复杂,基于业务作为出发点考虑的软件设计理念会越来越凸显价值。
因为技术只是实现业务的介质之一,况且新技术的产生速度正在越来越快。
那么,与其用最好新技术,不如替业务选择最适合的技术。
好了,我们总结一下。
这次Z哥先帮你分析了一下产生「业务归属」分歧背后的原因。
然后,再分享了一个正确思考这个问题的建议,还举了两个例子。
以后再遇到拿捏不准业务该归属到哪个项目的话。只要记住一句话:哪边缺了这个业务,会有至少一个流程走不通。如果都能通,那么这个新业务就适合“独立门户”。
在程序员们的日常工作中,容易发生分歧的问题还有很多,不过,其实大部分问题都有一个通解——全局的业务思维。
推荐阅读:
作者:Zachary
出处:https://www.cnblogs.com/Zachary-Fan/p/businessattribution.html
如果你喜欢这篇文章,可以点一下左下角的「推荐」。
这样可以给我一点反馈。: )
谢谢你的举手之劳。
▶关于作者:张帆(Zachary,个人微信号:Zachary-ZF)。坚持用心打磨每一篇高质量原创。欢迎扫描下方的二维码~。
定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些思考。
如果你是初级程序员,想提升但不知道如何下手。又或者做程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注我的公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思维导图。
如果你是运营,面对不断变化的市场束手无策。又或者想了解主流的运营策略,以丰富自己的“仓库”。欢迎关注我的公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思维导图。
相关推荐
网上收集的程序员漫画,《神秘的程序员们》,没事的时候可以看看,放松一下。
《一个程序员的奋斗史》是一篇描述了主人公段伏枥从大学毕业生到步入职场,开始程序员职业生涯的心路历程。该文通过主人公的亲身经历,展现了程序员在职业生涯中可能面临的种种挑战和抉择,以及程序员如何通过不断的...
一个女程序员的心路历程一个女程序员的心路历程一个女程序员的心路历程一个女程序员的心路历程
综上所述,“一个程序员走过的路”是一个关于程序员如何从入门到精通的全面指南。它不仅涵盖了C语言和C++这两种关键的编程语言,还深入讲解了文件操作与算法设计,旨在帮助程序员在技术领域取得深入发展,并在职业...
它告诉我们,程序员不仅仅是那些整天坐在电脑前的“宅男”,他们在代码的海洋中自由地航行,用技术和智慧解决现实问题,创造出一个又一个令人惊叹的数字奇迹。在这个充满挑战和创新的世界里,程序员们不仅用技术改变...
作为一个作为一个程序员很重要的一个能力应该是解决问题的能力
[程序员小飞]别只做一个程序员_中国程序员的出路_程序员的副业
描述提到“怎么样当好一个合格的程序员”,这一点强调了持续学习的态度对于成为一名优秀程序员至关重要。在快速发展的IT行业中,新技术层出不穷,因此保持好奇心、积极主动地学习新知识是必不可少的。此外,“程序员...
本书描写了一位刚从大学毕业,对社会懵懵懂懂的菜鸟程序员段伏枥,通过自身的努力,一步一步前行,最后成为...这是一个程序员的奋斗,也是无数程序员的缩影。 同时,这也是一部IT公司潜规则与科技江湖厚黑学的实录。
一个java程序员的成长历程
一个合格程序员该做的事情——你做好了吗
600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员常用的单词和词汇600个程序员...
这本书涵盖了编程基础、数据结构、算法、操作系统、计算机网络、数据库等多个核心领域,为读者构建了一个全面的面试知识体系。 在编程基础部分,书中详细介绍了各种编程语言的关键概念和语法特性,包括但不限于Java...
### 一个Java程序员应该掌握的10项技能详解 #### 1. 语法 作为Java程序员,必须熟悉Java语言的基本语法。在实际编程过程中,能够根据集成开发环境(IDE)提供的错误提示信息迅速识别出语法错误,并且知道如何进行...
这是一个繁琐且需要耐心的过程,尤其是在面对复杂问题时,可能会导致情绪低落。 8. **代码审查**:代码审查是保证代码质量的重要环节,但有时过度严格的审查或无意义的批评可能会打击程序员的士气,影响团队合作...
程序员之路——一个老程序员对刚上大学的学弟学妹的忠告.