关于全栈工程师

看到知乎上关于这个问题的讨论,突然心生一种感觉,好像梦回到春秋战国时代,感受了以一下什么是百家争鸣,把地址粘到这里,以留收藏纪念。原文

我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就 一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小 时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现 在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不 懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。

Facebook 的众多海报当中,有一张写的是「任何一个 Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这 个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入 Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过 JavaScript 并且觉得 JavaScript 很恶心?正确的做法是立即在网上买几本 JavaScript 入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析 JavaScript 语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到 Hive 然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所 说的学习能力。

这是高级工程师和初级工程师的主要差距。尽管在高级到初级这一维度上,美国工程师和中国工程师是有重叠的,但美国的教育体 系和行业传统使得美国应届生比一般中国工程师更偏向于高级那一端。美国学生的优势在于,他们的教育体系让他们习惯面对开放性问题。一家公司万千问题当中, 此时此刻哪一个最值得解决?这不是中国工程师擅长的问题,因为实在是太开放了。中国教育让人擅长在给定条件下解决问题,太开放反而不知道从何入手。此外因 为绝大多数文献都是英文的,所以要钻研什么对于能读懂英文的人来说都可以非常成体系的学习,这对于很多拒绝阅读英文的中国工程师来说很不利。拒绝阅读英文 意味着永远只能接受别人的二手资料,对于很多概念的理解只能停留在技师的层面,而无法上升到工程师或者科学家的层面。


补充下,首先我觉得好的开发者,即使不是全栈,也要融会贯通多种技术。我从来不认为一个只专精一种技术的人有可能成为好的开发者,即使是 C,即使是汇编。(当然其实反过来看,那些大神们哪个不会搞点其他的?比如几个做服务器端开发的大神居然不懂服务器管理?)

然后从广度和深度的组合看,我认为好的开发者大概有两种类型:
1. 手术刀
2. 代码专家。
(来自《人月神话》)

手术刀是业务驱动的,最需要全栈的人;他们的核心价值在于:懂业务,技术全面,都能拿的起来,而且能选择最合适的技术。
代码专家是技术驱动的,即使不够全栈也可以用,但是技能树点的越多当然有好处。

而我提的创业逼出来的全栈,是因为,对于创业团队而言,手术刀更加重要,代码专家要依靠各种开源组织的贡献,或者临时聘请。

还有几位讲,创业的最大需求技能是整合资源的能力,找合适的人做事的能力。这个我认同,我只是说我自己,我承认我没能力忽悠一堆技术大牛策划大牛和我一起没工资的创业。我也忽悠不到前期种子投资的钱。
所以我说的,是说对于我,种子期,天使期,最重要的都是我自己作为手术刀,而不是资源整合者。


------------------------------------------

全栈工程师不是为了工作本身,是为了方便实现自己的梦。
作为一个标准的全栈工程师来答下,全栈工程师不是培养出来的,是逼出来的~
不是公司逼的,是自己逼自己逼出来的~

因 为我要创业,我经济压力又大没法辞职,我没法忽悠其他人一起免费干活......而且作为一个写了13年程序的老程序员(貌似知乎上比我老的程序不会很多 了。。。。),本来工作语言就已经用过 Delphi, C++,Java,Perl,PHP,Lua,ObjectiveC,NodeJS,Tcl。这些都是工作中用的,尤其是创业那些年,遇到什么问题,我就 要自己去探路,探出路来需要招聘对应的人再招聘~结果顺便把各种语言都学了一圈~

之前创业三年,一开始就我一个技术,所以运维几十台Linux 服务器我也顺便管了(我之前工作平时就工作在 Solaris 下面,差距不大),我老婆是前端工程师,所以 HTML,CSS,JS 我也一起学了。
所以多学一些语言对我来说真的不是件事情......

做过几年游戏制作人(做制作人我也同时每天 写代码....),策划,UI 都还有心得。

而且我这十三年怎么过的呢?别人朝九晚五,我每天工作到半夜2点,周末也很少休息。

现有的答案已经说明了,以一个正常人的精力和学习速度来说,想在 full stack 的每一个层面都达到顶级的精通显然是很困难的事情。但是做不到这一点就算不上 full stack developer (FSD) 了吗?其实我希望大家留意题主引用的那段英文的最后一句:a genuine interest in all software technology. (对所有的软件技术抱有一种真挚的兴趣)。

