朴灵:打破限制,从前端到全栈

非商业转载请注明做译者、出处,并保留本文的原始连接:http://www.ituring.com.cn/article/197773前端

朴灵,真名田永强,文艺型码农,Node.js布道者。现就任于阿里巴巴数据平台,任资深工程师,著有《深刻浅出Node.js》。他活跃于CNode社区,是线下会议NodeParty的组织者,同时也是JSConf China(沪JS、京JS,以及杭JS)的组织者之一。朴灵热爱开源,是多个Node.js模块的做者,我的GitHub地址:http://github.com/JacksonTian叩首问路,码梦为生。git

图片描述

从前端到全栈

“当时咱们团队的Leader不会去限制工程师作什么事情,而是说这件事是你在负责,因此你就要从前作到后。”github

问:你从何时开始编程的?编程

我高二的时候才刚刚接触互联网,那时候看别人搭一个BBS我内心就特别崇拜,我很好奇这个过程是怎么实现的。之前有一个叫“中国博客网”的网站,上面提供了能够本身编辑模板的功能。在那个年代,脚本特效很流行,我常常把代码拷到那个模板里面去,测试效果。后来上大学以后我才知道,这个论坛的构建者其实就是利用了一个相似于Discuz的系统,搭这个网站并无想象中那么复杂。后端

问:据说你在大学学的是Java,在这过程当中你的兴趣点有没有转移?缓存

学校教了不少东西,可是个人重心一直放在前端技术上。虽然学校教了C和C++这样的语言,可是教了以后也不告诉咱们这个东西到底有什么用,因此我当时仍然痴迷于网页。工做几年之后才发现学校教的东西颇有用,因此如今再回去补。服务器

问:你是怎么变成所谓的全栈工程师的?是你本身的兴趣使然仍是工做环境给了你这样一个机会?微信

我通常不说我是全栈工程师(笑)。我刚进大学的时候,目标其实很明确,就是想看看那些JS特效是怎么实现的。2009年毕业以后我开始工做,就侧重去作前端。那时候前端也才刚刚兴起,后来我就成了一个真正的前端工程师。前端工程师

去了淘宝以后,我碰到了Node.js这样一个我很感兴趣的东西,我用了两年时间完成了从前端工程师到全栈工程师的演变。个人我的习惯就是,若是我对什么感兴趣,就会在这块投入精力去研究。因此经过这一两年的学习,我已经能够完成所谓的后端的工做了。当时咱们那个团队由空无和玄澄带领,他们不会去限制工程师作什么事,而是说这件事情是你在负责,因此你就要从前作到后。多线程

问:在你看来全栈意味着什么?你在QCon大会上主持了这个专题以后有没有带给你一些新的思考?

之前我认为全栈就是一个开发者能力的提高。若是你在某个领域很是专,有一个点很擅长,这时候别人才称你是专家;若是你有多个点比较擅长,那别人才有可能称你是全栈工程师。另外,责任也很重要。一我的再也不只是负责在前端写CSS,也不仅是在大工程里面作一小块东西,而是有了一个全局的视野。我之前对于全栈工程师的理解可能就是集中在工程师我的能力以及责任这两点上,经过主持Qcon的全栈工程师专题,我以为还有一点,就是环境对全栈的影响。

我的能力是不太好复制的,有的工程师能力强,有的工程师能力没那么强,这种状况下你对能力稍微弱一点的工程师作这种要求,是很难达到目标的。Coding的分享给我带来了这个想法:基础设施建设对全栈的影响也是很大的。若是你不能帮助一个工程师成长,那就应该在环境上作出改变,你要去打造适合这样的人才成长的环境才行,这样才是正向循环。

问:淘宝如今使用Node.js的范围有没有扩大,主站有没有在用?

主站也有在用。如今几乎每一个BU都在用Node作尝试,无论它作的是大系统仍是小系统。我看到有不少团队尝到了甜头,但我也看到有不少团队不肯作改变,不肯去尝试新技术。

问:方便说一下你如今的工做内容是什么吗?

我最近半年在社区都不怎么活跃,是由于我作的内容刚刚开始,如今才有了一些进展,未来咱们有计划把咱们作的东西对外产品化。我如今的主要工做就是改Node.js和V8。在Node.js上改动我会直接接到Io.js的仓库里面,如今已经提了不少。

