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


这里是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,一经查实,立即删除!

相关文章

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

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

微服务探索与实践—总述

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

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

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

十分钟了解Kubernetes

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

【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 年…

Visual Basic 兴衰记

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

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

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

Ozon Tech Challenge 2020 (Div.1 + Div.2) E.Kuroni and the Score Distribution 构造

传送门 文章目录题意:思路:题意: 思路: 不难想到,长度为nnn的数组最多的满足条件的三元组序列是1,2,3....,n1,2,3....,n1,2,3....,n,对于每一个位置贡献为i−12\frac{i-1}{2}2i−1​,那么如果m…

Exceptionless(二) - 使用进阶

作者:markjiang7m2原文地址:https://www.cnblogs.com/markjiang7m2/p/11100563.html官网地址:http://letyouknow.net在上一篇文章Exceptionless - .Net Core开源日志框架中就说到如何对Exceptionless进行本地化部署,不过我也跟大家…

基于 Kong 和 Kubernetes 的 WebApi 多版本解决方案

前言大家好,很久没有写博客了,最近半年也是比较的忙,所以给关注我的粉丝们道个歉。去年和朱永光大哥聊的时候提了一下我们的这个方案,他说让我有空写篇博客讲一下,之前是非常的忙,所以这次趁着有些时间就写…

CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs

传送门 文章目录题意:思路:题意: 给定一个n∗nn*nn∗n的矩阵,每个点上面都有一个xi,yix_i,y_ixi​,yi​,表示这个点到xi,yix_i,y_ixi​,yi​这个点停下,当xi−1,yi−1x_i-1,y_i-1xi​−1,yi​−1的时候代表…

从严治码-别人在项目中下毒,我该怎么治?

01 从软考说起从4月份开始,由于备考《系统集成项目管理工程师》的原因,博客没有持续更新,在上半年考试结束之后,又对项目进行了一些收尾的工作。下面就这段时间的学习作一个记录和总结吧。在学习的过程中,提炼了一些自…

学习MVVM设计模式后第一次用于生产

WPF的MVVM设计模式从winform转变到WPF的过程,难点主要还是在MVVM的设计模式。当然,如果依然采用winform的涉及方式,在每个控件背后绑定事件的方式运用在wpf中,依然可行,但是假如GUI改版,其背后绑定的特别为…

netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源

基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统用户管理菜单管理角色管理权限管理[精确到按钮])代码生成器代码克隆到本地 用vs2017或以上版本 打开工程。项目结构如下:找到DbModel下面的初始化db脚本里面包含4张表的schema和初始化数据…

asp.net core 系列之Startup

这篇文章简单记录 ASP.NET Core中 ,startup类的一些使用。一.前言在 Startup类中,一般有两个方法:ConfigureServices 方法: 用来配置应用的 service 。 Configure 方法:创建应用的请求处理管道它们都在应用启动时,被AS…

译 | .NET Core 基础架构进化之路(一)

原文:Matt Mitchell翻译:Edi Wang随着 .NET Core 3.0 Preview 6 的推出,我们认为简要了解一下我们基础设施系统的历史以及过去一年左右所做的重大改进会很有用。如果您对构建基础结构感兴趣,或者想要了解我们如何构建与 .NET Core…

剑指 Offer 27. 二叉树的镜像

思路:递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* mirrorTree(TreeNode*…

Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的序列aaa,让你计算 n≤4e5,a≤1e7n\le 4e5,a\le 1e7n≤4e5,a≤1e7 思路: 首先这个式子是n2n^2n2的,显然不能直接算,并且异或没有分配律&…

.NET开发框架(一)-框架介绍与视频演示

本文主要介绍一套基于.NET CORE的SPA高并发、高可用的开发框架.我们暂且称它为:(让你懂.NET)开发框架。以此为主线,陆续编写教程,讲述如何构建高并发、高可用的框架。(欢迎转载与分享)它标准化了…