一个引发程序员们干架的问题


这里是Z哥的个人公众号

每周五早8点 按时送达

当然了,也会时不时加个餐~

我的第「77」篇原创敬上



在一个分布式系统的开发团队中,有一些问题是很容易产生程序员之间矛盾的。


其中之一就是「业务归属」,就是当新加/修改一个业务的时候,代码变更应该放到你负责的系统还是我负责的系统里?


一些业务轮廓很清晰的就不用说了,大家的认定都是一样的。比如商品相关的放到商品服务,会员相关的放到会员服务。


但是对于轮廓模糊的业务,大家作出的决定就不一定相同了。


这个时候起决定性作用的并不是各自的工作经验,而是你的「业务思维」是否具有全局性,以及对全局业务的了解程度如何。



一旦草率的作出了“不合适”的归属划定,后续将会带来大量的额外成本,协作、更高的bug率等等。


看看以下的场景是不是平时有见到过?


  • 嗨,小明,我这里有个bug需要你和我一起调试下。


  • 当初如果这个业务在这里就好了,现在已经积重难返了,只能推倒重做了。


  • 我觉得这个问题可能是这里导致的,也有可能是那里导致的。



所以,一个业务归属于哪个项目,看似是一个很简单的选择题。但是每个人心中的默认选择是不同的,比如以下两种截然不同的倾向。


  • 我能解决的就我解决咯,实在解决不了的再给对方


  • 只能我这里解决的就我这里解决,其它的全部对方来


其实这些选择都是因人而异的,很难形成一个放之四海而皆准的共识。


如果双方都选择第二点,产生冲突、争执是必然的。


哪怕大家都选择“为他人着想“的第一点,只是避免了相互扯皮,但还是无法避免后续业务边界混乱付出的额外成本。


所以,我们还是需要从中提炼出本质的东西作为决策的准则。



Z哥我认为思考业务归属的时候,本质上还是逃不开「高内聚低耦合」范围,一个合理的项目归属认定,会让软件系统离每个人所期望的「高内聚低耦合」更近一步。


因为「业务归属」和「高内聚低耦合」一样,都在“划线”,明确边界。


但是我们很多时候其实并不知道“线”应该具体画在什么位置,只是知道一个大概方位而已。



其实,如果当我们的系统只是一个单体应用的话,是不存在「业务归属」问题的。


因此它是在分工协作下所产生的一个副作用。


但是,只要我们继续保持分工协作来开发一个分布式系统,这个问题就是绕不开的一道坎。



在工作中,由于边界不清容易产生业务归属分歧的场景主要是以下两点。


  • 一个新业务,需要两边配合完成


  • 一个老业务,一部分在A处理,一部分在B处理。


这里先停顿一分钟,想一想,如果是你的话,该如何来作出选择?



Z哥我给你的建议是,你可以这样来考虑:哪边缺了这个业务的话,会导致至少一个流程走不通


640?wx_fmt=png


来举两个例子帮助你理解。


一个电商网站现在要上线一个会员卡的功能,类似阿里的88会员这种。 


效果是买了这个会员卡的用户,在该平台购买自营商品时,享受8折优惠。


那么你来思考一下?这个业务到底是放到「会员服务」还是「促销服务」?


参照上面的建议来思考就是回答两个问题:


  • 会员服务缺少了这个会员卡业务,是否有至少一个流程走不通?


  • 促销服务缺少了这个会员卡业务,是否有至少一个流程走不通?


很显然,会员卡虽然有一个打折功能,但是这个打折是建立在一个身份标识上的。


那么就要思考一下,这个身份标识后续是否会在整个购物链路中的多个环节有露出展示或者对应的专属业务,比如专属客服、每月领福利等等。


另外你会发现,如果促销想实现打8折的效果,可以完全不需要有会员卡的存在也能做到。


所以,这个会员卡本质更像是会员属性的一个扩展,是跟着某个具体的会员走的。


假如最终不小心被归属到了促销服务,则每次围绕会员卡展开的业务都需要与促销服务产生耦合才能完成,很明显就背离了「高内聚低耦合」的初衷。


所以,对促销服务来说,会员卡业务并不是必不可少的。相对来说,会员服务与它的关系更紧密。


至此,第一个例子的答案就出来了,应该放到会员服务。



再来看第二个例子。


随着社交电商模式的崛起,该电商平台想上一个拼团功能。


那么这个功能该放到「购物车服务」里?还是「促销服务」里呢?


