从「后端现在已经看不懂前端了」说起

2020-01-07 21:22:41 +08:00
 djyde

原载于我的独立博客: https://lutaonan.com/blog/to-frontend-prejudicers

V2EX 这两天有一篇这样的帖子:《说句实话,我后端现在已经看不懂前端了,太难了》

原文内容是:

看不懂惹,肿么办,最近在学 react,完全抓瞎。

然后又附加了内容:

一直用的 jquery,手动找位置然后对应 dom 操作,现在各种前端各种依赖,一会 route 一会 webpack 的 给爷整蒙了都。

类似这样的帖子多年来数不胜数,但这次评论区的评论比较典型,所以我决定这次不再沉默。当然,本文并非针对帖子作者。

对于那些抱怨前端「看不懂」的网友,我们应该问他们一个问题:为什么前端就应该是谁都能看懂?

这些网友从来不会抱怨别的领域的代码看不懂,比如他们不会说「我一个前端已经看不懂后端了」,或者「我一个后端已经看不懂 iOS 」了。

所以在这些网友心中,前端代码就是要谁都看得懂才是正常的。因为谁都应该看得懂 HTML, 谁都看得懂 CSS.

显然,这群人对前端的认知还活在过去,他们一边享受着用 Web 技术做出来应用,一边意淫着这些包含复杂业务逻辑的 Web 应用靠 HTML 和 Vanilla JS (原生 JS) 就能写成。

换句话说,这群人最大的问题在于,他们意识不到 GUI 开发 (Graphic User Interface Programming) 是一个从图形界面被发明开始就一直在被研究的独立领域,而 Web 前端只是 GUI 开发的其中一个分支而已。

这群人没有意识到到底什么是「前端」。前端就是写 HTML / JavaScript / CSS 吗?不,前端应该泛指那些需要编写 GUI 的技术。在我看来,写 iOS / Android 应用和写 Web 前端没有本质上的区别,区别只是语言和平台,背后处理的问题是一模一样的:如何实现视觉和交互 -> 交互如何触发逻辑 -> 逻辑如何影响视觉的变化

所以,如果认为浏览器识别的是 HTML 所以认为前端应该谁都能看懂、门槛低,进而得出前端目前的工作流是问题复杂化的结果,就如同因为 Android 的 UI 是用 XML 写的就认为 Android 门槛低一样不成立得可笑

对 GUI 开发难点的不了解是导致这种误解的最主要原因,以网友「 avastms 」提出的评论为典型:

这是前端圈长期逆淘汰的结果。

模板混代码里这种 PHP 宗教行为就别提了。

个人认为因为 javascript 语言的部分原因,前端很少有人懂什么是继承,什么是类,实例到底啥意思,更别谈良好维护引用了。

什么 redux,什么 vuex 根本就是莫名其妙,不就是事件监听吗,像 Node.js 那样 EventEmitter 多么清晰,非得自己造概念。

画虎不成反类犬,凡是有这套什么状态管理逻辑的,代码完全不可读。

前端自己也是不争气,不用别人的这些狗概念,自己就不会写代码了吗?

没有什么 redux,自己就不会管理自己的属性了吗?

他说:「模板混代码里这种 PHP 宗教行为就别提了」,想必他在说 JSX. JSX 刚开始出来就充满争议,但人们最终会发现,JSX 是函数式 GUI 开发最易读写的方案。实际上,他完全可以选择不使用 JSX,这样去写代码:

const Component = h(‘div’, null, [h(‘p’, null, ‘hello world’), h(‘p’, null, ‘I am Randy’)])

但是,这位网友大概更愿意读这样的代码:

const Component = (
	<div>
		<p>hello world</p>
		<p>I am Randy</p>
	</div>
)

觉得这样的写法恶心,多数是因为不知道 JSX 这个语法糖的背后是什么。

事实上没有人阻止任何人不用 JSX, 或者看看 Flutter 就大概知道没有 JSX 的 React 会是什么样子。

作为补充,这是希望 Flutter 引入 JSX 的相关讨论:Consider JSX-like as React Native · Issue #15922 · flutter/flutter · GitHub

至于提到的 Redux 和 Vuex, 证明这位网友根本不知道 EventEmitter 和 Reactive 的区别。这里就不展开讨论了。

为什么我们宁愿用 JSX 这种折中方案也不愿意放弃函数式编程,是因为声明式(Declarative) 是编写 GUI 最好的方法。复杂的 GUI 应用包含复杂的状态,人脑在处理复杂的状态绝对不比计算机在行,我们尽可能地把这些状态交给计算机做,函数式编程就是我们实现这个目标的工具。

Elm 的作者写过一篇名叫 Concurrent FRP 的论文,讲述了函数式响应式编程 (Functional Reactive Programming) 在 GUI 开发中的历史背景和应用。

那些喜欢说「 jQuery 一把梭」的网友,要么遇到的业务很简单,要么是在自虐。我见过写外挂用易语言一把梭的,但没听说过 Adobe 写 PhotoShop 用 Visual Basic 一把梭。