我能够举个例子解释一下咱们如今作的事情。在Node.js社区上有一些性能调优的工具,好比Chrome上有个CPU调优工具,它能够帮你找出哪段代码运行得比较慢。咱们在这个基础上作了更多的工做,咱们作的这个性能调优的工具不只要知道慢,还要知道为何慢。用个人工具扫过以后,我就知道怎么去改,其实如今我打的不少补丁都是经过这个工具发现的。形成性能慢的缘由可能有不少,咱们尽可能去发掘这些问题。

另一件我在作的事情就是帮助公司内的一些Node开发者。好比,这些开发者可能作业务开发时没有什么问题,可是运维或者运行的时候就会出现问题。咱们工做几年来,并无由于使用Node.js而形成什么故障,高手写代码不太容易出现问题。可是对于每一个工程师来讲要求是不同的,我如今的工做重点就是:出问题的时候可以立刻解决。线上代码慢的缘由是什么,为何会有内存泄露,咱们作了一些工具来解决这件事。

虽然用一个新技术的时候可能感受很爽,可是这个技术会带来什么后果或者反作用,可能对于不少人来讲都是没底的。为了让阿里的技术环境可以更健康地发展,咱们的工做就是要让你们知道,咱们不怕这样的问题出现,能出现咱们也能解决。如今咱们努力在公司之内创造更好的环境,在将来咱们有计划把这些东西推出来,但愿国内其余用Node.js的公司也能从咱们的工做中获得一些好处,独乐乐不如众乐乐。咱们但愿本身可以作更多的事情,有朝一日能成为Io.js或者Node.js项目里面的核心贡献者,而后去影响它。

问:淘宝UED正在实践先后端分离,应该也有其余团队在作相似的事情,你怎么看?

我我的没有直接参与这样的事情。我以为先后端分离是否能完成的核心在于服务化的程度。若是系统都是面向服务去设计的,那么在这个过程当中解耦可能很容易完成。因此当你真正作一个前端应用层的东西时,就不须要Java的同窗来参与帮你写模板,而这个应用层多是跟业务相关的。

这里的一个概念就是产品应该有两个部分:一个部分是系统层,另外一个部分是应用层。应用层的需求可能每天变,可是这种改动基本上不怎么影响底层系统的稳定性。系统层应该是趋向于稳定的,除非业务模型上有一些大的变化的时候才会去改动。而日常的平常迭代,也就是应用层,会有频繁的发布和改动。

若是把两层东西都混在一块儿的话,整个系统就会很庞大,界限不清晰。后端的人会干预前端的东西,前端有需求的时候可能后端的同窗也不能理解。在这过程当中我以为能够把应用层独立出来,让前端的同窗可以在中间有一个缓冲地带,既能适应应用层的频繁发布和需求改动,又能让后端稳定。

问:JavaScript有不少框架和库,对于初级学习者来讲,怎么能在这些资源中选择适合本身的来建立我的技术栈?

我以为JavaScript最核心、最源头的东西就是它的规范。固然,若是你纯粹去读规范的话也没有什么目的性,但那是一个核心。当你遇到困惑的时候就不妨去规范上找一找,一般你都能找到答案。这对于我来讲是核武器同样的东西,通常不能用的(笑)。

另外,ECMAScript不算是纯粹的API,它定义的实现就不能更改,对于那些没定义的实现,你要去看那些API是怎么去作的。我基本上主要靠这两个东西。

他眼中的Node

“有一个圈子,有一个社区,其实你会收获不少东西。"

问:能不能简要介绍一下Node生态环境的发展示状?

这个话题其实我已经好久再也不提了,由于现状已经太好了。前几年的时候模块有几个了、有几千个了,而后过了一年这个数字就上万了,再过一年就蹦到十万以上了。

我是蛮喜欢这样一个形态的,在跨过一个相对比较低的起点以后,你们可能都有能力来完成一个模块。可是,每一个工程师的能力有强有弱,每一个人的意识都是不一样的,因此这个生态环境又是特别真实的。这里面的东西多,水平良莠不齐,但你会发如今不少状况下,若是一个模块是活跃的,它就一直是活跃的;若是它的质量很差,它就永远都是质量很差的。说不定几年之后,你会发现愈来愈多的模块都是以不断迭代更新的状态生存的,老是有最好的模块来适应当下最须要的事情。

问:我以前听你在采访里说,你当时推广Node的初衷是由于你看到国内外对Node的理解存在很大差距,如今还有没有这种差距?

