为什么我不喜欢「前后端分离」(个人观点,欢迎来喷)

2016-08-09 07:17:39 +08:00
 FrankFang128

原文在 http://iwritejs.com/dont-seperate-backend-and-frontend/


我不知道国外有没有「前后端分离」的运动,我只知道国内的大公司喜欢搞这个。

前后端分离大概的意思就是后端只给前端提供数据,前端负责 HTML 渲染(可以在服务器渲染,也可以在浏览器渲染)和用户交互。

说这个说得最多的就是阿里的前端了。同时阿里的前端也是在中国最活跃的。

为什么做前后端分离?

本篇文章我来腹黑地揣测一下原因。以下言论不针对某个个人,而是对前端群体的群嘲。我坦然接受你的反嘲讽。

最开始的前后端:

图一

某些团队做前后端分离,主要的原因是

在前后端分离之前,前端就是页面仔。技术大牛都是后端,鲜有前端能晋升到架构师层级。这不是对前端的歧视,而是前端真的只是做做页面、加个动效而已,凭什么晋升到架构师。

当时前端能控制的,就是 CSS 和 JS 文件。连 HTML 都是放在后端的仓库的。因为 HTML 是由服务器输出的,用到的模板语言就是后端的。

Node.js 火了之后,前端看到一个机会, HTML 是可以用 Node.js 来输出的呀,于是鼓吹前后端分离,把 HTML 层面交给前端来控制。这样前端就能管控更多的东西了(好可怜,终于能掌握 HTML 的控制权了)

HTML 如果放在浏览器渲染,就是下图

图二

HTML 如果用 Node.js 渲染,就是这样

图三

看起来只是掌握了 HTML 的控制权,但是这里面可以做的文章可多了。

以前 HTML 是 Java 、 PHP 输出的,或多或少存在效率不高的地方,现在用 Node.js 重写,效率是不是就提升了(很少有程序重写了,效率还下降的)。效率提升了是不是该奖励下前端,给几个晋升名额呢?

前端得到好处了,就更要巩固自己的地位了。以前的 jQuery 代码,后端看看就懂。「那不行,我要搞点后端看不懂的」,这样才能显示我前端的技术含量,这样才能升值加薪啊。于是 React 、 Gulp 什么全加上。

好了,我编不下去了。

总之我不认同这种前后端分离。

为什么?

因为

  1. 又增加了一个中间层(当然程序员通过增加中间层来解决问题),好处是有,职责明确;但是也有坏处:人为地拉长了战线。对比图一和图三你就会发现,结构变复杂了,一个人能做的事情变成需要两个人做了
  2. 并没有实质变化。以前的后端结构也是存在调用 Service 逻辑的,现在只不过换成让前端用 Node.js 做。除了把本来就吃紧的前端人力耗费在他不擅长的领域,我没看到什么提升。这里唯一的好处就是前端是势力范围扩大了。

我认同的是「全栈工程师」。

一个业务的前后为什么要分给两个人写?以表单提交为例,后端要对数据做校验,前端也要做。为什么要让两个人都写一次?前端说可以让后端也写 Node.js ,这样就可以服用代码了呀。

搞笑吗?后端写了三年的 Java 你现在告诉他要全部重来?后端肯定不愿意啊。

矛盾就出在,分『后端』和『前端』两个职位上。

大公司细分后端和前端,也是可以理解的。这里不表。

我只是说前端端分离的缺点:

  1. 大部分站点,不应该分前后端。除非你的前端,非常非常非常复杂。但是大部分站点的前端,根本没有那么复杂!

  2. 分了前后端很容易出现各自为政的情况。推诿、邀功、互相鄙视,不一一列举了。

  3. 有人问一个人怎么又学后端又学前端?我的建议是把前端做薄,如果没有必要,不要搞什么 Angular 、 React 。用原生 JS 或者 jQuery 能满足大部分网站。同时后端向 Rails 学习。局部交互复杂的地方,采用动态加载来做交互。

  4. 有人说你是前端的叛徒,你这么做前端还有什么前途。

    搞笑,你做了前端就要一辈子为前端说话吗?太屁股决定脑袋了吧。

标题有点标题党,其实真正主题是:前后端分离是前端不得志的必然结局。(好像更标题党了 XD )


难道前后端分离没有好处吗?

我觉得只有一个好处:好招聘。毕竟你要招一个优秀的全栈工程师是极其困难的。

有人说,你真有意思,说这么多缺点,你还不是给不出解决方案,说了跟没说一样。

说下我的思路

  1. 保持前端简单,复杂了就用原生的方式封装,具体来说就是用自定义标签来封装复杂组件。这样一来,后端同事还是可以开发页面,因为只是多了一个自定义标签而已,本质还是 HTML

  2. 尽量不要在开发状态加 watcher ,目的也是让后端可以直接上手,不需要了解那么多工具。转译放到 Web 框架的开发者模式里面做,看到 less 请求加转义成 CSS 不是什么难事也不复杂。

  3. 前端只是辅助(这里说的是大多是网站,不包括重型 Web 应用),前端要做好服务化:健全的文档、友好的接口。

  4. 前端也要学后端知识,别在那自嗨。

  5. 小公司别搞前后端分离,徒增复杂度!!!

