怎样成为全栈工程师(Full Stack Developer)?修改
补充一下Full Stack Developer的定义和标准:What is a Full Stack developer?,这样大家讨论怎样成为Full Stack Developer时不会偏的太远。
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? To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology...修改
105 个回答
我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。
Facebook 的众多海报当中,有一张写的是「任何一个 Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入 Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过 JavaScript 并且觉得 JavaScript 很恶心?正确的做法是立即在网上买几本 JavaScript 入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析 JavaScript 语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到 Hive 然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所说的学习能力。
这是高级工程师和初级工程师的主要差距。尽管在高级到初级这一维度上,美国工程师和中国工程师是有重叠的,但美国的教育体系和行业传统使得美国应届生比一般中国工程师更偏向于高级那一端。美国学生的优势在于,他们的教育体系让他们习惯面对开放性问题。一家公司万千问题当中,此时此刻哪一个最值得解决?这不是中国工程师擅长的问题,因为实在是太开放了。中国教育让人擅长在给定条件下解决问题,太开放反而不知道从何入手。此外因为绝大多数文献都是英文的,所以要钻研什么对于能读懂英文的人来说都可以非常成体系的学习,这对于很多拒绝阅读英文的中国工程师来说很不利。拒绝阅读英文意味着永远只能接受别人的二手资料,对于很多概念的理解只能停留在技师的层面,而无法上升到工程师或者科学家的层面。
一个天气应用,干净清爽的界面,天气信息一目了然。它不仅可以精确预测未来10天的天气,还可以显示某地的历史天气信息。它具有自定义提醒功能,支持web版本,iOS版,Android版。
为什么想要做这样一个App?因为你喜欢旅行,但没找到一个天气app可以提供你下个月或者某个特定月份的天气信息;因为你懒你没有每天看天气预报的习惯,你想要在第二天温度达到30度以上或者温差有+/-7度的时候,获得温馨提示;因为你要成为一个Full Stack Engineer,你必须不断训练每个stack的能力。
## Web版
你决定用mysql来存储用户数据,用nosql存储历史天气数据。你用Redis作为cache,缓存一些最常请求的天气数据。你用Python写后台,功能简单,后台不复杂,用户注册登录,抓取返回某城市的天气数据,某地的历史天气数据,很快便搞定。
后台开发并测试好了,接下来是web前端。你十分清楚一个好的UI设计对一个app的重要性,你也明白UI的设计不只是为了美观,更重要的是提高信息的可读性和程序的可用性。幸好你平日的积累这次派上用场了。你把之前保存下来的上百个优秀的UI设计作品拿来研究,你从书架上拿出Norman的那本经典 - The Design of everyday thigns 重新细读。最终你用白纸黑笔敲定了第一个版本的UI,简洁直观,没有任何多余的设计,所有元素的排列间距 大小颜色都恰到好处。你相信即使天气不好,但用户只要使用这个app都会有着愉悦的心情。
那么开始写前端吧。啊,别急,都忘了还有icon和logo,可是不会PS不会AI怎么办呢,学吧。你平日喜欢结交不同领域的朋友,正好几周前在一个活动上你认识一位朋友做设计的。她花一个下午的时间教你基本的PS和AI的使用,并对你的UI设计给出了一些意见。你请她吃了顿晚饭表示感谢,然后立即回家根据她的一些建议重新调整了UI,这次你在PS里把UI画了出来,icons和logo也顺道一起做了。
接下来的一周,你学习HTML,CSS,以及javascript,并漂亮地把前端搞定。
## 发布App
在朋友圈发了个状态,找人帮你做Beta测试。他们都首先问你是什么app,一开始你简单回答一个天气的app。但你发现,这不能提起他们的兴趣。你觉得你需要用语言,用故事包装一下。不光是作为别人「是什么app」提问的回答,也是成为Full stack Engineer道路上的一个重要技能。
你去看了所有你喜欢的产品的主页,从他们的文案上获得一些灵感启发;你读了经典的On Writing well,发现好的文案,好的设计,其实和好的代码很相似,都是重在交流,如何让他人毫不费劲地明白你要表达的内容。你的故事要吸引人,你的产品介绍要在1分钟内解释清楚,并确保你的父母可以毫无压力听明白。
一切就绪,产品上线了。反响不错,用户持续增加。很多用户希望有移动版本,于是你立即投入到iOS版本的开发上。
## iOS版 及 后台优化
你花一周不到时间学习了基本的语法和工具使用便投入到app的开发中。你知道learn by doing 是最好也是最快的。由于之前学习了设计的基础,UI,icons很快搞定,不久iOS版本便发布了。iOS的发布带来了更多的用户增长,后台服务器的压力颇大,你知道是时候优化后台了。
你在AWS上多开了2台服务器,并写了一个script来自动化部署过程。
你改用uWSGi协议,用uwsgi作为application server
你使用Nginx来做并发,负载均衡...
......
......
## 成立公司
用户持续增长,每天你都会收到十几二十封用户的邮件。你很感激这些愿意花时间给你写邮件的用户,你相信他们是你最重要的用户,是潜在的付费用户。如果你把他们像上帝一样对待,他们同样也会把你看作是上帝。所以除了睡觉时间的发来的邮件,每一封邮件,你都会在2小时内给予回复。
果然这样的付出是收获巨大的,他们不仅惊讶且非常感谢你的快速回复,他们会在app store里给你★★★★★的评价,他们在社交网站上分享你的app,他们甚至会主动提出捐款给你。
你从快速的用户增长中嗅到了商机,你开始思考如何赚钱。广告你是坚决不能允许的,你认为再精确的广告也会影响用户体验。你设计了2个不同的付费方案,你打算用A/B测试看哪个方案更好。你分别给200个用户发去邀请尝试付费的邮件,邮件内容你精心打磨过,并在最后写上:CEO & Founder. 通过分析2种方案的用户行为,你决定将使用第一种方案。
接下来,你相信差不多是时候成立个公司了。为了省时间,你花2000块钱找了个园区挂靠并帮你注册公司。公司的名字让你头疼了很久,你不想只是简单的用这个app的名字作为公司名字,你知道公司将来还会做出其他优秀的产品。你希望这个名字简单易记,同时其含义也是你公司文化的象征。
公司注册下来了,但银行那边得自己跑。你联系了一些媒体编辑,邀请他们来试用你的产品;你重新设计了产品主页,并开始写产品的blog;你在各大社交网络都给app注册了账号,即做社区客服也为宣传... 这些事大大压缩你写代码的时间。以往你都是以代码量作为衡量自己当天工作效率的指标,所以这些天你总感觉没做啥工作。
这样的发展早已超过你的预期,这个app从一个side project几乎变成了你生活的全部。你跟你女朋友半个月才出去约会一次,为了省时间你总是约她在酒店房间见面,她抱怨不断;你1个月没跟朋友出去喝酒了;你2个月都没锻炼过身体... 你意识到, YOU CAN NOT DO THIS ALONE,你需要帮手,你需要找人一起把这个做下去。
但你不是要成为Full Stack Engineer么?你现在是了么?
## Full Stack Engineer
设计,后台开发,前端开发,移动开发,运营维护,PS,文案... 好像都会了,这算Full Stack Engineer了么?
不,这只是踏上成为Full Stack Engineer的第一步。你知道目前只是每个stack都懂一点,离senior或者expert还差得远,而要每个stack都做到极致,需要大量的时间和精力。精力有限,产品开发紧迫,力不从心啊,这条道路也太孤独,因为你不需要与任何人进行协作。难道要把一些stack的任务交给别人做么?这样算是放弃成为Full Stack Engineer么?
不!这不是。
什么是Engineer?「Engineers are versatile minds who create links between science, technology, and society」
Engineer的本质工作是设计,开发出应用于大众的产品。
一个真正的Full Stack Engineer,他从生活中发现问题,洞察需求,他设计解决方案,并开发出初始版本的产品。为了达到目标,他愿意去学习任何领域的技能和知识。同时他不追求一个人完成所有工作,如果有人可以比他在某方面做得更出色,便会十分热情的邀请他们加入。
最终他的职位也许不再是Engineer,他不再设计UI,不再写代码... 他的工作不再是design and building an app or product,因为他有更大更重要的任务要做 - design and building a team or a company which builds great products.
而这时,社会给了他们另一个称呼 - 创业者。尽管众人已忘记他们engineer的身份,但在他们骨子里,内心深处,自己始终都是一个engineer。当他们需要从头再来时,他们毫不犹豫从设计开发产品做起。Nikola Tesla,Ferdinand Porsche,Henry Ford,Jack Dorsey,Mark zuckerberg,Elon Musk... 细数那些改变了或正改变世界的创业者,他们大多数是engineer背景,热衷于设计创造。他们学习技能和知识,不是为了成为某个领域的专家;而是因为那些 是完成自己目标所需要的。
以上,为我认可的 Full Stack Engineer
---
Peng
太多有才华的人写了几年代码最后都去做了管理。而今天的网络相关技术,聪明又能持续学习的人,在三年之内可以在一个领域做到很高的水准。那么如果你做五年,十年甚至十五年呢?
我以为你成为 Full Stack Developer 是很自然的选择,而且可以跟随最顶尖的技术。这种人并不罕见,我认识的人中 @徐 乐乐 就是个例子。
相信 Full Stack Developer 的核心并非否定团队和协作,而是更多的体现在架构设计,快速原型和 TroubleShooting 方面。
随着今天的分层越来越清晰,平台和语言越来越有特点,更加全面的技术人员可以根据不同的语言搭建整个架构。
数据一致性要求高?那么使用事务管理久经考验的 Spring?还要考虑 scale ?那么放在 Oracle 里面做还是放在 Application Server 的 Transaction 管理里面做?简单请求的高并发?那么 Node.js 也许不错。 Web App 快速原型,那么 Rails 也许不错。邮件模板和自动发送? PHP 有现成的东西为什么不用?前端数据和交互复杂? 为什么不试试 emberjs ( PS :选前端框架对于架构人员来说简直像女人逛银座一样令人兴奋。甚至有人用几乎所有的框架写了同样的 Web App 来供他们试用: TodoMVC)?想绕过苹果的 App Store 的审查机制频繁发布?可以考虑在 iOS Apps 里面嵌入 HTML5 。
Full Stack Developer 在快速原型上也很有优势,因为省去了大量的管理和沟通成本。而且,这并非就意味着一定在代码质量或者测试上有缩水。
MVC 前后都可以用。一个写过 test_helper.rb 的人做前端,一定会搜索 javascript TTD 。同样,用过 javascipt lint 的人一定可以找到 stylecheck 。语言和平台会变化,聪明的方法和工具都是共通的。懂得基本的字体知识和排版审美难道和 CSS 不是天生一对?
TroubleShooting 方面 Full Stack Developer 同样优势巨大。
服务器压力太大未必需要通过后端解决,优化个 SQL 写个 Hint 是选择,而拿一部分数据和运算到前端也许是更加合理和低成本的选择。一个系统运行多年,最后遗留的问题很可能需要对业务和技术都有深入理解的人才能解决。
从以上内容可以看出, Full Stack Developer 并非杂而全 - Facebook 也不会雇庸手。他要求的是一种更加全面的深入。 一方面,他是技术人员不断学习的结果。另一方面,他也是对自己事业的一种责任:
技术人员的价值不是指派做了一半的 issue 给队友,而是更快更好的搞定事情。
这个回答竟然收到的赞同比我其他所有回答都高,看来我还是转型灌技术鸡汤好了。
补充下,首先我觉得好的开发者,即使不是全栈,也要融会贯通多种技术。我从来不认为一个只专精一种技术的人有可能成为好的开发者,即使是 C,即使是汇编。(当然其实反过来看,那些大神们哪个不会搞点其他的?比如几个做服务器端开发的大神居然不懂服务器管理?)
然后从广度和深度的组合看,我认为好的开发者大概有两种类型:
1. 手术刀
2. 代码专家。
(来自《人月神话》)
手术刀是业务驱动的,最需要全栈的人;他们的核心价值在于:懂业务,技术全面,都能拿的起来,而且能选择最合适的技术。
代码专家是技术驱动的,即使不够全栈也可以用,但是技能树点的越多当然有好处。
而我提的创业逼出来的全栈,是因为,对于创业团队而言,手术刀更加重要,代码专家要依靠各种开源组织的贡献,或者临时聘请。
还有几位讲,创业的最大需求技能是整合资源的能力,找合适的人做事的能力。这个我认同,我只是说我自己,我承认我没能力忽悠一堆技术大牛策划大牛和我一起没工资的创业。我也忽悠不到前期种子投资的钱。
所以我说的,是说对于我,种子期,天使期,最重要的都是我自己作为手术刀,而不是资源整合者。
------------------------------------------
全栈工程师不是为了工作本身,是为了方便实现自己的梦。
作为一个标准的全栈工程师来答下,全栈工程师不是培养出来的,是逼出来的~
不是公司逼的,是自己逼自己逼出来的~
因为我要创业,我经济压力又大没法辞职,我没法忽悠其他人一起免费干活......而且作为一个写了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++程序员的话,我依然对不起我的工资。
但我的价值根本不在于是一个 C++程序员,而是我可以从前端到后端到运维提供一揽子方案,视野广阔,任何点都可以选择最合适的技术,如果是创业,我可以自己一个人完成这个纯应用层面难度的开发的全部工作。
如果不是创业,我的价值可能也就是个2w 多工资的架构师或者技术经理,这个价格远远对不起我这13年的付出。一个真正的全栈工程师,目标只有一个:创业。
如果说要想全部达到level3,没有三四十年怕是不行吧,到时候还会有新的知识,永远达不到的。
所谓的全栈都是资本家们根据他们的业务自我衡量的,骚年们还是从基础好好打起吧。基础好,学习就快,所谓阳光下没有新鲜事嘛,学计算机你懂得的。

