前后端分离的陷阱

news2024/12/27 12:09:16

不管你设计的系统架构是怎么样,最后都是你的组织内的沟通结构胜出。这个观点一直在组织内不断地被证明,但也不断地被忽略。

前后端分离的利与弊

近几年,随着微服务架构风格的引入、前后端生态的快速发展、多端产品化的出现,前后端分离已经成为行业的普遍实践,也是大型企业级分布式架构的缺省选择。

前后端分离也给软件技术人员的职业发展和协作方式带来了新的变化,分别出现了前端工程师、后端工程师、前端开发团队以及后端开发团队。

前后端分离使得前端关注信息架构,处理用户体验相关问题;而后端则关注构建业务能力、数据处理、持久化等问题,并向前端提供API接口(API as product),由前端进行消费。前端工程师不需要关注后端的具体实现和技术框架,后端工程师也不需要关注前端的具体实现和技术框架。

这带来了如下的好处:

  • 前后端用户体验和业务逻辑解耦。不同端以及不同用户体验的变化不再影响后端API接口。后端API聚焦在表达业务能力,可同时服务于多端产品,而无需更改。
  • 后端无需考虑业务逻辑或能力升级对前端的影响,只要保证接口不变即可。
  • 响应变快。对前端尤其是多端服务出现后,前后端分代码和打包部署等技术分离、可以更快地响应不同的用户体验需求,而不必等待后端。
  • 前后端工程师能力聚焦,可以专注各自领域的技术学习,聚焦提升自己的专项技能和经验。
  • 前后端团队边界明显,认知负荷降低,单点开发效率高,只需关注本端的开发任务和技术即可。

分离带来的好处渐渐体现出来,尤其是在一些大型的互联网项目尤为明显。然而也有很多前后端分离的交付团队中出现了如下的问题:

  • 团队开发业务的大小和复杂度随着项目的进行发生变更,引起前后端团队人员比例失调,比如出现前端开发团队进度快,需要等后端团队联调,或者反过来,后端团队等前端的情况,开发进度不畅,沟通协作成本高。
  • 这样的临时任务变动,不管新增还是调换人员的动态调整成本高,体验差。
  • 业务开发节奏快,没有足够时间量留给后端预先设计API,前端团队只能靠自己的猜测和仅有的共识进行开发,联调时双方分头再改一遍,返工高,沟通协作成本高。
  • API的设计也受前端消费者和开发节奏的影响,面向前端的用户体验设计。
  • 多个相同组件模块间出现多种不同的做法。

那么,前后端团队不分行不行。当然行,前后端人员不分的协作模式可以灵活匹配开发任务、全栈能力提升、同时团队还可以了解端到端的业务;但同时也使得团队整体的认知负荷高,架构越复杂成本越高,还会影响整体的开发效率。

那到底分不分呢?是什么在影响我们的架构?

组织的沟通结构决定软件构架

康威定律:设计系统的组织由于受到约束,这些设计往往是组织内部沟通结构的副本。

分不分答案其实很简单,就如文章开头所言,**不管架构怎么设计,不管作为技术从业者的我们多少次向更好地架构和技术发起努力,但还是会看到“为什么得不到想要的设计,为什么明明是一个架构却各不相同”。因为,在这场对抗中,最后一定是组织的沟通结构胜出。**实际上也确实是这样。从上述坏味道以及这些“前后端分离团队”的代码中也可以看出:

  • /stock-schema/customer-detail
  • /stocks/createAndNext
  • /stocks/query-list?

后面就差写上page了

前后端分离看似简单,然而它实际上是技术的分离而非团队的分离。如果要真正实现前后端团队分离的协作模式,或者反过来要想实现前后端技术分离的分布式架构,都要首先考虑组织的沟通结构设计,让它去服务于你想要的及架构。

尤其是当我们在构建和运行大规模软件系统的时候,更需要刻意设计我们的团队沟通结构,以促成“低摩擦”的软件交付,避免“跨部门的职能竖井”、严重依赖外包资源、大量工作件流动受阻、无法提供快速交付或者难以满足现有业务服务的组织反馈机制”。

设计团队的沟通结构

那么,回到最初的问题,如果作为架构师的我们,想要实现前后端技术分离的分布式架构,如何设计团队的沟通结构?

我参考《高效能团队协作模式》中作者给出的四种拓扑类型、三种协作模式,以及设计原则试着给出如下两种答案:

1.方案A - 前后端分离的特性交付团队

方案A的端到端交付团队协作模式
图1.1 方案A的端到端交付团队协作模式

方案A的端到端交付团队服务的架构图
图1.2 方案A的端到端交付团队服务的架构图

