最近跟朋友聊天,经常聊到全栈工程师,我就问他们为什么要成为全栈工程师?技术派的回答:“全栈工程师,前后端技术都会,感觉很牛!”,职业派的回答:“全栈工程师很多公司都需要,不担心工作找不到,工资也比普通的工程师高。”,跟风派的回答:“我好多朋友都想当全栈工程师,都说全栈工程师很好。” 有时候,我就贱贱的问他好在哪里?他当场傻了,回答不上来。

各位小伙伴能看这篇文章,相信要么是全栈工程师,要么对全栈工程师有兴趣,这个问题也问下你:“全栈工程师,好在哪里?”你可以花几秒钟想一下,这样你从这篇文章中收获的价值会更高。


1. 什么是全栈工程师



百度百科上对全栈工程师的定义:

全栈工程师是指掌握多种技能,胜任前端与后端,能利用多种技能独立完成产品的人。


这个定义是正确的吗?请你花几秒种想一下,这个非常重要!


这个定义是错误的!

这个定义是错误的!

这个定义是错误的!

重要的事情说三遍,所以才会有百科词条后面讲的困境。


2. Facebook 的全栈工程师


Facebook 宣称她只招全栈工程师,我们来看下Facebook对全栈工程师的能力要求:

Layers of the Full Stack:

1. Server, Network, and Hosting Environment. 

2. Data Modeling 

3. Business Logic 

4. API layer / Action Layer / MVC 

5. User Interface 

6. User Experience 

7. Understanding what the customer and the business need. 


Other Pieces of the Puzzle:

1. Ability to write quality unit tests. By the way, even JavaScript can have unit tests these days.

2. Understanding of repeatable automated processes for building the application, testing it, documenting it, and deploying it at scale.

3. An awareness of security concerns is important, as each layer presents its own possible vulnerabilities.


按市面上讲的全栈工程师来理解:

1到4点是java(后台)开发人员必备的技能,第5点是web前端工程师的技能。

全栈工程师,就是要掌握1-5点的技能。


第6点用户体验、第7点理解客户和业务需求,这两点不在市面上的全栈工程师的技能范围内。你可能会抱不同的看法,我们来看一些常见的案例。

一.

产品经理来找程序员;“你做的这体验像什么鬼,用起来多不方便。”,

程序员:“现在哪有时间搞这些,项目都延迟这么多了,等有时间再来优化吧!”

二.

产品经理又来找程序员改需求,这是第5次改需求了,于是程序员忍无可忍:“你怎么搞得,能不能想清楚一点,一个需求改五遍了。”

这个是产品经理的问题吗?不是的,是程序员的问题。


案例一,用户体验不是全栈工程师重点考虑的,完成功能才是最重要的。

案例二,一款产品,一般产品经理设计40%,程序员设计20%,其它人设计40%。程序员拿到产品,要搞清楚客户需求、业务逻辑、功能间的关系、数据流和交互方式等,这些是程序员对产品需求的理解,更是对产品功能的细化。如果程序员有做这个步骤,在开发之前,就能找出产品中隐藏的问题和设计上的错误,就不需要产品经理反反复复的过来改需求。理解客户和业务需求不是全栈工程师重点考虑的,在全栈工程师眼里,功能都不是个事,我先做了再好。


全栈工程师的能力水平是高级程序员,高级程序员没有6和7点能力,6和7点是架构师、主管程序员以上级别程序员要掌握的技能。

再看其它拼图中的三个点,就自动化部署因为有框架,有人会做;单元测试、安全,有多少全栈工程师会做?这个不是说我对全栈工程师不尊重,市面上讲的全栈工程师,在公司里面基本上是属骡子的,每天做大量的工作,加班加点赶项目,做完前端做后台,改完后台bug改前端bug。根本就没有时间来考虑这些,更不要说花时间做了。


