今天在知乎上看到一个关于怎样成为全栈工程师(Full Stack Developer)?的讨论,身中N枪,为警示自己,故在此自黑一下。自黑是一种精神,也是一种勇气嘛。
马宏菩,Hexcles / Programmer / (Wanna be) Hacker
窃以为 full stack 不是那么简单的事情。当然,不同的地方可能有不同的标准,且听我慢慢道来。
既然大家都在以 Web 为例,那我也说 Web 好了。不过事实上 full stack 也有可能是其他方面的。
租个 VPS ,从装系统配环境开始,然后拿个 PHP/Python/Ruby/Node.js 什么的写个后端(少不了用一些框架吧, 后端框架多如牛毛,不说 PHP , Python 用个 django 、 Ruby 弄个 rails ,都挺方便吧),再给它撸个好看的页面(表现层多半也会用个 bootstrap 之类的,如果设计能力强一点的话就用一些更轻便的 helper frame 然后主要自己手写;逻辑控制层高端一点弄个 backbone 甚至 angular 之类搞个重 AJAX 、带前端模板及路由的新潮 HTML5 应用)。弄好以后上线,性能出问题了,看看日志 Google 一番调调参数,甚至多买一两台 VPS 来弄个负载均衡什么的。再要不,我们换成实体机,然后顺便玩玩网络和虚拟化什么的?
吐槽:表示基本中枪。看过我的博客之后,很多网友跟我说,你的技能好全能啊,从前端,然后服务器端脚本PHP/Python/Ruby,还有数据库,Linux运维,Android什么都会。每次看到网友这么跟我说,我都会很不好意思……虽然看起来很全,但是基本都是拿不出手啊。或者说,我懂的技术刚刚够建立与运营这个网站,不对,是因为建立这个网站我才去学习这些技术的……
看起来很全能了,但是问题是,这样算不算 full stack 呢?
也许在一些小公司可以算是了(不过现在很多互联网创业公司水平都很高,所以也不能完全看大小)。但在真正高水平的公司,以上的任何一点都达不到相应领域“工程师”的标准。
吐槽:“以上的任何一点都达不到相应领域“工程师”的标准”。这哥们戳中我的痛处了……
装个系统调调参数甚至弄个简单的负载均衡就叫运维了?你确定这不是网管?从几台机器到成百上千台机器是有一个量变到质变的(虽然经过这个质变以后,对于运维工程师来说两者就差别不大了),更别说弄个机房,搞个异地数据中心什么的。不说CCNP,CCNA总该有吧?再者,如果不说这么大(这么大了可能就涉及到“架构师”了),往小一点说,也有很多可深挖的:性能调优只是根据网上的文章随便调调参数?我见过不少牛逼的 Web 运维都读过 Apache 和 nginx 甚至部分 kernel 代码。没有自动化的监控程序和运维工具难道得死死守在机器前一遍遍地敲命令?合格的运维不但熟练使用已有的工具,还会根据需要自己写脚本、工具,因为现实情况太复杂通用工具不一定适合。很多公司里,运维还要兼顾安全问题,那么又是一个大坑。备份、冗余、风控个个门道都很深。
吐槽:运维的话,我基本算是个网管级别的。技能罗列一下,无非就是会在服务器Linux上装装 PHP/Python/Ruby/Node.js 的运行环境,然后网站出问题了,简单排查一下而已。
再说后端。会用 django 或者 RoR 写点东西很厉害?这些本来都是 RAD 框架,就是拿来快速开发、快速上手的,降低了门槛。但不同的程序员编程功底和代码质量还是会对最终成果造成很大影响。滥用 ORM 导致性能低下的例子我就不多说了。明明用了这样的框架还能写出带有 SQL 注入的程序也不少见,有的甚至还存在逻辑安全漏洞,至于什么加盐、防 CSRF 、 XSS 、 replay attack 、 session fix 、应用层 DoS 等等,多少人都是只听说过名字知道个大概然后用一个“厉害”的框架就以为一劳永逸?不知道原理也没看过框架代码,不知道框架到底是怎么实现的、是否有一定局限……再说软件工程方面。写几个测试数据就叫单元测试了?提前写测试数据再开发就成 TDD 了?三天两头重构就叫敏捷了? QA 、版本控制、协作、文档,都不是那么简单的事吧。
吐槽:后端的话,我还稍微好点,毕竟我是程序出身的。PHP学得还比较深,前些年还特别看过一次PHP的内核,并将它们全部写成博客,不信可以看看这个系列:PHP内核探索。Python的话,大概在应用级别吧,不是特别厉害,写Web的话喜欢Tornado,也曾经研读过Tornado的源码:“Tornado源码解析篇”导读索引。还研读过很多语言,框架的源码,这里就不再列举了,编程上我还是自认为勉勉强强算及格吧?但仅仅限于编程,后面提到的软件工程方面的知识我就比较薄弱了。
然后说前端。 HTML/CSS 本来就是以方便表示内容和布局样式而开发的,只是“会写”应该不算什么难事吧?何况还有各种布局、排版库。 JS 灵活得很,有一点 C 语法基础的人学起来也很快,感谢 jQuery ,就算是不知道什么是闭包、不知道 JS 原型继承等等的三脚猫功夫也能实现大多数需求了。那么这样就是前端工程师?真是这样的话为何前几天知乎还有人问好的前端工程师为什么这么难找?能写出在所有浏览器表现一致并且方便维护的样式需要不少经验积累和勤奋实践,对浏览器渲染原理的了解也不可少。这还只是第一步,加上 JS 这玩意儿以后复杂度其实陡然上升了。在一个真正的大项目里,要保证各个组件正常运行不是一件容易的事, JS 本来就缺乏一些“软件工程”特性,导致大型代码组织不便,糟糕的 JS 程序很容易就污染了命名空间、搞错了作用域、漏掉了异常、弄错了类型、在异步和回调之中迷失……一不小心,就搞挂了页面,调起来还麻烦(就算现在有了 Chrome )。这还没算上性能、兼容性、安全等等问题呢。这也是为什么前端工具/技术特别多的原因之一。好的前端工程师不但紧跟技术前沿,还乐于知道这些牛逼的技术都是怎么实现的,然后灵活运用。
吐槽:前端的话,更不用说了……我前端很弱,仅仅会用HTML/CSS写点自认还不算太丑的页面而已,JavaScript呢,大概就是可以写出自己想要的效果,效率什么的就不考虑那么多了。
可能有人会说人的精力有限, full stack 有了广度自然要牺牲一下深度。那么我想说,再怎么牺牲深度,如果各领域都像上文举的反例那样,那肯定是不够的。那样可能只算是一个爱折腾的 geek 而不是工程师。我一个大二学生就能很好地完成开头提到的情景,并且还可以再深一点(比方网络方面有个差不多CCNA的水平和一些经验, PHP 自认为还是比较扎实的= =,对于安全、性能优化、分布式等方面也有一些了解……),但我也只觉得自己大多数时候还只是“折腾”而已,还有太多不足和有待提高之处。事实上,上述任何一个领域中的真正的工程师都肯定能凭借自己的学习能力和极客精神轻松地在业余时间完成开头所说的那个例子:看看 github 上那些有趣的个人开源项目和搭建起来的 demo 吧,大部分作者的本职应该都只是前端、后端或其他等等的其中之一。更不用说还有很多工程师的博客也是自己写(我是指写一个博客系统)、自己搭的。
吐槽:啊,原来我的水平大概就跟一个大二学生差不多啊?(惊恐……)我原来也只算是一个爱折腾的 geek 而不是工程师。幸好我的博客系统是自己写的,这点还好还好……
full stack 一定是很难的。其实我自己作为一个互联网领域的学徒,也面临着这样的困惑:我发现自己什么都会一点、什么都不算精(按照某些标准大概已经算是一个“full stack”了吧)。到底以后应该怎样呢?是朝真正的 full stack 努力还是好好专精一个?看了不少招聘要求,现在就算是创业小团队也很少会直接招 full stack 的,所以觉得大概是先做好一个性价比高一些?不知道题主为何想要成为一个 full stack 呢,是因为已经是某一领域的工程师想要做做其他方面么(这个也会影响到“怎样成为”这个问题)?
不好意思,似乎跑题了。不要太浮躁,把全栈说得太过轻易。
吐槽:看来我离 full stack 还是路漫漫……
郭佳,http://douban.fm/?cid=1006168
全栈工程师不是为了工作本身,是为了方便实现自己的梦。作为一个标准的全栈工程师来答下,全栈工程师不是培养出来的,是逼出来的~不是公司逼的,是自己逼自己逼出来的~
因为我要创业,我经济压力又大没法辞职,我没法忽悠其他人一起免费干活......而且作为一个写了13年程序的老程序员(貌似知乎上比我老的程序不会很多了。。。。),本来工作语言就已经用过 Delphi, C++,Java,Perl,PHP,Lua,ObjectiveC,NodeJS,Tcl。这些都是工作中用的哦,估计这样的经历就很难了。
之前创业三年,一开始就我一个技术,所以运维几十台Linux 服务器我也顺便管了(我之前工作平时就工作在 Solaris 下面,差距不大),我老婆是前端工程师,所以 HTML,CSS,JS 我也一起学了。
所以多学一些语言对我来说真的不是件事情......
做过几年游戏制作人(做制作人我也同时每天 写代码....),策划,UI 都还有心得。而且我这十三年怎么过的呢?别人朝九晚五,我每天工作到半夜2点,周末也很少休息。
谁都能做到,并且不是一直专注于一个岗位,我相信都能成为全栈工程师。回到起点,全栈工程师不是为了工作本身,是为了方便实现自己的梦。
没错,如一些答主所说,你各方面都半吊子,我承认。我现在每天工作是写 C++和 Lua。Lua 部分还好,C++要遍历个 std::map 我到现在记不住,每次现搜索。作为一个 C++程序员我不够好,只能算是入门,或者说我一直是重视实现功能而非钻技术细节的人。我不关心技术上多牛,我关心功能的实现。C++反正我掌握的部分足以我写 Cocos2d-x 了,反正公司安排的开发工作我都能完成。
没错,如果是这样,作为一个 C++程序员的话,我依然对不起我的工资。
但我的价值根本不在于是一个 C++程序员,而是我可以从前端到后端到运维提供一揽子方案,视野广阔,任何点都可以选择最合适的技术,如果是创业,我可以自己一个人完成这个纯应用层面难度的开发的全部工作。
如果不是创业,我的价值可能也就是个2w 多工资的架构师或者技术经理,这个价格远远对不起我这13年的付出。一个真正的全栈工程师,目标只有一个:创业。
吐槽:感谢郭佳……我也是为了追梦才被逼走上了full stack这条修罗之道的,你们甚至不知道,我为了要做自己心中的游戏,还自学3D建模/游戏编程/绘画……但是发现是个深坑,而且时间/精力/金钱各方面原因暂时被搁置了。
Cat Chen,上知乎,求欢乐
既然原文是说,Facebook 工程师说 Facebook 只招 full stack engineer,那我就来说说 Facebook engineer 都是怎样的人啦。
我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。
首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。
Facebook 的众多海报当中,有一张写的是「任何一个 Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入 Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过 JavaScript 并且觉得 JavaScript 很恶心?正确的做法是立即在网上买几本 JavaScript 入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析 JavaScript 语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到 Hive 然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所说的学习能力。
这是高级工程师和初级工程师的主要差距。尽管在高级到初级这一维度上,美国工程师和中国工程师是有重叠的,但美国的教育体系和行业传统使得美国应届生比一般中国工程师更偏向于高级那一端。美国学生的优势在于,他们的教育体系让他们习惯面对开放性问题。一家公司万千问题当中,此时此刻哪一个最值得解决?这不是中国工程师擅长的问题,因为实在是太开放了。中国教育让人擅长在给定条件下解决问题,太开放反而不知道从何入手。此外因为绝大多数文献都是英文的,所以要钻研什么对于能读懂英文的人来说都可以非常成体系的学习,这对于很多拒绝阅读英文的中国工程师来说很不利。拒绝阅读英文意味着永远只能接受别人的二手资料,对于很多概念的理解只能停留在技师的层面,而无法上升到工程师或者科学家的层面。
吐槽:“任何一个 Facebook 的问题,都不是别人的问题”,说得很好。任何我遇到的问题,都不是别人的问题,我要努力尝试自己去解决它们。
小结
FSD 即 full stack developer,正如 Cat Chen 说的,努力着手解决眼前的问题,就会走上 FSD 的路上。我刚毕业那会第一份工作是从事 Java,后来打算建立我自己的网站,于是自学 PHP,还有 HTML/CSS/JavaScript 。如果你看到我的旧博客,你会发现上面一大堆入门级别的技术博文,那就是我自学时留下的足迹。后来随着兴趣什么的,JQuery/Ajax/Flex等各种衍生技术,Python/Ruby/Node.js等各种脚本语言,Linux运维,还有各种开源项目都慢慢开始涉猎,这些都是我在通过建设“简明现代魔法”这个网站的过程中获得的技能。所以,如何成为一个FSD?有个好办法,那就是 —— 自己去做一个网站,并维护它。
而且成为了 FSD 有一个巨大的好处,那就是成为了 FSD 那就意味着你具备了单人创业的能力。
有些网友很吃惊,甚至质疑,你的网站真的是你一个人做的么?真是我一个人做的……我很珍视我的这个小站,也花了同龄人无法想象的时间去建设与维护这个网站。我是把它当作一个创业项目去做的。
以一个正常人的精力和学习速度来说,想在 full stack 的每一个层面都达到顶级的精通显然是很困难的事情。但是我觉得,做到这么一点,就足够了:
a genuine interest in all software technology. (对所有的软件技术抱有一种真挚的兴趣)
正如本博客的副标题所说的:成功,唯有积累,没有奇迹。要成为 FSD,也是没有捷径,靠的是吃苦和经验积累。
注:本文转自简明现代魔法。
农夫评注:虽然现在能力还很低,但是我的梦想也是成为一个全栈工程师,路漫漫其修远兮,吾将上下而求索;亦余心之所向之,虽九死其犹未悔!简明现代魔法的博主的梦想是构建自己心中的游戏,那么我的梦想则是在在线教育领域开辟一块领地,实现自己所期所盼的在线教育模式!
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/1493/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料