a genuine interest in all software technology. (对所有的软件技术抱有一种真挚的兴趣)
1. 什么是全栈工程师
最近有个招聘挺火的:
Is it reasonable to expect mere morals to have mastery over every facet of the development stack? Probably not, but Facebook can ask for it. I was told at OSCON by a Facebook employee that they only hire ‘Full Stack’ developers. Well, what does that mean…
这是facebook的招聘,说是只招Full Stack Engineer,在中文翻译过来就是全栈工程师,也叫全端工程师。那么什么是全栈工程师呢,就是前端和后端全通。前端技术有html,css和javascript,后端技术有多种流派,比如java、php、python等,除此之外,还需要数据库设计,比如mysql、oracle、Microsoft SQL Server等。说点通熟易懂的,我们把it开发行业与建筑业相比。一个全栈工程师能独立完成一栋5层的别墅;而一堆普通前端后端工程师一起完成一幢上百层的摩天大厦。话说回来,其实我们IT民工与他们普通民工,并没有本质上的区别,他们在搬砖,而我们在搬bit,他们晒着太阳累一点活得长一点,我们吹着空调却死得早一点。
2. 全栈工程师的价值
也有人说,你牛逼,懂八种技术,但你能干八个人的活吗?全栈工程师并不是说一个人能干几个人的活,我们从几个方面来看待这个问题。
1) 沟通成本
项目越大,沟通成本越高,做过项目管理的人都知道,项目中的人力是1+1<2的,人越多效率越低。因为沟通是需要成本的,不同技术的人各说各话,前端和后端是一定会掐架的,后端API和移动客户端也是一定会掐架的。每个人都会为自己的利益而战,毫不为已的人是不存在的。
而全栈工程师的成本几乎为零,因为各种技术都懂,知道问题的所在,一不小心自己演示怎么去做就变成全都自己干了。即使是在团队协作中,与不同技术人员的沟通也会容易得多。一个不懂技术的你,让一个后端和一个前端去沟通,那完全是鸡同鸭讲,更不用说设计师与后端了。但如果有一个人懂产品懂设计懂前端懂后端,那沟通的结果显然不一样,因为他们讲的,彼此都能听得懂。
2) 全局观念
现代项目的开发,很少说只用到一两种技术的,特别是移动互联网大潮下。随便一个互联网项目中用到的技术,就会需要用到后端开发、前端开发、界面设计、用户体验设计、数据库、安全等级保护设计、各种移动客户端、三屏合一设计、restFul API风格设计和OAuth授权等等,一些比较前卫的项目,可能会用到第三方开发,像微信SDK,微博SDK,支付宝SDK等等。
Web前端也远远不是从前的切个图用个jQuery上个AJAX兼容各种浏览器那么简单了。现代的Web前端,你需要用到模块化开发、多屏兼容、MVC,各种复杂的交互与优化,甚至你需要用到Node.js来协助前端的开发。
所以说一个现代化的项目,是一个非常复杂的构成,我们需要一个人来掌控全局,他不需要是各种技术的顶级专家,但他需要熟悉到各种技术原理与实现。对于一个团队特别是互联网企业来说,有一个全局性思维的人非常非常重要。
3) 项目进度
软件工程项目的进度管理是比较困难的事情,完全按部就班的进行一个项目几乎是不可能的。期间将涉及到诸多问题,或多或少将影响项目的安排。在制定项目可行性方案时最大约束就是合同期,里程碑、基线等东西。最根本的计划只有一条:竭尽一切所能使项目在合同期内保证质量的完成项目全部工作。
那么,谁来评估并且制定周密可行性方案成了首要问题。这个艰巨的任务只能落在对项目有全面了解,并且懂各方面技术的人员身上。计划要分粗细,粗的计划就是里程碑,界定某段时间内要出哪些成果。细的计划也就是任务执行计划,要注意预留单元测试修改的时间,并且要预留未知干扰的时间。计划的制定不单单要满足工期要求还要可行,再漂亮的计划如果不可行就是花瓶。计划是可以调整的,但里程碑计划尽量不要调整。基线是一些重要的里程碑,一旦建立,万不得已是不能改变的,否则在多线程的项目将出现扯皮推诿的情况。同时设置各个检查点,在规定的时间间隔内对项目进行检查,比较实际与计划之间的差异,并根据差异进行调整。
接下来,我们需要人来计划执行情况跟踪,必须定期跟踪计划的执行情况,根据实际情况做相应调整。也就是要监督计划执行。监督审查跟踪,推荐由女生来担当,但是调整项目计划需要项目负责人来协调。
对于验收,每个任务的成果都要严格验收,如果有问题没有及时解决,对后面的工作压力太大,往往出现前面都是“按计划执行”,到后面爆发性的延期。验收不仅是黑盒子测试,同时也需要白盒子测试。
风险预测项目管理,要有风险意识,我起初没怎么重视,后来经历过了才有感触。最大的风险不是在技术层面上,而是在项目组成员上,要注意在项目开发期间会不会有人离开,会不会有人参加,项目组成员在此期间会不会休假或外出(如结婚、生子),某人生病了,要及时做好调整计划准备等等。技术方面的可以适当预留新技术的摸索时间。
3. 全栈工程师的窘境
清高,自命不凡。这倒也奇怪了,我接触很多学弟或者同学<也有一些学长>,他们的特点都是这个,也许他们也都有成长为全栈工程师的资质吧,大家都是恃才傲物。懂一些技术IT同学就觉得自己很屌很牛逼的样子,其实多数人员只是知其然不知其所然。然而,全栈工程师是能了解全部的,这个特点就更明显了。
对别人要求严格,喜欢追求完美,许多事情不小心就全做了。总是觉得别人这不行那不是,把新手要求的尽善尽美,这往往大家都很累,我曾经这么要求过,后来他就不跟我完了,说我要求太高了。
低情商,交不到女朋友。学习it编程要学习的东西很多,没有那么多时间去想其他事情。这也往往造成程序员低情商,不懂人情世故,全栈工程师更甚。写到此处,想到一则故事:两名开发工程师,一个测试人员。其中,两名开发工程师是男的,一个水平高,一个水平低,一个测试人员,女的。好的开发程序员呢,写的程序近乎完美,各种好,各种高质量,测试的妹纸几乎找不到任何漏洞。差的开发工程师呢,成天各种bug,各种漏洞,总是被测试妹纸叫过去臭骂一顿,回来写了又提交。后来是,测试妹纸和差的开发工程师跑了。原因是,差的开发工程师用心不专,但是呢态度非常好,一来二往,和测试妹纸关系好了。
如果一个公司不太懂全栈工程师的价值,那么全栈工程师的地位将会很尴尬,说得不好听一点,全栈工程师就是什么都会,然后,你就是什么都不会。
我不是一个非常专业的Web前端,不熟悉node.js;也不是一个专业的移动端开发工程师,不精通移动端开发;更不是一个运维工程师,不熟悉高端冗余算法等。用人单位会问我,你到底是专业做哪一个方面的,我为什么要给你这么高的工资?
4. 我为什么成为全栈工程师
全栈工程师和我基本上是一样的,全栈工程师不是为了工作。作为一个全栈工程师,不是公司培养出来的,而是逼出来的,不是公司逼出来的,而是自己把自己逼出来的。自己想要精通技术的各原理,方便以后实现梦想。
没有梦想是可怜的,没有实现梦想的手段或者技术是可悲的。庆幸的是,我一直怀揣着梦想,并且想用自己的双手去实现。
有创业的心,但我又不会空手套白狼,忽悠免费劳动力,所以只能自己干。自己干,必须各个方面都要学通,哪里不会就去学哪里。
曾经看过一句话,大意是这样的:一般程序员写程序,做测试等,牛逼一点的程序员写算法、Linux内核或者Windows内核开发,更牛逼的程序员写驱动程序开发。因为写驱动程序需要精通软件语言,同时精通硬件语言。
大学,学校目标培养的是两领人才——领导和领军人才。在电子信息工程学院,目标是想把我们培养成驱动程序开发工程师。
在大学课程上,学习C,学习Linux(Ubuntu、CentOS、Slackware),MATLAB编程,Verilog,FPGA编程,51单片机编程等软件或者硬件语言。
在大学课程选修上,要么跟老师学习要么是私自学习,ASP,Microsoft SQL server,PHP,MySQL,HTML,css,JavaScript等。
在大学的社团活动,加入摄影协会,能运用Photoshop作图,修图,切图。虽然在专业设计师眼中只有半吊子的水平,但在开发者中算是佼佼者了。
编程方面,学习康盛公司框架,开发康盛Discuz!的插件,从Discuz!X系列开始接触,开发插件是大学期间花最多时间的一件事情。
后来在工作了,领导给我职位是CTO。网站从零开始干起,由于要快速建起,就用了康盛公司框架。虽然是CTO,但是很多事情必须得自己干,就连搬运服务器的事情都要亲历而为——因为底下没人!
由于业务发展,我们开发了触屏版,Android,iOS,以及开放平台(oauth)。诚然,不是我一个人把全部代码都写了。触屏版很简单,写了几个页面。客户端上,是我的弱项,错失了移动互联网的大好时间<时间为2011年,以移动平台为主的:微信估值800亿美元,Instagram估值300亿美元(产于2012年4月)>。虽和Android工程师一起开发过,但没有完整的编写过一个apk,目前边学习边编程项目。对于iOS,不得不说是我的更弱项,只是看过几本书,没有真正的编程过,还不算真正的全栈。如果是全栈,一定能解决各个问题,不能被技术人员忽悠。
开放平台Oauth,RESTFUL风格设计等,这些是后端的知识,编写它们自然不在话下。在系统性能调优上,学习并运用了ThinkPHP,Spring,Django等框架思想到新的项目上,在UIUE上,能熟练的使用bootstrap框架去实现。
如果不是为了创业,我不会去学习那么多技术。学了这么多技术,我的价值可能也就是个20k多工资的架构师或者技术经理,这个价格对不起多年的付出。一个真正的全栈工程师,目标只有一个:创业。
5. 全栈工程师的资格与成长路劲
原型设计,Photoshop,前端开发,后端开发,移动端开发,运营维护,安全等保,数据分析...好像都会了,这算Full Stack Engineer了么?
不,这只是踏上成为Full Stack Engineer的第一步。你知道目前只是每个stack都懂一点,离senior或者expert还差得远,而要每个stack都做到极致,需要大量的时间和精力。精力有限,FullStack 有了广度自然要牺牲一下深度。那么我想说,再怎么牺牲深度,如果各领域都写过几行代码、浅尝辄止,那肯定是不够的。那样可能只算是一个爱折腾的 geek 而不是工程师。FSE的特点应该和黑客的务必有的特点类似:高智商,好玩,探索。FSE是一直学习中的,务必要高智商<参考《黑客与画家》>。简单来说,FSE更像是“全才大牛”,对任何一个领域都达到了该领域的专业人士的平均程度,更像是 Engineer × N。
说具体点:
前端开发,在HTML+CSS上,能做到兼容主流所有浏览器,并且熟知网页优化,知道如何让网页变得更加快速,也能做到搜索引擎优化。在JavaScript上,至少会用js写出各种效果来。水平不至于达到能自己写一个js框架,但至少能用好一个框架吧,比如web端的jQuery。
后端开发,至少精通一种后端流派语言,比如Java,或者PHP,或者Python,能力无需到达一个人开发一个高可用系统框架,但至少也能熟练使用一种框架,研究过框架的代码,比如Java里面的ssh框架,PHP里面的ThinkPHP框架,Python里面的Django框架。
先贴几个图出来让大家看看需要学习什么:
![](http://img5.douban.com/view/group_topic/large/public/p25105017.jpg)
![](http://img3.douban.com/view/group_topic/large/public/p25105053.jpg)