可见,市面上说的全栈工程师,或者百科词条上定义的全栈工程师,跟实际全栈工程师要掌握的技能不同。

3. 全栈工程师,不是你想的那样

为什么会出现这种情况?关键出在前后端分离。这个即是技术进步带来的好处,也是技术进步带来的麻烦。

早些年,我们做开发,都是前后端一起做,只是要自己去设计框架来做前后端隔离。后来有些前端框架出来,我们也会用这些框架,自己做开发。后来慢慢的,就有程序员专门做前端开发,特别是像VUE这类框架出来,前端程序员彻底沦为界面交互工程师。


我分享一个案例:

前两年搭一个新团队,我根据公司方向和产品需求,团队配置是3个java和2个web,我的想法是java负责接口和后台开发,web负责app嵌入页和活动页的开发,这样的配置是合理的。结果在做计划的时候,web就报工作量大,时间内完不成。我就好奇,这怎么可能?

我深入了解了一下,技术经理采用的方案就是前后端分离,java只做接口,后台的页面由web程序员来开发,这就完蛋了,这样的配置用这种方案,肯定不能按时完成工作。这种技术方案,就是java程序员砍掉两只手,只做一块业务,而web程序员沦为界面交互工程师。


我们接着前面的分享,web程序员不甘心局限在界面交互上,想找回自己的价值,就开始学习1-4点的能力,于是全栈工程师就大火起来。

由于一些误导,就变成是:web程序员学习后台开发,成为全栈工程师;java程序员学习web开发,成为全栈工程师;Android/IOS app端程序员,学习后台,又可以开发app,又可以自己写接口,成为全栈工程师。

加上大众创新,万众创业,很多创业公司招不到合适的程序员,或者是为了省成本,就开始大量的招这种全栈工程师,对公司来说,是花一份的钱做两份的事。这种做法对公司和个人都是没有好处的,对公司有害不在这里讨论,有机会我另外写篇文章分享;对于全栈程序员的伤害,后面二小节分享。


全栈工程师是鬼老提出来的概念,我没有找到是谁提的这个概念,不清楚作者原著是怎么讲的。但是鬼老的书我看的多了,像《**编程思想》、《敏捷开发》、《XP》、《Scrum》、《重构》、《测试驱动开发》... ... ,像这些书都有个特点,比如《重构》,讲的是代码重构,但是它讲了很多设计思维、设计模式、产品理解、用户体验等内容,所以学习这本书的内容,不仅可以写出好的代码,还能成为一个优秀的架构师。再比如《敏捷开发》,它是讲敏捷开发方法,看是讲项目管理,实际它讲了很多技术管理、开发方法,学习这本书,可以成为敏捷开发的项目经理,还可以成为架构师或技术总监。

所以鬼老提出来的概念,它都不是一个单纯的概念,都是让你职业能有成长。我们再看这些书的作者,都是从事这个行业一二十年的时候写的,看介绍都是某科技公司的CEO或技术副总,到这个级别,都很关注程序员的成长,而不仅仅只是传授一个技能。


我们回到facebook全栈能力要求第6、7点,这个是架构师的能力,所以成为全栈工程师,这7点掌握了,可以达到架构师,或者主管程序员以上。其它三个点是技术总监要掌握的能力,如果掌握这三个点,有可能成为技术总监。

真正的全栈工程师,是让你职业向上成长的概念,简单的说,是让你成为高富帅;不是让你掌握更多开发语言,往旁边成长,这样只会成为一个大胖子,互联网行业发展这么快,大胖子是跟不上节奏的,会带来职业生涯的灾难。

如果你对不同级别程序员需要掌握哪些技能不熟悉,你可以搜我写的“程序员职业次第”的内容。


4. 高级程序员往全栈工程师发展的后果


百度百科对全栈工程师“困境”的描述:

技术有两个发展方向,一种是纵向一种是横向的,横向的是瑞士军刀,纵向的是削铁如泥的干将莫邪。这两个方向都没有对与错,发展到一定程度都会相互融合,就好比中国佛家禅修的南顿北渐,其实到了最后,渐悟与顿悟是一样的,顿由渐中来。可以说全栈什么都会,但又什么都不会。

如果一个公司不太懂全栈工程师的价值,那么全栈工程师的地位将会很尴尬,说得不好听一点,全栈工程师就是什么都会,什么都不会。曾经有一次面试,对方问很基础的问题,他答不上来,但他能做出产品,也知道什么是怎么一回事,他也不会犯那些错误,可他就是答不上概念,要考倒他非常容易。所以在应聘面试的时候,有些时候会吃亏,他可能会不如那些在某一方面钻得很深的人工资拿得高。

由于经常在各种技术穿梭,他会经常忘记代码的语法和一些API,所以他经常需要去查API甚至查语法,他觉得没有Google我几乎没法工作。这在某些人的眼里,是技术不够的表现。他记的只是一个Key,一个如何找寻答案的索引,而不是全部,人脑不是电脑,他不可能能记下所有的东西。


百度百科对全栈工程师价值的描述:

对于创业公司来说,全栈工程师的价值是非常大的,创业公司不可能像大公司一样,各方面的人才都有。所以需要一个多面手,各种活都能一肩挑,独挡多面的万金油。对于创业公司,不可能说DBA前端后端客户端各种人才全都备齐了,很多工作请人又不饱和,不请人又没法做,外包又不放心质量,所以全栈工程师是省钱的一妙招。虽然说全栈工程师工资会比一般的工程师会高很多,但综合下来,成本会低很多。


全栈工程师的因果

我们结合价值和困境,来做下分析:全栈工程师是多面手、万金油,哪些方面都会一点,都不精,能体现价值的地方是创业公司,大公司面试通不过。在一家人员不齐的公司上班,你说项目进行能顺畅吗?晚上加班到十点之后是不是情理之中的事?所以你选择当全栈工程师,你是不是已经决定了以后只在创业公司混,每天要加班到晚上十点之后,一周要上六天班?

现在创业公司一年半内倒闭的概率是97%,也就是说,选择了全栈工程师,你基本上就选择了每一年左右要换份工作。你想在一家公司稳定的工作,好好的发展,基本上是奢望。


全栈工程师应该都有个感觉,刚开始的时候,面试很顺利,很容易就被录用,随着年限的增加,面试会越来越困难。这个是为什么呢?

刚成为全栈工程师的时候,还有一门语言精通,所以面试的时候,面试官看你一门语言精通,还会其它的语言,所以很容易就面试上了。但是,全栈工程师大量的时间都花在赶项目、加班和解决各种语言的问题上,随着年限的增加,这门精通的语言,也不精通了,越来越依赖百度或谷歌。面试的时候,面试官一问三不知,想找份工作就困难了。

而难找工作的这个时间点是什么时候呢?我们来算一下,22岁毕业,3-4年成长到高级程序员,成为全栈工程师,差不多要经过3年,就可以成长到只能靠百度或谷歌来工作了。这个时候差不多29或30岁。

我们再往下聊,三十岁之后,体力还跟的上这种强度的工作吗?这个时候很多人刚有小孩,这个阶段的小孩是最闹腾的,你多多少少都要照顾下小孩子,每天只能睡两三个小时,顶得住吗?所以现在很多公司不要三十岁之后的工程师,是有道理的,你只能当个万金油,能力跟不上公司要求,加班又加不过小年轻,工资又比小年轻高很多,公司不炒你炒谁?


相信有不少小伙伴这段看得毛骨悚然,这就是互联网行业,我们行业所有的麻烦都是自找的。这篇文章分享的观点,成为真正意义的全栈工程师,是可以避开这个因果的。


5. 中级程序员往全栈工程师发展的后果