我觉得对于 FSD ,尤其是对于想成为 FSD 的人来说,这个态度才是最重要的事情。即使都是 FSD,每一个人各自的技能加点也肯定会不一样,有人在前端更擅长一些,有人在服务器层面更有经验... 但其实没有什么硬性的门槛,需要的是解决任何问题的能力和意愿。你要做到的就是不固步自封在一个领域。遇到问题,就去研究,不因为问题不在你的 comfort zone 就放弃或者推给别人。即使一开始的解决方案很笨拙也无所谓,just learn whatever it takes to make it work. 比如说我要做一个网站,我有一些东西没碰过,但我有足够的兴趣和动力去搞个八九不离十。(这里自学能力很重要,有好的 mentor 也会帮助很大)当你经历过一次这个过程以后,你就会有信心去弄明白更复杂的东西,在之前的基础上进一步去消化、改进、学更多的东西。

另外,我个人觉得这个过程应该是由实际问题驱动的,而不是漫无目的看到什么东西流行了或者觉得很NB就去学。@庄生 的答案里提到绝大部分的网站都活不到或者永远也达不到10k用户在线的水平,那种情况下去看 high scalability 的东西有什么意义?学的东西用来解决或是改进实际遇到的问题,这样你的整个知识体系覆盖面和侧重点会比较合理。打个比方就是你的技能点有限,所以加点方案 得有一个主题,到处乱点的话就废了。谁能做到这样努力的工作(不是为了“资本家”,而是为了自己为自己工作),并且不是一直专注于一个岗位,我相信都能成为全栈工程师。

回到起点,全栈工程师不是为了工作本身,是为了方便实现自己的梦。

没 错,如一些答主所说,你各方面都半吊子,我承认。我现在每天工作是写 C++和 Lua。Lua 部分还好,C++要遍历个 std::map 我到现在记不住,每次现搜索。作为一个 C++程序员我不够好,只能算是入门,或者说我一直是重视实现功能而非钻技术细节的人。我不关心技术上多牛,我关心功能的实现。没错,如果是这样,作为一 个 C++程序员的话,我依然对不起我的工资。

但我的价值根本不在于是一个 C++程序员,而是我可以从前端到后端到运维提供一揽子方案,视野广阔,任何点都可以选择最合适的技术,如果是创业,我可以自己一个人完成这个纯应用层面难度的开发的全部工作。

如果不是创业,我的价值可能也就是个2w 多工资的架构师或者技术经理,这个价格远远对不起我这13年的付出。一个真正的全栈工程师,目标只有一个:创业。


做过强电逆变器,虽然控制电机可以跑起来,但是仅仅停留在跑起来,可以控制速度而已。但是波形还能烂一点不?尼玛电机噪音那个大,主流的逆变器论文看过木有?甚至我怀疑微积分都没学好。

做过机器学习,其实说白了,机器学习导论那本书你看完都可以做了,各种贝叶斯聚类分类决策树,高端点的LDA;但是这个仅仅是入门好不,底层的数学原理你足够了解了?能推导公式不?。让你做一个数字识别可以做出来,让你做一个来识别指纹呢?人脸识别呢?别告诉我说有库。

其它的等等很多都类似,别被fullstack这个词毁掉了你的一辈子,要知道你做的东西都是别人的入门的时候做的

