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

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

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

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

28952 次点击
所在节点    程序员
230 条回复
nicevar
2020-01-08 09:45:05 +08:00
@KuroNekoFan 别,Qt 现在还是碾压 Elecron 的,Electron 目前还是写玩具的时代,微软这么强的公司,弄出个 vscode 还经常用着用着卡得要命,别说用来做一些复杂功能的软件了,什么时候可以用来写 Maya 这种软件就可以拿出来吹了
leigou19
2020-01-08 09:46:20 +08:00
如果是单纯的 crud 本前端也看得懂后端啊,但是追究到什么分布式,事务我就不知道了。对应来说,vue 大部分人猜也能猜出来是干啥的,但是想一步到位弄清楚前端工程化,难道不要付出点学习成本吗
qingsonghe
2020-01-08 09:48:12 +08:00
微软的 office 365 套装,我现在用的多的反而不是客户端,而是 online web 版本。感觉前端开发,整套流程下来,复杂程度和后端是相当的。
no1xsyzy
2020-01-08 09:52:51 +08:00
@murmur 甚至 React 社区造出的游乐设施 Vue 那边就靠官方抄过去。这个比喻神了。
yaphets666
2020-01-08 09:53:04 +08:00
@Felldeadbird 不用对应的工具啊 现在基本不用写 webpack 了 早就集成了...说你们不懂你们还不服气
EPr2hh6LADQWqRVH
2020-01-08 09:53:13 +08:00
@FaiChou 可以,胆子挺大的
mikulch
2020-01-08 09:55:21 +08:00
@Martox 看了下老哥你房贷 8k 会不会压力太大了。。。。顶不住什么时候就去大厂 996 挣高工资了。
geying
2020-01-08 09:55:22 +08:00
看评论像进了幼儿园 有扯皮的功夫不如摸会鱼

我觉得前端确实是比以前复杂了,但是至少在发展,但是发展归发展,步子不要太大,容易扯着蛋

后端就继续搞好后端,自己的坑还没填完呢,怎么还有精力搞前端(被迫全干的除外)
tachikomachann
2020-01-08 09:55:44 +08:00
讨厌的是不断地折腾工具和概念,还有娱乐圈似地导出打嘴炮推广。。
sunznx
2020-01-08 09:56:55 +08:00
模板混代码里这种 PHP 宗教行为就别提了。
现在的 php 也不是模板的啊
nfyig
2020-01-08 10:00:55 +08:00
@FaiChou 什么公司, 这么牛, 但最终还是编译到 js, 而且异步流程如果用 FP 应该不是很好处理
Felldeadbird
2020-01-08 10:04:31 +08:00
@yaphets666 就是变复杂,学习成本大了。以前后端可以兼职前端。现在前端打包后的成品,如果不部署对应开发工具,在成品修改的话,不专业呀。开发环境部署完毕后,还要学习多一套新语法。后端估计大部分连 es6 语法都没弄懂。看了半天,看得一头雾水。如果在看 typescript……所以回到正文:后端现在已经看不到前端。 不正是如此吗?
JJmou
2020-01-08 10:05:42 +08:00
@mikulch 4 年前端可以吗,这是需要上班还是利用闲暇时间做
ben1024
2020-01-08 10:08:25 +08:00
[JSX is similar to another extension syntax created by Facebook for PHP called XHP.]( https://en.wikipedia.org/wiki/React_(web_framework)#JSX)

PHP 的嵌入模板在纯展示层还是舒服些
arraysnow
2020-01-08 10:10:12 +08:00
@hyrepo 屁股坐歪了。
楼主要说的是,不要因为某个领域难以入手就去讽刺+鄙视整个行业(前端真的难入手吗?),前端早已不像当初全干程序员一把梭的时代,现在由于业务和平台的复杂已经细分为一个行业了。这就像因为机器学习入门难就去吐槽 tensorflow 不好使,而大部分程序员对 ml 认知还处在“协同过滤”“国际象棋”这两个名词。
承认现实远比回避来的实在,至于技术革新,先把姿态摆正才有谈的意义
wenzichel
2020-01-08 10:21:33 +08:00
术业有专攻,为什么前端的东西,一定要让后端看懂
no1xsyzy
2020-01-08 10:25:58 +08:00
@wangyzj #58 编程范式的改变改变的就是上层接口,而不是底层实现啊,V8 还是 C 实现的呢,C 既不是函数式(无闭包)也不是面向对象(勉强做出来 cls_method(obj, args...),这些函数仍然在唯一命名空间)。而且相当多的文章讲闭包直接描述为 “闭包对象”。
另一方面,PG 写过一篇简单实现 CLOS 的。反过来说,这样考虑也没什么问题:类就是生成对象的函数,而对象就是含有一个闭包并设计了消息入口的函数。传统的杯子例子:
https://gist.github.com/no1xsyzy/d30b8efca925ec426cc1bd3f5ee6d780

发展目标不应该,至少大部分会去主动判断 “应该不应该” 的人都声称不应该是走向自然语言。

另外,js 可能可被 wasm 抛弃,但目前 wasm 使用量极少,大部分还是用于骇客目的,其次是混淆。
murmur
2020-01-08 10:28:48 +08:00
@no1xsyzy 开源社区互相借鉴有什么不好么,vue 还借鉴了 ng 呢,google 那个 ng 喷子已经被开除了
yanguangs
2020-01-08 10:33:04 +08:00
@Felldeadbird
ts 对于后端来说没什么难度吧,反而不了解的是前端的打包,配置项这一块.
我接触的很多前端,反而对 ts 一开始是很不适应的.
onfuns
2020-01-08 10:34:59 +08:00
我一直认为前端后端都是只是一种语言的实现,而不是局限于岗位。
再说了鄙视链不是一直都有吗?底层 > 算法 > 后端 > 前端 > 测试 > 运维 > 产品。
只要技术存在一天,有岗位需求,那么鄙视链一直存在,就像洋大人比自己人高一等的感觉。

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

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

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

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

© 2021 V2EX