如今仍是有。我以为最大的差距就是在国内推一个技术的时候,总会有不少人来黑。这些人可能也没有什么前提,无论怎么样,就是嘴巴爽了再说。另外,国内外环境还有一个差距,就是在国内你们主动刷新本身知识的能力还不是太强。你会发现有一些工程师可能已经能完成当前的工做了,可是他在持续学习上可能不会投入太多。

问:你认为前端工程师和后端工程师谁更应该学习Node.js?谁学习Node获益会更多?

其实不管什么工程师学习Node均可以有收获,可是我以为前端工程师的收获会更大。

为何要有前端这个工种?我不知道国外是否是这样,可是国内不少人会说前端工程师就是写HTML和CSS的,这种工做就像流水线同样,已经被限定在一个划定的圈里面去发展。当前端工程师发展到某一个阶段的时候,他会发现这个圈子对他是一个限制。我以为前端工程师须要打破这个圈子,打破以后就会发现更开阔的视野。当咱们想要解决一个问题的时候,就不仅是再用已有的熟悉的办法来解决,而是发现视野之外的、可以更好地解决问题的方法。反过来讲,若是你老是不想去了解服务器端的一些技术,老是用前端的方法来解决问题,那成本可能很高,作出来的方案也可能不理想。

先后端有Node.js链接之后,你就会发现本身的工具链已经完成了一次革命。不少工程师可能会用Java或Ruby来写一些工具,可是前端工程师不熟悉Java,也不熟悉Ruby,他要去完成目标的时候就会特别困难。如今Node.js出来之后,你就发现不少工具直接用Node.js就能够写了,好比说CoffeScript,还有一些像LESS,Sass之类的工具。前端工程师用本身熟悉的东西就可以改良本身的工具,这是第一步。改良工具之后视野就会放开,你会发现还有不少其余东西能够放手去作。

问:你怎么看LinkedIn放弃Node和Scala?

作任何一件事情都会有最适合的方法。我以为像LinkedIn这么大的系统,实际上是一种很复杂、很复合的模式。咱们在淘宝推广Node.js的时候,也不可能去用Node把那些最底层最核心的东西替换掉,这是不现实的。若是说在某个系统里面,Node.js不能胜任某些工做,那就不要用它好了。

听说LinkedIn也并无彻底放弃Node,只是某一部分弃用。我以为Node.js是有它擅长的地方的,只要可以在适合的地方去用好就好了。

问:Io.js和Node.js分离开来,是由于Node更新太慢形成的吗?

大部分缘由可能在于,虽然Joyent公司高管对这个项目还算重视,可是他们对开发进度没有实质的帮助。

从2014年7月份开始转岗之后,个人工做重点就是Node.js的内核,因此我对Node.js和Io.js的提交列表和PR都是比较熟悉的。我发现当我提交一个补丁上去的时候,在Node.js下面的处理速度特别慢。我刚进去的时候看到的PR列表大概只有两百多个,如今Io.js分出去之后PR列表更长了。那些在这个项目上作贡献的人,基本上80%已经不在这家公司了。因此如今出力的人并非来自这家公司,而是社区的一些开发者。若是这家公司只想享受商标带来的好处,贡献者们就不会赞成,因此他们就独立出来了。

目前来讲我本身是比较喜欢Io.js这个项目的。我跟他们提一个问题上去,很快就会有反应。他们的态度也更开放,就是说无论你的贡献是大是小,只要对这个项目有好处的,他们都会接受。而且他们对新事物的接受速度也更快,好比如今Node.js的V8版本处于3.2,而Io.js里面的V8已是4.2了。若是更新慢的话,ES6的一些特性就没办法引进来。由于Io.js中有这些新的特性,因此开发者就更愿意进入这个项目。

可是Io.js也给我形成了一些困扰。之前一个版本发布至少也要一两个月,可是如今的版本发布速度已是以周为单位的了,几乎每周都能出一版。他们更新速度太快逼着我要去作不少工做,须要不停地打版本。话说回来,实际上企业内部升级版本的速度要求不是太快,升级一个大版本之后,若是不须要接下来小版本的功能,就能够先忍忍。

问:你以为Node阵营的分裂是一件好事吗?

我以为是好事。我记得好久之前就有人特别想给Node.js的异步IO所有加上Promise,若是不分裂,这件事情永远不可能。虽然如今的Io.js也不能完成这件事,可是只有分裂才有更多的可能性,才能产生更好的东西。

问:不少大公司好比Paypal,从Java转换到Node.js很是成功,在后端Node.js会取代Java吗?