为什么要成为所谓full stack engineer? 这个full stack engineer 的概念要理解清楚,我个人认为不是说要成为一个全能工程师。
先 讲个自己的故事,我是从90年代初就开始做技术的,那时候没有互联网、没有开放代码、没有各种平台,资料都是去书店去买,一本书里面真正有用的就10来 页,雷布斯当时写了本《未公开的dos中断》,当时奉为天人,后来知道是翻译的。做应用要懂dos,要懂各种bios的中断,要会用汇编,要会用c,要会 做网线,要会装服务器(那时还是netware的天下),还要会手动查查病毒,读懂分区表,要自己写sql和sqlform去实现用户应用需求,甚至在 DOS里面自己做字符的界面管理和鼠标控制,还要用汇编写中断去控制调制解调器和打印机,因为用户不愿意多买服务器(当时服务器好贵)写个简单的 tcp/ip的堆栈....
这个够full stack吧,当时觉得自己真的属于上知天文下知地理,但是时至今日,这些本事有什么用呢?我觉得基本没用了,而且随着经历的丰富,反而觉得过去自己浑身 的本事都是雕虫小技,不懂的东西好多好多,真正有用的是留下来对项目的经验和架构的体会。IT行业发展到现在,和社会发展一样,进入了社会分工明确的时 代。每个方向深入下去都是大的不得了的东西:
1 你说你懂操作系统,能给linux提补丁吗?
2 你说你会运维,sed,awk,sar,snmp这些东西你都是活字典吗?
3 你说你会数据库,一条复杂sql能不看explain就能知道怎么运行的吗?看了explain能知道数据库的索引问题在哪里吗?知道怎么改吗?
4 你说你会网络,看过tcp/ip源码吗?知道wifi里wep,wpa aes的区别吗?知道前兆线和百兆线物理上的区别嘛?
5 你说你会web编程,看过http的rfc吗?看过webkit代码嘛?
6 你说你会大数据分析,概率论的几十种分布都懂嘛?每种分布适合那种情况知道吗?或然率公式会推导吗?
7 你说你会C/C++,你知道不同编译选项出来的优化代码的顺序吗?
。。。。。
真 正要懂一个技术,不是仅仅看几本书写几段例程就行的,都得实际干几个能上线的项目才能知道这个技术的坑在哪里,适合什么,不适合什么,出了问题大概怎么回 事。这件事从人的精力上来看我个人觉得是不可能的,而且做到了也没什么意义,最多就成为一把瑞士军刀:什么都能对付两下,真干专业的活那样都不好使。这对 一个技术人员真的不是什么好事,因为工程师是要实际动手干活的。
我建议工程师的可以成为临栈工程师而不是一个全栈工程师,所谓临栈就是对于自己专 项工作相邻的一些技术要有一定的了解,类似母语之外的外语。比如做后台的工程师,对数据库要有点了解,或者对tcp/ip有点了解。做前台的工程师,对 http要有点了解,对图形学、色彩学有点了解。这样有助于在工作中和团队中的伙伴更好的交流,实在不行时候也能对付两下子救救急,或者证明不靠谱的伙伴 做的确实猪头。但是,记住了,这不是你的饭碗,除非你打定主意改行。
当然,你要是想做那种光说不做的工程师、顾问呀什么的,那是另外一回事了。瑞士军刀也是有市场的。
歪楼结束,回到问题。
如何成为全栈工程师,我觉得是机遇,就和民国初期出了一堆学贯中西的人一样,不是他们多牛,而是时代造就:
小时候读私塾,国学童子功没问题。长大取消科举,留洋好找工作,不到20岁就去留洋,回来以后一看,我靠,学贯中西呀。
如果你每3年换一个方向,每个方向都扎的很深去做实际项目,还要复习过去的知识并跟上发展,你就可以成为一个full stack工程师。祝你成功!

FACE BOOK把PHP转换为C++代码,CPU和内存的效率大大提高了。我们不防从结果倒推一下原因:如果他的程序员只是PHP的大神,而对C++一窍不通,那么节省50%CPU请求是不可能实现的。

所以我得出的结论是:跨平台、多框架、多语言之间的迁移力,是FSDer所必需具备的

淘 宝从oracle转向mysql,Google抛弃C语言采用Go语言,Groupon美国站点从Rails迁移到了Node.js,阿里巴巴逐步完成了 “去IOE(IBM小型机+Oracle数据库+ EMC2存储)”运动架构逐步转向了“MySQL+PC Server”,Twitter将其一些后端服务从Ruby on Rails迁移到了JVM上,京东商场后台抛弃.NET使用Java重写,PayPal使用Node.js重写其支付系统 ,Facebook iOS客户端使用HTML5重写后又换回原生应用……

每次栈的迁移都有背后的原因,新时代的Developer如果不能很快的切换过去,那无疑会给团队的转移增加阻力,这也就是为什么FB只招Full Stack Developer的原因-----FB也不知道下一次人迁移到哪个技术栈。

FSD并不是要求会开发、会设计、会3D、会策划……而是要找出特定领域内,哪种技术栈更适合,并且要快速具备完整转移的能力。

微信成功了,又开发了网页版;网页版完成了,又要开发桌面版。如果微信的架构师说我只会开发手机APP,那么难道要临阵换帅?

你可能感兴趣的:(关于全栈工程师)