有些人,能接受 Maven, Gradle 的不完美,也知道什么场景应该用什么技术栈,但一旦开始写点前端代码,就认为应该有一个神一样的、完美的、还没有学习成本的构建工具,然后 Twitter, V2EX 抱怨一番,却不愿意认真学一学前端这个领域的知识。

不要妄想有一个睡醒就突然会用的构建工具。说实话,Webpack 不需要任何配置就能用,再不行试试号称 zero configuration (零配置) 的 Parcel, 用 TypeScript, 引入 CSS / LESS / SASS 通通不需要配置,跑起来就行。但那又如何呢,那些不愿意学习又想出活的网友们不懂的不是运行 webpack dev 这个命令,而是根本不懂这个命令背后解决的是什么问题。

一个人要锤子锤个钉子,结果大家都说雷神的锤子很牛逼。这个人听了,上来就要用雷神的锤子,结果拿都拿不起来。然后网上发个贴:「根本不懂为什么雷神要搞个这么重的锤子,给爷整蒙了都」。底下评论:「我工具锤一把梭!」楼下再附和:「雷神搞这个锤就是为了装逼」。

奉劝各位,把抱怨转化成求知,没有一个领域是不需要学习成本的,不管是做技术还是技术以外的领域,是分工和市场经济让各位觉得一切理所当然,然而像磨刀这样看上去简单的动作,也不是每个人都能磨好一把刀。

28898 次点击
所在节点    程序员
230 条回复
charlie21
2020-01-07 23:17:06 +08:00
学习态度问题是无法由被学习的内容本身去纠正的,更无法由 ......
你开心就好
CasualYours
2020-01-07 23:20:43 +08:00
刚学习 React 时,官方文档阐述的第一个概念便是 Think in React
LancerEvo
2020-01-07 23:23:11 +08:00
楼主这个槽点不太对
那个看不懂前端的后端显然是基础不扎实 react 那么经典简明的设计都看不懂的话 后端估计干的也不怎么样
EPr2hh6LADQWqRVH
2020-01-07 23:41:27 +08:00
我看着你们连我的“代码完全不可读”都读不明白,我也实在是替你们的语文捉鸡啊。
竟还狡辩说复杂系统的代码就不该可读?
你猜 Linux 内核的源码可读不可读?
EPr2hh6LADQWqRVH
2020-01-07 23:42:07 +08:00
我发现很多前端觉得现在自己走在函数式编程的康庄大道上,和其他 C 狗 Java 狗不一样,甚至和 jQuery 的前端老油条也不一样,完全属于特立独行,开天辟地,践行着一条没有前人走过的前端特色函数式编程道路,简直就是众人皆醉我独醒。

首先我要来指出一点,纯函数编程,永远也不可能成为主流。 为什么? 因为人类的平均智商还不够!明白了吗。你以为 js 是一种先进的函数式语言吗,别井底之蛙了,出来看看吧,都别提 haskell,一个 scala 都是搬不走的山。

别他们研究人员抛出个大概念,博士们都说好,然后一帮一知半解都谈不上的人,就跟着无脑在下面顶礼膜拜。

而且函数式编程概念一点也不新,他们最早一辈就开拓出来了,js 诞生之初就是函数传来传去的,根本没法用来唬人,好吧。


其次我要说的是,函数式编程和面向对象编程并不冲突,当然它和命令式编程就更不冲突,这其实也是 Scala 那帮人一直在说的。
你会爬了之后,突然听说了有一种移动方式叫蹦,这是不是意味着你就不用掌握走路了?


还有就别再说什么,FP 才是最适合我们前端的 GUI 编程范式,我们这么多人摸着石头走过来的一定没有错,Vue 啦什么 React 啦 jsx 啦,这都是历史的选择,是历史选择了 redux 什么 Vuex 之流来领导我们前端,他们永远是走在时代前面的,不断引领最正确的道路。

要不你问一下各大 GUI 系统的老油条,什么 Windows,X 之流,为什么不用最适合 GUI 编程的 FP 语言?
你猜也是 XML 写 UI 的 Qt,是不是也把模板写代码里然后预编译一下?