图1.1和1.2分别展示了方案A中前后端团队如何围绕架构进行协作。方案A的假设在于前后端分别是不同的服务/产品,向不同的服务对象提供某种服务。

每个团队都是端到端的交付团队,好处是团队高度重视用户价值和服务的可用性,可以快速的响应各自的变化,团队的认知边界也很清晰,协作成本低,效率高。它的挑战则在于服务的边界是否定义良好、能否被正确实现,服务提供方可以实施服务管理实践时,这种模式才能正常运作。一旦边界或API不合理,效率会降低。这种方案对团队的服务/产品设计和管理能力要求较高。

方案A中赋能团队、以及可能的领域子系统团队是必不可少的。尤其在团队和业务规模增长的情况下,这两个团队的存在是为了补齐端到端特性团队的能力短板,降低认知负荷,提供特定领域的支持和赋能,同时避免了因组织沟通壁垒导致的规范、实践、重复造轮子、能力缺少等共性问题,尤其促进了跨组织的低摩擦软件交付和特性团队的交付效能。

2 方案B-端到端交付团队

方案B的端到端交付团队协作模式
图2.1 方案B的端到端交付团队协作模式

方案B的端到端团队协作的架构图
图2.2 方案B的端到端团队协作的架构图

图2.1和2.2分别展示了方案B中前后端团队如何围绕架构进行写作。方案B同样以端到端的特性团队为主,它将整个架构所服务的Web系统看做是一个服务或产品。因此,采取纵向切片的方式划分端到端的特性交付团队。在这样的团队协作中,前后端技术分离但不分家,前后端工程师分别以组件开发的方式进行协作和内部集成。

它的好处在于,能够完成端到端的交付,不需要依赖其它团队,团队自己有能力进行快速的业务创新和探索,也可以与领域子系统进行协作达成目的。

其缺点则在于:

  1. 前后端开发集成需要较多的协作和沟通成本
  2. 需要迭代计划的配合
  3. 这些开发细节和沟通等待会产生较高的认知负荷,对整体效率产生影响
  4. 对团队能力挑战大

同样,方案B中赋能团队、以及可能的领域子系统团队是必不可少的,这两个团队的存在避免了因组织沟通壁垒导致的规范、实践、重复造轮子、能力缺少等共性问题,尤其促进了跨组织特性团队的低摩擦交付和效能。

然,方案B的另一个问题在于,通常端到端交付的节奏都比较快,要预先留给后端进行设计的时间并不多,所以也会很容易出现在文章开头的问题(又回到原点):

  1. 前后端并行开发,在集成时返工
  2. 后端API为前端而设计,耦合度高
  3. 前后端人员比例与业务的节奏和复杂度不能灵活匹配,出现前端等后端,或者后端等前端联调的情况,造成浪费。

这些问题如何解决?

  • 根据业务变化,动态的调整前后端工程师的比例。人员协调成本高,团队人员体验差,成长不利。
  • Web开发前后端能力全栈,Story前后端一起做,灵活匹配开发任务、团队能力提升、还可以同时了解端到端的业务和实现;但同时也使得团队整体的认知负荷高,前后端技术和架构越复杂成本越高,还会影响整体的开发效率;也还需要同时考虑人员的成长与发展。
  • 适当增加全栈的比例,前端和后端分开做,由全栈同学做“自由人”切换前后端开发任务。自由人越多,团队整体的适应力就越强,对自由人的挑战和依赖较大。

在我的访谈中,1、2、3均有很多团队尝试过或正在采纳。大多数团队前后端的比例在1:2 ~ 1:4之间调整。访谈的同学都提到了两个决策因素:

  • 既要尊重现在的前后端技术发展趋势和生态不同,各自有不同的关注点和特点
  • 又要为达成业务目标而努力。

那么,还有其它的解法吗?从《高效团队协作模式》一书中我找到了另一种答案:

在考虑这个问题的时候,切入点依然是康威定律的指引。我们会发现,一个项目的架构也并不是一成不变的,它会随着业务的变化而变化,在产品的早期、成熟期、规模期,架构是不同的形态,我们为什么不可以用动态的眼光去设计我们团队的沟通结构呢?答案是显然的。

所以就有如下的解法:

假设业务及技术的复杂度和规模随着时间而增加。那么:

  • 在交付初期,业务和技术的复杂度相对较低,要求业务快速上线完成价值转化。

    前端后端更多的是在构建基础的页面和模型。与此同时,团队刚刚形成,需要端到端的去了解业务的价值,面向Web开发的全栈更容易促成团队的组建、规范和达成业务目标。

  • 交付中期,业务开始增长,有复杂的业务流程引入,以及用户体验要求上升。

    前后端的技术复杂度也随之而来,比如页面的渲染,交互操作,微前端的引入、数据的一致性,业务的可用性都开始有了较高的要求。
    同时,代码量也到了一定的量级,在耦合性、内聚性也都出现了不同程度的质量要求。
    这个时候,可以适当的开始引入前后端专家,以赋能角色促进的方式与全栈团队进行协作,解决技术难度,整洁代码治理,赋能规范和对应的前后端工程实践等以提高整体的工程效能。

  • 交付的成熟期,随着业务规模发展,系统架构也开始变的复杂起来,用户多了起来,除了功能特性,也会在页面加载性能、数据安全等方面提出新的要求。

    与此同时,也会出现多端产品服务,开发者生态的形成也会促进后端形成平台化的能力。
    这些变化都会促成前后端团队的逐渐分离。
    这个时候前后端团队也会适当增加转向架构和特定领域的技术专家,可能增加特定领域团队,而大前端的工程师则会补充前端+Bff的开发能力诉求。

总结

前后端分离本质上是技术的分离,而不是人员的分离。团队要不要分取决于你如何设计你的架构,也取决于你的业务模式,所服务的产品形态、团队能力、工程实践的成熟度。

前后端团队分离的成本是极高的,对团队的能力要求也是极高的。它并不适合业务不明确,交付优先级经常变动,需要快速交付,且需要不断创新和探索的业务。

从个人成长来看,前后端分不分并不重要,而是于自己的发展目标与项目机会是否匹配,团队不应该成为我们成长的阻碍,而应该化为促进我们成长的平台。

本文的讨论并不涉及Mobile app的开发。如果你的架构既有Web端,又有Native app, 小程序,你的团队结构是怎么设计的呢?

(感谢李源春、廖安栋、赵林、付世威等同学的输入)

推荐阅读

  • 高效能团队协作模式
  • 如何高效管理一支开发团队(上)
  • 如何高效管理一支开发团队(下)
  • 如何应对团队协作的五大障碍
  • 开发团队如何远程工作

文/Thoughtworks 禚娴静
原文链接:https://insights.thoughtworks.cn/low-friction-software-delivery-teams-patterns/

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

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

相关文章

vue前端框架应用案例(三)实现简单的echarts柱状图表

目录前端效果展示项目架构Seller.vueSellerPage.vueindex.jsApp.vuemain.jsindex.html后端源程序接口测试本博客内容参考黑马课程,详细信息请参考以下网址 Bilibili官方黑马课程:【echarts数据可视化项目】 前端 效果展示 项目架构 Seller.vue 该部分…

点云双边滤波

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、局部的特点。双边滤波器的好处是可以做边缘保…

rootlogger 和 logger的关系

你是不是经常看到日志框架&#xff08;log4j、log4j2、logback等&#xff09;配置文件中有类似配置&#xff0c;但是始终搞不清楚啥意思&#xff1f;<root level"INFO"><appender-ref ref"CONSOLE" /><appender-ref ref"FILE" /&…

3.9.1Cache的基本概念和原理

文章目录一、引子二、工作原理三、局部性原理&#xff08;1&#xff09;空间局部性&#xff08;2&#xff09;时间局部性&#xff08;3&#xff09;总结四、性能分析&#xff08;1&#xff09;方案一&#xff08;2&#xff09;方案二&#xff08;3&#xff09;考题五、块&#…

LeetCode 212. 单词搜索 II 【字典树+回溯】

题目链接&#xff1a;https://leetcode.cn/problems/word-search-ii/ 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&am…

VC+VB开发CAD重生记:CADEditorX 15.X Crack

CADEditorX是一个 ActiveX 组件&#xff0c;用于在任何支持 ActiveX 和 COM 技术的开发环境&#xff08;例如 C#、Visual C、Delphi、VB、JavaScript 等&#xff09;中向网页或正在开发的应用程序添加 CAD 功能。它可以查看、编辑、转换、打印和测量DWG、DXF、SVG、HPGL、PDF、…

python设计模式-构建器(Builder)设计模式,原型设计模式

构建器(Builder)设计模式构建器(Builder)模式是一种独特的设计模式&#xff0c;它有助于使用简单对象构建复杂对象并使用算法。 这种设计模式属于创建型模式。 在这种设计模式中&#xff0c;构建器类逐步构建最终对象。 该构建器独立于其他对象。构建器(Builder)模式的优点它提…

Anolis Os linux U盘 安装

Anolis OS系统8.4安装|U盘安装Anolis OS(龙蜥)8.4系统_白云一键重装系统 (baiyunxitong.com)https://www.baiyunxitong.com/jiaocheng/7092.html#:~:textAnolis%20OS%E7%B3%BB%E7%BB%9F8.4%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4%EF%BC%9A%20%28%E5%88%B6%E4%BD%9CU%E7%9B%98%E5…

