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

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 这个命令,而是根本不懂这个命令背后解决的是什么问题。

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

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

28979 次点击
所在节点    程序员
230 条回复
charlie21
2020-01-08 14:03:09 +08:00
@lambdaq @KasuganoSoras 后端出身者,做前端,就当体验生活了。心态要摆正
大学生参加小学生的夏令营,你就好好体验嘛,问这问那 问什么?
人家的夏令营做得有声有色,是,再怎样,你也不想把它当正式工作来做(大学生参加小学生夏令营,算什么?留级?)。其实是这么一回事

然而这些情绪都是多余的。在商品时代,有人发工资,就有人做。有人给大学生发工资,也有人给小学生发工资,还发得挺高!怎么说呢,这方面而言,大家都是没有区别的,都是劳方。劳方何苦为难劳方
zappos
2020-01-08 14:05:25 +08:00
代码混模板只会在浏览器这种异步加载文件的地方出现。

你看安卓是咋搞的,先写在 xml 里面,然后 inflator.inflate(rid)。

如果哪天能 new Component(path) 就好了。都是浏览器的限制也没办法。
rick2c
2020-01-08 14:11:22 +08:00
搬砖嘲讽搬砖的,哈哈
shintendo
2020-01-08 14:13:07 +08:00
上面那个模电数电的给我看笑了,难道以为前端都不是 CS 专业毕业的?吹的自己都信了
zappos
2020-01-08 14:13:46 +08:00
@LemonFlower 大型项目难以维护的原因是 js 用 html 的机制来管理包,而不是用自己的机制,你看后端的 js 项目就从来没有这个问题。
lemon6
2020-01-08 14:17:31 +08:00
后端稍微学习下就能写前端?那前端花点时间就不能写后端?谁大学没学过 c++,java 呢。不知道哪来的优越感
zappos
2020-01-08 14:20:03 +08:00
@no1xsyzy wasm 的最大阻碍就是大家不愿意升级浏览器。webpack 的作用就是把新特性编译成旧特性,以便在低版本浏览器上运行,你编译成 wasm 就整个白忙活了。😂😂😂
Lesions
2020-01-08 14:28:33 +08:00
夏虫不可语冰,撑南哥
Jimmy2Angel
2020-01-08 14:35:02 +08:00
真心觉得前端比后端难
fernandoxu
2020-01-08 14:38:45 +08:00
@FaiChou 什么公司?好🐂🍺
zigzog
2020-01-08 14:40:53 +08:00
@maomaomao001 “你们说的这些就非常搞笑了”,对不起,我不知道“你们”是谁,没人需要我代表,我也不想代表任何人,如果你觉得受了哪个后端的气,你应该直接找到那个具体的人。
我前面说的那些并没有说前端现在这样如何好或者不好或者我懂或者不懂,我要表达的只是说作为后端,在缺乏前端时只要自己愿意,总能解决问题,如此而已。
所谓的“看不懂前端代码”这话可不是我说的,麻烦你仔细看过之后再评论,对我来说没有看得懂看不懂,只有需不需要看懂的区别,当然了,我也只是个普通的开发者,太高深的,在应用层之外的除外。
前面我说 webpack 比 grunt 复杂,我不太懂,的确是不懂,因为没空去仔细了解它的内部机制,只能照猫画虎把事情做掉就行了。
说白了,web 上的东西,绝大部分都是“数据管理系统”,无论前端后端,技术上来说并没有什么多难的东西,真正的难题基本上都在语言或者开发平台层面被解决掉了,最多只能说有些问题解决起来比较繁琐,各种框架无非是解决这个繁琐的问题,现在前端无非是框架多了,工程化程度高了,带来的结果就是交互上的体验更细致,这当然是进步,但是要说后端看不懂前端代码,那才真是搞笑。
shintendo
2020-01-08 14:41:07 +08:00
@zappos 跟浏览器关系不大,前端本来就有构建这一步,js 在浏览器不支持的情况下一样能做模块化。“代码混模板”是 react 否定表现与行为分离的结果,是根植在 react 的设计哲学里的,也是我个人认为 react 最重要的贡献,往大了吹是解放业界思想。虽然在实践上,我更喜欢 vue 的 SFC 方案。
webbillion
2020-01-08 14:44:22 +08:00
@mikulch 你好,我有兴趣,不过没 5 年那么多,但是能力应该没问题。
fyxtc
2020-01-08 14:46:50 +08:00
挺好的心得分享,值得读。说到底还是容易把对自己不利的情况归结为外因而不是因为自己的欠缺造成的,这种人不在少数
jmi
2020-01-08 14:49:45 +08:00
挺好
FFFire
2020-01-08 15:05:22 +08:00
让一切归于全干工程师
4BVL25L90W260T9U
2020-01-08 15:21:44 +08:00
实际上 JSX 这个东西就是从 Facebook 的 XHP ( PHP 增强版)发展来的。吐槽 PHP 的语法垃圾可以,但是 PHP 的编程模型还是挺有价值的,可以看一下 Facebook 的这个视频:
<amp-youtube data-videoid="vG8WpLr6y_U" layout="responsive" width="480" height="270"></amp-youtube>
shintendo
2020-01-08 15:30:42 +08:00
@ospider jsx 更早的雏形是 e4x
atonku
2020-01-08 15:32:51 +08:00
你们是真的闲
leido
2020-01-08 15:33:30 +08:00
说得好,很赞同你这句 『写 iOS / Android 应用和写 Web 前端没有本质上的区别,区别只是语言和平台,背后处理的问题是一模一样的』

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

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

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

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

© 2021 V2EX