你们啊,还是要提升自己的姿势水平啊!
gzwsj95
2020-01-07 23:53:34 +08:00
前排吃瓜
charlieputon
2020-01-08 00:10:24 +08:00
还有一些后端( java )说,随便搞搞就可以写安卓了。因为都是用 java
zigzog
2020-01-08 00:13:26 +08:00
我是后端,之前有个前端的活没人干,公司也没专业前端,我自己用 jquery 一把梭整了个事件驱动的“框架”,改了几版以后改不动了,全乱了 。
没办法又学了学 vue,然后重写了一遍,感觉好多了 😄
不过前端各种花样真是学不来,前面好不容易把 grunt 搞明白点了,发现又来个 webpack,这个更复杂。。。
wangyzj
2020-01-08 00:15:13 +08:00
又来引战。。。
我一全干工程师来 BB 几句
首先,前端做好前端的活,后端做好后端的活,来回瞎掺和对自己没好处,现在不是全干工程师时代了,现在要求的是精尖人才
第二,如果只是关注某一个方面的话
后端从最初的 http server+php,java 之类就玩得转到后来分布式,集群,docker,devops,微服务,k8s,之类也是一点点的发展起来的,一个专注后端的人,从 server,数据库到什么 apm,acid 概念都得吃,你让一个前端从 0 开始来搞肯定懵逼,后端人员关注的也一直是服务器数据库性能,分布式事务可靠性等,而那个年代,没智能手机,只有 pc 上网,chrome 刚流行,ie6 还在大面积使用,bootstrap 还可以说是唯一方案,所以后端人员对前端的认识肯定是 jq,html,css,pc 能打开网页,文件只要压缩,甚至对 cdn 需求都没多少。那个年代的后端软件工程概念比较成熟,前端还算是原始社会
从 2009 年开始,v8 出现,nodejs 出现到后来 google 的 angular 出现,然后诞生 react,vue 等,前端压抑的激情得到了释放,尤其是中台概念出现后,前端觉得自己可以取代后端了。包括同时的移动时代到来,spa 应用出现,用户对网页浏览体验要求越来越高。简单的 html css js 堆积无法满足用户极端的需求和软件开发人员的协作效率,win7 开始全面部署 ie11+,各大主流浏览器都符合了 w3c 标准,前端软件工程解决方案就变得无比重要,到后来 es5,6,7 对 JavaScript 语言的优化,使得前端软件工程更加完善,甚至比现在后端还要完善,协作开发,打包,压缩,部署,cdn 一把梭,甚至有需要甚至可以做 nodejs 中间层承接更多请求,前后端协作也更加顺畅,可以说最近 10 年前端变化是质变的。反过来如果让一个后端从 0 开始直接接触 2019 年的前端,绝对是噩梦,但必须要承认的是前端目前的发展路线是必然的,是软件工程的刚性需求。同时过快的发展也带来了很多问题,common,amd,umd 乱糟糟,webpack 和 babel 之流版本一变化就惊出一身冷汗,再加上现在 dart,ts 各种崛起和三大框架不停的打嘴仗,我更希望看到稳定统一一站式的方案出现

归根结底,隔行如隔山,玩好自己的就行,不可能有人完全吃透自己的本行
而且也不用评论谁的好坏,并不是什么先进就一定是对的
要综合考量很多因素。需求,团队构成,成本和企业规划和已有技术栈更重要
v 站也没那么新潮,性冷淡风,不也玩的好好的,满足客户需求最重要
但我发现最近 Livid 好像在研究前端😨

结论
目前的前端是发展的必然产物
想学新东西肯定要花时间
肯定是复杂了,但学会后会很爽,因为更规矩了
后端把你看 k8s 文档时候骂街那劲拿出来啃一下前端肯定学得会的
手动狗头

小透明小见解
轻喷
zhuangzhuang1988
2020-01-08 00:15:23 +08:00
@avastms 哈哈, 不鼓吹会点 fp 的基础用法, 咋体现优越性
April5
2020-01-08 00:20:23 +08:00
@avastms 所以说了这么多,大神教教我们什么是前端开发的最佳实践,让大伙摩拜下 o(* ̄▽ ̄*)o
cxyfreedom
2020-01-08 00:25:08 +08:00
本身这个就不关乎前端和后端,你让前端看前端,后端看后端也会有这种情况。职位不同,公司不同,导致技术栈本身就会有差异。有些技术可以自己学,有些则是自己折腾太费力。要解决什么问题就用什么技术,当你需要的时候不学也要学,否则就被淘汰了。
GG668v26Fd55CP5W
2020-01-08 00:36:47 +08:00
因为原来看得懂,现在看不懂了。你说 iOS, Android,哦,那些原来就看不懂。
EPr2hh6LADQWqRVH
2020-01-08 00:39:38 +08:00
@April5 呵呵,大概就是 Angular 那样吧,多学学,不一定非要用,对你自己有帮助。
q8164305
2020-01-08 00:42:40 +08:00
现在前端已经非常稳定了吧,套路就那样,事实上你完全可以用自己的思路开发,react 说白了就是个纯粹的 ui 层,啥 redux 根本不需要
laminux29
2020-01-08 00:49:39 +08:00
对于后端来说,前端只是麻烦而已,何来难度。

前端不服的话,可以来试试学后端。这可不是从 C++开始学,而是从高数 /物理 /模电 /数电开始学的。
tmachineff
2020-01-08 01:09:56 +08:00
工作几年之后还在纠结技术方向,鄙视其他领域的话。你职业生涯大概率也就在搬砖了,并且搬到 35 就搬不过年轻人了
wangyzj
2020-01-08 01:21:52 +08:00
@avastms 我也觉得 fp 现在被过分夸大了,快成宗教了
虽说不那么了解 fp 底层
但在我看来 fp 底层就是对类的封装出来的构造函数指针
根本就不是 fp 唯我独尊
而是融合发展,更加向自然语言前进
但再怎么发展依然脱不开 html,js,css
除非万维网大变化
wangyzj
2020-01-08 01:22:45 +08:00
@laminux29
入门都不难
深究都不易
hcwhan
2020-01-08 01:26:47 +08:00
说的很好

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

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

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

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

© 2021 V2EX