UPDATE:这篇答案写在问题添加了“补充说明”说明之前,对于“Full Stack Developer”的定义是我根据自己的理解来写的,现在看来我(以及另外一些朋友)的理解和补充说明里引用的那一段是不同的。所以这个答案与题目描述并不相符,仅供参考,请大家注意。
简单来说我以下所说的 FSD 可能更像是“全才大牛”,对任何一个领域的了解都达到了该领域的专业人士的平均程度,更像是 Engineer × N ;而补充说明以及 庄生 (抱歉由于重名太多不知道该at哪一个)、@尤雨溪 等朋友所说的 FSD 则是各领域都有一定的了解(但不必达到该领域的专业人士的水平),足够独立完成一个项目的各个方面,强调了解新领域的勇气和能力(前提自然是有充分的兴趣)。
对于后一种 FSD ,我是十分赞同将其作为一个目标而奋斗的,理由和方法其他几位也说了很多的(我很赞同独自完成一个项目,途中了解些感兴趣/有用到的、但之前不了解的新领域,永远保持一颗好奇心,真的受益匪浅)。
而对于前一种 FSD (也是我下面即将讲到的),先声明我绝对不是也不想“装逼”,做以下几点说明:
- 对于各个领域来说,我所举的那些例子都是我在对该领域“简单了解”之后接触到的很有限的一些概念、技术,是一些例子而已。该领域的大部分专业人士所能够做到的,但绝不是说懂了这些就是专业人士,也更谈不上“炫耀”(我自己也不会啊,所以有错误肯定在所难免,还望指正)。
- 这种各领域都达到专业水平的全能大牛(至少在我看来如此)真的存在么?是的,我见过一些。他们的知识广度和深度让我由衷佩服。而他们中的很多其实在工作中也只是某个领域的专业工程师而已。
- 以我有限的知识水平和学习经历来看,能够做到这个程度需要付出极大的努力。而所谓的“给大家泼冷水”其实倒不如说是给自己泼冷水——我也一度觉得似乎能一个人搞定一个项目(就像下面即将谈到的那个“反例”一样)就是什么都行的 FSD 了,但遇到了他们之后,我真的意识到差距真的不是一般大。因而我才产生了疑问:在我短暂的大学生涯里,把这样的“全栈”当成奋斗目标真的可行、值得么?是不是先把一件事情做好更好呢?
- 最后,下面的回答是以“基于 Web ”的全栈“开发者”例的,所以有些朋友吐槽怎么不说 native app 、怎么不说 PS 、画画之类的……好吧,可能是我太年轻了。
====================
窃以为 full stack 不是那么简单的事情。当然,不同的地方可能有不同的标准,且听我慢慢道来。
既然大家都在以 Web 为例,那我也说 Web 好了。不过事实上 full stack 也有可能是其他方面的。
租个 VPS ,从装系统配环境开始,然后拿个 PHP Python Ruby Nodejs 什么的写个后端(少不了用一些框架吧, 后端框架多如牛毛,不说 PHP , Python 用个 django 、 Ruby 弄个 rails ,都挺方便吧),再给它撸个好看的页面(表现层多半也会用个 bootstrap 之类的,如果设计能力强一点的话就用一些更轻便的 helper frame 然后主要自己手写;逻辑控制层高端一点弄个 backbone 甚至 angular 之类搞个重 AJAX 、带前端模板及路由的新潮 HTML5 应用)。弄好以后上线,性能出问题了,看看日志 Google 一番调调参数,甚至多买一两台 VPS 来弄个负载均衡什么的。再要不,我们换成实体机,然后顺便玩玩网络和虚拟化什么的?
这样算不算 full stack 呢?也许在一些小公司(不过现在很多互联网创业公司水平都很高,所以也不能完全看大小)可以算是了。但在真正高水平的公司,以上的任何一点都达不到相应领域“工程师”的标准。
装个系统调调参数甚至弄个简单的负载均衡就叫运维了?你确定这不是网管?从几台机器到成百上千台机器是有一个量变到质变的(虽然经过这个质变以后,对于运维工程师来说两者就差别不大了),更别说弄个机房,搞个异地数据中心什么的。不说CCNP,CCNA总该有吧?再者,如果不说这么大(这么大了可能就涉及到“架构师”了),往小一点说,也有很多可深挖的:性能调优只是根据网上的文章随便调调参数?我见过不少牛逼的 Web 运维都读过 Apache 和 nginx 甚至部分 kernel 代码。没有自动化的监控程序和运维工具难道得死死守在机器前一遍遍地敲命令?合格的运维不但熟练使用已有的工具,还会根据需要自己写脚本、工具,因为现实情况太复杂通用工具不一定适合。很多公司里,运维还要兼顾安全问题,那么又是一个大坑。备份、冗余、风控个个门道都很深。
再说后端。会用 django 或者 RoR 写点东西很厉害?这些本来都是 RAD 框架,就是拿来快速开发、快速上手的,降低了门槛。但不同的程序员编程功底和代码质量还是会对最终成果造成很大影响。滥用 ORM 导致性能低下的例子我就不多说了。明明用了这样的框架还能写出带有 SQL 注入的程序也不少见,有的甚至还存在逻辑安全漏洞,至于什么加盐、防 CSRF 、 XSS 、 replay attack 、 session fix 、应用层 DoS 等等,多少人都是只听说过名字知道个大概然后用一个“厉害”的框架就以为一劳永逸?不知道原理也没看过框架代码,不知道框架到底是怎么实现的、是否有一定局限……再说软件工程方面。写几个测试数据就叫单元测试了?提前写测试数据再开发就成 TDD 了?三天两头重构就叫敏捷了? QA 、版本控制、协作、文档,都不是那么简单的事吧。
然后说前端。 HTML CSS 本来就是以方便表示内容和布局样式而开发的,只是“会写”应该不算什么难事吧?何况还有各种布局、排版库。 JS 灵活得很,有一点 C 语法基础的人学起来也很快,感谢 jQuery ,就算是不知道什么是闭包、不知道 JS 原型继承等等的三脚猫功夫也能实现大多数需求了。那么这样就是前端工程师?真是这样的话为何前几天知乎还有人问好的前端工程师为什么这么难找?能写出在所有浏览器表现一致并且方便维护的样式需要不少经验积累和勤奋实践,对浏览器渲染原理的了解也不可少。这还只是第一步,加上 JS 这玩意儿以后复杂度其实陡然上升了。在一个真正的大项目里,要保证各个组件正常运行不是一件容易的事, JS 本来就缺乏一些“软件工程”特性,导致大型代码组织不便,糟糕的 JS 程序很容易就污染了命名空间、搞错了作用域、漏掉了异常、弄错了类型、在异步和回调之中迷失……一不小心,就搞挂了页面,调起来还麻烦(就算现在有了 Chrome )。这还没算上性能、兼容性、安全等等问题呢。这也是为什么前端工具/技术特别多的原因之一。好的前端工程师不但紧跟技术前沿,还乐于知道这些牛逼的技术都是怎么实现的,然后灵活运用。
可能有人会说人的精力有限, full stack 有了广度自然要牺牲一下深度。那么我想说,再怎么牺牲深度,如果各领域都像上文举的反例那样,那肯定是不够的。那样可能只算是一个爱折腾的 geek 而不是工程师。我一个大二学生就能很好地完成开头提到的情景,并且还可以再深一点(比方网络方面有个差不多CCNA的水平和一些经验, PHP 自认为还是比较扎实的= =,对于安全、性能优化、分布式等方面也有一些了解……),但我也只觉得自己大多数时候还只是“折腾”而已,还有太多不足和有待提高之处。事实上,上述任何一个领域中的真正的工程师都肯定能凭借自己的学习能力和极客精神轻松地在业余时间完成开头所说的那个例子:看看 github 上那些有趣的个人开源项目和搭建起来的 demo 吧,大部分作者的本职应该都只是前端、后端或其他等等的其中之一。更不用说还有很多工程师的博客也是自己写(我是指写一个博客系统)、自己搭的。
full stack 一定是很难的。其实我自己作为一个互联网领域的学徒,也面临着这样的困惑:我发现自己什么都会一点、什么都不算精(按照某些标准大概已经算是一个“full stack”了吧)。到底以后应该怎样呢?是朝真正的 full stack 努力还是好好专精一个?看了不少招聘要求,现在就算是创业小团队也很少会直接招 full stack 的,所以觉得大概是先做好一个性价比高一些?不知道题主为何想要成为一个 full stack 呢,是因为已经是某一领域的工程师想要做做其他方面么(这个也会影响到“怎样成为”这个问题)?
不好意思,似乎跑题了。到最后自己还反倒提了个问。只是希望抛砖引玉,更踏实的回答多一些,不要太浮躁,把全栈说得太过轻易。
手机打字,如有差错还望指出,谢谢。
焊过电路板,调试过硬件
把弄过各种芯片硬件,写过几行fpga
研究过x86, arm, powerpc, mips各种芯片
写过几万行的linux驱动,网卡,pci等等都写过
精读过linux内核几个模块的代码,写过几个os级别模块
写了无数的linux后台程序,各种c, c++, python,
ruby, java, erlang, php都写过一些程序
用qt写过客户端,写过android app,写过ios app
写过windows的程序
做过网站,用过ROR,写过简单前端,js, css,html都了解一些
弄过机器学习,写过分类聚类,跑过svm。
做过通讯系统,做过强电逆变器。
看起来够fullstack了吧?很不幸告诉你,如果是这样,那么就会毁掉fullstack这个词。
做过强电逆变器,虽然控制电机可以跑起来,但是仅仅停留在跑起来,可以控制速度而已。但是波形还能烂一点不?尼玛电机噪音那个大,主流的逆变器论文看过木有?甚至我怀疑微积分都没学好。
做过机器学习,其实说白了,机器学习导论那本书你看完都可以做了,各种贝叶斯聚类分类决策树,高端点的LDA;但是这个仅仅是入门好不,底层的数学原理你足够了解了?能推导公式不?。让你做一个数字识别可以做出来,让你做一个来识别指纹呢?人脸识别呢?别告诉我说有库。
其它的等等很多都类似,别被fullstack这个词毁掉了你的一辈子,要知道你做的东西都是别人的入门的时候做的。
------------------------------------------------------------------------------------
回到问题:如何称为一个fullstack工程师
我觉得不要怕dirty job就可以了,一个不熟悉的领域,去找一两本导论级别的书,建立一个基本的知识框架,然后就可以开始干活了;当然,你别指望做的多好;但是绝对不会差到哪里去,知识基本都是相通的;甚至是可以相互借鉴的。
当然,如果就拿起某门语言大概看一下语法就开始干活的,我觉得这个不能算。基本每个后端工程师都会写简单的html & css & js吧?
-------------------------------------------------------------------------------------
关于发展问题:
和我一起毕业进入同一个公司(后面跳槽了)的同事,基本都是做深度路线的,很多都混的比我好(大公司核心部门核心岗位,或者在各大公司跳来跳去的);无论是搞ACM的,还是在某个领域有足够强的积累。
他们去面试基本都可以秒杀国内主流互联网公司;但是我呢?做深度不够,做广度他们不需要,而且各大公司都会考虑成熟的技术,所以给的offer相对就没那么有吸引力了(当然,毕业后就没找过工作了,具体也不知道,哈哈)。
相反创业公司如果要找合作伙伴,都需要建立一定的信任关系,有些不了解的,让你去你都不敢去;如果是熟悉的团队,那么你只能期待公司发展顺利早点上市,哈哈。
自己创业?目前不考虑,这个是一个团队的事情,哪怕两三个人,不是你一个人可以解决的。就算你在fullstack,你也不可能兼顾到所有的事情。
-----------------------------------------------------------------------------------------------
关于优势
考虑问题会全面很多,可以做系统级别的事情,不容易陷入拿着锤子满世界都是钉子的境界。
还有,中小创业公司很喜欢这种人。
-------------------------------------------------------------------------------------------------
对自身发张的考虑
1) 知识结构体系化,更扎实一些。
2) 技术在某个方向做深。
3) 切入某个应用领域,多了解领域知识,解决领域问题。
4) 千万别沦落为民科!!!!
我觉得对于 FSD ,尤其是对于想成为 FSD 的人来说,这个态度才是最重要的事情。即使都是 FSD,每一个人各自的技能加点也肯定会不一样,有人在前端更擅长一些,有人在服务器层面更有经验... 但其实没有什么硬性的门槛,需要的是解决任何问题的能力和意愿。你要做到的就是不固步自封在一个领域。遇到问题,就去研究,不因为问题不在你的 comfort zone 就放弃或者推给别人。即使一开始的解决方案很笨拙也无所谓,just learn whatever it takes to make it work. 比如说我要做一个网站,我有一些东西没碰过,但我有足够的兴趣和动力去搞个八九不离十。(这里自学能力很重要,有好的 mentor 也会帮助很大)当你经历过一次这个过程以后,你就会有信心去弄明白更复杂的东西,在之前的基础上进一步去消化、改进、学更多的东西。
另外,我个人觉得这个过程应该是由实际问题驱动的,而不是漫无目的看到什么东西流行了或者觉得很NB就去学。@庄生 的答案里提到绝大部分的网站都活不到或者永远也达不到10k用户在线的水平,那种情况下去看 high scalability 的东西有什么意义?学的东西用来解决或是改进实际遇到的问题,这样你的整个知识体系覆盖面和侧重点会比较合理。打个比方就是你的技能点有限,所以加点方案得有一个主题,到处乱点的话就废了。
另外,在学校里写东西,找人巨难,这造就了一批 full stack 小伙伴. 有一次搞一个 html5 的比赛,到后来快要deadline时,前端明显要搞不完了,作为一个野生前端,怒刷了一天 js 后开始填坑.
有时候因为找不着人,还可以临时变身美攻(当然你也可以叫设计湿),然后客串一下 ios 客户端开发,设计个数据库…… 最后小伙伴们所有东西都搞完,你再从头到尾把他们搞的东西擦一遍屁股,然后需要宣传/比赛的话,海报/视频/演讲/slides/文档都是你的事,最后就成了 full stack 了.
你看,full stack 都是苦逼的人(你看这还只是学校里的 full stack,要是工作上成了 full stack 那就不定啥样了). 想想好像没必要匿…,就不匿了吧.
- FSD = full stack developer
- 领域专家 = 和FSD相对,表示精通且只精通单一领域的大牛(暂时想不出更好的名字了)
- 互联网公司 = 通过互联网产品本身的运行来产生现金流。例如百度,Dropbox
- 外包公司 = 根据客户需求来订制产品然后整体卖给客户。项目本身的现金流和公司没有关系。例如东软。
不知道马同学所谓的高水平公司都有哪些,可能都是外包公司吧。因为对于互联网公司来说,他提到的问题基本都属于premature optimisation。比如:
建一个VPS还非得精通到怎么搞机房和数据中心?以现在的硬件条件稍微高配一点的VPS跑一个在线人数10K的网站+DB问题也不大。国内有多少网站在线人数超过10K了?对于大部分的网站要CCNP/CCNA干嘛?
ORM性能差就要用native sql? 重写了一遍以后每个request平均能省下多少ms? 你的用户在乎这点时间吗?值得那么多重写和测试的¥¥么? 现在确实native sql确实又开始火了,但本质原因还是方便,根本不是性能问题。
还有很多,不一一反驳了。
下面回到楼主的问题,我认为成为FSD的想法非常好。因为成为FSD意味着具备了单人创业的能力。而且随着框架越来越强,互联网创业团队(包括intraprenuer)越来越小,FSD的前景其实远远超过领域专家。(这句话是个人观点,5年以后再回来看)
那么如何成为FSD呢?很简单也很难:自己去做一个网站,并维护它。
为什么要成为所谓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工程师。祝你成功!
不知道为啥,这几天全栈突然火起来了,可能是年底,很多大大开始拷问自己的价值和发展方向,最后正好憋出这么个问题来,然后大家一起哄,觉得全栈的确很棒,然后就火了。。。
我也说说自己的看法。
其实我自己对自己的定义就是全栈,别喷我,我是说我自己的定义,符不符合您的定义就不一定了。
其实不应该叫定义,而是就是这样,没必要定义,没必要较真,不管你是全栈还是一栈还是没栈,你的价值别人都看在眼里,你值多少钱,有多少斤两,能做多少事情,不会因为一个称呼就牛逼哄哄起来。
之前做过几年前端,不过自从前年10月份被开除之后,我基本算是脱离前端了,之后搞IOS搞了一阵,虽然没有特别深入,但是做了好几个项目,赚的钱也基本上够养活自己一年。
后来又学习和实践了很久的nodejs,写过不少杂七杂八的项目,不过那时候还不敢说自己是个nodejs工程师,还差得远,不过现在随着前端乱炖的不断推进,在nodejs方面也算是有些自己的领悟了,我给自己定义在这方面已经算掌握了一个技能,可以独立承担项目。
然后去年7月份,加入大搜车。从0开始学java,也一直在写java,到现在五个月了,对java没啥深入了解,但是自己做一个单独的项目完全没问题,最近刚上线了wap版的网站,所有的前后台都是我一个人搞定的。在公司内部还维护几个内部系统,分发,数据,微信接入等。
现在你说我是不是全栈,我就说我就是全栈,恩,就是这么简单,我最擅长前端,但是其他的语言我也可以独立做比较正式的项目,我认为这就是一个普通的全栈工程师了。
当然,在我们内部,偶的职位名字叫:支撑工程师。。。。
就算你什么都会,哪怕美术和策划、运营的事情也会做,仍然是每天上班八小时,为什么就要拿几份薪水?更何况,作为工程师,是高级工程师的待遇;作为美术,作为策划,可能只是初级水平,岂不是要按照初级美术和初级策划的水平去拿工资?
所以,要成为全能的full stack工程师, 并不是瞄准多拿几份工资这样的目标。
--------------------------------------------------------------
既然叫工程师,就是应该负责技术的,而不只是写代码。
各方面的技术,各方面的技术架构。比如,关卡编辑器里面的图层该怎么搭,如何定义?美工PS出来的图片应该是什么规格?这些都是技术架构,都是工程师要去做的。工程师应该帮美术做好图,做好动画;帮策划做好关卡,填好数据;这才是工程师。所有跟技术相关的东西,包括Photoshop的使用细节,3dmax的使用细节,都是工程师需要去搞定的。美术只是在工程师做好的基础上让它更漂亮更好看,策划让它更好玩。
否则,你就只是程序员,而不是工程师。否则,你就会很被动,美术扔过来一堆动画你没法倒进游戏,或者弄进去了也看起来很渣;策划扔过来一堆数据到了上线的时候才发现不对头;到时候,最吃力不讨好的仍然是程序员。
如果只局限在自己的代码中,就只能是程序员。如果只关心客户端而不关心服务器,就无法对技术负责,就只能是一个程序员。每一个实际问题,都有可能涉及各方面的技术。举个例子来说,做格斗网游,要做出良好的打击感,你就不仅要关心渲染技巧,还要关心美术特效,还要关心网络,关心服务器应该传送过来哪些数据,还要关心哪些东西是对玩家有用的必须表现出来的东西...当你的关注重心从代码转移到具体实际的问题的时候,就成为了一个工程师了,继续努力下去,就很容易变成全能的工程师。
-------------------------------------------------------------------
同样,美术并不只是制造图片、模型、动画,而是要为画面负责,为美观负责。如果花了大量的时间精力来加班,制造出来了大量漂亮的图片却没有让游戏的画面更好,做出了大量漂亮的模型可是放在一起却不协调,产生强烈的违和感,不能不说是美术的失职。
策划并不只是出策划案,设计复杂的系统,策划要为好玩负责,为赚钱负责。如果花了大量的时间精力加班做出了非常细致的策划文档,却无法实现,最终出来的游戏既不好玩也不能卖钱,那当然就是策划的失职。
前端工程师也好,全栈工程师也罢,都只是因为不同时期、不同需求、不同的环境产生的不同定位。都是为了更快速和高效的解决工作中遇到问题。当项目达到一定的规模之后,需要前端工程师也需要全栈工程师,全栈工程师比起专业领域的工程师,视野、沟通、协调能力上确实非常有优势,但具体到某一类领域内的沉淀,可能还是专业的更强,毕竟一个人的精力有限,不可能全部都兼顾(只是有所侧重)。
从离开大学之后,最开始接触的是Java WEB编程,然后开始专职写JavaScript(职位Web程序员)后台使用Java。之后跟随技术总监加入创业团队,经历社区 -> webgame -> mobile game,所使用的技术从JavaScript慢慢延伸到Nginx/Apache、CSS、(x)HTML、ActionScript3.0/Flex、C++、lua等,包括购买硬件、进IDC机房,架设、配置服务器。所有这些我觉得都是工作需要和兴趣使然,很自然的事情。Node.js、MySQL、MangoDB、C、汇编、Python、PHP、Shell、Perl、GO、PhotoShop等等,这些都是因为兴趣。这些在日常工作中帮助我不少,我在公司里写的最多的是工具,各类小工具,凡是我觉得容易出错或是手工操作比较麻烦的,我都会想着怎么用工作解决它。工具最开始用bat,然后是hta,现在是node-webkit,我觉得语言倒是次要的,之所以讲语言是次要的是因为所以这些我最开始也不会,只是为了要解决某个问题,然后去搜索、尝试、验证,达到所要实现的功能和需求。
我比较喜欢的二句话,一句是:“广度是尝试研究的副产品”,另外一句话:“秒杀泛泛之辈的是一技之长,秒杀一技之长的是博闻强识。”
对于工程师来讲,我非常赞同 @Cat Chen 的观点:“我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。”
所以我的建议是,不要在乎自己是不是全栈工程师,起码首先应该有一门深入的技术吧?由深到广,这是一个知识学习积累的过程,不是个Title。
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,那么难道要临阵换帅?
我觉得Full Stack关键不在于你已经会什么,以及你已经会的东西有多深刻。而是在于,你能够会什么。
当一个可以随意切换自己角色并且顺利适应各种技术甚至不是技术的挑战的工程师,那就可以称得上是一个Full Stack了。
这需要的不仅仅是热情,更需要适合自己的方法和强大的学习能力以及近乎不要脸的抗失败打击能力。
一家拙见。
我觉得全栈工程师在技术上至少是要打通软件和硬件之间的桥梁。Full stack的主要价值在于探索可行性(也就是架构和原型),相当于最精锐的尖刀班,在战线上实现突破的那个人,站在一个项目的最前沿,没有人可以依靠,所有人都要依赖你的突破,那你只能当一个全栈工程师。
做到全栈之后,我个人感悟是,技术都是相通的,无非就是信息(数据)的处理过程和信息(数据)的流动。
有的人啥都会,HTML、CSS、Javascript、Java、C#、C/C++、Python……,数据库也会一大堆,什么MSDB,ORACLE,MySQL,Mongo,Redis……,但他啥屁值得炫耀的成果都没有(比如我)。
放弃狗屁全栈的想法吧,专心做好一件事,如果你对同事做的事情感兴趣,就挤时间找别人多交流学习,慢慢你会一精多通,因为你境界到了,一开始就抱着全栈的想法太傻了。
Step 2:无论是多小的问题,都在理解的前提下追求尽可能正确的解决方案,拒绝以「基于 Copy-Paste」、「基于巧合」的方式处理问题。
Step 3:习得任何知识技能的时候,尽可能建立其跟已有知识的联系,以此不断拓展自己的知识图谱和结构。
重复 2-3
完成以上,剩下的工作就是给自己洗脑,让自己相信「以 full stack 为目标的人生,也必须当一个工程师」。
几品境界?”本因额头出汗,答道:“弟子根钝,又兼未能精进,只修得到第四品。”枯荣
大师再问:“以你所见,大理段氏的一阳指与少林牛花指、多罗叶指、无相劫指三项指法相
较,孰优孰劣?”本因道:“指法无优劣,功力有高下。”
时间精力有限,精一层 知全栈。
一个工程师如果落到最后都要自己来,只能说明圈子太小,个人魅力不够。
albert corleone,中央在下一盘很大的棋
收起
禅师:成为全栈工程师,这个问题等于如何成为全才,有可能吗
码农:有可能,不过可能性比较低,因为达芬奇这类人毕竟是百年一遇的奇才。不过,因为我热爱这个行业,也有一定天赋,所以只做好软件全栈的话我想还是可能的
禅师:你玩过三国志这个游戏吗
码农:我还开发过
禅师:你喜欢什么样的武将,诸葛亮怎么样?
码农:不错,虽然他武力只有20,不过智力有100,不过游戏出战不是单打独斗,我可以给他搭配武力100,智力20的吕布,在战场上所向披靡
禅师:对于一个武力65,智力65的武将,你怎么处理
码农:砍头或让他下野,浪费军粮和黄金
禅师:但是他很全面啊,两项能力综合130分,比诸葛亮和吕布的综合分还要高
码农:话虽如此但他还是太平庸,无法独挡一面
禅师:赵云怎么样
码农:这是我最喜欢的武将之一,武力97,智力80,还有一个姜维也是,武力91,智力91,这是我心中全才的标准
禅师:首先,请把一个能力发展到90,如果你还有余力把另一个能力发展到90,再称呼自己全栈吧,否则你只是一个全面发展又全面平庸的废材。
码农:我明白了,我想facebook和google标榜的全栈,也肯定不是一个c++,java,ios,php,blabla都只会编写hello world的全栈。
当然,能成为怎样的FSD,跟工作环境很有关联。自己不够坚定,什么样的环境,就能出什么样的人。
所以大可不必对熟练程度有太高要求。
如果是以这个标准的话,全栈工程师其实并不难:
做好自己的本份,并对周围甚至全世界别人做的事情感兴趣并花时间去熟悉了解,多虚心参与不同层次的研讨
久而久之,自然就成为全栈工程师了。
难只难在坚持。
1)什么是全栈工程师 ?
有的人说是精通前端,精通后端,精通底端
------按照这个标准,地球上估计都找不出一个“全栈工程师”;
有的人说是懂前端,懂后端
------按照这个标准,我估计大部分目前做后端都可以称为“全栈工程师”,毕竟哪个写后台的一个页面都没写啊 ?大部分目前做app的也可以算“全栈工程师”,毕竟哪个做app的完全不知道后端怎么写啊? 但如果这就是“全栈工程师”了,未免有点夸张了;
所以,如何定义“全栈工程师”就是一个很难的问题。我个人倾向于所谓的“全栈工程师”,应该是“精某端,懂另外一端”,“精”自然就是精通,能够玩各种花样,熟悉各种机制;“懂”就是知道怎么一回事,知道能够完成什么工作,知道常见的功能如何完成。
2)什么情况下需要“全栈工程师” ?
有的人说以后全部都只要“全栈工程师”,我觉得这完全是胡扯!分工合作是人类社会进步的一个很大的推动力,难道软件业发展到今天,反而要反其道而行之了么 ?肯定不可能。术业有专攻,分工合作才能促进整体效率的提升。
所以,“全栈工程师”真正能够发挥很大作用的,一个应该是如很多人所说的“创业”,自己创业,刚开始没那么多人那么多钱,要尽快做出产品,那么”全栈“就是一个必备的条件了;另外一个是”做原型“,比如说有了新产品想法,不太可能一下子扑100个人上去搞,很多时候都是先投3~5个人先试试,这个时候”全栈“也是很有优势的。
但无论是创业,还是新产品,一旦上了规模,必然要开始分工合作,全栈可能就慢慢退出,或者转型为类似产品的角色,起到一个胶水的作用
3)你要成为”全栈工程师“么?
我觉得看个人兴趣,毕竟前端和后端或者底端差异很大,不是想成为就成为的。
前端偏向于艺术,后端偏向于工程,底端偏向于数学,一个人很难同时具备这三种截然不同的素质。比如说像我这种码农,完全没有审美观,颜色分辨不超过10种,让我做前端,做出来的只能说能用,远远达不到美观的要求。
但保持适当的兴趣还是有必要的,做不出美观的前端,能作出能用的,一开始也不错
所以我觉得每个人都可以去尝试一下。
画过电路板,2层板,4层板...
修过电视机,收音机,...机
编过FPGA,单片机代码...
搞过ASP/ASPX/JSP/PHP
亦搞过VB/DELPHI/MFC/C#/JAVA EJB/CORBA
上过 SQLServer(2000~2008)/Informix/DB2/Oracle/Mysql
编过 Application/Activex/J2ME/SWT RCP/Android 应用
为了修正无源码的应用bug,亦搞过汇编破解VC应用/反编译C#应用
熟悉了各种Remoting技术,RIA技术
.............各种各种to be continued...
对于我这种人在中国好似也就适合创业了,但经历过两次合作创业发现,创业靠的还不是你身上技术细菌,而是你能否说服别人,文大于理。
非常同意楼上几位砖家的话,fullstack实际上并不是要你的知识面有多广,而是你要保持接触新事物的心态。在需要迫切解决某问题的时候,愿意第一时间去接触未知的技术、信息,解决必须解决的问题,而后积累下来成为经验,而经验能降低你的学习成本,让你更快的吸收理解未知技术。
整个IT体系,从硬件到软件,软件之间,本来就是需要互相适配和优化的。所谓的全栈工程师是为了能够把这种相互适配和优化发挥出来吧。
张虎,http://yunba.io CEO,原 JPush CTO
收起
- 对软件开发有各个环节有浓厚的兴趣。
- 有良好的自我驱动能力,很强的学习能力。
- 良好的英文阅读能力,经常使用 google/stack overflow/quora/wikipedia 研究软件开发方面的知识。这一点是针对非英文母语的人。
- 深刻理解计算机相关的这种基础知识和原理。
- 深刻理解工具链使用和原理。
- 以上两条做到融汇贯通,就快成为全栈工程师了。
- 找各种机会实践你的理解。
对于开发者来说,很多时候coding真的只是一种乐趣,而可能做出一个活生生的产品,就更乐不可言了。而且一般喜欢coding的人,好奇心肯定不小,一旦钻进了开发的领域,会被各种不同领域的技术亮瞎眼睛:-)
我个人比较菜,属于典型的蜻蜓点水式学习,当然这是之前,目前正在形成一套自己的学习机制。本科专业是机械,感觉很无趣,骨子里对“计算机”感兴趣,所以就各种去自学。先是从C语言开始,Turbo C敲个a+b就乐坏了,那时候沉浸在自己井底之蛙的世界里,事后想想真的略傻!之后不知轻重地跑去参加ACM,整算法,结果鼻青脸肿。大一下开始玩Linux,心灵得到一些慰藉。
之后进入一个团队,先学Java,没怎么学好;后来进入了嵌入式组,在这里泡了一年,多少对ARM,DSP,嵌入式Linux,甚至CPLD,FPGA之类有过了了解,还十分大胆地写了几行Verilog代码,而在那里面最让我着迷的无疑是嵌入式Linux了。然后大四整一年参加了一个比赛,做控制,写uCOS之上的机器人控制代码,偶尔也会写底层的驱动(不过整个系统采用的是DSP + FPGA,大部分驱动是负责FPGA的队友写的)。
闲暇之余,自己还对Web开发十分热衷,CSS和JS的世界也别样精彩,但也只是会皮毛罢了。
所以总结来看,凡是作为一个开发者,你就有可能接触到各种开发技术,因为你太长时间在计算机的世界里面,很多词汇耳濡目染。什么前端(Front End),后端(Back End),桌面(Desktop),移动客户端(Android,iOS),Web,嵌入式(Embedded),工具链(Tool Chain),服务器(Server),数据库(Database),用户体验(UX),等等。
可以参考之前的回答,如果一个开发者啥都会,但是又做不出什么实际有价值的东西,那还是相当于啥都不会;待你的宽度和视野足够了,能够宏观看待技术学习的时候,但是深入学习某一个你最感兴趣的技术的时候了。贪多求全,必死无疑!
再回到Full Stack Developer,看了那个链接,基本赞同作者试图传达的观点,但是可以把技术层面的东西再从其他方面分类。我个人对Full Stack的理解,从底层到上层,应该包含操作系统,工具链,数据库,分布式系统,用户态的桌面应用程序开发,移动客户端应用开发,基于浏览器的互联网产品,针对专用系统的算法开发等等。即是从操作系统一路到应用层面,不在于你会多少工具,而在于你掌握了多少核心思想。很多东西确实是相通的,人最重要的是能思考,有解决问题的能力,能够举一反三。
对于操作系统(比如Linux)来说,我觉得读内核的源代码可能不是必须的,但是对操作系统每一个关键模块工作原理的理解是必须的;而对工具链(比如gcc)来说,了解他们之后你对自己的源代码如何被转换成及机器代码就会更深的理解,就可能会更加严谨地编程,也能利用工具链的某些特性提高你的程序性能,发现bug后的除错可能也会相对容易;对于服务器这边,高可用,高并发是比较核心的问题,能够工作的服务器现在很容易搞到,但是高性能的服务器(不是靠硬件,靠优化配置)就比较考验人了,同理对于数据库产品来说,可能最核心的是scheme设计和性能优化,缓存之类的,学习的时候了解了基本的SQL,就要去深入了解数据库的原理了;前端的东西是直接更用户打交道,这个时候就要有足够的敏锐度,发现用户的痛点,才能够做出体验良好的产品;移动客户端稍显特殊,但是本质无异,先了解一下Android的整体架构,为什么选用Java作为第三方开发语言之类的问题会对之后的产品开发有不少帮助。
上面啰嗦了这么多,我想表达的就是,全栈的开发者不在于“会用”多少技术,而在于“懂”多少技术;只有掌握了技术的原理,才能说是“会”了这个技术。
因此我建议大家一定要多看原理性的东西,并且多实践,这样才能朝着Full Stack Developer一步一步迈进,同时锻炼自己的思维能力,解决问题的能力,还有沟通能力(和客户)。
最近看书比较多,也在不停地思考一些东西,跟大家共勉。
有了扎实的基础过后,再深入学习一门后台语言,比如:C,C++,C#,Java这些主流的,面向过程和面向对象的各一门,专研自己喜欢的一门,这样后台的思维会培养起来。
接着学习前端的知识:HTML/CSS/JS/PHP这些吧,这样对浏览器可能会比较亲近一点。
最后选择自己技术的定位,深入专研,这样从深度上学习,才能够让自己的底气更足。当深入到一定程序,平时作为技术人员,热爱技术本身是必须的,所以自然就会接触到其它知识,比如:服务器shell,linux系统的使用,汇编,ruby,计算机网络技术等等,反正各种技术。这样不断的增加自己知识的广度。
最后总结:想要精通一门,必须手握10门技术。做一个知识的生态体系,深到广,广到深,顺序都是可以的。
工程师应该帮美术做好图,做好动画;帮策划做好关卡,填好数据;这才是工程师。所有跟技术相关的东西,包括Photoshop的使用细节,3dmax的使用细节,都是工程师需要去搞定的。那不是全栈工程师,那是全国劳模。
看了大家的回答,没有人提及“全栈”的字面义,所谓full stack的stack是指什么?我首先联想到的是tcp/ip协议栈,最下面是链路层(只考虑相邻两点间通信),上面是网络层(网络中任意两点间路由),再上面是传输层(流控、纠错、重传、心跳等),顶上是应用层(只要关心进程间交换的数据了)。
理论上,栈上的每一层职责明确,上层不用关心下层的实现细节。类似的,映射到网络应用开发者的前后端分化也是如此,前端自发出http request,后端到给出http response之后就啥都不管了。然而对用户体验而言,整个过程是一体化的,有些细节不清楚,就会导致特定问题无法解决、性能无法调优。
因此个人浅见,“全栈”既不是全知全能,更不是全职全责,而是相对前后端分化而言,两头和中间都懂,基本功深厚,有common scene,能迅速确定排查方向,或缩小排查范围的人。所谓两头和中间是指他应该具备一些前端技能(如js,css,浏览器工作原理,人机交互),清楚网络协议和拓扑结构(数据如何流经网络中各个中间节点,代理、隧道、网关、cdn),并掌握一些后端的技能(J2EE那一套衍生的中间件、数据库等等)。
招“全栈”工程师的出发点,恐怕是为了避免前后端分化导致隔行如隔山,完全不闻不问,只管自己一亩三分地的情况。所以保持一颗好奇心,对相关的知识态度积极些,在实践中有意识地多积累吧。