如何评价真阿当的文章:《2016年前端技术观察》?

关注者
2980
被浏览
503064

237 个回答

让我先登录一下万年不用的 CSDN 帐号,看看我的专家头衔还在不在⋯⋯其实这种盘点文章就是这样子,我之前也不是没被《程序员》约过稿,就好像 @贺师俊 说的一样,你不写就只能约别人写,反正总是要有人写的。

尽管我的 title 还是 Front End Engineer,但我的实际工作已经变成了一半 Full Stack Engineer 一半 TPM。(TPM = Technical Program Manager,负责驱动技术项目执行而非规划面向用户的产品。)我的目标是最终项目的交付,而不是前端不前端的问题。能够让拥有相关技术的专家帮忙做,我就让他们帮忙做。他们不能帮我做,我就让他们教我做。无论是 iOS、Android 还是服务器端或者脚本,没有人做我就要去学会然后做完。不在乎技术上是否完美,够用就好,关键还是项目交付。因此我专注于思考「什么样的 trade off 最有效解决问题(如何定义够用就好)」以及「某人的 motivation 是什么(如何说服某人帮我做这件事情)」。我在阅读这篇文章时,更多的是在思考后面一个问题,也就是发生了什么事情使得阿当要这样写。

我看完这篇文章之后的感觉是,他的团队里主要有两种人:专门在新技术上挖坑而且挖完填不回去的「高手」,和什么坑都不能独立填好的「新手」。这是他不爽各种新技术的原因。再加上服务器端团队时不时有高手跑来前端挖坑,他们可能自己能够填回去但他团队里的人就是无法把坑填好,所以他非常不喜欢他团队里面的人跟风挖新坑。

这底下的问题是什么?我觉得是团队招聘和成长的问题。如果团队能够招到真正的高手,自己挖的坑自己能填平,那就没有那么多问题了。就拿 ES6 来说,坑是非常多的:开发环境要实时编译,生产环境要打包编译。两者都要支持 Source Maps,前者用于浏览器中直接调试,后者用于生产环境收集来的错误堆栈反编译。已有的大量 ES5 代码要能批量转换为 ES6。如果你团队里有人挖了 ES6 这个坑然后填不平,各种配套工具都没有,那当然是有问题的。但为什么你招不到能够解决所有这一切问题的人呢?

如果团队成员能够成长,他们能够变得有能力把坑填平,那也不是问题。对于应届毕业生来说,他们需要在公司提供好的工具和开发环境下工作,这是正常的。对于工作了几年的人来说,他们想要做工具,而且是越来越复杂的工具,这也是正常的,因为他们认为(以为)这是正确的方向。但他们的能力上限还没有到那里,你怎么办?在你眼中,他们所谓的学习成长过程就是把你的工具换代,但开了个头把一切都搞烂了就做不下去,这是你的锅还是他们的锅?

团队招聘和成长问题的再下一层,是 ownership 的问题,也就是谁背锅的问题。你可以说别人在进行工具换代时把开发环境搞烂了,影响了团队所有人的工作效率,所以是别人的锅。但你是团队 leader,这自然也是你的锅,你是逃不掉的。你可以说自己是 PM,尝试甩锅给 EM (Engineering Manager),说团队建设得不好是 EM 的责任。问题是作为 PM 你的责任就是产品要能高效率地交付,做不到的话哪怕产品规划得再好也是你的锅。

有锅就要背。正确的做法是把自己团队的问题解决了,而不是写文章跟别人吵架。做 leader 到了一定的级别就应该具备解决人的问题的能力。团队有问题就要去 debug,找到问题根源后要有能力 bug fix。到了这个级别,需要处理的问题往往不是技术而是人。你的焦点应该是如何让人能够有效地解决技术问题,然后把具体技术问题交给他们处理。

P.S. 透过 PM 和 EM 的视觉看到的世界跟工程师看到的世界是不一样的,因此我没有像其它答案一样讨论具体的前端技术。我的思维方式已经变成「如果我们认为阿当是个 bug,那我应该如何 debug 背后实际的问题?然后应该如果设计 bug fix 方案?」
这篇文章出来以后,我在微博上的第一反应是:『误人子弟』。

有些人说,要允许不同的声音嘛。至少人家有说出来的勇气嘛。这都不是重点。人当然有表达他的看法的权力,但作为一篇对一个领域做年终总结性质的文章来说,这篇文章有太多问题。因为文章太长没法细说,所以我大概说说为什么我认为这文章误人子弟:

1. 阿当的论证模式完全是经验主义,而不是基于实践。

