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

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

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

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

28893 次点击
所在节点    程序员
230 条回复
jiang42
2020-01-07 22:07:00 +08:00
实际上一项技术真的牛逼的话就是应该让傻逼能写出还过得去的代码,比如 Go

我是做 static analysis/formal verification 的,我的愿景就是让傻逼也能会用 sa/fv
YuTengjing
2020-01-07 22:07:08 +08:00
@ayase252 #16 这倒确实要,一般都要使用 babel-plugin-import 插件配置 antd 按需导入,antd-dayjs-webpack-plugin 插件替换 moment 成 dayjs 减少打包体积,还有修改 antd 主题等... 当然了,优化不优化还是看你自己了
hyrepo
2020-01-07 22:07:23 +08:00
再多说一句,近几年的观察以及亲身经历的感悟是,搞技术的往往很容易因为对某些技术付出了精力就去捍卫这些技术,所以别人说你用的技术有问题时,在你反驳之前请先想一想自己有没有站到一个客观的位置上,你要捍卫的究竟是技术本身还是你自己付出的精力?
orzorzorzorz
2020-01-07 22:09:21 +08:00
此时,一名路过的 ng 老年选手正思考着如何吹一吹 vue 和 react,并考虑如何在其中混入 ng 黑以达到更好吹 ng 的效果,且需要吹 rv 吹得有理有据,黑 ng 黑得不带痕迹,带更多人步入老年。
ayase252
2020-01-07 22:17:11 +08:00
@YuTengjing 当然,做到优化改 webpack 没毛病。但是从学习路径上来说,单纯引入使用这一步还不到改 webpack 的层面。(突然发现 antd 的文档把这个放到 getting started 里面,难怪有人那么吐槽)
Felldeadbird
2020-01-07 22:18:12 +08:00
所以我有个疑问了。
以前 java,php,asp 都只需要搭建对应的环境,外加非必要的数据库,就可以运行了。

现在换了更专业的前端(公司裁员前端离职了),如果不用对应的工具维护前端的代码(即经过工具打包的代码),能否做到以前那样,开箱即用呢?

这是我这个后端的唯一认为前端门槛提高了的地方。
murmur
2020-01-07 22:20:16 +08:00
@Felldeadbird 能啊,连 node_modules 打包拷给别人就可以,less 是可以,然而 sass 还是啥要二进制文件,我不知道这个东西在不在项目目录里
jtsai
2020-01-07 22:24:27 +08:00
老问题了, 其实 web 前端比起前些年的爆发现在新东西和概念少了很多, 接近成熟了, 说难也真不难, 繁琐
Raymon111111
2020-01-07 22:28:31 +08:00
终于花了半年把框架学会了

结果框架被淘汰大家都用新的

*前端现状*
djyde
2020-01-07 22:29:30 +08:00
@Raymon111111 #29 據我所知前端技術棧在 2018 - 2019 已經沒什麼變化了
hantsy
2020-01-07 22:40:27 +08:00
前端框架流行,要感谢 FF,Chrome 的兴起,不然还停留在 IE6,狗屁框架也用不了。现在新框架几乎不支持 IE 系列了。
shintendo
2020-01-07 22:41:11 +08:00
@jiang42 vue 就是那个让傻逼写出过得去的代码的东西
guanhui07
2020-01-07 22:44:30 +08:00
现在前端就学下 react vue 技能点 挺成熟了吧
tyrealgray
2020-01-07 22:46:58 +08:00
@darmau 能一样吗?
如果是一个程序员,没写过前端有天被叫去写前端凑合的情况大有人在。
反过来可能就不那么现实了,比如让前端从来没搞过嵌入式从头学点焊吗?
murmur
2020-01-07 22:47:24 +08:00
@hantsy 某种意义应该感谢的是 360,通过各种手段推广带 chrome 内核的浏览器
Austaras
2020-01-07 22:52:17 +08:00
@djyde hook
maomaomao001
2020-01-07 22:52:29 +08:00
@Raymon111111 啥框架要学半年啊 , 这也太神奇了
tun
2020-01-07 23:00:41 +08:00
电脑手机性能越来越好 对功能要求也变高了 性能的快还要展示的好 所以一个全栈是不可能的 开始前后端分离 分离后就可以只研究自己这部分 双方就往两个方向越走越远 这时候后端直接跳到前端的领域一定就是看不懂的
DOLLOR
2020-01-07 23:01:11 +08:00
@Raymon111111
今年 2020 年,Vue 6 岁,React 7 岁,Angular 4 岁,webpack 8 岁,Babel 6 岁,TypeScript 8 岁,Electron 7 岁,Node.js 11 岁。

以上东西不会半年就淘汰,反倒是半年都学不成一个东西的人是得担心自己被淘汰了。
Raymon111111
2020-01-07 23:10:09 +08:00
@maomaomao001 所以前端只学工具使用吗?

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

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

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

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

© 2021 V2EX