赵望野:前端工程师的困惑
赵望野,现任豌豆荚 Front-end Team Lead。他 2011 年加入豌豆实验室,曾负责豌豆荚 Windows 版的前端架构设计和主要开发工作,以及 Front-end Infrastructure 的研发工作。当豌豆荚从一家初创公司成长为一家获得上亿美元投资的企业的时候,赵望野也在他的职业道路上不断成长着。随着业界对前端工程师价值的逐渐认 可,越来越多的人才开始进入这个领域,而赵望野却认为这一切都“有点晚了”。他的困惑来源于变化的环境和前端工程师这个有些特殊的群体。而他,也逐渐从一 个单纯的工程师变成了一个以解决问题为目的的人。
新路
“我觉得我不傻,这个公司到底靠不靠谱,我干一阵是能够判断出来的。”
问:你从什么时候开始编程的?
我第一次写代码应该是七八岁,因为我爸爸是哈工大的教授,所以计算机是作为年轻的科研工作者得的奖。写程序我第一次用的是 Basic,而第一次做有界面的东西,用的是 Visual Basic。我是在初二的时候第一次接触互联网,那时候接触了一点点 Web 开发。
问: 你大学学的是什么?跟计算机有关吗?
我是在中国传媒大学上的数字媒体艺术专业,算是相关。因为本质上专业培养目标是能够利用新媒体技术、艺术结合去做一些事情。虽然我们专业到目前 为止也没给新媒体一个准确的定义,但是互联网肯定算是新媒体之一了。而我自己的个人兴趣是做一些网络、Web 开发方面的事情。
问:你现在从事的工作都和你的专业相关吗?
算是相关。你很难确定某个东西到底是不是网络多媒体,因为这种交叉学科口径很宽泛,包括我们专业课的设置,学的东西也是非常杂的。我前两届的学 生还在学数字电路、模拟电路这种纯工科的课程,到我这届就删掉了。我这个专业比较新,我研究生的导师是这个专业的创始人,2002 年是第一届,所以我入学的时候还没有毕业生。这个专业到底应该是干什么的、怎么发展,也是在一个逐渐摸索的过程。但本质上,我现在做的这个其实算是 Web 前端,就是 UI,那 UI 算不算网络多媒体呢?我觉得是算的。
问:其实你现在用的很多技术都不是在学校学的吧?
对。我觉得这是一个普通现象,不只是前端,甚至很多的后端工作,比如做 Windows 客户端或者做 iOS 客户端开发都是。因为本科教育相对还是一个比较基础性的教育,我觉得不会有专业去教你 JavaScript,有的话也都是像选修课这样的形式。专业基础课大部分还是比较经典的教学语言,像C,或者是 Pascal,也有可能是C++。更重要的是基础,比如数据结构、算法、操作系统这些。不会有一个大学专业课教你一个框架、教你一个具体的技术平台、怎么 去做移动开发、怎么去做 Web 开发。所以我觉得这应该是个普遍现象。
问:你是怎么加入豌豆荚的?
在 2010 年年底的时候,我当时已经是研究生了,带着我们的本科生来创新工场参观,当时有人接待了我们,说:我们在招人,有想来实习的同学可以留个简历。本科生没有 一个留的,但我留下了我的简历,相当于我把简历扔给了创新工场的人力资源库。当时大概面了两三个项目,除了豌豆荚,剩下的我都不记得了,。我面试的时候豌 豆荚还没搬出创新工场,我入职的那一天是他们刚刚从创新工场搬出来到自己独立的办公室。
问:选择一家初创企业其实还是很有风险的,你是如何决定的?
我觉得这首先是个个人选择问题。第一、风险肯定是和收益并存的。第二、因为我当时也只是实习,其实对创业这事本身并没有什么概念。包括创业会有 多大风险,到底会面临什么样的困难,会有多少收益,其实并没有一个很直观、很明确的判断。我周围的师兄师姐,包括我的同学,也没有人参与过创业,大家对互 联网创业这事也都不很了解。本质上,首先我觉得我不傻,这个公司到底靠不靠谱,我干一阵是能够判断出来的,当时也是实习,对我来讲风险并没有那么大,因为 我并不是毕业找工作,所以先干着呗。大概干了一个Q吧,就觉得这里还挺好的。
豌豆荚的文化和气场现在对于很多人来说是很有吸引力的,你去的时候,有这样成型的文化和气场吗? 有,但是我觉得公司文化这件事,并不是你刻意想要一个什么样的文化。本质上说,早期加入的人少,跟你一起工作的人你喜不喜欢,如果你喜欢的话,说明你们的 气场是相似的,你们做事的方法、态度,包括三观应该是一致的,慢慢地这些人聚在一起自然而然形成了这样一个文化。但是可能到一两百人之后,才会有意识地回 来把这个东西总结一下,“我们的公司文化是什么样的”,才去对外传达这样的思想,而并不是很早的时候就说我们要一个什么样的东西。比如像豌豆荚的三个创始 人在一起,我加入他们之后,会觉得以前这几个人做事的方法、价值观跟我都是相符的,我自然也喜欢他们,所以就加入这了。
前端工程师的困惑
“如果 Web 技术在移动设备上面的消亡是一个不可避免的技术潮流的话,那可能前端工程师真的要好好考虑一下怎么去规划自己的职业路径了。”
问:几年前,很多人对前端工程师的价值并不是很认可,你觉得最近这几年这方面有没有改观?
我觉得是有改观的,但是有点晚了。现在的情况是,大家并不是不认可前端工程师的价值,而是说这个水太浑了。前端工程师数量很多,但是这里面真正 意义上可以被称作合格的前端工程师的数量并不多。比如我会切个图,会拼个简单的页面,现在传统行业也在做内部系统或者自己的门户站,像这样的程度无论从工 程质量还是项目复杂度来讲,简单的培训都可以完成。这有点像专业技能,大部分前端工程师的能力就停留在钳工、电工这样的水平,而并不是一个真正意义上的软 件工程师。
我们认为合格的、符合我们用人标准的前端工程师是我能把他当成一个真真正正的软件工程师来对待,这个数量是比较少的。大家觉得前端门槛比较低,很多人都能做,技术含量比较低,但本质上不是这样的。
近些年有所改善是因为互联网泡沫破裂之后,行业开始进入了一个健康的发展状况,竞争也进入比较正常的状况了。任何行业都是这样,行业健康发展的 一个标志就是很多人开始做同质化的事情。这个时候前端工程师的价值就体现出来了,因为前端工程师是最终决定你的产品能不能从 80 分进到 100 分甚至 120 分的人,是体现竞争力的。比如同样我都是做一个阅读软件,或者 SNS 网站,其中一部分是产品设计师或者 PM 的工作怎么样,如果我们把变量变成一致的话,差别就在前端工程师上。他们实现的东西到底是不是用户便于用的:界面精美,使用体验流畅,加载速度快。前端工 程师会在同质化竞争时体现出竞争力的一部分。
如果一家初创公司不注重这一块,不把使用体验当作一个竞争力,那说明这家公司还是处在一个比较初期的竞争阶段,因为没有竞品,他们拼市场、拼功 能,当有了竞品之后才会去拼产品。产品竞争力的一部分是由产品设计师和 PM 来决定的,另外一部分就是前端工程师,特别是对 Web 产品来讲。
我为什么说这事有点晚了呢?因为现在已经进入移动互联时代了,PC 上面的 Web 流量大幅萎缩下降,但是却并没有转到移动设备的 Web 上面,而是转到移动 App 上面。在移动终端上,Web 技术只能作为一个补充,移动设备并不是 Web 前端工程师的主战场。所以现在很多前端工程师会比较迷茫,或者说未来怎么发展,是不是要转行去做 Android 开发,或者 iOS 开发,很多人会有这样的想法。包括我们自己的前端团队其实也在探索前端工程师在移动设备上怎么去发展,如果要转型的话,怎么转,我们做一些什么样的事情是 更能体现出我们价值的。
问:到底什么是前端?
我觉得现在前端的概念比以前大家所普遍认识的范围要广。前端工程师是干嘛的?做 UI 的。这个词在英语里面本身指的是接口, interface 本身并不只是你看得见的,一个能点的按钮叫 interface,USB 也是 interface,火线的 IEEE1394 接口也叫 interface,所以它指的应该是两个系统进行信息交互的中介。所以前端工程师做的应该是能够把服务或系统转换成用户能够接受的形式。比如我是豌豆荚 的前端工程师,豌豆荚能提供什么样的服务,我把背后的复杂的技术系统转换成用户能够接受的信息形式。比如,我把应用搜索或者我们现在做的应用内搜索转换成 这样的信息形态交给用户。用户看到的就是我手机上的一个 App,或者在 Web 上面的一个搜索框,同时,能够把用户输入的信息,再包装成系统能够接受的形式传递回来,作为一个中介在里面存在。
我们现在说的前端其实是指狭义的 Web 前端。我们的技术团队其实也在探索,是不是整个做客户端开发的,都可以叫做前端。无论 Windows 开发、iOS,或者做 Andriod 开发,平台复杂度都要比 Web 高一点,但是做的事情是一样的。比如说用户给了我一个搜索请求,怎么去查我并不管,我只是把这个东西扔给后端,后端把结果返还给我,我把它做成一个交互流 畅、界面精美的体验,把这个结果包装一下还给用户。前端工程师的视野一定要非常开阔,纯从用户角度看可能是更偏向于 PM 或者设计师,纯从技术的角度看可能会偏向于架构师,我觉得前端会在这里面找一个平衡。
问:你觉得现在前端工程师的发展路径可以是什么样的?
如果你要说三四年前,可能还是 PC 上面的 Web 会占主导,那个时候客户端完全没有办法跟这些做互联网的公司竞争,做互联网最主要的就是在浏览器里面落地。现在这两年,移动互联网的发展很快,前端工程师 会有点迷茫,不知道自己该干嘛了。因为如果一个公司只做移动端的话,那很有可能前端工程师在这里面就是一个非主导的地位,在工程团队也会比较边缘化。但这 个题怎么解,我们没有办法给出特别好的答案,因为我们自己也在探索。但我也并不觉得这是一个问题,因为如果你是一个工程师的话,就知道任何事物都有发展的 自然规律,如果我们有一天认为 Web 技术不适合移动终端这种使用场景的话,那前端工程师就转行干别的吧,可以去做 Andriod 开发或者做 iOS 开发。
问:关于 Web 应用和原生应用争论,你有什么看法?
现在整个前端圈子里面有一小撮人,有点像原教旨主义者,他就觉得 Web 是一个神圣不可侵犯的既有体系,“客户端已死,Web 永生”,他们觉得在移动设备上面,Web 终有一天会赶超原生应用。但我觉得这不是目的,Web 只是一个技术手段,为什么一定要在移动设备上赶超原生技术呢?
所有的工程师还是首先应该把用户放在第一位,你要解决的是用户的问题,而不是用一个特定的技术手段去解决用户的问题。我见过很多人,他们到处去 跟人争辩,说 Web 现在发展得很快,一定会在移动设备上大有所为的。但是没有办法回避的是,Web 确实性能没有原生应用好。也有人反过来说,过几年随着硬件的发展,手机 CPU 变得更快,内存更大,那 Web 技术可能就会变得更快了,但是他们忽略了一点,Web 变得更快的同时,原生技术也更快了。
虽然我是豌豆荚的前端工程师,但首先我是豌豆荚的工程师,所以我要解决的是用户在使用移动设备时遇到的问题,而我的目的不是用 Web 技术去解决他的问题。这两年我们也看到很多大公司成功地把自己在移动终端上面的客户端,从混合形式转成了纯原生形式。比如 非死book,这是大家都公认的比较优秀的产品,他们曾经在早期的时候选择用混合的技术形式做移动客户端,但是最终放弃了,都转成了纯原生的开发。而 iOS 开发和 Andriod 开发又完全分成了两条技术路线。
问:还有没有其他技术路线?
可能会有一些比较特殊的。比如最近 Google 在公测的软件叫 Inbox,它选择的一条路是,用 Google 的 GWT 和另外一个叫 J2Obj-C 的框架写了一份代码,但他们把这份代码编译成 JavaScript 的 Web 版在浏览器里用。又因为代码是 Java 的,所以就可以直接在 Andriod 里用,然后我再把它转成 Objective-C 在 iOS 里面用。但这些都跟 Web 没有必然的联系,虽然我写的代码可以在浏览器里跑,但它并不是一个 Web 技术的解决方案。所以这些东西到底是不是前端工程师的工作范围,未来会不会转向这条路,其实我并不知道。如果 Web 技术在移动设备上面的消亡是一个不可避免的技术潮流的话,那可能前端工程师真的要好好考虑一下怎么去规划自己的职业路径了。
问:为什么 Web 前端工程师会感觉转行很困难呢?
我遇到过很多人以前可能是做 Windows 客户端开发或者是做 Server 端开发的,做 Windows 的可能转 Server 了,做 Server 的可能转去做 Andriod,或者转去做 iOS,并不会有特别大的困难,因为他们的基础知识是没有问题的,就像我刚刚说的数据结构、操作系统原理这些知识体系的基础。但为什么 Web 前端工程师现在会觉得转行很困难呢?原因在这:他们的基础知识有缺口。
我们现在的实践经验就是:如果一个很有经验的 Web 前端工程师去做 Andriod 或者 iOS,可能在用户体验这块的感觉会比较强,但技术上并没有任何优势,因为 Web 平台的复杂度比 iOS 和 Andriod 低得多。很多公司招 Windows 客户端工程师的用人标准是非五年经验的我不招,为什么?因为 Windows 平台复杂度很高。如果你 C++ 代码写得再好,但是没有做过 Windows 平台开发,没有那三五年的时间去摸索 Windows 平台的 API 和特性,你是不可能做好 Windows 客户端开发的。Web 前端也是客户端开发的一种,只不过是限制在浏览器这个技术平台里面,而浏览器这个平台的复杂度是远低于 Andriod 和 iOS 的。这就是为什么很多前端工程师会觉得自己转岗很困难的原因,本质上还是因为基础知识的缺口。而反过来 Andriod 和 iOS 的工程师转 Web,并不会觉得很困难,他可能不知道浏览器有什么 API,但是不可能连 Javascript 这个语言都学不会。
Web 技术最主要的编程范式是声明式,所谓声明式,就是我写个 HTML 的标记,声明我要什么,但是这个东西在浏览器里怎么渲染,我控制不了。另外一个比较典型的声明式范式的语言是 SQL,我只描述我要什么,但是后面会有个很复杂的体系来按照我的描述去实现。它的好处是你很容易抽象你的需求,学习成本会比较低,但是代价就是牺牲了运 行时的效率。如果你开发又简单,运行时又快,那原生技术就没有存在的必要了。原生技术不是声明式的,比如界面是怎么渲染的,你要用代码去控制渲染的过程, 你不能简单地说我要一个表格,它就给你个表格。而 Web 是这样的,Web 说我要一个表格,浏览器就给它个表格,你再告诉浏览器说我要一个 5 像素的阴影,那浏览器就给你一个 5 像素的阴影,前端工程师根本控制不了这 5 像素的阴影怎么画上去,或者说只能在很小的范围内控制。这其实和时间换空间,空间换时间这个简单的哲学原理很相似,不可能两者兼得。
脚踏实地
“我接触过很多前端工程师,他觉得差一像素就差吧,但是 UI 质量可能差别就在这一像素上,你差了这 1 像素,就不是 100 分了。”
问:对你来说一个优秀的前端工程师需要具备什么样的技能?或者什么样的知识结构?
前端工程师应该首先是个工程师。现在很多前端工程师,包括我面试的,可能会在基础知识上有所欠缺,基础的数据结构、基础的算法、操作系统原理, 这些对一个软件工程师来讲非常基础的内容还是要知道的。如果不知道的话,你可能会成长得很快,但是很容易进入到一个瓶颈,并且这个瓶颈是无法突破的,因为 你的知识结构是有残缺的。
其次是个人素质,比如说对细节的注意力。前端工程师做的东西,无论是自己实现的,还是按照设计师的设计稿实现的,差 1 像素就是差。那这 1 像素你能不能看得出来,并且把它纠正过来,这其实很多情况下取决于个人的素质和对细节的注意力和追求。因为我也接触过很多前端工程师,他觉得差 1 像素就差吧,但是 UI 质量可能差别就在这一像素上,你差了这 1 像素,就不是 100 分了。
第三部分是你要对用户体验有一些基本的了解和判断,什么样的东西体验是好的,什么样的东西是体验流畅的,怎样能够让用户更有效地去接受你想传达的信息。一些交互设计上的最佳实践是一定要知道的,这不完全是设计师的事,前端工程师也要参与进来。
问:你在面试的时候,除了这些技能之外,你还看重别的什么吗?
其实我个人会比较看重一个人的视野。很多部门说我也看重视野,但是前端工程师应该尤其看重,因为前端技术更新迭代太快了,Web 技术本身就非常不稳定,你今天会的东西,明天睡一觉可能就已经发生变化了。前端工程师如果视野不够开阔,你所了解的东西广度不够的话,就很难跟得上这种进 步速度。
另外,前端是最接近用户的这一端,你不仅要能从工程的角度,从站在你背后的产品设计师、后端工程师的角度去跟用户交流,同时你要能站在用户的角 度,反向地跟你后面的这些设计师和后端工程师交流。比如后端工程师给我一个 API,我作为使用者来说必须能判断什么是好用的,我才能把后端想要传达的信息有效地传达给用户,再把用户的交互反馈给系统。前端工程师要站在两个角度去 沟通,要能够从非常不一样的角度去看待同一件事情。
我看你在一个 Talk 里面说过“统一的前端研发生态环境能够自生长”,这个你们是如何实现的? 首先“自生长”是为了做 Talk 包装出来的一个概念,但如果要把它说成大白话的话,所谓“研发生态环境”是指的是开发环境、测试环境、生产环境和运行环境,这是你的代码会跑的一些独立的 物理上隔离的环境。这时候就需要有个工具链,能把整个环境穿起来,尽量减少在整个研发过程中工程师的一些机械性手工操作。
所谓“自生长”是说,因为一个工具链上涉及到很多的小工具,这些工具都像珠子一样串在一起,但是每一环我都可以独立地去替换它,“自生长”保证 了这些工具都是非常原子的。如果有一个工程师觉得现在我们在整个研发过程中某一个环节不够好,自动化流程不够,想去优化它,那他就可以单独针对这一小块去 优化,而不是给你一个很庞大的技术体系,想要把这个东西使用明白都得花很大的精力。
所以所谓的“自生长”是说每个人都可以很容易地对你整个技术环节当中的一个小部分进行改进,它就能够日趋完善。可能今天我改一点,明天你改一点,日积月累下来,整个工具链就会越来越完善。
问:这个体系在你们团队里实现起来有没有遇到困难?
困难倒是没有。但是这个东西做完了之后,我得 Push 大家去用,如果大家不用,就很难让这个东西达到我所说的自趋完善的过程。豌豆荚做事的文化并不是上面给你一个任务,你就一定要去做。而是这个东西我痛了, 谁痛谁驱动。我把这个解决方案给他了,他一开始可能不用,但时间久了之后,他痛得不行了,就会尝试一下看看能不能改进痛点。所以这个过程会相对比我之前预 想的缓慢。但现在基本上这个事情已经进行完了,我们现在整个前端的研发都是构建在我之前做的那套系统之上。
问:你刚才说你很重视视野和学习的能力,那么你是怎么更新自己的知识、工具和技能的?
我觉得还是要保持一个高度的关注吧,首先我订阅了很多国外的技术博客,包括圈子里面比较知名的工程师,他们都有写博客的习惯,我会去关注他们正 在做的事情,也包括一些公司的技术团队的技术博客。比较知名的像 Google 有自己的 Google 黑板报,当他们做了一件比较牛的事情,就会放一篇 Blog 出来,我会长期关注这件事。我之所以很少关注中文世界,是因为会有滞后。
前端技术发展实在太快了。如果现在后端一些做 Server 的工程师,还在用两三年前的技术方案不会有人觉得是完全不可接受。但如果现在前端工程师,比如我面试的时候,如果你不知道什么叫前端 MVC,没听说过 Angular,Backbone 这些前端 MVC 框架,那我觉得这是一个完全不可接受的事情。整个前端的技术体系就是逆水行舟不进则退,基本上以周甚至以天为单位更新自己的知识体系,要时刻保持关注。
问:那你现在工作中都使用什么样的框架和工具?
如果专指前端的框架的话,我们豌豆荚还是挺丰富的,我们并不像很多公司一样会指定特定的工具,我知道有一些公司现在在用 YUI,还有一些可能用 Backbone 或者 Angular。首先我们并不指定一个团队只能用一个框架,我们根据产品的不同选择一个最合适的解决方案。以前我做 Windows 客户端的时候,用的是 Backbone,后来的海外产品,以及很多内部产品用的是 Angular。我们也希望大家能多接触不同的技术解决方案、不同的框架,去了解这些框架背后的设计哲学,解决问题的角度,这会带来很多的启示。我们现行 还在维护的产品里面用的就有 Backbone, Angular, React,我们鼓励解决问题,但不鼓励用同一种姿势不停地解决同一种问题。我们做的一些内部项目,大家会觉得比较机械,不愿意做。但是如果用一种新的技 术方案,在解决一个问题的同时还会学一些新东西,这也是一个不同的思路。
问:你对自己有没有什么规划?想一直做前端工程师?
我自己其实并没有特别明确的规划,可能也跟我自己所处的环境有关,因为豌豆荚实在发展太快了,我五年之前也不会想到自己会发展到今天这样。这四 年在豌豆荚走过的整个成长路程,并不是一步一步规划过来的。很多时候如果你真的潜心在工作里面,什么也不管,可能过了一段时间后你会发现你比自己想象的走 得更远。在互联网这个外部环境变化比较快的行业里面,超过三年的规划我觉得意义都不大,因为一年以后可能整个外部环境就完全不一样了。我自己现在可能会做 一些团队管理,包括产品的研发管理上面的事情,这也是我两三年前完全想不到的。以前我觉得自己会一直做工程师,前端做不了,我会去做别的,但现在看来, “做事”对我来讲可能更重要,技术只是一个手段,是支撑之一,还有其他的东西需要保障。
我现在在做的产品,前端只是众多技术体系的一部分,我想要把这件事做成,只盯着前端这一块是不行的。以前我只做工程师的时候,一个问题来了,我 的反应是这事我前端应该怎么做,前端能做到什么范围,如说一个功能到底应该由前端去做还是由后端去做,我只能站在前端工程师的角度去考虑这件事。但现在我 会更多考虑的是我要把这事解决了,不管是前端还是后端,首先要把这事解决了。所以思考问题的角度和整个目标会不太一样。
问:知乎上有相关的讨论,码农 35 岁以后怎么办?
很多人感觉现在一些工程师牛了之后就不写代码了,底下就会有一堆人站出来反驳,国内的谁谁谁,现在多少岁还在写代码,但这只是个例。从整体上 看,确实国内的环境相对比较浮躁,位高权重了之后就不爱写代码了,这是个普遍现象。当然也有个例,但是用个例来推导出结论是不科学的。确实国外的状况要好 很多,一是竞争环境不太一样,生存压力也不一样。另外,国内技术驱动的公司不多。人写代码能创造多大价值,就是你能挣多少钱和你在公司里的地位。如果你十 年如一日地写代码,但是到你 40 岁写的代码跟你 30 岁写的代码创造的价值是一样的,那活该嘛。写不写代码这不是决定你有多大影响力和有多少收入的根本项,关键是你创造多少价值。