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

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

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

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

28967 次点击
所在节点    程序员
230 条回复
iheshix
2020-01-08 11:33:48 +08:00
我公平的说,看了楼主这篇文章,我觉得确实写得很不错。有自己的见解。
然后看了楼主的博客的见解,我就“爱”上楼主了。

这年头三观正的人,不容易找了。
wly19960911
2020-01-08 11:34:52 +08:00
无非出现这么多争执,单纯就 JS 入门门槛低,从业人员多了,也包括全干工程师,换成其他平台看看还有一句话敢说吗,难道 android 学习成本就低了? iOS 学习成本就低了? qt 成本低了?

只是因为原来只会原生 html 开发的人现在被强迫着学习来自其他平台的 GUI 设计理念(组件)然后抱怨而已。
EPr2hh6LADQWqRVH
2020-01-08 11:40:07 +08:00
屎壳郎从来见不到屎,总是见到饭。
T3RRY
2020-01-08 12:09:41 +08:00
看了评论,不懂还敢瞎 BB 的傻逼是真的多
zigzog
2020-01-08 12:09:59 +08:00
@maomaomao001 对我这种外行来说它们都是“自动化构建工具”,相当于 Java 里面的 Maven 和 Ant,也可以说它们目标不一样,但对只是用用的人来说并不关注那些区别。
B4PLpPSsR4voMdx0
2020-01-08 12:22:23 +08:00
说得好,那些太有偏见的帖子不值一看。
KasuganoSoras
2020-01-08 12:25:18 +08:00
PHP 路过,虽然是后端但是也要干前端的活,没学过什么 Vue,Webpack 这些高端玩意,从来都是 jQuery 一把梭,能跑就行了,自用的网站没那么细致,何况我还是个写后端的
FaiChou
2020-01-08 12:27:55 +08:00
@maomaomao001 给你一个我的同事的 blog 吧 https://blog.strongfish.site/
maplelin
2020-01-08 12:36:14 +08:00
说前端不会写后端的,前端人均培训班毕业?不知道哪来的优越感,谁上学的时候没学过 C,JAVA 这些基础课程
maplelin
2020-01-08 12:41:01 +08:00
前端的发展是需求导向的,有什么需要做什么样的功能,有人非要把后端那一套理论放在前端来,也不知道是什么鬼心思
maomaomao001
2020-01-08 12:41:26 +08:00
@zigzog 那其实你们这些说法真的非常搞笑, 你又要不关注 webpack, (可以,没问题, 你用 create-react-app ,或者 vue cli 命令行 ,2,3 分钟就给你搞好环境啊,配套工具了)

然后又想关注 webpack 的细节 ,发帖上来说 看不懂前端开发了, 这不很矛盾吗 ?
maomaomao001
2020-01-08 12:48:47 +08:00
@FaiChou 这个博客好像没有转码过去的代码 , 有没有那种,能比较容易体现 clojurescript 优点的网站(或者应用)
royzxq
2020-01-08 12:55:45 +08:00
啧啧,有些人呐,点进去看主题和回复有惊喜
FaiChou
2020-01-08 13:01:06 +08:00
@maomaomao001 我私聊你说这个问题吧. 你可以点我头像用 telegram 私我.
Lfinesse
2020-01-08 13:15:55 +08:00
@laminux29 都学过。后端也学过。

模电数电这些又跟后端有啥关系呢?
irgil
2020-01-08 13:24:19 +08:00
@hyrepo 深以为然,屁股决定脑袋,同时沉没成本本身就让人畏惧。其实更应该关注的是,自己的通用能力、核心能力的提升,这才是核心价值所在。
linZ
2020-01-08 13:48:28 +08:00
@avastms redux,vuex 什么的又不难。。大家都学一下,用这个简单好用的东西,多好
xxdd
2020-01-08 13:54:59 +08:00
stay hungry stay foolish
不过觉得原帖没啥恶意···评论乱了
LemonFlower
2020-01-08 14:00:03 +08:00
@avastms 一直不喜欢前端用函数式,再配上拆碎成几十个 package,一个普通页面几十个文件,极端抽象复用,项目大起来是真的恐怖
barbery
2020-01-08 14:00:03 +08:00
『为什么前端就应该是谁都能看懂?』请继续你们的表演😂

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

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

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

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

© 2021 V2EX