同样回答两个问题:


  • 购物车服务缺少了这个拼团业务,是否有至少一个流程走不通?


  • 促销服务缺少了这个拼团业务,是否有至少一个流程走不通?


首先,大家最容易想到的是,拼团一般都是直接下单,不经过购物车,自然不用放到购物车服务,放到促销服务才是合适的。


这个理解完全合理。但是我们可以再想一下,拼团就必须要放到促销服务里吗?


拼团其实也就是一口价,也不用经过促销的价格计算。


如此看来,拼团对促销来说也不是“刚需”。


这个时候将拼团服务独立出来才是更好的选择。因为在这个例子里,缺少拼团业务,对两个服务都不会产生流程上的阻碍。


反而独立出来后,后续对拼团业务的调整,会更容易进行。不用对购物车服务、促销服务产生任何影响。



至此,我相信你对如何判断一个业务的项目归属已经有感觉了。如果你想贯彻「高内聚低耦合」作为系统的设计方针,不妨学习一下「领域驱动设计」。


这是由Eric Evans提出的概念,将建模作为、划分系统边界等等作为最高优先级的开发模式。


我相信,随着未来的业务越来越复杂,基于业务作为出发点考虑的软件设计理念会越来越凸显价值。


因为技术只是实现业务的介质之一,况且新技术的产生速度正在越来越快。


那么,与其用最好新技术,不如替业务选择最适合的技术。



好了,我们总结一下。


这次Z哥先帮你分析了一下产生「业务归属」分歧背后的原因。


然后,再分享了一个正确思考这个问题的建议,还举了两个例子。


以后再遇到拿捏不准业务该归属到哪个项目的话。只要记住一句话:哪边缺了这个业务,会有至少一个流程走不通。如果都能通,那么这个新业务就适合“独立门户”


在程序员们的日常工作中,容易发生分歧的问题还有很多,不过,其实大部分问题都有一个通解——全局的业务思维。



推荐阅读:

  • 分布式系统关注点——缓存背后的“毁灭种子”

  • 8个月打磨,一份送给程序员的「分布式系统」合集



原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)


如果有希望我写一下什么主题的话,欢迎在后台给我留言哦~


640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

newcode Islands 思维

传送门 文章目录题意:思路:题意: 给你两个圆,上面依次有nnn个点,编号为1−n1-n1−n的排列,给出一种连边方式,使得每个点都被遍历且连线不能相交,没有方式的话输出−1-1−1。 思路&…

微服务探索与实践—服务注册与发现

前言微服务从大规模使用到现在已经有很多年了,从之前的探索到一步步的不断完善与成熟,微服务已经成为众多架构选择中所必须面对的一个选项。服务注册与发现是相辅相成的,所以一般会合起来思索。其依托组件有很多,比如Zookeeper,Co…

快速沃尔什变换:从入门到背板(含推导过程)

前(che)言(dan) FWTFWTFWT是个神奇的东西。 然而网上多数讲解多数直接给结论,顶多用归纳法证一证。 所以本文会讲解FWTFWTFWT的推导过程。 虽然也用到了构造,但是好背得多 参考博客:https:/…

微服务探索与实践—总述

背景软件开发是一个不断发展的过程,从当初的面向过程为主到如今的面向对象的开发,软件开发者不断探索与实践更加符合时代发展要求的开发模式与架构思想,而这,也在极大程度上提高了软件开发的效率。微服务是一种架构模式或者说是架…

P4097 [HEOI2013]Segment 李超线段树

传送门 文章目录题意:思路:题意: 实现以下两个操作: (1)(1)(1)在平面上加入一条线段。记第iii条被插入的线段的标号为iii (2)(2)(2)给定一个数kkk,询问与直线xkxkxk相交的线段中,交点纵坐标最大的线段的编…

【CF1204D】Kirk and a Binary String【结论题】【LIS】

传送门 题意:给一个01串SSS,求一个等长的01串TTT SSS和TTT所有对应位置的子串最长不下降子序列长度(以下简称LIS\text{LIS}LIS)相同TTT中0的数量尽量多 ∣S∣≤100000|S| \leq 100000∣S∣≤100000 对于一个01串SSS,…

这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!

本周三的Developer Wednesday为大家揭秘了Microsoft Learn网站的全新学习模式一时间Microsoft Learn圈粉无数如果你正在为错过直播而暴风哭泣等一等,看这里!全程高清回播将为你持续解密这一次你一定不可以再错过了哦!什么是Microsoft Learn&…

【CF1182D】Complete Mirror【树的重心】