我很早就说过,评价一项技术的时候,我遵循一个原则:如果我没有用过,研究过,亲自踩过坑,我不对一个东西妄下判断。直觉性的判断可以有,但你经验再丰富,没有实践支撑的直觉判断也是不足以作为论据的。

举例来说,对于 CSS 预处理器,阿当提出的种种疑问,全都是基于『假设』而不是实际的实践反馈:可能会出现这个问题,可能会出现那个问题。然而他没有提供任何证据表明这些问题是不能解决的。相比之下,@大漠 的回答里对于这些疑问都提供了基于实践的反馈,并且用实际使用体验来说明预处理器利大于弊。真正在生产环境里写 CSS 的前端们心里自然也知道预处理器的使用率是怎样一个状况。

对于 Angular,对于 React,他的批评也一样极其的流于表面。对于 Angular 讲的是 MV* 这种非常虚的东西,对于 React 则是用上手门槛高一笔带过,甚至说出了『既然jQuery已然可以提供必要的帮助了,那么还要React干嘛』这样的话。仔细看一看,懂的人立刻会发现这些话根本不像是真的用过 Angular 和 React 人总结出来的经验。

对这两三年流行起来的技术,并非因为守旧而排斥,而是确实做过思考,结合自己过往的经验,持很重的怀疑态度。

我们注意一下阿当说的这句话。『做过思考』,『结合自己过往的经验』。唯独没有真正去实践过。一切判断的来源都是他当年的经验。

对一个东西持怀疑态度没问题,但把这种未经实践检验的怀疑去对经验不足的新人输出,一来可能本来观点就是错的,二来让大家觉得『我没用过,但这东西不对』的思维模式是可取的,是为误人子弟。

2. 阿当的技术视野早已经脱离业界现状。