128197 次点击
所在节点    JavaScript
562 条回复
FrankFang128
2016-08-09 09:05:00 +08:00
@noli 用 RESTful 结构的话,不存在问题啊

/data API 分成 /data.json 和 /data.html 两种形式就好,移动端只用 /data.json 就好啦。(当然某种意义上这就是前后分离)
FrankFang128
2016-08-09 09:06:03 +08:00
@murmur 我觉得是的,不然我真的无法理解那些吵着用 React 的人是怎么想的。
genffy
2016-08-09 09:06:32 +08:00
@FrankFang128 要跳槽么?来么?
FrankFang128
2016-08-09 09:06:33 +08:00
@xchange 对,除了做页面,得找点事情折腾折腾才好。
ChiangDi
2016-08-09 09:08:31 +08:00
我们公司前后端分离没有 node 做中间层
FrankFang128
2016-08-09 09:10:25 +08:00
@ChiangDi 那应该是图二吧?用 JS 做渲染。
mdluo
2016-08-09 09:10:40 +08:00
Rails 的 turbolink 不就是残废版的 virtual DOM 吗

Rails 确实很优秀,但是也确实很老了,至少在处理前端方面

还以为在前端技术里就 Vue 和 React 能互喷,没想到 Rails 居然也能
just4test
2016-08-09 09:11:08 +08:00
为什么我不喜欢 mvc 架构,明明只用 jsp 就能搞定一切的
mazyi
2016-08-09 09:11:31 +08:00
HTML 是什么?我只关心数据。
后端的逻辑为什么不分离?和前端一起画画?
并且呀,前端学了那么久了,早就该开始写后端了嘛, nodejs 不是很火嘛~
Phariel
2016-08-09 09:12:01 +08:00
我所见过的全栈 前端代码根本不行 都是拿后端思维在搞 术业有专攻 前端还要考虑渲染交互浏览器优化等等很多事情 前后不分离的时代又不是没有过 Dreamweaver 各种 IDE 级的绑定我就在写 .net 还是 2.0 的时代我就在写 最后感觉都不靠谱 直到前端这个专业分工出现我才觉得 WEB 开发有希望了
XueSeason
2016-08-09 09:12:39 +08:00
非常喜欢楼主的几篇有个人见解性质的文章,从批判的角度看前端,给人更多的思考。
xiaonengshou
2016-08-09 09:14:28 +08:00
做 web app 就前后端分离,不是就后端渲染。看产品需求咯。
FrankFang128
2016-08-09 09:15:00 +08:00
@mdluo Virtual DOM 不就是残废版的游戏渲染器吗? 这种话语没有实质的意义,我认为 Virtual DOM 是在炫技,对业务没有很大提升。当然如果你的业务一秒钟操作 DOM 100 次, Virtual DOM 还是有意义的。

我把所有前端渲染的框架一起喷。
FrankFang128
2016-08-09 09:16:38 +08:00
@xiaonengshou 相信我,大部分项目都应该后端渲染。除了我上面列举的在线 IDE 和在线游戏不能后端渲染。
Felldeadbird
2016-08-09 09:17:40 +08:00
前后分离 多了中间层去处理后端的数据,其实真的很不优雅。不过在现在讲求 分布式业务下,这点性能损失也是可以容忍的。
只要业务大了,后端肯定需要和前端分离的。否则多端开发的时候,后端都要写一次,很辛苦的。
noli
2016-08-09 09:17:56 +08:00
@FrankFang128 所以你也知道了,前后端分离几乎是必然的。事实上除了 web 相关开发,我没发现哪里不是前后端分离的。当然我也觉得全栈的理念很合理,只是目前全栈的工具链发展得还不是很完善。然而全栈也是应该支持前后端分离的思想的。
marvinwilliam
2016-08-09 09:18:10 +08:00
你觉得都愿意这样么?你在大公司呆久了没啥,人家业务多,分离可能会比较和你,但是你去过小公司么,你知道有一部分的小公司的后端有多水么?前端的东西是完全不会写,人家 HR 也是没有办法才要求招的前端,这些后端当然喜欢分离了啊,毕竟自己工作就少了啊.
mdluo
2016-08-09 09:18:49 +08:00
@FrankFang128 说 webapp 没场景,举个例, QQ 空间要不要滚动无限加载,要不要动态更新回复要不要动态通知,微博知乎同理。用 React 来做就是分拆分拆组件, redux 绑定好数据,组件内部状态跟界面绑定好,分分钟搞定。用传统方法做,要判断多少条件?
deadEgg
2016-08-09 09:21:09 +08:00
支持楼主 , 一切为了开发效率
大公司前后端分离是为了开发效率以及分工明细,
小团队前提倡敏捷开发,没必要太过的提倡前端的复杂度
FrankFang128
2016-08-09 09:21:27 +08:00
@mdluo 我认为像 Vue 和 React 这么重的前端,是没有必要的。我认为前端应该不要再在「 JS 统一宇宙」的路上深陷下去了。
现在
CSS 用 JS 写
HTML 用 JS 写
服务端渲染用 JS 写
DOM 被 JS Virtual DOM 取代
Web Components 被 JS 框架取代
SEO 不要了
不用 GulpJS 开一个 Watcher 都不能开发啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298014

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX