如何成为全栈工程师?
2015-08-18 余果 人邮IT书坊
不管您是否承认,除去极少数天赋异禀、骨骼惊奇的天才程序员,我们大部分人都是普通人,都需要遵循“一万小时定律”,才能从平凡变成超凡。
凡 人要从一个小菜鸟成长为全栈工程师,只能从少到多、慢慢积累知识和经验。职业生涯的本质,就是在一个专业方向上积累信息。这里我推荐采用“先精后广,一专 多长”的流程来学习。采用这种方式来学习,不光可以触类旁通、举一反三,还让我们学习得更快,而且循序渐进更符合一般人的职业生涯发展。
先精后广,一专多长
“先精后广,一专多长”是指,建议初学者学习全栈技能的时候,先在一个特定的方向上有比较深入的钻研,然后再将学习目标渐渐推广开来。比如先从前端方向入手,掌握了基本的HTML、CSS、JavaScript之后,不要转头向服务器端语言或者App方向发展,而是深入到性能优化、SEO、多种框架、响应式页面等前端细节中去。经过一到两年的深入研究之后,再去学习其他方向。
如 果在创业公司做全栈的工作,一般也不会要求一个人处理所有的技术工作,至少会有两三个人组成团队来做项目。大家在分配工作的时候,可以按照每个人的偏好和 技术特点,进行前后端的分工,不用完全按照每个人做一个模块的方式来分工。这种分工的界限不一定要很绝对,在不同职位的工作范畴中,可以有一些重合的区 域。
如果是毕业生或者初学者,我不建议在刚开始的一到两年接触太多技术,杂而不精,结果可能会对后面的职业道路产生副作用。
为什么我强调在开始的时候有一个专精方向的重要性呢?因为这样您才能在求职的时候有一个“亮点”。
平心而论,程序员在市场上的供求关系比很多其他职业都更有利于求职者,在微博、Twitter、V2EX上都会有很多引人注目的招聘启示,大家对优秀程序员的需求从来就没有减少过。
虽然优秀的程序员总是能找到工作并且工资不低,但是很多程序员投出的简历都石沉大海,一个主要原因是由于求职者的简历没有亮点,或者说从工作经历中提取不出来一个亮点。
让我们做一个情景假设,作为一个有两年工作经验的全栈工程师,您看到腾讯有一个职位空缺。
腾讯社交用户体验设计部招聘前端开发,要求如下。
- 本科以上学历。
- 两年以上工作经验。
- 精通HTML、CSS、JavaScript等前端相关技术,熟悉W3C网页标准。
- 熟悉至少一种后台语言的开发机制(如Java、C++等)。
- 有一定架构能力和算法能力,有良好编码规范。
- 良好的学习能力、沟通能力,追求完美,有工作激情,能在较大强度下工作。
- 热爱互联网,喜欢研究各种互联网技术者更好。
您想,自己完全满足要求啊,于是一封简历就投递到面试官的邮箱,里面用大段文字表达自己全面的能力完全符合这个要求,而且自己还有亢奋的激情和浓厚的兴趣。
但是您从面试官的角度来想想,他收到了多少份简历呢?对于一个大公司的HR,可能100个都算少。
根据中国招聘平台拉勾网“2015年互联网人才流动报告”,前端相关岗位的简历投递数只有岗位数的一半。与此同时,服务器开发方向(比如Java、PHP、C++等)的简历投递数都大大高于岗位数。从图表可以看出,前端开发仍然处于人才紧缺阶段。
HR要从100个符合要求的人中选择10个来面试,您的简历中的哪一点能吸引他呢?有的竞争者有丰富的移动端作品,有的竞争者提到他很擅长页面性能优化、响应式、页面渲染效率,有的写过JavaScript框架……而您只是一个普通的满足要求的人。
不同职位的供求关系是不一样的。
您可能会说,我爱好广泛,学习能力强,我会一点PHP,做过Wordpress主题,会一点Java,毕业设计做过一个小客户端应用,什么都会一点……但最终您仍然会得到一个“无亮点”的评价,被无情地淘汰掉。因为虽然您会的技能很多,但大多只能算是“及格”的东西。
所以,作为一个求职者,无论是毕业生还是社会招聘,仅仅满足招聘要求是不够的。您需要在招聘要求的方向上以200%的能力来得到这个职位。
一个求职者在整个流程中会受到多方考核:HR考核您的成本和价值,专业面试官(不是全栈工程师)考核您的专业能力,经理考核您的沟通能力。在所有这些考核中,其实每一环都是漏斗型筛选,会过滤掉一些人。
好消息是,由于程序员的供求关系,只要您的专业能力够强,您就有很大的概率通过整个面试录用流程。我一次又一次提到“供求关系”这个词,是因为在商业社会,所有的商品(包括人才)的价值来自于供求关系,而不是生产成本。生产成本是准入门槛,但绝不是核心竞争力。
让 我再次重复这一点,作为求职者,一定要在某个特定方向上有非常深入的理解。仅仅会做还不够,还要理解背后的原因,还有背后的背后的原因。有些面试官的习惯 是,在一个问题上深入地问下去,从经验问到操作过程,再问到技术原理,一直深入到面试官问不下去了,或者求职者答不上来了。所以,理解得越深刻,您就越有 优势。
有了一个专长,得到一个能让您成长的工作,进入强大的团队,您就能有自己的阵地,以此为生,然后再逐步学习更加广博的知识,朝自己的个人目标去努力。如果您连阵地都不稳固,就不存在开枝散叶、落地生根的可能性了。
假设您已经在一个中等规模以上的公司找到了工作,那就会有一个专门的岗业。经过几年的工作和练习,您会在专业知识上达到很熟练的程度,日常需求都已经在您的“舒适区”,现在您终于准备好了。既然您的目标是做一个全栈工程师,那么从哪些技术开始入手呢?
围绕商业目标
我的第一条建议是,在考虑做什么项目的时候,围绕商业利益作为目标。归根结底,技术是服务于商业目标的。
在计算机科学诞生的短短几十年中,热门的技术和平台一直在发生巨大的变化。
服务器端的平台和语言从C到C++、Java、Python,再到如今的Node.js,变化从来没有停止过。
客户端则分浏览器和原生开发两个分支。浏览器方面,Web标准是一个活的标准,意思是说,有一些新的提案不停地加入到标准之中,这是一个动态滚动的标准,而不是印刷出来的定案。
各种浏览器的市场份额每隔两年就会发生天翻地覆的变化,从moz到Webkit,我们见证了Webkit的发展壮大。
移动端设备的市场份额之争更是激烈,曾经的诺基亚和摩托罗拉被新起之秀收购,iOS和Android之争还在继续……
仅 仅据我所知,2014年到2015年腾讯就有很多团队进行了从PC端到移动端、从HTML5到原生App开发的各种转型。没有人能说得准下个季度我们团队 的目标是什么,每半年就有一次大的调整,而小的调整从来就没有停止过。“变化”是唯一保持不变的东西,每个人都在不停地学习新的技术。
相 对来说,商业目标是稳定的。把关注点放在商业目标而不是技术上,就能选择出更适合完成商业目标的技术,这样就能做出更为客观的决定。更重要的是,在这个过 程中您学习到的不仅仅是技术,更是一种潜在的思维方式,这种思维方式可以帮助您提升综合竞争力,是一种“硬通货”的能力。
老板雇用一个员工,不是因为他能写程序,而是因为他能帮助自己赚钱。赚 钱有两种方法:减少成本,或者增加收入。程序员如果能加快内部系统的运行效率,让产品制作流程更加顺畅,就是减少成本。如果能让用户更容易地购买产品,或 者提高服务质量吸引更多用户,就能增加收入。在老板看来,程序员只是一个昂贵的劳动力,他会不会写程序都没那么重要,重要的是能赚钱。
所以如果您想成为一个高级开发者(或者高级设计师),就一定要学会这种思维方式。
所 谓“商业目标”要广义地去解读。对于直接制作产品,给用户使用的团队,就需要对外关注如何提高产品质量、降低产品成本;对内应该关注如何优化流程、减少错 误率。如果团队输出的成果是公司内其他部门需要的原材料,就要关注下游的需求,研究如何更好地输出成果,如何在流程上使得输出产品的过程更顺畅。
关 注商业目标需要持久的练习。等到自己成为全栈工程师,或者成为团队管理者,更加需要在多个目标任务之中做出选择。全栈工程师需要做和能够做的事情是很多 的,他会很多技能,也负责处理很多工作,所以他更需要能力从诸多事情中找到最有商业价值的一个:可能是制作一款工具提升团队效率,也可能是成本上的优化。
全栈工程师可以做得事情越多,就越需要具备判断做什么的能力。如果增加一个用户需要的功能是加分项的话,拒绝一个用户不需要的需求更加值得推崇。
一切都要围绕商业目标来进行,包括您做的项目、您的汇报方式,以及您在学习新技能时进行的取舍。
我在公司的技术通道中会发现有这样一些开发者,他们做项目的驱动力是“技术”本身,而不是“商业”目标。比如说,他们针对微信平台做了一个活动推广页,使用了很多华丽的3D旋转和SVG动画。好的方面如下。
- 用的技术很新潮,满足了自己的炫技虚荣心。
- 朋友圈(其实都是前端同事)传播很广。
- 在高端机器和大屏幕机器上效果很好。
坏的方面如下。
- 在低端机和慢速网络下效果不好。
- 沉浸在技术的实现中,而忽略用户体验。
- 打开页面就自动播放音乐,让用户感觉很突然。
我老婆是一位财务人员,她每次看到朋友圈这种很炫酷但需要加载的页面就会马上关掉,有时候耐心等待打开之后也是眼花缭乱,不知所以。所以有时候我会思考,一个技术的圈子,在热烈讨论某个推广页又用了某某炫酷新技术的时候,有没有想到普通用户根本不买单呢?
再来说说一个好的案例。
我 在面试求职者时遇到一个综合能力不错的候选人,他是一个全栈工程师。我问他,您现在掌握的技术比较多,那您未来的职业规划是怎样的?他说,他觉得用什么语 言并不重要,但是最近一年开始把重心放在Android开发上,因为移动端App开发是现在的潮流,有很大的需求,在这里可以有所成就。但在未来,不排除 改变方向去做别的事情的可能,到时候可能是iOS或者其他新的系统。基本上来说,自己掌握的知识体系是可以复用的,但也期待学习新的语言。
我喜欢他这样的态度,对未来有自己的方向,但也知道自己没法看得太清晰。对商业和市场有想法,而且自己也有足够的技术能力和自信向未来前进。相比而言,有些候选者的项目经验和学习技能很杂,东一锤子西一榔头,有些时候纯粹是为了折腾而折腾。
记住,当您只有一把锤子,您看什么都是钉子。而如果您痴迷于工具,反而看不到问题所在。因此,要先看看有哪些问题需要解决,然后再补充您的工具箱。永远从商业目标的角度来决定学习哪些东西,而不是纯粹为了锻炼技术能力而去学习。
关注用户体验
我的第二条建议是,从用户体验的角度考虑问题。
用户体验是用户使用产品时的心理、感受、印象、评价。生活中处处涉及用户的体验,闹钟、牙刷、马桶、书包、公交、红绿灯、手机、电脑、键盘、鼠标……每天,我们都在和产品打交道,每天都在使用和体验产品。
每一个糟糕的体验背后都蕴含着商机
全栈工程师应该关注用户体验,并且掌握用户体验相关的知识。即使一个技术达人能够以一己之力搭建一个站点,但他如果不关注用户和客户的体验,那么他做的产品可能会很糟糕。这样的产品除了“能用”之外什么优点都没有。
所有优秀的工程师所做的一切都是在优化用户体验:优化性能的开发者是在积极地提升用户体验和交互;设计师有意用颜色、空间、大小和表单的排列方式让用户体验更顺畅好用;而内容运营者认为某些内容重要,某些内容不重要,也是在考虑如何提升用户的体验。
我在2010年加入腾讯的时候,公司只有一万多人。那时候,我需要办一些行政手续,需要公司开具薪酬证明,整个操作流程是这样的。
打开公司论坛,搜索“薪酬证明”,搜索到一篇文章,里面讲到找一位人力资源的员工来办理。
我 打开RTX(腾讯内部使用的工作通讯软件,类似QQ),找到这位人力资源的员工,问他座位在哪里;跑到他座位上,此时已经有几个人在排队了,我排在后面; 到我了,我告诉他我要办薪酬证明,并告诉他我的RTX ID;等待10分钟后,他打印出一张薪酬证明,签字盖章后给我。整个过程耗费了我一个小时的时间。
2015年,我要申请美国旅游签证,需要开具薪酬证明。我从平时的宣传渠道得知,现在人力资源的很多服务都可以在线上办理了,于是我尝试了一下,现在开薪酬证明的流程是这样的。
- 关注“HR助手”的微信公共账号,它自动识别出我是腾讯员工,也得到了我的ID。
- 选择“我要办证明”→“收入证明”,在证明用途一栏,选择“签证类”→“旅游签证”,并提交一些个人信息。
- 输入我的办公座位号,提交给系统。
第二天,一个漂亮的红色大信封放在我座位上。打开一看,里面包括中英文两份收入证明,还有我的旅游目的地以及时间,整个收入证明既漂亮又专业,是为签证量身打造。从提交系统到拿到最终的证明,我只花了几分钟,过程顺畅快速,体验非常好。
从 2010年到2015年,经过这几年的发展,腾讯的员工规模已经达到了三万多人,翻了三倍。HR流程如果还以旧的方式运作,可能得加派好几倍的人手,浪费 所有员工不知道多少时间。但是现在通过自动化的系统,用户满意度大大提高。一个内部员工使用的系统,尚且有如此的优化空间和投入力度,何况是对外直接出售 服务的公司呢?
我这样被公司服务“惯坏”的人,往往对社会上其他服务更加挑剔。此外,在深圳这样一个服务业水平居全国前三的城市居住惯了,去其他城市也经常会有被“怠慢”的感觉。我想这就是所谓“由俭入奢易,由奢入俭难”。
所以,用户现在都被手机中那些提供优质体验的App“惯坏”了,想让他们再接受陈旧的设计和体验,就更加难上加难了。
用户是谁
“站在用户的角度想问题”这样一句朴实的话,可以指导我们做很多事情,但是很多时候我们忽略了这一步。
就像“体验”泛指所有生活中所有的体验。这里的“用户”仍然是一个广义的定义:所有您为之服务的人。
比 如做一次演讲或者汇报,第一件要紧的事不应该是做PPT,而应该是调查听众,站在听众的角度去思考:听众知道什么信息,听众想知道什么。如果给您的老板汇 报,您不能期望他了解您所做项目的技术细节,而且他想知道的也不是技术细节,而是项目进度和风险。但是如果在一个技术论坛上分享,您就不能期望听众都知道 您的项目背景和目标,需要花一点时间去介绍,听众也不想知道太多细节的东西,只需要介绍一些决策和架构的大方向。
写 邮件的时候,收件人(还有可能这封邮件被转发之后的收件人)就是用户,那么写邮件的一些技巧就包括:尽量简短,不要给收件人太大压力;把结论放在邮件的开 始,方便对方快速了解情况;如果需要老板拍板,给出选择题,而不是问答题。总而言之,以对方能理解、会关注的方式来表达自己做了什么。
作为前端工程师,上游的设计师、下游的后台工程师,都可以认为是前端团队的用户。如果细心观察,就可以发现这里面有一些痛点。因为领导没有自己敲代码,所以他可能不会发现这些痛点,也就不会安排您去做优化工作。所以这里需要您自己去观察和优化流程。
很 多程序员的第一个想法是做工具,但是想想我刚才说的话,老板雇用您不是因为您能写代码(或者做工具),而是因为您能帮他赚钱。所以您要用一切办法,去优化 流程解决痛点,做工具是一个可选的方法,但不应该是您的第一个想法,更不是唯一的办法。假使真的是做了一个工具,最终汇报邮件的时候,不要以“我做了一个 工具……”开头,而应该以“我发现了一个问题……”开始。
大巧若拙
老子(两个字都请以三声阅读)说,大巧若拙。意思是,指真正聪明的人,不会显露自己,反面从表面看好像还很笨拙。用户体验不只是界面和交互这样可以直观感受的东西,还包括一些隐藏在用户界面背后的细节和规范。
就 像冰山,露出水面的部分只占整个冰山的1/9,用户看到的只是显露出来的部分。背后的部分一般用户是看不到的:比如用户研究,用研团队会通过调查,输出一 些用户画像,影响整个产品的功能方向、设计风格;还有设计规范,设计团队在设计产品的一开始制定了规范之后,新增加的功能和页面都必须遵循已有的设计规 范,这样整个产品是统一的,能够给用户专业的感觉。
为什么现在很多商业公司花了大把的钱和精力开发出独立运行的App,体验却很糟糕,甚至很多用户反馈称App还不如微信公共号好用?
一 个很大的原因就是公司不重视用户体验,觉得用户研究和交互这种东西,不用专业人员去做,让设计师搞定就好了;或者老板拍脑袋定方案,做出的东西花里胡哨、 炫酷狂拽,但就是让用户摸不着头脑。相反,微信花了很大的精力去做深入的研究,最后设计出了一套看似简单,但是可用性非常好的框架。然后微信开放后台系统 给第三方,第三方公共号可以定制的地方有限,只能把功能往里面套,不太容易出错,用户体验自然就上来了。
反观某些银行的App,几乎每个标签页的设计风格都不一样,而且喜欢自己设计键盘,每次在输入密码的时候都非常不方便,其实这是没有必要的。
做自己会用的产品
创 业公司做产品,CEO一定要是自己的目标用户。因为如果自己都不体验自己的产品,就很难发现用户在使用产品过程中遇到的糟糕体验。我们经常在网上看见网民 抱怨办理公共事务时手续很麻烦,很多流程设置得让人抓狂。我想,这里面有一个很大的原因就是,设计公共事务流程的人,自己本身不是目标用户。
网 上有个段子,说一般的产品经理没办法把自己代入成“小白”用户,做出的东西只有他自己会用;高级产品经理经过半小时的冥想可以进入小白状态;张小龙和马化 腾这样的大师级产品经理需要两分钟;而乔布斯可以随时切换大师级产品经理和小白的状态。这就是为什么他会说“stay hungry, stay foolish”。
我如果开创一个公司需要招聘“全栈工程师”,我要求的三个能力就是一专多长、关注商业目标、关注用户体验。
有 志往全栈工程师方向发展的学生,我推荐从入门简单的前端开发开始学,而且从拉勾网“2015互联网人才流动报告”来看,职位多、简历少排名第一的职位是前 端开发。而且因为前端开发处于互联网开发的中间环节,可以从上下游入手,渐渐地接触Web开发的完整流程。第三个原因是,前端开发直接面对最终用户,也可 以锻炼自己对用户体验的感觉。
当然,前端并不是唯一的选择,您也可以从其他职位开始,专注地学习这个职位需要的技术,到达一定的深度之后,扩展自己的知识面,往一专多长方向去发展。