传送门 题意:给一棵NNN个结点的树,你需要钦定一个根,使得所有深度相同的点的度数相同。 N≤100000N \leq 100000N≤100000 用脑子想一想,就是根节点直接相连的子树都长得一模一样。 如果根节点度数大于1,我们发现它…

P1989 无向图三元环计数 思维 + 建图

传送门 文章目录题意:思路:题意: 统计无向图中三元环的个数。 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2)。 我们可以考虑给点之…

十分钟了解Kubernetes

何为Kubernetes?最简单的一句话来概括Kubernetes。它就是一套成熟的商用服务编排解决方案。Kubernetes定位在Paas层,重点解决了微服务大规模部署时的服务编排问题。Kubernetes组件介绍了解Kubernetes都是从Pod开始的。Pod是Kubernetes最小的调度单元,所…

【CF1020C】Election【贪心】

传送门 题意:NNN个人给MMM个党派投票,开始时每个人选择一个党派投票(给定),每个人可以花费一定代价贿赂(每个人给定代价),求让1号党派胜出(票数严格最大)的最…

Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp

传送门 文章目录题意:思路:题意: 给你一天hhh小时,初始时间是000,每天可以使时间aia_iai​或者ai−1a_i-1ai​−1,问最多可以让多少天的时间在[l,r][l,r][l,r]范围内。 思路: 算是个比较简单…

【CF1194E】Count The Rectangles【类扫描线】【单调性】【树状数组】

传送门 题意:给定NNN条与坐标轴平行的线段,保证不垂直的线段没有交点,求一共构成多少个矩形(以线段交点为顶点)。 1≤N≤50001\leq N\leq50001≤N≤5000 显然是个数据结构乱搞题。 直觉告诉我们先枚举一条线段。 假…

.NET Core 的过去、现在和未来

在最新的微软 Build 大会主题网站上,微软.NET 程序经理 Scott Hunter 发表了一篇文章,指出.NET Core 是.NET 的未来。去年,微软就已经确认 Visual Studio Live 中的.NET 框架将会被.NET Core 取代。将.NET Core 作为开源开发技术栈在 2014 年…

Ozon Tech Challenge 2020 (Div.1 + Div.2) C. Kuroni and Impossible Calcul 抽屉原理

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组ana_nan​&#xff0c;求∏1≤i<j≤n∣aj−ai∣modm\begin{matrix} \prod_{1\le i<j\le n} |a_j-a_i| \end{matrix}\bmod m∏1≤i<j≤n​∣aj​−ai​∣​modm。 n≤2e5,m≤1e3n\le2e5…

【HAOI2015】按位或【Min-Max容斥】【FWT】

传送门 题意&#xff1a;开始时你有一个数000,每次选出[0,2n−1][0,2^n-1][0,2n−1]中的一个数进行按位或&#xff0c;每个数选中的概率给定。求得到2n−12^n-12n−1的期望操作次数。 1≤n≤201\leq n\leq 201≤n≤20 神仙题 首先发现每一位都是独立的&#xff0c;可以分开考…

Visual Basic 兴衰记

这是一篇暴露年龄的文章。为什么这么说&#xff1f;因为现在年轻的程序员可能没有接触过当年红极一时的 Visual Basic。28 年前的 1991 年 4 月&#xff0c;Microsoft 发布了 Visual Basic 1.0 for Windows&#xff0c;次年 9 月&#xff0c;发布了 Visual Basic 1.0 for DOS。…

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated) D. Kuroni and the Celebration 交互 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗树&#xff0c;每次可以询问两个点的lcalcalca&#xff0c;询问次数不能超过⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊2n​⌋&#xff0c;求它的根。 n≤1e3n\le1e3n≤1e3。 思路&#xf…

【CF1047D】Little C Loves 3 II【构造】【赛瓦维斯特定理】

传送门 题意&#xff1a;给一个NMN \times MNM的空棋盘&#xff0c;每次选取两个曼哈顿距离为3的空格子放上棋子&#xff0c;问最多能放多少个。 1≤N,M≤1e91 \leq N,M \leq 1e91≤N,M≤1e9 暴力讨论 假装N≤MN \leq MN≤M ①N1N1N1 容易得到&#xff0c;详见代码 ②N2N…

函数式编程里的Materialization应该翻译成什么?

Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程.首先, 搜了一下中文资料, 暂时没有对该词的中文翻译, CSDN\博客园\阿里云上所有关于它的文档都没有做中文翻译, 直接沿用这个英文单词.难道轮到我来创造这个词的中文翻…