成为全栈工程师一般的学习路径是怎样的?
补充一下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...
做这样一个简单的 app:
一个天气应用,干净清爽的界面,天气信息一目了然。它不仅可以精确预测未来 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 Things 重新细读。最终你用白纸黑笔敲定了第一个版本的 UI,简洁直观,没有任何多余的设计,所有元素的排列间距 大小颜色都恰到好处。你相信即使天气不好,但用户只要使用这个 App 都会有着愉悦的心情。
那么开始写前端吧。啊,别急,都忘了还有 Icon 和 Logo ,可是不会 PS ,不会 AI ,不会 Sketch 怎么办呢,学吧。你平日喜欢结交不同领域的朋友,正好几周前在一个活动上你认识一位朋友做设计的。她花一个下午的时间教你基本的 Sketch 的使用,并对你的 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
既然原文是说,Facebook 工程师说 Facebook 只招 full stack engineer,那我就来说说 Facebook engineer 都是怎样的人啦。
我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。
Facebook 的众多海报当中,有一张写的是「任何一个 Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入 Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过 JavaScript 并且觉得 JavaScript 很恶心?正确的做法是立即在网上买几本 JavaScript 入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析 JavaScript 语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到 Hive 然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所说的学习能力。
这是高级工程师和初级工程师的主要差距。尽管在高级到初级这一维度上,美国工程师和中国工程师是有重叠的,但美国的教育体系和行业传统使得美国应届生比一般中国工程师更偏向于高级那一端。美国学生的优势在于,他们的教育体系让他们习惯面对开放性问题。一家公司万千问题当中,此时此刻哪一个最值得解决?这不是中国工程师擅长的问题,因为实在是太开放了。中国教育让人擅长在给定条件下解决问题,太开放反而不知道从何入手。此外因为绝大多数文献都是英文的,所以要钻研什么对于能读懂英文的人来说都可以非常成体系的学习,这对于很多拒绝阅读英文的中国工程师来说很不利。拒绝阅读英文意味着永远只能接受别人的二手资料,对于很多概念的理解只能停留在技师的层面,而无法上升到工程师或者科学家的层面。
现有的答案已经说明了,以一个正常人的精力和学习速度来说,想在 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 的东西有什么意义?学的东西用来解决或是改进实际遇到的问题,这样你的整个知识体系覆盖面和侧重点会比较合理。打个比方就是你的技能点有限,所以加点方案得有一个主题,到处乱点的话就废了。
现有的答案已经说明了,以一个正常人的精力和学习速度来说,想在 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 的东西有什么意义?学的东西用来解决或是改进实际遇到的问题,这样你的整个知识体系覆盖面和侧重点会比较合理。打个比方就是你的技能点有限,所以加点方案得有一个主题,到处乱点的话就废了。
从全栈工程师到全栈员工,软件吞噬世界的步伐又进了一步。以下是 Chris Messina的文章
在我离开 Google快两年之后,我开始意识到职业环境正在发生的变化。传统的管理纪律正在渐渐瓦解。要想在职场上成功,需要的技能比以往更加多样而难以定义。如今,要想在职场上有所成就,你必须成为一个真正的博学者,成为一名全能全栈员工。
什么是全栈员工(full-stack employee)?
就像“全栈工程师(full-stack engineer)”和“全栈创业(full-stack startup)”一样,全栈员工(full-stack employee)拥有超强的综合技能,有着无法估量的价值。他们可以在快速演进、变革的技术浪潮中如鱼得水。他们可以在事实稀缺、观点横飞的过剩信息中凭直觉做决定。全栈员工能够熟练运用设计语言,明白使用卡通字体无异于犯罪行为,轻车熟路地嘲弄Keynote、Sketch抑或是Skitch。他们清楚用户界面(UI)和用户体验(UX)的区别。
他们可以和人讨论工程问题,能搞清楚算法、编程,也能理解前端的等级和后端的等级根本不是一回事。虽然他们可能并不亲自编程,但他们知道GitHub、StackOverflow都是做什么的。如果必要,他们会暴力破解一段“复制粘贴”的脚本,在CSV文件中进行基础分析。
他们是最新锐的社交应用的用户,深谙自我推广 之道。他们既可以在听众面前循循善诱地耐心讲故事,也可以在看了3分钟kickstarter视频后就能指出:亮明要点的时间不能长于一段Instagram、Vine短视频。注意力就是这个时代的硬通货。
全栈员工对新的想法、最棒的实现路径、提升生产力和与愉悦度的事情有着“贪得无厌”的胃口。他们对世界及其运转规则充满好奇心,想知道如何留下自己的印记。正是这一点使他们与过去时代的人们区分开来。开始一份工作时,全栈员工不会戴上“眼罩”埋头苦干,而是始终与行业的发展保持同步,因为他们清楚:变革往往出现在边缘地带,不能只盯着脚下的一亩三分地。
一名全栈员工是什么样子的?
有了24小时在线的移动设备,工作和非工作之间的界限正在模糊,既然工作正在变得碎片化,全栈员工要清楚地意识到自己的生活方式也要随之变化,比如使用整体式单色衣柜、功能明确的厨具。
成为全栈员工意味着要在两极之间来回切换。他们既要适应单兵作战,自给自足(比如自己安排时间,使用自己的设备工作),也要能和团队高效协作。过去,在大型团队中,往往需要有一名 IT经理来决定使用何种技术。如今,随着人们越来越多地使用个人设备工作,员工需要自己来搞定跨设备、跨平台沟通等问题。就拿企业协作工具来说。Slack可以整合所有东西,而微软却只对自己平台上的工具开放特权。如果你不能接入其他人的 API,你已经落后于时代了。全栈员工也是如此——他们至少应该熟知所有最新的应用,这样才不会落伍出局。
全栈员工必须要在自己的领域有深刻的洞见,同时也要机动地应对优先事项的转换,胜任不同的安排。组织的扁平化已经不是新现象,变革的动力可能来自顶层,也可能来自底层,有时候需要个体来决定事情的优先级。现场服务工程师(FSE,Field Service Engineer)应该遍布组织内部,却又不能分布的过于稀疏。即使不用监控每一位员工,他们也应该知道每一个人在做什么,保证他们在不熟悉的事情上不会手足无措。
要成为一名全栈员工不是一件容易的事,回报却也很丰厚。首先,他们可以更自由地按照自己的方式、在自己喜欢的地方(Teleport等服务可以帮助他们找到价廉的工作地点)、喜欢的时间工作。他们可以使用最新的工具,自给自足,自我管理。由于他们的工作涉及多领域、多学科之间的协作,会带来更宽广的视野,更丰富多彩的经历。在组织内部,他们的影响力也会不断上升,对组织的成败也将担负起更大的责任,团队的成功与否更加休戚相关。
这对雇主和管理者意味着什么?
对于企业和管理者来说,在人力市场上争夺全栈员工意味着很多准备工作。首先,你们做好准备来吸引、留住这些人才了吗?其次,你们团队的工作风格是否明确,你们对远程办公的支持如何?再次,你们允许的工作时间,支持员工自主安排工作计划吗?最后,你们会给他们留出健身、养生、陪伴家人的时间吗?
Google虽然充分考虑到了员工的健康、精神需求,但反过来也要求员工高度负责。 Google的员工可以以任何方式在任何时间、任何地点工作,只要能最大程度发挥创造力。但它同时希望员工能够随时参加一场临时安排的快速议事会。你的团队准备好了吗?
如果你还没有尝试过,不妨一试,来感受下”全栈员工“的工作环境是什么样子的。不同背景的人们在一个公共空间内彼此协作。他们一直在线,通过Slack等协作对话平台交流。大多数全员协作空间都是临时搭建,多种实体、虚拟的工具混合使用(白板、投影仪、会议室、视频会议设备等)。
对于职员和管理者来说,最需要培养的是”同理心“——员工和管理者都要对彼此有一种“同情的理解”,在彼此沟通、协作、要求时能够提出具体的需求。因为未来的工作需要高度的灵活性和自主性,但这并不意味着每个人给自己下达工作命令、工作指标。管理者的角色依然是必要的。
未来的工作是什么样子的?
说未来的职场将由全栈员工引领,无疑有些夸张,但这是一个显而易见的趋势。毫无疑问,工作的定义正在发生变化,员工的最大价值是应对不确定性,能够从海量的信息中提炼出有效的战略、战术。
而且,在工作机器人大规模“入侵”之前,我们只有10年的时间。他们正在取代体育新闻、驾驶、快递等重复性工作,人们要重新思考适合自己的角色。感知和综合的能力将是第一位的,而语言、辨析力和同感力在进行复杂、敏感的任务是都是必备技能。全栈员工将帮助我们向未来过渡,将成为新的混合经济中的关键角色。
auxten,面向工资编程
高中的时候喜欢踢球,班上有一个特别厉害的前锋,用我们对手的话就是:“挡也挡不住,跑也跑不过,绊都绊不倒”。
嗯,我认为的一个“全栈工程师”,不是仅仅能从汇编写到JavaScript,从PHP写到Objective-C。更是从代码到PhotoShop,从产品设计到地推样样行,样样懂。
从小了说,给他安排个你自己都没想太明白的任务,他给你一个惊喜。
从大了说,就是既能当CTO,又能当COO,没有各种CXO,自己也能当CEO。
==============分割线==============
说一个我一个朋友@程一仕的故事吧,我是在大三认识他的。当时我是学校论坛的系统管理员,正在招人接替我毕业后在学校的工作。招了好久没有入得了我法眼的,这时我师傅说找到一个不错的。
说实话,第一次见面我对他没啥好印象,因为这货抽烟,完全不像是一个搞技术的。后来一起通宵修理服务器,研究技术,慢慢发现这货是个挺有意思的人。
以后的日子里我带着他一起写Python,写C,写JS。。。我发现他就是那种能不断给我惊喜的工程师。。。
我们工作室的传统是,每年暑假大家都在学校做封闭开发,当时我找了个去IBM实习的机会,想让他替我留校。最后一聊,这货没空,暑假要骑自行车去西藏。。。我才发现他还是个文艺青年(当时还不是那么贬义)
后来,他到了大三,去的支付宝实习,做运维开发。
再后来跟我一样去了百度,不到三年时间,就升到了T6。。。
有一天无意发现这货豆瓣竟然有上万的粉丝,一问才知道,有一天他闲得无聊,写了篇骂豆瓣的产品的帖子,由于字字鞭辟入里,连豆瓣的产品同学都直呼骂得好(抖m的既视感),不断邀请他来豆瓣做产品,直到他亮出T6的身份,对方才作罢。
此人还对人文历史政治总有很多见解。每每觉得无聊,第一个想到拉他出来吃吃饭,每次都有新收获。
几个月前,他跟我说他前几天被一伙人拉着去融资了,那伙人是想搞云存储的,发现他对分布式存储很有研究,就生生拉上他去壮大阵容。。。
我就问,他们怎么知道你对这个有研究呢?这货拿起手中的加冰可乐,33.3°仰望天花板:“因为MooseFS有部分代码是我写的”。
后来才知道,这货已经是百度分布式存储&缓存Topic的负责人了。。。。
就在我为他要在技术的道路上超越我而惶惶不可终日的时候,有一天,他问我有没有兴趣回成都。。。
原来,这段时间他拉着几个学弟搞了个无节操(约XX)的叫“谁有空”的APP(啧啧,这名字。。),拿了几百万的融资,开始出任CEO,走向人生巅峰了。。。
他也教会我一件事,遇到比自己厉害的学弟,不要嫉妒,不要尝试去压制,因为“有些鸟注定是不会被关在笼子里的,它们的每一片羽毛都闪耀着自由的光辉”。可能有一天你就要去他公司打工呢。
所以,过了这么久,我最喜欢的一个身份还是
曾经这个全栈工程师的“师傅”。
突然就想起这个表格了http://static.icybear.net/[CN]Programmer%20competency%20matrix.htm
如果说要想全部达到level3,没有三四十年怕是不行吧,到时候还会有新的知识,永远达不到的。
所谓的全栈都是资本家们根据他们的业务自我衡量的,骚年们还是从基础好好打起吧。基础好,学习就快,所谓阳光下没有新鲜事嘛,学计算机你懂得的。
网友评论