曾探:爱JavaScript再多,它也只是生活的一部分
曾探,2007 年毕业于吉林大学软件学院,目前就职于腾讯 AlloyTeam 前端团队任高级工程师, 著有《JavaScript 设计模式与开发实践》一书。他曾参与 WebQQ、QQ 群、Q+ 开发者网站、微云、QQ 兴趣部落等大型项目的开发。有 Java、Python 和 JavaScript 的开发经验,业余作品有 HTML5 街头霸王等。平时喜欢电影和音乐,业余时间是一名健身教练。
问:你是从什么时候开始编程的?什么样的契机让你成为了一名前端工程师?
我是 07 年大学毕业之后才开始编程。刚工作的时候做的是 Java 开发,当时几乎还没有公司提供纯粹的前端开发职位。如果做的是 web 项目,那么在项目中程序员的工作都是从前端到数据库一锅端。
刚接触 JavaScript 的时候,觉得开发很方便,不需要搭建任何环境,新建一个记事本就可以开撸了。第一次接触 JavaScript 时用 2 天时间写了个贪食蛇,在 IE6 上跑的很欢快,当时觉得很神奇,也很开心。
我 09 年我开始专职做前端开发,在之前的工作还是以 Java 为主,有次刚好看到了一家公司招聘前端开发,就有了后来的事情。虽然现在偶尔还会用其他语言写点东西,但自己本身最喜欢的语言还是 JavaScript,这也是为什么我会从事前端开发的原因。
至于为什么我会喜欢 JavaScript,而不是别的语言,我倒没有认真从语法、语言历史什么的角度去想过。也许就跟四月清晨遇到的百分百女孩一样,总之你一眼就认定是她。
问:在学习设计模式的过程中是否遇到过困难?你是如何克服的?对于正在阅读《设计模式》和《JavaScript 设计模式与开发实践》的读者,你有什么建议?
有时候我在 QQ 群或者论坛之类的地方听见一些新人说:“接下来 1 个月我要把设计模式学完。”其实设计模式这种东西很难用学完来作为衡量标准。
如果你刚成为程序员不久,其实是没有必要刻意去学习设计模式的。如果没有一定程度的积累,看设计模式那些东西跟背书的效果差不多,结果都是无根的浮萍。设计模式本身是从代码中总结而来的一些设计技巧,如果没有代码量的积累,我们很难去真正理解这些模式。
在无数行代码的积累之后,自然而然我们会发现已经使用过一些模式,但缺少一些总结,使用的方式和场景或许还有改进的余地。这时候再去看一看设计模式之类的书籍或者文章,才会有一种茅塞顿开的感觉。
《设计模式》这本书本身还是比较难懂的,这本书本身很薄,但字字珠玑,正因为如此,很多重要的知识和思想可能就在1、2 句看似不起眼的话中。如果是阅读这本书,建议精读和反复读。暂时看不懂也没有关系,先放着过一段时间再来看,或者是工作中遇到了类似的问题,再来翻翻这本 书。
相反的是,《JavaScript 设计模式与开发实践》这本书写得非常简单,从读者的反馈来看,这也是一本容易阅读的书。里面举的例子并不复杂,而且大多都是跟实际开发相关的,所以阅读起来也会有种亲切感。这本书没有特别的阅读建议,从第一页开始,或者从某一页开始都可以。但最靠谱的,还是从前言开始。
问:如何正确地使用设计模式? 如何避免过度设计?
这个问题在《JavaScript 设计模式与开发实践》的前言部分已经提到过。设计模式被一些人认为只是夸夸其谈的东西,他们认为设计模式没有太大的用途,毕竟一个完全没有接触过设计模式的程序员,也许亦经历过许多不错的软件系统开发。他们觉得刻意去使用设计模式反而可能会增加程序的复杂度。
对于开发中的一些情况来说,我们也许在一些特定的场景里,一眼就能看出来使用什么模式。另外一些模式则是在代码重构的时候才加上的。
我们不必去纠结一开始就应该使用什么模式,在首先完成功能需求的前提下,如果使用某种模式会在将来的项目维护阶段为我们带来好处,则可以用这些模式来重构代码。如果以前的代码就完成了需求,而且在维护阶段不会带来大的变化,那我们就没有必要非得往模式上面套。
如果要避免在程序中造成过度设计,首先得熟悉这些模式的用途和场景。
有时候我们将一些模式用在了错误的场景中,或者说在不该使用模式的地方刻意使用模式。特别是初学者在刚学会使用一个模式时,恨不得把所有的代码 都用这个模式来实现。锤子理论在这里体现得很明显:当我们有了一把锤子,看什么都是钉子。拿足球比赛的例子来说,我们的目标只是进球,“下底传中”这种 “模式”仅仅是达到进球目标的一种手段。当我们面临密集防守时,下底传中或许是一种好的选择;但如果我们的球员获得了一个直接面对对方守门员的单刀机会, 那么是否还要把球先传向边路队友,再由边路队友来一个边路传中呢?答案是显而易见的,模式应该用在正确的地方。而哪些才算正确的地方,只有在我们深刻理解 了模式的意图之后,再结合项目的实际场景才会知道。
问:JavaScript 设计模式和其他语言设计模式的主要区别是什么?
关于设计模式的大多数讨论都是源自C++,Java 这些静态类型语言,而 JavaScript 是一门动态类型语言。许多设计模式就是为了解开对象之间的类型耦合而生的,而作为动态类型语言的 JavaScript 没有这种困扰,这说明 JavaScript 语言中的设计模式和其他语言是非常不同的,从结构上已经没有什么可借鉴的东西了,能够借鉴的只有思想和解决问题的场景。
人类飞上天空需要借助飞机等工具,而鸟儿天生就有翅膀。在 Dota 游戏里,牛头人的人生目标是买一把跳刀(跳刀可以使用跳跃技能),而敌法师天生就有跳跃技能。因为语言的不同,一些设计模式在另外一些语言中的实现也许跟 我们在《设计模式》一书中看到的大相径庭,这一点也不令人意外。
Google 的研究总监 Peter Norvig 早在 1996 年一篇名为“动态语言设计模式”的演讲中,就指出了 GoF 所提出的 23 种设计模式,其中有 16 种在 Lisp 语言中已经是天然的实现。比如,Command 模式在 Java 中需要一个命令类,一个接收者类,一个调用者类。Command 模式把运算块封装在命令对象的方法内,成为该对象的行为,并把命令对象四处传递。但在 Lisp 或者 JavaScript 这些把函数当作一等对象的语言中,函数便能封装运算块,并且函数可以被当成对象一样四处传递,这样一来,命令模式在 Lisp 或者 JavaScript 中就成为了一种隐形的模式。
在 Java 这种静态编译型语言中,无法动态地给已存在的对象添加职责,所以一般通过包装类的方式来实现装饰者模式。但在 JavaScript 这种动态解释型语言中,给对象动态添加职责是再简单不过的事情。这就造成了 JavaScript 语言的装饰者模式不再关注于给对象动态添加职责,而是关注于给函数动态添加职责。
问:JavaScript 有很多框架和库,对于初级学习者来说,怎么能在这些资源中选择适合自己的来创建个人技术栈?
相比于其他语言的开发者,JavaScript 程序员确实会显得比较“辛苦”。前端框架和库的发展太快了,好像 jQuery 的流行还是昨天的事情,今天又涌现了 Backbone、Angular、React 这些框架。对初学者来说,很容易让人迷茫,不知道学习哪个框架。我的建议是,优先根据项目需求选择,如果你接手的项目正在使用 Angular.js,那就是学习 Angular.js 的好机会。
如果还有一些业余时间,可以选择一些最流行的框架来学习,它们之所以能够在浩瀚的框架海洋中脱颖而出,肯定是有它们的优点的。比如我们找准了 Angular.js 来学习,可以先用 Angular.js 来做几个 demo 页面,然后想办法在一个合适的项目中使用。熟悉语法之后可以阅读它的源代码,如果有时间和精力,可以模仿它写一个类似的框架,在这个过程之后,或许你还可 以对它加以改进。
问:AlloyTeam 现在有多少人?由什么样的工程师组成?
AlloyTeam 目前有 50 多人,团队既有 94 后的小鲜肉,也有 70 后的大叔,女前端工程师则既有美丽师姐、也有全民校花,还有萌妹子。大家的技术从 Web 前端、后端到客户端,端端精通,既有对基础框架有研究的同学,也有对计算机图形处理感兴趣的同学,既有喜欢做工具的,也有喜欢做游戏的,技术专长可谓兼容 并包。
问:AlloyTeam 的名字从何而来?你们团队的主要工作内容是什么?
我们团队的代号叫 AlloyTeam,很多人很好奇腾讯 AlloyTeam 名字的含义和由来,其实这里还真有一段小历史。2008 那年我们团队开始研发 WebQQ,WebQQ 是业界首个将 WebOS、云计算、AppStore 和 Web 开放平台整合在一起的产品,所以我们就给 WebQQ 起了一个开发代号——AlloyOS。Alloy 是合金、合铸、合成、聚合的意思,正好寓意我们的 WebQQ 是将公司内、外的各种互联网服务产品合铸成一个为用户提供一站式的在线生活的 WebOS 平台。所以我们的团队也就自然成了 AlloyTeam,同时 AlloyTeam 这名字还有一个寓意:就是将不同成员的聪明才智,以及不同技术聚合在一起,以产生更强的合金特性,从而成为坚不可摧的团队。
目前我们团队主要负责手机 QQ 中的移动 Web 业务以及 Hybrid App 的开发工作,比如:兴趣部落、QQ 群等等。除了日常业务开发之外,也鼓励大家做一些各个方面的自由开源项目,不管是可以提高大家工作效率的开发工具,还是能对业界产生影响力的开源项目,小 到组件,大到游戏,我们都非常支持大家去做。团队内部非常平等和自由,也鼓励大家分享、布道、写书。另外,AlloyTeam 也随时欢迎优秀的 Web 前端小伙伴加入。
问:如今,移动互联网已经变得越来越重要,在这种情况下前端工程师会面临什么样的机会和挑战?
的确是这样,就我个人而言,除了上班时间已经很少打开电脑了。原先用 PC 能做的事情,现在手机几乎全部可以完成,可以预见这个趋势在将来还会更加明显。在这种情况下,原先在 PC 上开发的前端工程师很多都转向了移动 web 开发。包括 AlloyTeam 也是这样,现在绝大部分时间都在做移动端开发。对于前端工程师来说,可能要学习一些新的知识,这不是坏事,也不难,程序员应该保持学习的心态。不管是 PC 开发还是移动开发,我们都在用相同的方式来改变人们的生活。
问:程序员给人的印象通常都是不善交际、不善运动,生活习惯不规律,这些习惯也潜移默化地影响着程序员群体的健康。你在业余时间是一位健身教练,请问运动带给你的好处都有哪些?
我认识许多非常有才的程序员,程序员是一个相当聪明的群体,聪明的人能做好许多事情,而不是仅仅写代码。不过也许大部分人都把太多重心放在了工 作上面,这是好事,但也不全是好事。程序员的职业特点注定对健康的损害比较大,从 25 岁开始人的器官开始不可逆转的老化之后,久坐和不运动带来的危害更大。所以程序员更要有意识地多运动,至少运动会给你一个跳动更强烈的心脏,可以背女朋友 越过某个路上的小水沟。当然,加班赶项目的时候也比别人抗得久。
问:请问对于程序员来说,工作和运动是否有可以兼顾?对于想要积极锻炼的程序员来说,你有哪些建议?
IT 行业基本上只能在大城市生活和工作。大城市的房价物价注定我们工作得努力和辛苦。这种情况下,许多人完全把太多精力放在了工作上面,而忽略了生活本身。工 作本该只是生活的一部分,也许我们应该有一个更加平和的心态,努力工作和享受生活并不矛盾。在业余时间有一些自己的爱好,或是找一点适合自己的运动,不光 是为了更好的工作,还因为这些爱好本身也是生活的另一部分。
对于开始有意识开始锻炼的程序员,这是一个很好的起点。不过现实中的大部分人情况都是三天打鱼两天晒网。如果真想通过运动来改善体质或者丰富业 余生活,首先一定要保证自己能坚持下来。很多人刚开始锻炼的时候非常有激情,一段时间后就被自己以各种理由说服放弃了锻炼,比如要加班,有约会,感冒了, 有聚餐各种各样的原因。这些事情肯定是会遇到的,但不管怎样,一周抽出 5 个小时来锻炼身体其实肯定是没问题的。
其次,不管什么运动都是一门科学。拿健身来讲,首先要搞清楚身体跟新陈代谢有关的基本知识,搞清楚动作标准,这样才会有效果而且不容易弄伤关节 和肌肉。如果有条件的话,可以去健身房里面请一个专业教练,有教练和没有教练的区别太大了。相信坚持一段时间后,都能看到自己形貌和精神的改变,直到健身 成为一种习惯。