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

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

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

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

28961 次点击
所在节点    程序员
230 条回复
frankwei777
2020-01-08 10:38:07 +08:00
看来大家年底 kpi 都完成了
no1xsyzy
2020-01-08 10:38:20 +08:00
@chinuno 程序员本身都是任务细分才出现的,COBOL 当初的目标就是让商人可以自己编程,结果商人发现直接雇个人编程更方便。
另外,后端前端所接触的设计师是不同的。
后端接触的数据库设计师,建模师。
而前端则是用户界面和交互体验设计师(就是美工 /UI/UE/UX )。
lk920724
2020-01-08 10:39:24 +08:00
保持学习,保持谦虚。
TimLang
2020-01-08 10:39:26 +08:00
我后端出身,jquery 时代可以折腾前端,js 基础不错,最近折腾 flutter 感觉写页面比 css 简单多了。。
xbdsky
2020-01-08 10:42:13 +08:00
有这种感觉,前端现在真的门槛越来越高
lambdaq
2020-01-08 10:46:02 +08:00
后端看不起前端主要原因是布局无非就是 x y 坐标系上画点整。。随便找一个程序员也能花点时间给你做出来一个(效率低下)的排版或者布局引擎。

但是没想到浏览器给整出来那么多幺蛾子。我觉得主要是 css html 天生残废导致的。前段工程化也是不得已而为之的事。比如从来没听说过写 qt/android/ios 的要有人专门来写界面和布局或者交互。都是一个人直接撸完。
no1xsyzy
2020-01-08 10:46:58 +08:00
@murmur 是没什么不好,但体现了 Feature 的偏向流动性,各种 React 社区先出,然后 Vue 出,慢半拍
ruby109
2020-01-08 10:48:08 +08:00
FP 和 FRP 是两个东西
murmur
2020-01-08 10:48:45 +08:00
@no1xsyzy 慢半拍和稳定成熟的实现,我选择后者,这就是 vue 能迅速成长的原因,每个技术都不是最新也不是首创,但是拼起一个非常好用的东西
samaxu
2020-01-08 10:49:31 +08:00
问题在老板觉得你应该看得懂
maomaomao001
2020-01-08 10:52:07 +08:00
@Raymon111111 我就是真的想知道,什么框架学习 (学习,学习) 用半年 ?
fantastM
2020-01-08 10:53:23 +08:00
就个人从零学习 Vue 的体验而言,自从适应了从 jQuery 的 DOM 操作到 Vue 组件化的写法之后,感觉世界都美好了
maomaomao001
2020-01-08 10:55:56 +08:00
@zigzog 这两个就不是干同一个事情的呀
no1xsyzy
2020-01-08 10:58:03 +08:00
@murmur 所以我选择去游乐园玩而不是去造游乐园。
所以说这比喻神了。
expy
2020-01-08 11:01:12 +08:00
看不懂才好啊,多造几个岗位,也能多几个地方搬砖。
FaiChou
2020-01-08 11:21:07 +08:00
@nfyig

贴一个公司的博客, 有兴趣的话可以来学习. 小公司, 青岛.
wly19960911
2020-01-08 11:26:51 +08:00
@avastms
“要不你问一下各大 GUI 系统的老油条,什么 Windows,X 之流,为什么不用最适合 GUI 编程的 FP 语言?
你猜也是 XML 写 UI 的 Qt,是不是也把模板写代码里然后预编译一下?”

那为什么你不能承认历史潮流要转变呢?就以教条主义来践行一切准则?你确定 windows 的老油条不做前端了? GUI 那你说的除了函数式语言精进难度非常高以外你说了什么有用的词? 以别人的行为来推测某个平台的不正确?

到最后你也只是说了,函数式可读性差,对于入门的人来维护项目不可靠,其他的词都是废话,用自己的词来掩盖自己重申过的观点。

我认为从 react,flutter,iOS 的 swift UI 上,能看到一条别人没走过的声明式 UI 的道路。而 react 真正践行的 react hook,现在只有 react 流行,这个也是不少人认为完全的函数式带来的误区。

楼主说的是声明式 UI 对 UI 带来的变革,如果我没理解错误,你的话里面也没有谈到 react hook 的问题。所以不要以为拿一点语句来表达自己重申的观点就能把自己的话说的很令人信服。
maomaomao001
2020-01-08 11:28:37 +08:00
@FaiChou 求推荐几个 clojurescript 写的网站, 我很想浏览体验体验 , 本以为你的博客是 clojurescript, 但是好像不是
reeco
2020-01-08 11:29:00 +08:00
前端有啥难的,有啥看不懂的
zxCoder
2020-01-08 11:31:09 +08:00
道理我都懂,可是真的难

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

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

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

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

© 2021 V2EX