本文仅用于学习和交流,不用于商业目的。非商业转载请注明作译者、出处,并保留本文的原始链接:http://www.ituring.com.cn/Art...
编者语
通往360的酒仙桥路真是名副其实的“堵”,难到是大公司感召人才的魅力所致?采访当天,恰巧碰到高校毕业生面试大军。这么想来,李松峰老师特意下来直接把我领进办公楼,确实有种“走了后门儿”的窃喜。之后,李老师带我来到了360著名的“南瓜车”型休息区,坐在里面有种"公举"的感觉。不久,传说中的月影大大进入了视线。笔记本加手机,嗯,够专业!等真正进入了采访,月影大大的谈吐、逻辑完全颠覆了我之前对技术员的偏见。后期整理虽然枯燥,时不时能被他广博的知识和独特的视角给惊醒,揉揉眼又是智慧一眼。
月影(本名吴亮)
早年曾在微软亚洲研究院做过访问学生,在金蝶软件有限公司先后担任核心开发工程师和项目经理,在百度电子商务事业部做过Web开发项目经理。在盛大创新院搜索主题院做过高级研究员。目前担任奇虎360副总监、360技术委员会委员兼前端技术委员会主席,前端最大团队——奇舞团负责人,w3ctech顾问。
多年来致力于JavaScript技术和Web标准的推广,曾经活跃于国内极有影响力的JavaScript专业网站——无忧脚本(www.51js.com),并担任JavaScript版的版主。
平时热爱文学、写作和围棋。著有畅销书《JavaScript王者归来》、网络火爆技术文章《写给想成为前端工程师的同学们》《前端动画原理与实现》等。
图灵访谈:我知道月影大大在前端方面特别有名,图灵社区的好多留言也都感叹终于有机会访谈到月影大大了。是什么时候开始接触JavaScript的?
我接触的时间算是比较早的了,如果从写网页开始的话,那时还没上大学,在高中的时候,大概1996年左右。我们家上网比较早,算是第一批网民,那会儿我自己就写一些网页,只是简单地用一些HTML写一写,不是很专业,就做着玩。那个年代,很流行个人站长,我也跟着玩。后面接触到了动态网页技术,我记得当时用Perl写了像聊天室、留言本之类的页面。基本上不是很体系,就是瞎玩。
当时还是以C语言为主,写一些小程序。大学的时候,学校并没有专门的前端专业,但社团里面需要做一些网页,包括一些其他的宣传。
毕业以后,我的第一家公司是深圳金蝶,做ERP软件的。挺有意思的是,我们那一届有一个半年轮岗的实习期。派到分公司后,我接触到的不全是开发,也做过售后、售前等各种东西。半年以后回到总部,参与了总部正在开发的一个内部web系统。当时的话,我还考虑是用.NET还是Java,最后选择了Java。
当时看来,Java是比较适合的,因为这种企业级的系统用Java比较成熟,而且金蝶是一个Java很强的公司,所以也就学了Java这一块的东西。
涉及web系统就不可避免地要用到前端,我自己又没有系统地学习过前端,所以就用了Java的一些前端框架。之后,我发现用后端程序员使用的Java工具开发前端很不方便,于是回归到了标准的HTML、CSS、JavaScript 上,开始系统地学习JavaScript,比如说看犀牛书(《JavaScript权威指南》)、混迹无忧脚本。
图灵访谈:对,还是51.JS论坛的版主。
因为经常发一些技术知识,参与一些讨论,算是比较活跃。
图灵访谈:应该说IT行业挺看重分享、开源的?
对,做技术的话,我挺看重分享的,这是一种互联网行业的精神。互联网早期的时候,可能比现在更纯粹一点。虽然现在的互联网,表面上看,存在一些开放精神,其实很多时候这些产品都已经商业化了,讲的更多的,是流量、变现、价值。
我希望做技术的同学能够继承早期互联网时期那些草根站长们身上的互联网精神。不一定为了访问量,才去做产品。回归到初心,我觉得通过技术把产品做出来,分享给大家,享受分享的过程,这本身就很美好。
图灵访谈:你的微博昵称“十年踪迹”,让我想到了纳兰性德的词“十年踪迹十年心”。不知道是否出自这里?
对,确实出自纳兰容若的词。虽然是理科出身,其实我蛮喜欢文学,尤其是古诗词。像诗经、楚辞、宋词、元曲,我都会去涉猎一些。虽然小时候常吟诵的唐诗宋词大多遗忘了,但接触到这些诗歌都还挺美的。当成爱好跟朋友分享、拿来自己欣赏或是写写都挺有意思。
图灵访谈:从“十年踪迹”“月影”到你写的《JavaScript王者归来》这些名字,可以看出作为“技术界的一股清流”你是很喜欢文学的。除了文学,平时你还喜欢写作、围棋。
之前会写一些包括技术的、非技术的文章,最近几年比较少了,但会坚持写技术博客。
图灵访谈:你怎样平衡生活跟工作呢?
其实刚毕业那段时间,平衡这块也不是很好。因为从事了自己兴趣爱好方面的工作,很开心。脑子里没有把工作和生活区分开的概念,平时下了班也想写写代码,写一点其他的东西。但是后来慢慢意识到,还是要花些时间多陪陪家人、周末健身、休息旅游,合理安排自己的生活。
我在这方面还是挺有代表性的。以前没有关注过这些东西,现在会关心身体锻炼。周末的时候,固定时间游泳健身,也会在家做做菜。
图灵访谈:其实图灵出过一本书叫《程序员健康指南》,但是受欢迎程度远不如技术书。从你这边说,是否应该注重一下?
应该注重一下健康问题。很多人可能有意识到,但改变多年养成的习惯也挺难的。
身体锻炼很重要,中午到公司健身房做些不太剧烈的运动,比如跑步机上慢跑一会,哪怕是楼下走一圈、散散步,保持更好的状态、更高效率地工作。
不要觉得年轻、身体好,所以这些东西无所谓。当你工作了一段时间以后,你会觉得每天熬夜、长时间久坐,很不舒服。
现在带团队的话,我不希望底下的同学因为工作导致身体方面的问题。我鼓励大家都运动运动,原则上也不鼓励过多的加班。做产品研发,所以项目都是有周期的,有忙有闲,是很正常的一个状态。如果遇到忙的情况,可能会出现周末加班,占用大家的一部分时间,但等到项目上线,后面会有一个调整期,大家可能相对的闲一点,个人学习时间也多一点。
图灵访谈:有人说前端的门槛低,切个图,搞个动态,拼个页面就行了。你觉得优秀的前端开发人员应该具备怎么样的技能?
前端很有必要分成两块:一个是专业的领域,还有一个是业余爱好者的领域。其实,我不反对把前端的门槛变得更低,因为前端实在太有用了,它的重要性决定了它的普及广度。举一个最简单的例子,把时间倒回20年前,谁会想到如今几乎每个人甚至说一个家庭里面的孩子,都可以熟练使用电脑。20年前PC刚出现的时候,这是没法想象的。
当时,只有专业人士经过专门的培训之后,才能够上手使用,但现在的门槛已经变得很低了,PC就像家庭电器一样,已经普及成每一个家庭必备的工具了,它影响和改变着我们的生活方式。
前端也一样,前端在未来太重要了。过去的话,我们可能把前端只看成是在浏览器上面展现UI的东西。未来随着互联网(IOT)、万维物联网(WOT)的迅速的发展,包括所有虚拟现实在内的各种智能终端可以帮我们做很多事情。像智能手表、智能手环、智能家居,会需要越来越多的终端与人来交互。
智能自动化洗衣机可能是大家用的第一台智能设备,未来发展的方向是把这些设备组合起来用。举一个简单的例子,我吃早餐的时候喜欢看新闻节目。假如我家的智能电视能够在我打开微波炉加热牛奶的时候,自动帮我切换到早间新闻的话,是不是就不用手动操作了?这其实是很生活化、个性化的需求。如果物联网做得足够发达,就是没有经过太专业培训的人,也可以实现这种类似于简单编程的活动:通过一些图形化,或者是一些简单的直观方式来控制不同品牌、不同厂家制造的家电来完成这种自动化的逻辑。这也是未来前端普及的方向。
另一块是更专业的领域,就是如何在这些家电的底层,在人机交互的界面,做出更好的展示、更炫酷的东西。举个例子,最近3D打印的话题很热门。其实,3D打印技术和显示屏的工作原理从本质来讲都一样。你可以把在浏览器上显示网页理解成定时地、快速地、不间断地把内容打印在浏览器界面上,只是速度非常快,可能一秒钟打印几十次。所以CSS的媒体查询(media query)里面包含了打印机。从2D打印跨到3D打印,最大的难题,是我们需要一个3D的表现模型,无论对于CSS还是JS都是更高的要求。
虚拟现实的话,像3D眼镜、还有我在上海科技馆看到的那种球幕电影,未来都可能作为个人影音产品进入到我们的家庭。这种情况下,如何把元素展现在这种球幕上,其实需要有更专业的技术。所以说前端的水很深,我们要把它分成专业的和不太专业的。
最近在开奥运,可能大家对体育相对比较关注,我就用体育项目来做类比解释下“门槛高低”的问题。入门门槛高的领域,你可以把它理解成像跳水、体操的项目,因为不是所有的人,只要身体素质好就可以上去在单杠、双杠上面转几圈的,体操需要有专业的训练才能实现。入门门槛低的领域就像跑步项目一样,任何人都可以,只要身体健康、四肢健全的话,其实都可以跑步。但是我们也知道爱好者的跑步和专业运动员的跑步是不一样的:奥运赛场上的专业运动员,其实不夸张地说,在赛场上能够很精准地控制每一块肌肉,他能够追求很细节的、属于毫秒级的速度提升,这些不是普通人能够达到的。所以,跑步项目的金牌含量和跳水项目的金牌含量其实是一样的。
前端跟跑步差不多,你可以用记事本、用简单的标签随手写一个网页,很简单,但是从专业的角度来看,一个专业的产品很可能需要专业前端工程师追求毫秒级性能提升、像素级设计稿还原。这就是一种专业精神,只有真正从事这个行业,真正进入这个行业的专业领域的时候,你才能感受到;只有经过长年累月的积累和修炼,你才能达到这样的专业度。
图灵访谈:如何理解“计算机不仅是一门科学,而且是一门艺术”?相比其他的领域,其实前端领域对这句话的感受应该更强,因为前端就是要做出一些用户体验良好的界面也好,东西也好。平时工作的时候,怎样操作这门艺术来符合用户的胃口?
计算机科学是一种科学,它的本质是提高生产力。提高生产力的一个非常重要的方法就是合理抽象,只有把功能抽象到足够高,这个功能模块才能适用于越广泛的领域。
程序设计没有太多的诀窍,不管你是面向对象、面向过程、还是函数式编程,不管采用哪种设计模式,本质上是在做抽象工作。当你把现实生活的模型转变成一种数学模型,并反应在程序里面的时候,就能够提高生产效率,这也是程序最核心、最本质的价值。但是前端很难做到这一点,因为每一个人的操作习惯都不一样,每个人想看到的东西都不同,每个产品向用户传达的东西也不一样,人的活动是很自由的,你没办法去抽象。如果把个性的要求过度抽象,它们就会更贴近机器而对人不友好了。当你对人友好的时候,其实就没法对机器很友好,这是一个矛盾。前端的用户交互领域,一直存在这样的矛盾,不管是模块化开发还是采用像MVC框架、MVVM框架,我们只是在做有限的抽象:把一些复杂的交互活动拆解成一个一个的原子,包括HTML提出的标签、属性,CSS的样式。本质上是对渲染层做一些原子级的拆分和抽象。
但是这种抽象的能力很有限。服务端的话,可能存在一套普适的方法论,有一个很牛的算法来解决这一类问题。但在前端的话,几乎没有一套方法能够去解决所有的交互问题。我们没办法单用程序的思维去解决前端问题,它需要运用各种知识才能把人类的交互体验带到一个新的高度。
我一直相信这样一个观念,就是程序员的工作是创作,写代码不是为了完成某个固定的工作。如果只是为了完成某个固定的工作,这些工作就是没有意义的,未来肯定会被人工智能所取代。前端真正解决的是与人打交道的问题,因此差异性特别大。
图灵访谈:移动互联网的到来对前端开发人员产生了不小的影响,前端人员应该如何去面对挑战?
我曾经给团队设定的目标就是“从前端到端”,前端人员不应该把自己的目光只锁定在浏览器上,还要放眼于移动端和未来更多的终端。前端发展至今形成了一些相对比较成熟的方法论,可以适用于其他领域。
举个例子,我以前做手机开发的时候,我发现像iPhone、Android下面其实都有一些自己的布局,比如安卓有自己的layout,有通过xml方式的布局。没有前端背景的安卓工程师会用很繁琐的方式实现哪怕是简单的布局。比如说,在手机界面底部放一个bottom bar(一个固定高度的底栏)。考虑到不同型号手机的屏幕高度不同,没有从事过前端开发的安卓工程师可能会用一些比较复杂的layout组合来实现;但对于前端来说的话,其实只需要用linear layout,把中间layout的高度设置成自适应,再把底下的挤到屏幕外面去,然后用一个负的margin把它浮动上来,就可以很完美地解决这个问题了。
过去的话,前端跟后端还有其他程序领域的交流很少,很多前端工程师并没有从服务端去学习一些更先进的东西,web 服务端以及手机的原生应用开发者,也没有从前端学习一些东西。
现在,这个情况在慢慢地改变,边界也会变得更模糊。各种分辨率的屏幕、终端、甚至一些其他的设备比如非显示屏设备,包括各种传感器、执行器,其实都可以用前端的方法论来解决交互问题。
图灵访谈:作为360前端最大团队“奇舞团”的负责人,主要支持哪些业务?
主要还是支持公司的业务,也有像众成翻译、爆米兔这些实验性的产品。而公司业务的话,我们其实支持的产品线也还挺多的。
图灵访谈:这么多年的技术管理经验,是否可以分享给想要从技术转向管理的后辈?
其实很多公司都会给技术做的比较好的同学一些机会。但就我的理解,我觉得有一些人可能更喜欢做技术,愿意更深入地做技术、写代码。
我带技术团队的话,其实优势还是在技术上。从管理来讲,这么多年也是磕磕绊绊,经历过很多的事情。我觉得说,做管理其实比做技术更难,你必须去处理很多的杂事。如果你是一个喜欢专注、集中精力投入到一件事的人,刚开始做管理时会觉得挺痛苦,但是慢慢地也会习惯。如果你致力于把前端行业做好,带团队能够做的事情肯定更多。
图灵访谈:那你觉得,做技术管理一定要像你这样在技术上见长么?
其实没有关系。关键的问题,是做管理需要对技术大方向的理解到位、看清趋势,还有一定的知识广度。技术见长的管理者要切忌心态狭隘,一定要开放,不要让自己的技术成为整个团队发展的天花板;避免保守,相信其他的新技术。我相信一个技术管理者肯定有他独到的一面,但即便是技术不够好或者不够自信,也可以承认这一点、开放一点,鼓励团队里面的技术牛人来发挥他们的价值,甚至可以招聘或者培养一个技术牛人来一起带领团队。
另外,一些工程师在微博、知乎上抱怨经理“不干正事净做些政治斗争”。在我来看,大都是些误会。因为很多技术管理者都是技术出身,相对来说的话,大家还是比较单纯的。可能真的是管理者的管理水平问题,才导致了这些不舒服。你可以跟他好好地聊一次,他自己可能都没有意识到。对于团队来说,团队成员间的沟通,leader对团队成员的绝对信任,以及团队成员对leader的支持帮助,其实是非常重要的。不是所有的人天生就能面面俱到,不管是技术还是管理,其实都是需要帮助的。
图灵访谈:团队面临多项目集体构建的时候,如何应对项目间共用组件的问题?
奇舞团有自己公共的平台,像公共组件库和公共编译部署工具,供所有项目开发过程中使用。这些是我们结合360的流程特点,给业务定制的,它能够适应大多数业务的基础搭建需求。反过来,从业务上收集到的需求也能够不断完善公共平台的建设。
公共组件是由每个业务根据实践总结、提交上来的。当然我们没必要说,一定要所有的小组都去采用同样的标准、同样的方式去做业务,因为互联网产品的差异也蛮大的,有PC上面的、移动的、有嵌入式的(嵌入在桌面软件里的)、还有混合编程的。每个产品的特点都不一样,选择最适合的技术就好。不能为了做技术规范而做规范,相对来说,我更看重的是产品技术方案的成熟度,包括文档、Style Guideline、代码review、线上质量、潜在风险,等等。
另外,我觉得组建团队的一个重要原则,就是多元化。针对不同产品选择不同的技术,团队成员也会有更高的自由度。开发一个特别大的项目,或者带一个特别庞大的团队时,尤其团队人员的水平又参差不齐的时候,你是不得不去采用统一的架构做规范的。也许这个架构并不是最适合、最高效益的方案,但它有一个非常大的优点,就是保证技术人员不会写出一些破坏性的东西来把整个项目毁掉。
图灵访谈:如何支持底下技术人员的职业发展?
技术人员的发展有几个阶段,分别是学习、沉淀、分享和影响力。具体来说,你要先学习,然后在工作中沉淀,等有了一定的知识沉淀以后去分享,然后打造你的影响力。影响力对于个人的职业发展很有帮助,奇舞团鼓励中高级工程师具备一定的个人影响力。确实,有的同学可能有产生惰性的时候,奇舞团的人比较多,也没办法一一照顾到。但是还有另外一种情况,有的同学个人是有意愿的,但是最近项目太忙根本没时间去规划发展自己。这个时候我们会介入处理的,否则他就会完全陷入到业务里面,对个人的发展一点好处都没有。我们可能通过调配资源、增加人员、跟业务方沟通,或者其他的管理手段去解决问题,我觉得,这也是团队管理的价值所在。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。