阿当说自己对新东西一向超前,这在他转产品之前或许是真的。但是转产品之后他的技术视野几乎就停滞在了当年的状态:2016 年了还在拿 Canvas 和 WebGL 说事儿,觉得『没有什么新东西』,然而实际上是他真的脱节太久了 - caniuse 这个 API 列表 (caniuse.com/#) 里面今年新出来的东西很多,然而他一个字都没有提到。2016 年了还在拿垂直居中的几种写法说事儿,然而 flexbox 他一个字都没有提到。

从纯工程的角度来说,作为一篇 2016 年的年终技术盘点,ServiceWorker, WebAssembly 这些可能导致整个平台格局变化的东西,Web Components 规范逐渐落地,HTTP/2 可能带来的前端资源打包/加载范式的改变,依然一个字都没有提到。

退一万步说,『某框架』在 2016 被广泛在生产环境中使用,入门门槛低,接地气,又恰好解决了组件化的问题,当老师仍然一个字都没提到。嗯,这几乎一定是故意的了。如果不是,只能说当老师的眼界确实闭塞到了一定程度。

作为一篇总结文,让没经验的读者看完以后产生一种『哎,看来 2016 我也没错过什么』的错觉,是为误人子弟

3. 阿当的部分观点完全出于事实上的无知和主动的拒绝接收信息。

阿当时至今日依然觉得自己对于『Node 在服务端失败了』这个判断是正确的。淘宝天猫那些用 Node 承载着过亿日 PV 的工程师们,PayPal、Uber、Netflix 这种将 Node.js 用在核心业务上的公司的工程师们听到这句话,不知作何感想。

以下视频需翻墙,请自行判断。

PayPal: youtube.com/watch?
Uber: youtube.com/watch?
Netflix: youtube.com/watch?

当老师批驳 Node 的那一段当中那个『某 JavaScript 框架作者』就是我,当年我给他的几篇博客,他只说了其中一篇,然而他没说的其他几篇当中,就有介绍当年将 Node.js 引入 PayPal 的一篇。那是 2013 年的文章;根据视频里的信息,2015 年底的时候 PayPal 不仅仅还在用 Node.js,而且是将大部分的服务端逻辑都用 Node.js 替换了。他们的团队有 700 多个 Node 开发,很多是原来写 Java 的转过来的。上面的视频,我也在微博上贴给阿当看过,至于他是没看见,不想看,还是看了却故意不提,我就无从得知了。

那么 2016 年呢?我们可以看看 Node Interactive 2016 的赞助商:Sponsors | Node.js Interactive North America 2016 | Linux Conferences and Linux Events | The Linux Foundation 这里面有 Google, Microsoft, IBM, Intel... 如果 Node.js 的市场没有在增长,如果 Node.js 没有给这些公司带来商业上的机会,他们是吃饱了撑的来赞助 Node.js 的年会?你是信当老师,还是信 Google / Microsoft / IBM / Intel 的判断?

罔顾事实,抱着成见,输出和事实相悖的信息,是为误人子弟。

4. 狭隘的前端领域意识,引导新人自我设限。

阿当在文章中常常把前端和其他领域对立起来,人为地制造一种领域归属意识。比如批评 Less, CoffeeScript, TypeScript 是其他社区对前端的入侵,把研究语言、语法糖归作是后端才应该感兴趣的事情,把研究 Node 的前端看作是不自量力、不守本行的玩票者...

然而在我看来,领域之间的思想交流才恰恰是保证领域能够保持活力、向前发展的源动力。阿当对于这些事情的反感,归根结底就是一句话:他觉得这些东西的存在是一些新人不好好打基础的根本原因,间接导致了他招不到人。然而这里面的因果关系是否是这样,非常值得商榷。

你说新人该不该好好打基础?这简直就是废话。阿当的逻辑谬误在于把他观察到的一个客观现象,逻辑跳跃地怪罪到了一些他所看不惯的技术风向头上。仿佛真的是这些研究新语言、新框架、搞全栈的这帮人害得新人们啥都不会,而自己是忧国忧民的那个人。

新人浮躁的问题,本质不在于新工具的层出不穷,也不在于社区的技术风向,而在于市场招人时候的导向。管你社区宣传得再火热,那是给已经基本功扎实的人看的。如果大家招人的时候都注重考察基本功,新人们自然会知道还是得去恶补基本功。如果大家招人的时候忽略基本功只考察新人知道多少名词,新人自然就会试图去走对应的捷径。但是,毕竟事关饭碗的事情,我相信大部分招人的人都不傻。事实上,真正在研究新技术、搞全栈的前端里面,大部分都是先打好了扎实的基础才去接触更高层的东西的,因为不是这样的根本玩不转,也找不到工作。

阿当的论调最大的问题就在于,没有经验的新人,或者是没有技术背景的管理人员在看完他的文章之后,就会形成这样的印象:『前端就应该乖乖守住自己的本行,学好 JavaScript HTML CSS 这些基础就够了,追求新技术、搞什么工程化、全栈的前端是眼高手低、不负责任的。』

注意,虽然阿当的原话并非如此,他也一定会辩解自己并没有这个意思,但读完这文章客观上会不会留下这样的印象,读者可以自行判断。

人一旦给自己潜意识里划定了范围,就很容易找到逃避困难的借口:『这不属于前端该管的东西,我不用学』。算法也不用学了,编译原理也不用学了,数据结构也不用学了,反正这都不是前端的核心竞争力嘛。@月影 的答案里提到他的心疼,心疼的就是这个。而管理层的人看了这样的文章,也容易对前端的定位形成过于保守的看法。这样的导向,会影响真正有工程师思维的前端的产出。某当在拼命渲染新技术风向的危害的时候,有没有考虑过自己的言论可能带来的危害呢?

打着为行业忧心的旗号,输出着让新人自我设限的价值观,是为误人子弟。

---

其他诸多逻辑、技术上的细节谬误,不再一一指出。我本来没想多费口舌,到头来还是写了这么多。只希望读了这篇文章被误导的人能少几个。

这整篇文章里当然不是所有的观点都是错的,但写文章不是说只要有那么几个对的观点,就可以无视方法论上的问题、无视事实上的谬误、无视逻辑上的跳跃。如果要下一个结论,那就是这篇文章是一篇非常糟糕的年终总结文。如果这篇文章能够做到:
  • 基于实践经验和真实数据而不是臆断来对一门技术的优劣下论断;
  • 真正地结合 2016 年的发展来讨论而不是基于脱节的经验来空谈;
  • 基于自洽的逻辑做论证而不是跳跃地把两件事的因果关系联系起来然后批判一番;
那么我第一个鼓掌表示欢迎。

另:我跟阿当确实有过过节,但我早就对这种个人恩怨没什么兴趣了,这里也不对他的动机做任何道德判断,单纯只说对文章的评价。另外,我相信程序员杂志的编辑应该不是刻意搞什么套路,这篇文章的责编现在应该承受了很大的压力,希望大家可以理性评论。

又及:一个人的说法不对,就是会被人批评,不会因为他是弱势他的错误就变得可以理解了。尤其是这次是他先利用了杂志年终长文这样的话语权去输出他的看法,大家才不得不出来表达反对的看法。如果他在他自己博客里写这种东西,我根本看都懒得看。如果有人觉得这件事情是有人抱团站队要搞政治斗争,恕我直言,这种技术争论里面能看出政治斗争的人,这看世界的眼光是得龌蹉到什么地步?
为什么?