不太可能,Node.js仍是在应用层上更有优点。不管是咱们在系统层所作的尝试,仍是如今已有的案例,都没有可以证实Node.js可以取代Java。我举个简单的例子,如今没有人能拿Node.js来完成缓存或者涉及到集群的大计算,可是Java已经可以作到了。

可是Node.js在应用层上是有优点的,它的最初设计目的就是要优化IO和CPU的关系。之前的IO都是要阻塞CPU计算的,Node把全部IO相关的东西所有从主线程上剥离之后,主线程就变得比较高效。而咱们在Java里面去实现异步是比较麻烦的,可能须要启用多线程。虽然Java也有框架去作这件事,可是对已有的开发者来讲,因为他们对原有的模式已经很熟悉,因此不会愿意去作改变。应用层就应该可以快速运行而且面向不少系统。我能够用Node.js快速地开发,调用各个系统。

问:刚才你也提到,有些人认为Node.js在设计上最大的失败就是它的API是基于Callback,而不是基于Promise的,你赞成吗?

当时的状况就是那样,ES6没有出来,Generator也没有出来,若是让Node.js创始人Ryan Dahl去作这件事,他不只要去改上层的东西,还要去改JavaScript。可是如今的状况已经有变化了, ES6已经出来了,它里面有一个东西叫Generator,运行过程当中咱们让程序调用栈停下来,而后在某个时间再从新把它唤起来。新的框架Koa就可以利用好这个特性,写程序的时候你会发现程序已经顺序执行了,可是背后的实质仍是异步。我以为这些变化未来可能会慢慢影响Node.js自己的设计,甚至未来Io.js的API可能也会慢慢去改。

另外,之因此当时会有Callback这样的设计,就是由于当时的Callback特别适合异步调用。这样作的缘由也跟当时选JavaScript有很大的关系。Ryan Dahl去调研过Java、Ruby之类的语言,他发现这些语言提供的API有很重的历史负担。这时候若是给开发者提供新的API,你们也不会去用,由于这会改变他们的思惟模式。他在设计这个模型的过程当中,发现事件循环里面有阻塞IO的话就会致使效率急剧降低。而JavaScript特别适合完成这项工做,它不主动提供同步的API给你,因此阻塞的方式就不存在。

问:今年你还会不会举办京JS或者杭JS?

今年举办的会叫深JS。咱们今年没有主动去办会,而是由以前咱们的一个合做方去承接了这件事。他们是上海的一家外企,对JS社区有比较高的热情,过去三年举办的会他们都帮助咱们作了不少事情,此次交给他们办也是瓜熟蒂落的。

问:之后你还会再举办这样的活动吗?你在这几回办会的过程当中遇到过什么困难?

咱们之后不排除仍然会举办这样的活动。有一次在北京办会,咱们三我的都身在外地,全部的事情都是经过远程操做,在外地办会感到资源上的限制。另外的一个困难在于沟通,好比怎么去邀请国外的讲师或者跟咱们国外的主办方沟通,中西方的文化差别会形成一些困扰。

我以为办会最重要的仍是内容,对内容的挑选和审核,讲师怎么邀请,主题要怎么规划。不能某个主题今年讲,明年讲,后年讲,有的公司可能出于商业目的有这样的需求,但有些东西是不能去妥协的。

问:纵然有这么多困难,可是你仍是一直在坚持作这件事,举办这样的活动对社区来讲最大的收获是什么?

其实在办活动这件事上,我有一个老师叫周裕波,我在上海工做的时候就遇到过他,他常常会办一些前端的活动。对于我的开发者而言,他们不多愿意主动出来组织这些活动,但周裕波作到了,我以为我应该也能为Node作一些事情。当时我看到Node没有这样的氛围,国内的不少开发者都不肯意出来,当时的社区也关注不到这个东西,因此我就办了不少次NodeParty。

这个过程其实收益仍是不少的。首先我对这个社区更加了解了,跟不少高手都很熟悉。另外,我接触了不少赞助商,各类资源其实都是你们互相须要的。没作过这件事的人可能会以为很是难,但作了之后你会发现没有想象中那么难。由于你老是会获得一些帮助,来自各个方面的帮助,你在经济上也没有什么损失,还会结交一些的朋友。有一个圈子,有一个社区,其实你会收获不少东西。


更多精彩,加入图灵访谈微信!

图片描述

相关文章
相关标签/搜索