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

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

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

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

27027 次点击
所在节点    程序员
230 条回复
YuTengjing
2020-01-07 21:30:34 +08:00
其实我觉得吧,现在有些人就是没意识到,甚至不愿意承认前端的门槛越来越高了。
搞技术的如果不能持续学习,不愿克服困难,持续探索,真不适合当程序员。
beidounanxizi
2020-01-07 21:31:08 +08:00
好问题
mikulch
2020-01-07 21:32:43 +08:00
太长了,先占位再说。
另外找个成都的,5 年以上的高级前端,经验越丰富越好,一起合作做产品。产品需要持续投入精力,所以不太适合迫切需要钱,被迫 996 的朋友,本职工作很忙的朋友。
本人 7 年后端。本职工作不忙,可以持续投入副业。
tyrealgray
2020-01-07 21:37:38 +08:00
@YuTengjing 前端门槛一直很低,一个记事本就能写 html。只是上限变高了,越来越多的东西能用 js 写了。
lihongming
2020-01-07 21:45:15 +08:00
楼主说的很好,我也是近期重学前端,准确的说是 reactjs,发现必须抛弃原有知识,当一个全新的领域来学才是最快的。

现代前端技术栈是树状的,学着学着就会发现有个知识点会用到另一个技术,必须单独去学,另一个技术也是这样……如此迭代,整个技术栈学下来丝毫不亚于后端知识体系。但只要静下心来用心去学,一个月时间就能开始做一些东西了,学习能力强的可能一周就够了
murmur
2020-01-07 21:45:41 +08:00
vue 是真的简单,然而有些人总是在无脑推荐 react,没办法呀,明明人家的需求就是个内容展示系统,你想着给别人上个墨刀的架构,那能简单就怪了

vue 的框架设计是在玩游乐园,设施就在那里,你怎么玩也不能出游乐园
react 是让你盖游乐园,最后你可能超越迪斯尼,但是提供给你的只有一个地基和施工指南
TheFLY
2020-01-07 21:47:46 +08:00
结尾对类比恰到好处的精准使用已经预示了楼主未来十年将有一个极其光明的未来。
sagaxu
2020-01-07 21:48:42 +08:00
请你体谅一下,他们只是老了。他们年轻时,也曾挥斥方遒,驳斥那些视 jquery 为洪水猛兽的上古神兽。
iMusic
2020-01-07 21:48:59 +08:00
把前端业务类比房子,把建房子的工具比作前端技术栈

可能以前的任务只是建土胚房,用锄头、瓦刀、锯子等就可以盖起来。现在要求建高楼大厦了,还用原来的工具也许也可以盖的起来,但难度太大了。而用现代机械,可能上手难度比锄头难多了,但是效率肯定比原始工具高。

所以是前端业务的复杂性导致现在这些技术栈的产生,虽然比以前使用的工具学习成本高些,但更适合现在的前端业务。
darmau
2020-01-07 21:50:11 +08:00
@tyrealgray 你咋不说用吸铁石写硬盘呢
dog82
2020-01-07 21:50:20 +08:00
java1.4 一路过来的老程序员,对 java 8 的函数式编程也表示看不懂了,也可能是我变老了,现在转成 Go 语言了
YuTengjing
2020-01-07 21:52:54 +08:00
@tyrealgray #4 也对,换成高水平的前端吧。各种 cli,库,框架将细节封装起来,并且随着时间的推移会还会有更多的细节被掩盖,而平时的开发其实大多数是业务开发,接触不到细节,即便能接触到,没有比较扎实的基本功和持续不断的探索精神也没办法探究下去,很容易导致一直原地踏步。舒适区是很可怕的,如果没有足够的动力,很多人是很难走出也不愿意走出舒适区的。
fkdog
2020-01-07 21:53:02 +08:00
人家说看不懂都只是调侃罢了,真以为学不会呢?
这么跟你说吧,大部分后端,入门一门新东西,大概搭建环境可能也就多点只占 30%左右。
然而前端这边,npm package.json 还算好装,接下去 webpack 和 babel 配置就跟噩梦一样。
好不容易花了大把时间研究文档终于搞出了一个脚手架来,这时候我想用一下类似 antd 之类的第三方 ui 类库,结果发现,要引入一个 ui 类库居然要大改 webpack 和 babel 相关配置。

够折腾
darknoll
2020-01-07 21:54:44 +08:00
有些后端就是看不起前端,但是有些后端的活真的比前端简单不少。
WildCat
2020-01-07 21:55:08 +08:00
调侃一句,前端也看不懂后端了吧,「中台」「 k8s 」……
ayase252
2020-01-07 21:55:35 +08:00
@fkdog 不是,引入了一个 antd 需要改 webpack ?
hyrepo
2020-01-07 21:58:05 +08:00
我不认为业务的复杂性就一定会和技术的复杂性画上等号,最后一段“奉劝各位,把抱怨转化成求知”更是不认同,如果没有抱怨,给什么学什么逆来顺受,那改善和优化从何而来?技术的革新有多少次不是通过对现有技术的吐槽而得来的?
YuTengjing
2020-01-07 22:01:32 +08:00
@darknoll #14 说实话,我觉得大厂的前端应该都会写简单的 CURD。很多招聘信息不都写着至少熟悉一门后端语言。
Martox
2020-01-07 22:03:37 +08:00
@mikulch 接近 4 年前端,进一步说话?三街上班,不算大厂。
Geeker
2020-01-07 22:04:51 +08:00
@sagaxu 说得真好啊

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

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

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

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

© 2021 V2EX