Rumah >hujung hadapan web >html tutorial >专访:《编写高质量代码web前端开发修炼之道》作者@阿当_html/css_WEB-ITnose
曾回忆2010年时候看过他写的书,近段时间微博上的各种“撕逼”,以及广开收徒事情,让他站在了风口浪尖,有人支持,有人反对。那么今天我们就来看看阿当前辈在自己的前端生涯的经历。
正文从这开始~
自我介绍,所服务的公司
我是曹刘阳,圈里的朋友们叫我阿当。现在在岗岭集团工作,互联网医疗领域。
你是基于什么情景上选择了前端工程师,以及在所服务的几个公司来看,你觉得哪一段经历对你影响最大,为什么?
说来话长,大学时我的专业是计科系,学校里教些C啊、Java啊、软件工程啊什么的,死活提不起兴趣,总觉得这玩意儿离看得见摸得着的“作品”有太大的距离。直到开了网页设计和Photoshop这两门选修课,才眼睛一亮,觉得能做些什么了。另外,我读大学那会儿流行Flash,闪客。我觉得这东西很好玩,就自学了Flash。虽然很多人觉得C语言是最好的入门语言,但于我来说,真正为我打开编程之门的,却是AS2。没错,Flash的脚本语言。Flash方便快捷,加上AS2写脚本,不用太多的知识储备就能做出些好玩的东西了。如果不是因为Flash在今天已经快退出历史舞台了,我仍然觉得它是编程入门最好的选择。
大学时我非常喜欢读书,主要是PS、Flash和网页制作。当时网页制作方面的书low到不像话,经常都只告诉你如何操作Dreamweaver,偶尔有一点讲JS的也是xxx特效300例之类的,只有代码片断,没有基础讲解。这种非常虐心的局面一直持续到06年下半年,人邮出版社引进了一堆国外的优秀前端书籍进来,比如《Javascript DOM编程艺术》《Javascript高级程序设计》《Ajax基础教程》《CSS基础教程》,同时国内也有了非常好的原创书籍《CSS网站布局实录》。这些书都在讲“基础”,比之前我读到的那些代码片断类的书好太多太多了。我开始大量吸收这些书的知识。我有个习惯,就是喜欢把未知的东西全部补齐后,在脑子里有个清晰的、系统化的脉络后,再开始动手练习。书没读完我就像欠了债一样不舒服,拼命读,快的话一周一本,慢的话一个月一本。我觉得这些书上的知识比学校里老师讲的东西好太多,课都懒得去上了,除了去吃饭,就趴在床上看书。我有另一个习惯,就是喜欢自己按照自己的理解和记忆去练习,不喜欢照着书敲代码,哪怕自己写的效果比书上的效果差也不要紧,重要的是通过练习去验证我的理解是否到位。
虽然我的兴趣在前端,但当时市面上并没有前端工程师这个岗位。当时要么是网页设计师,要么是工程师。我想做工程师。大学毕业前一年,我花了大量时间在后台方面,主要学J2EE,但出去找工作时发现当时市场上对J2EE的需求量非常少,不得已换了定位,干脆找网页设计师的工作好了。然后大学时自学的Flash、选修的网页制作和Photoshop反而帮我找到了第一份工作。然后第一份工作的title就成了网页设计师,从PS、AI、Flash到网页制作全包。我大量的时间花在了设计上,配色啊、布局啊、点线面、冷暖色什么的。离后端越来越远,离前端也是若即若离。当时前端做网页,主流的做法其实还是在Dreamweaver里拉表格,还流行什么1*1透明png的黑魔法。公司的两位老前辈用的是ASP+ table布局,我跟公司推荐说改用CSS布局吧,说这是未来趋势。老板问我说,为啥要用CSS布局呢?有啥好处呢?我balabala说了一堆,但老板是生意人,不懂技术,没有听到什么他感兴趣的点。不置可否,然后这事就不了了之了。曾经一度我想过干脆转设计师得了,当时流行两种设计风格,1是简洁的欧美风,2是漂亮花哨的韩国风。我买了一堆的美术设计方面的书,一心想做个一流的设计大师,走韩国风!
但生活总是爱和人开玩笑,我阴差阳错还是回到了前端圈。我的第一份工作是在深圳,华强北,我很喜欢两站地之外的深圳购书中心,经常下了班走两站地去深圳购书中心看书。当时薪水低,没钱买,我就坐在地上看,翻看过大量前端相关的书。工作快一年之际,通过大量阅读书籍,我的前端和Flash编程能力都进步飞快,当时的年轻人和现在的年轻人也差不多,总喜欢加入些同行的群吹牛逼,吹的内容无非3个:公司、薪水、作品。我的作品总能在群里引起很多人的赞叹,猜测我的薪水应该很高,但事实上我的薪水却比很多能力一般的人少,这引起了我极大的心理不平衡。终于在一次心理极度不平衡下,我产生了跳槽的念头,我要找识货的东家给个对得起我能力的薪水。07年下半年,我找遍了51job、智联招聘,蓝色理想的招聘版,在深圳这个大城市却找不到前端工程师这个岗位需求。然后我将目光转到了北京,发现北京这时有大量的前端工程师需求,很多公司也开始有了UED团队。然后我就到了北京。
一开始去了家小创业公司,两个老板和我一个打工的,一共三个人。两个老板,一个是写PHP的,另一个是设计师,然后我就成了前端。北京的技术圈还是识货的,他们能理解到前端工程师的作用,很爽快地double了我的薪水,然后我就终于心理平衡了,成为班上同学里薪水上涨最快的一位。这份工作是我真正前端之路的开始,这家公司做的是Web 2.0的网站,对富媒体应用要求很高,各种效果,MP3音乐播放器、Flash相册、多文件上传、自定义皮肤、各种JS效果。然后这家公司为了生存也接外包需求。然后我就从前端开发、Flash开发、Flex开发到PHP开发,除了设计不需要,全部锻炼了个遍。平时加班、周末加班、多的时候三个项目并行开发,其中有的项目是我一个人全栈完成。而当时我虽然看过不少书,但其实刚从一个拉table的网页设计师转型过来,压力和挑战可想而知。也许确实是我对编程有天赋吧,也许是我很会挑书和读书,我扛了过来。这段时间对我的编程能力和抗压能力有了质的提高。不逼自己一把,永远完不成质变的,就是在这段时间我认识到这个道理。之前看过再多的书,也不如在这段时间让我成长得快。值得一提的是,正是在这段时间jQuery才开始红起来的,所以从深圳时开始我前后写了一年的原生JS,这让我对JS底层有了更深的理解。
之后有机会去了雅虎。没去过大公司的人,会特别向往大公司,特别是QQ群里一群人整天拿大公司说事,一个人自报家门“淘宝”“新浪”“腾讯”,然后一群人各种跪舔。我很向往去大公司,管它哪家大公司,我也要一个招牌,降薪去都行。然后很幸运去了雅虎,hr问我你薪资要求多少啊,我说你们看着给吧,没有要求。去雅虎对我来说,有非常重要的意义,不是公司光环,而是我遇到了YUI。当时YUI还是YUI2,雅虎内部强制要求所有前端使用YUI,不能使用jQuery之类的其他库。而在遇到YUI之前,我以为jQuery已经非常强大了,比原生JS强了太多了,就像魔法一样,我以为不会有比它更好的东西了。然后遇到了YUI2,纯英文的一个官方网站,花了近一个月的时间去啃它的各种文档,然后惊为天人,和jQuery的差异实在太大了,完全不同的思路。做内部分享的时候,我说jQuery就像古龙的小说,江湖是二维的线,兵器谱排行,而YUI像金庸的小说,江湖是个立体的面,东邪西毒南帝北丐中神通,没有一个jQuery对象那样的绝对主角。YUI的设计思路让我彻底知道了什么是框架,什么是库。直到后来YUI3的升级,我发现YUI就像apple一样,是个极致的、封闭的、完美的宝贝。我一直以为它会火,会大火。
在雅虎刚转正不久,遇到了雅虎裁员2/3,我这个新人理所当然被裁了。然后我内部面试成功转岗到了淘宝,我是淘宝北京的第一位前端员工。然后挑战了我这辈子的第一个spa,一个非常有挑战的项目。项目的核心部分我现在还保留着: http://t.cn/RbrJFM8对于当时的我来说,这是个很考验前端编程能力的任务,而且时间要求非常非常紧,这个核心demo我花了不到3天时间完成。各种拖拽啊、换肤啊很复杂,而且没有任何人可以咨询可以帮手。我通宵着加班,完成了这个挑战。在这段期间我看了设计模式相关的书,理解了面向对象编程的思路,然后这个SPA项目正好逼着我用上了OO编程。这个阶段我完成了第二次质变,也变得非常讨厌加班。另一件重要的事是,我开始写书了。感谢我的朋友周裕波帮我介绍了华章优秀的编辑杨福川。
书写到一半,我离职去了新浪。在新浪,进入到的项目组也是个特殊的项目组:即时通讯部,新浪聊天室和web uc。新浪聊天室和web uc全是spa,面向对象组织代码,多人合作维护同一份长期维护的项目。这段时间其实蛮闲的,我学了ruby、rails、python、linux、django、wxpython、敏捷开发等知识。然后html5来了,移动开发也来了。因为2010年被称为移动开发原年,是一个崭新的,光明的平台,机遇很好,很多小伙伴在开始往ios或android转了。我也买了android的书,准备转android了。但当时我已经有点船大难掉头了,一是因为我在web上积累了很多经验,二是我的书出版了,也去参加了很多大会的演讲,圈内很多人认识了我。最终让我下定决心留在前端圈的原因是,想起了asp、delphi的没落,和iphone4对flash不支持,flash的窘境,以及移动平台崛起,windows平台的衰落,我想还是web这种公开的非私有的技术才会是安全的吧,再说html5比html4强大很多了呀,未来大有可为。
在新浪的时间我恶补了大量知识,随着能力越来越丰富,我开始反思两个问题:为什么我要听产品经理的,我能自己做自己想做的吗?以及我大学时选择it这个专业的初心,我想做游戏开发,想开发出让人喜欢的游戏,让人可以津津乐道于上上下下左右左右BA的秘笈。我觉得自己足够强大了,能做前端能做后端能做项管,我想做点自己喜欢的事了,我要做游戏去。然后很巧的是,我的老朋友周裕波当时在盛大创新院工作,他跟我推荐这家在国内已经名气不小的工程师乐园,说这里想做中国的google,院长是陈大年,盛大九千岁,工程师出身而且出非常文艺的一个人。我非常向往这种传说中的工程师文化乌托邦,更何况盛大是以游戏出名的,这么理想的环境简直就是在为我量身打造的呀。然后我毅然离开了生活4年的北京,到了上海,加入了盛大创新院。
创新院当年是真的不错,自底向上自主立项,基本上项目负责人全是工程师,没什么产品经理。或者干脆说这家公司就基本没有产品经理也没有运营,全是工程师。大城小胖、flashlizi 、winter、hax、月影、正美当时都在创新院。记得我和小胖、flashlizi老吵架,吵不完的架,这俩又想做游戏又不想和我一起做,却偏偏都在我的项目组里。也是这段时间我发现传说中的微软大神,51js版主winter知识结构真奇葩。然后发现在线上咄咄逼人的hax,其实线下即视感居然有点憨憨的。真想不到是这样的人拍了我两次砖(一次是为朱印宏的《征途》连带被拍,另一次是拍我的书)。月影大侠说话结结巴巴的,还特别绕 @_@ 。正美一直到离开创新院一直到今天也没见过真人,不喜欢走动的一个技术痴。米粽从那时就已经在讨厌我了,我也不知道为什么,可能是因为技术理念不一样?(耸肩)创新院的回忆其实大部分是不太开心的,最美好的部分,大概是和winter聊洪荒流的神话吧,比如佛啊、太上老君啊、原始天尊啊,谁比谁狠之类的。在创新院期间我立的项目是一个跨pc和手机、pad的实时联机游戏平台,我们基于YUI3 + websocket + twisted + mongodb + 自主研发的html5游戏引擎开发了疯狂坦克、台球、斗地主、五十K共4款游戏。然后盛大创新院就倒闭了。。。这期间我的收获是学习了mongodb、redis、twisted、html5各种api,canvas2d和webgl。另外,也完成了技术人到产品负责人的转型。
小伙伴们都四散去了不同的公司,除了小胖很倔强地自己开始了屌丝创业之路,捆着裤腰带过日子,其他人都找到了不错的归宿。我没有离开盛大,调岗去了盛大游戏创新院。再然后和江湖大佬出去联合创业,做html5游戏平台去了。再然后创业因为一系列的原因,我退出了。但这期间的收获是真真实实地看到一个公司在经营的过程中会遇到的问题,将我彻底带出了工程师思维,开始用更接地气地方式看待很多事情,包括人、公司运作、向上管理向下管理的艺术等等等等。发现工程师真的是群太单纯太单纯的动物了。说单纯一方面是工程师简单善良,另一方面是工程师真的愚蠢。这个世界并不是围绕工程师在转的,工程师的世界虽然别有洞天深不见底广阔无限但终究只不过是哆拉A梦的四次元口袋,它并不是真实世界,它的游戏规则出了那个圈子什么也不是。我本以为我能做个剑客的,却发现我不过是剑客手里的剑,哪怕我是倚天剑,我也不是剑客。创新院那样的乌托邦再也不会有了。这个很打击我,非常打击。。。
我的编程之路到这里差不多就结束了。再后面的故事,我就已经彻底转型管理路线了。带着技术驱动产品创新的梦想和出师未捷身先死的遗憾,我离一线编码越来越远了。不是叛逃程序员圈,也不是我编程编不下去了,而是我的初心就并不是想当一辈子程序员,编程于我来说,是个工具,实现我的游戏梦想的工具,学前端学后端学软件工程全是为了有能力开发游戏。我从一开始就把程序当做工具,只不过一不小心发现我居然还有点编程天赋。
我发现一个很严重的问题就是,很多人在进入职场后忘记了初心,或者干脆就没有初心,什么挣钱学什么,往前怎么走完全是被圈子的思潮所带动的,比如圈子里鼓吹geek文化,鼓吹传说中的大神,鼓吹白胡子白头发写一辈子程序,然后很多人就被这种文化给洗脑了,误以为这是他自己的追求,还被这个文化绑架了,鄙视甚至攻击不认同这种文化的人。真的完全没必要。
我的每一段经历都有不同的收获,我也不知道哪一段经历对我影响最大。回首来路,我想我的路线其实从一开始就注定了吧?性格决定命运,无论路线怎么变,到了某个阶段,我的位置和方向可能都差不多。不谦虚地说,如果当年坚持走设计师路线,没准今天也是个很棒的设计师,也转型做管理做产品了,哈哈。
在当前前端技术更新这么快的情景上,你觉得前端开发工程师应该注重哪方面的学习?在学习过程中遇到瓶颈了应该如何突破呢?
前面说了这么多我的成长经历,就是为了现身说法,从我的经历中给出一些建议:
不要迷信大公司出品的技术,google和facebook等大牌公司出品的东西多了,别见着是名厂出品就觉得一定是正确的。google出品的GWT死了、微软出品的silverlight死了、IBM出品的dojo也和死了没区别吧.
别看今天热闹,经得起考验的才是王道。曾经flash、flex、silverlight、as3、extjs、YUI、mootool、prototype、air、phonegap、jquery mobile、coffeescript、javascriptMVC、backbone、标准语义化、seo、残疾人可用性、flash全站、RIA等等等等也都热闹过一阵啊,今天这些还有几个人提?把时间拉长了看,只有活下来的,才是王道。而什么样的技术能活下来呢?以我的经验看是:极致的性价比。所以我一点不看好angular和react。哪些东西具有极致的性价比,哪些东西才可能存活下来,历史总是惊人的相似。我说这话的意思,并不是让大家不要学习,多学习总是好的,学习下框架里的思想。就像YUI一直没火起来,但我非常感谢它对我的帮助。我说这话的意思是,要小心这些框架,要辩证地看问题,而且要做好充分的心理准备,它们很可能会被新的东西替换掉,不要陷入“不停追赶,不停放弃”的陷阱,精力会顾不过来。
别盲从意见领袖。对于很多技术人来说,他们追求的是“大神”之名,或“技而优则仕”之实,技术不过是工具,满足这些不甘寂寞的阿甘的陪跑教徒而已,他们才不管性价比高不高,才不管你们跟不跟得上,才不管你们基础扎不扎实学习效率高不高,也不管技术会不会淘汰,反正他们江湖名声起来了再互相卖个面子,不愁找不到好雇主要不到好薪水。还一群人大神大神地叫,可high了。
喜欢叫别人大神的,其实不少人心里也有个大神梦,也希望自己可以早点出点名气。所以呢,对别人总是巴不得别人和盘托出,然后直接拿来主义。有点成绩之后呢,端起碗吃饭放下碗骂娘。觉得看你教程、关注你、给你点赞是看得起你,是公平买卖。学到了知识之后呢,还会骂骂咧咧的,说你哪儿哪儿不对,说你误人子弟。然后问他们看不看书,答说,看,只看国外的书,叫扔个书单出来全是国外的书,显得有逼格。其实国产书有很多不错的,丝毫不出国外的书差,比如说《大话设计模式》《html5和css3权威指南》等等等等,非常棒,却很少看见他们出现在国人的推荐书单里,尽是些国外的书,有不少书其实跟实战离得老远,比如犀牛书,我觉得一点不实用,实战经验足够以后,再拿来当字典查查还行,也就那样。早些年的《网站重构》《css禅意花园》都什么玩意儿,看了和没看没什么区别。我对国人追求逼格的做法非常讨厌,不接地气,该成长不了就成长不了,活该。想学习的同学,别被这帮人绑架,什么东西对自己有用,相信自己的真实感觉。
看书非常重要。别整天东学一点西学一点,遇到问题查查百度(别跟我提你不用百度用google,这不是啥逼格,我不会翻墙,你爱用啥用啥)。看书是最系统地学习知识,将零散的知识点串成面的方法,没有之一。看书,看好书。
算法、数据结构啥玩意儿离前端实战很远,别听人瞎BB。我写了这么多年前端代码,遇到过的挑战非常多,越是基础的css、dom api、bom api对我的帮助越大。别的都是扯。让那些整天提算法、数据结构重要的人举几个例子出来看看,是什么场景下这些重要,一准举不出几个常见场景。还不如好好学学css去实用。
css是前端的基础,比js更基础。没学好css前,不瞎折腾js,更别折腾框架、工具、编译啥的。更别折腾node,妈的离前端越来越远。搞成了伪后端也解决不了你的实际项目问题。先学css、再学原生js、再学js框架、再学工具、最后学node后端。真想学后端的话,也不推荐用node,玩什么不好玩这个坑货。
别迷信大公司光环,幻想大公司的大牛如何如何牛逼,大公司的工作流程如何如何正规、大公司的技术选型如何如何正确。以我这么多家互联网大公司的亲身经历,和对其他大公司的了解,大公司其实也乱得一塌糊涂。都是混口饭吃,某些人喜欢装神弄鬼的,显得与众不同,公司光环既是他们的靠山,他们也为公司的光环添砖加瓦,相得益彰,或者说狼狈为奸吧。还是那句话,有用还是没用,相信你自己的感觉。别一边跟在人后面跪舔,一边发现这些玩意儿落不了地,该加班你还得加班。
别随便听任何人的意见,包括我,别搞偶像崇拜啥的,相同自己的判断。尽信书不如无书,尽信人言不如别听。
对你的了解,你做过工程师,创过业,那这些经历对你现在的感受时什么?
这些经历告诉我,工程师30岁转型危机是真实存在的。每个人都需要做未来5年计划,你希望5年后在做什么?很多人能回答出来未来2年计划,但回答不出来未来5年计划。这点值得引起足够重视。在职场时间真的过得很快,特别是IT圈,5年工作经验就敢自称老人,10年工作经验不管愿意不愿意都会被当做老人。你真的以为你到30岁时不会遇到30岁危机?你真的以为你想做白胡子白头发编程老头?你真的以为你做得了这样的老头?今天你在做什么,取决于5年前你的计划,而5年后你在做什么,取决于今天你的计划。如果今天的你没有5年后的计划,那么等着5年后的危机吧。
市面上前端相关的书很多,在这块上你的书单上有哪些呢?
html5和html4是个升级关系,不是个替换关系。html5相关的书,或者说当下流行的书,其实讲的是html5于html4的增量部分,而html4的书可能已经不再流行甚至不再出版了。这是很危险的,书断层有可能引起技术断层,特别是连互联网上的知识也是这种倾向的时候,非常可怕。不知道5年内工作经验的同学,基础扎实的有多少。我说的基础扎实是从html4开始算的。我个人的建议是,找找老书看,补补基础知识,从html4开始补,补到html5。也许这其中会遇到某些知识已经被淘汰了,但不重要,知道被什么淘汰了,以及为什么被淘汰了很重要。
希望直接就有现成的书,把最佳实践直接告诉你,这是不可能的。一是有能力写这种书的人很少,二是有能力写的人不见得愿意写。我建议是从html4时代的书看起,一路看到html5,移动前端开发。
那除了自己补,还有什么别的办法吗?也许你可以参加我的收徒计划。准备好这6个问题:
怎么看所谓高手、大牛?
如果钱不是问题,自己想做什么事?
如何看待工程师30岁转型问题?
自己和大多数人观点不一样的一件事是什么?不限于技术
如何看待拜师一事?
觉得我能教你什么?然后将答案投到 caoliuyang@111.com.cn
另外,入我门下还有拜师礼节和拜师费,详情看这里吧: http://t.cn/RGQ0g5i
为什么会想到收徒呢?自己想吧。
在前端技术的深广度上,要如何去权衡呢?
09年我在写自己的书的时候说过,欲精一行,必先通十行。深度当然是最核心的html、css和js上。广度上可以学学服务端编程、面向对象、代码重构技巧、软件工程、native开发、webgl等等。权衡嘛,注意你的岗位是前端,所以什么是珍珠什么是盒子要分清楚。盒子可以换可以扔,珍珠不能扔。
从技术岗转到管理岗,你切身的体会有哪些呢?
team leader和geeker是不一样的,team leader的定位是保证团队合作的流畅与效率,团队成员的能力成长和稳定性。geeker并不适合当管理,甚至会成为团队合作的障碍。技术岗是第一人称视角,是打cs,而管理岗是上帝视角,是玩魔兽争霸。
但有意思的一点是,编程中的很多智慧放到真正世界来运行也是非常适用的,比如敏捷迭代的思想,先完成后完美,比如面向对象的思想,高内聚内耦合,放权与团队合作,比如抽象不足与抽象错误,团队分工协作,比如api封装需要考虑易用性,文档编写要尽可能对用户友好。总之,编程的思想在做团队管理时也是帮了我很多大忙。
只是这样仍是不够的,需要掌握的知识还有很多,比如时间管理、心理学、性格研究等等。另外,我在负责产品,所以最近一年在恶补大量的经济心理学、社会心理学、产品营销、销售技巧等等等等。活到老学到老,做个技术出身的产品人,在互联网+时代,广阔天地,大有可为。