本来,全栈工程师是因为高级程序员升不到架构师或部门经理,退而求其次,通过学习更多语言来提升自己价值,提升自己薪资的手段。不知不觉,在行业中就变成是仅次于架构师的职位

所以,很多程序员立志成为全栈工程师,这种思想已经延伸到中级程序员,我甚至听到初级程序员讲他要成为全栈工程师,这太离谱了。我们来聊聊中级程序员成为全栈工程师会有什么后果。


我们来看个案例:

Android中级程序员,学习后台语言,打通前后台成为全栈工程师。

中级程序员的能力范围是什么呢?中级程序员只能负责模块,对完整的项目玩法是搞不清楚的,搞定完整项目是高级程序员的能力范围。Android程序员,在APP开发团队中,只能负责项目中的模块,后台缺人,把这个程序员拉到后台帮忙开发接口,后台他也只能写点接口,最多是负责到模块。你看他到哪里都是负责模块,只能在中级程序员水平。而且这种人好用啊,在公司会很吃香,项目组都想要他。他一会儿负责android,一会儿负责后台接口,他永远都不可能完整的搞定项目,不管是android,还是后台。

像这个中级程序员,刚成为全栈工程师的时候,工资会比同样岗位的程序员高,因为他可以做比别人多的事。但是,他只要做一两年,换工作就麻烦了,本来以他的年限,应该是高级程序员水平,面试官按高级程序员来面试,肯定是蒙的,如果按中级程序员来面试,他基本上也只能回答些key,所以面试效果肯定一般,就算过了技术面试,谈薪也会出问题,这种水平的薪资是中级偏下,而他当全栈工程师时,已经拿了接近高级程序员的薪资,自己不愿意接受降薪入职,所以,他的职业发展就差不多了。


6. 全栈工程师的价值

通过前面的分析,我们知道,全栈工程师,它不是指掌握多种技能,胜任前端与后端,能利用多种技能独立完成产品的人。

它是指全面掌握某个技术栈的人。


我们以facebook的全栈技能为例,全栈工程师是有层次的,掌握1-5点是优秀的高级程序员;掌握1-7点,可以成长为架构师或主管程序员;掌握其它拼图的技能,可以成长为技术总监。我们文章开头说很多公司想要全栈工程师,那是因为他有更高的技能,可以承载更高的职位;因为有更高的职位,所以全栈工程师的工资更高。当然,这个是老外公司的想法,国内创业公司招全栈工程师,还是因为一个人能当两个人用,可以给公司省成本。


我写这篇文章,不是打击大家成为全栈工程师,而是希望大家能关注自己的职业成长,成为真正的全栈工程师。

java程序员,会web开发是理所应当的,这个是成为合格的java程序员必备的技能,如果公司的人员配备,有专人来做H5开发,那就由专人来做,自己有这个技能不用就行了。偶尔出现web人力不足,就帮个忙分担些工作量;或者是有小项目,一个人能完成的,就自己把前后端一起担起来就可以了。

web程序员,学习后台语言,职业才能走的更远。如果只是做界面的交互开发,工作2年和工作5年的能力差不多吧,薪资差一倍,你说工作5年的这位职业是不是很危险。而且《web前端开发》等级考试,它就要考java和php等内容。


市面上讲的全栈工程师,只是掌握全栈工程师技术部分,而全栈工程师,要全面掌握技术栈,即包括开发前的客户和业务理解能力,产品分析和设计能力,开发过程中的系统架构能力、代码开发能力、数据库能力、单元测试能力、部署能力等,开发后的运维、安全、性能提升等能力。这个是职业成长的路径,是职业成长之道。


这篇文章的观点是我首次提出来的,网上也没有找到类似的观点,准确性你自己把握,希望对你有帮助。如果你有不一样的看法,我们可以一起讨论。如果对你有帮助,请关注我,我定期会分享程序员相关的话题。如果你有需要我分享的知识点或困惑的地方,可以给我留言,我在下一次做针对性的分享。