深度解读 python 实现 dbscan算法

DBScan (密度基于空间聚类) 是一种聚类算法&#xff0c;它通过找到图像中的密度峰值来对数据进行聚类。 文章目录DBScan 算法解释说明DBScan 算法的应用场景Python 实现的 DBScan 算法Python 实现 dbscan 高级算法再演示一种 python 实现 dbscan 算法的代码总结DBScan 算法解释…

共享模型之内存(二)

1.有序性 1>.JVM会在不影响正确性的前提下调整语句的执行顺序,思考下面一段代码: static int i; static int j; // 在某个线程内执行如下赋值操作 i ...; j ...;可以看到,至于是先执行i还是先执行j,对最终的结果不会产生影响.所以,上面代码真正执行时,既可以是: i ..…

mysql:日志,redo,undo,为什么使用日志?

mysql日志 mysql事务的隔离性是通过锁来实现的 而原子性&#xff0c;一致性&#xff0c;持久性就是通过日志来实现的。 REDO LOG 称为 重做日志 &#xff0c;提供再写入操作&#xff0c;恢复提交事务修改的页操作&#xff0c;用来保证事务的持 久性。 UNDO LOG 称为 回滚日志 …

凑个小热闹:python采集《狂飙》评论

前言 昨晚&#xff0c;2023年首部爆款剧集《狂飙》迎来大结局&#xff0c;一度冲上热搜第一 “是非面前稍不留神&#xff0c;就会步入万丈深渊&#xff0c;唯有坚守信仰&#xff0c;才能守得初心” 面对这么多广大网友的讨论&#xff0c;我也来凑上一个热闹 用python采集一下…

Mybatis框架(三)深入Mybatis之Mybatis注解开发与分页的实现

本文是本人专栏【Java开发后端系列框架】里的文章&#xff0c;文章根据各框架官网与网上资料加上本人工作经验&#xff0c;进行修改总结发布在这个专栏&#xff0c;主要目的是用于自我提升&#xff0c;不用于获取利益。如果系列文章能到帮到您本人将感到荣幸&#xff0c;如果有…

docker学习(四):DockerFile微服务实战及docker端口映射

文章目录前言1.Dockerfile介绍2.微服务实战案例3.docker端口映射3.1查看docker网络模式命令3.2docker网络模式前言 大家好&#xff0c;这是我学习docker系列的笔记文章&#xff0c;目标是掌握docker,为后续学习K8s做准备。本文记录了springBoot微服务项目通过DockerFile生成镜…

基于Android的租车app

需求信息&#xff1a; 1.用户中心 进行登陆注销、修改信息、修改密码、上传用户信息:身份证、驾驶证等&#xff0c;并提供基本的验证真伪功能。2.租车交易 用户可以查看可以根据条件查看可以租用的汽车车辆信,息。完成租用车辆功能&#xff0c;(包括登记汽车使用的位置范围) 车…

基于数字孪生的智慧电网3D可视化运维系统

十四五规划提出&#xff1a;“加快推动数字产业化&#xff0c;培育壮大人工智能、大数据、区块链、云计算、网络安全等新兴数字产业”&#xff0c;这是深化电网领域以新能源为主体的国家新型电力系统战略。建设背景在2020年的联合国气候峰会上&#xff0c;我国正式提出了“3060…

听说,这届飞桨社区的框架贡献者真的很“卷”

飞桨平台的快速发展&#xff0c;与开源开放密不可分。飞桨框架建设并非只靠百度工程师&#xff0c;也离不开热爱飞桨、热爱开源的开发者们&#xff0c;他们用自己的方式参与飞桨框架建设&#xff0c;与飞桨共同成长。 为了鼓励更多的开发者参与到飞桨社区的开源建设中&#xff…

前端利器——炫酷的CodePen

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

目录 一.为什么要使用智能指针 二.auto_ptr 三.unique_ptr 四.shared_ptr 五.weak_ptr 智能指针均定义在头文件<memory>中&#xff1a; #include<memory> 同时每种智能指针都是以类模板的方式实现 一.为什么要使用智能指针 C的内存管理中&#xff0c;每当…

如何使用ArcGIS拼接栅格

1、概述数据的来源是多种多样的&#xff0c;特别是从网上下载的各种数据往往是分块的数据&#xff0c;在使用的时候需要进行数据的拼接&#xff0c;这里为大家介绍一下ArcGIS进行栅格拼接的方法&#xff0c;希望能对你有所帮助。2、直接拼接在ArcToolbox中点击“数据管理工具\栅…