全栈工程师
软件工程师熊燚,最早我在华为工作,曾是华为某大型视频门户和视频平台的初创人员,也是一名不折不扣的长期看护其基线版本的全栈工程师,这段经历其实为我的全栈技能打下了一个很好的基础。
后来加入了亚马逊(Amazon),负责数千万商品销量预测系统和成本利润计算平台的研发,从 0 到 1 重新设计并开发了数据分析和可视化系统,还维护和优化过数据分发的高可用服务,也改进过核算平台的分布式计算架构和工作流引擎,这些多领域的工作让我快速成长,并积累了大量的宝贵经验。
现在在西雅图甲骨文(Oracle)的云计算部门就职,职位是首席软件工程师,主要负责研发云基础设施的分布式工作流引擎
软件工程的范畴里,人类创造了大量的概念和术语,绝大多数都清晰而精确,但“全栈工程师”却是个反例。在互联网出现以前,甚至在客户端和服务端模式出现以前,大多数的程序员,就已经是一定意义上的“全栈”了,他们往往涉足硬件、软件,完成程序从开始到终结各个阶段的工作。
千禧年之后,Web,特别是 Ajax 等前端技术迅猛发展,而技术的进步就自然而然地带来了分工,于是有人负责前端,有人负责后端,甚至划分得更细,此时能够做两头事情的人,才显得更加珍贵。因此,我认为 Web 技术的发展和自然而然引发的分工才是全栈工程师出现的最重要的因素。
广泛的 Web 技术才是一名通常意义上的全栈工程师最该专注的核心内容,而此处的 Web 技术,包括网络、前端、后端 MVC、持久化技术等多个层次。
和其他软件工程师发展的路线相比,除了通用工程师的技能以外,基于 Web 的全栈技术是一种非常适合用来进一步发展和修炼的技能树,和其它的技术类别比起来,它至少有下面这样几个明显的优势
全栈的个人发展
首先,互联网是全栈概念的诞生地,也是软件领域最激动人心的产品和技术的诞生地,这是传统软件所无法比拟的。这些互联网的全栈工程师,每天都在接收新的资讯,每天都“不得不”和这些全新的技术理念搏斗,他们拥有着和这些产品与技术最近距离访问、全面接触和深入研究的机会。很难预测下一波互联网的技术浪潮什么时候到来,技术主角又是谁,但全栈技术是可以帮你打好基础,做好随时拥抱它的准备的。
全栈技术的学习之路上有很多纷繁精彩的“套路”,而它们可以应用在软件工程的其它领域。可以说,全栈技术中,有太多能帮助程序员开启新世界大门的东西了,比如 JavaScript 的异步编程,比如各种数据、模板和逻辑的解耦和分层,再比如说持久层技术里面的读写模型分析。
视野的拓展。工程师的成长过程中,在早、中期可以利用全栈技术拓宽视野,并养成思考的习惯。最终需要“学得精”,但是开始一定要“学得杂”。只有在广度上有足够的积累,足够的内容去比较,才能养成思考的习惯,拥有更全面地看待问题的视野。
拿我自己来说,工作以来我花了很多时间去做一些不同领域的项目,比如我现在的工作是研发一个分布式工作流引擎,从 Web 全栈技术上学到的东西,是能够帮助我快速上手这些技术的。同时,理解它们的本质,也能拓宽分析和解决问题的思路。毕竟,在软件领域,技术都是相通的
关于就业和创业
首先,全栈工程师本身就拥有多技能、多角色。团队非常欢迎这样的人,因为当一个人可以扮演多个人的角色,就减少了沟通和配合的损耗,提高了效率。出了问题,从客户端到服务端,对多个层面都有所了解的全栈工程师可以更高效地分析和定位问题。这个世界需要专家,但更需要通晓各个层面知识,能够快速解决问题的人。
其次,全栈工程师是创业的最佳技术角色。有了创意和点子,全栈工程师就可以快速地开发原型,迅速实现第一个版本,并能马上提供优质的宣传推广和用户体验。不要小看这一点,在很多情况下,全栈工程师不需要其它额外的协助,自己就可以很快地将想法变现。
再次,全栈工程师拥有最多的就业机会。内部的管理系统、报表系统、论坛、博客,但无论是哪种类型,它们都是全栈工程师最熟悉的东西。
你可能耳闻过著名的 Facebook 只招全栈工程师这样听起来似乎有些“极端”的故事,可事实上,几乎所有的互联网大型公司,都会招聘大量的全栈工程师
有了全栈工程师的底子,未来面对软件行业进一步细化,选择其它细分职业时,会因为有了全面而扎实的基础而更有利。
举例来说,假如你做过一段时间的前端程序员,那往往对用户交互设计是有一定的心得的。擅长前端的全栈程序员转行做了产品经理;而在 MVC 部分学习的分层和解耦经验,持久层部分积攒的那些对于一致性、可用性的理解,对于将来想投身于分布式系统设计开发的程序员朋友会很有帮助
每一项综合技术都有自己的特点,基于 Web 的全栈技术也不例外。它五花八门,涉及面广,同类技术多,技术迭代迅猛,技术资料新等等,就如同下山的猛虎,成为了很多程序员朋友迈向全栈大门的一道阻碍。经常听到这样的抱怨:
- 想学 Web 全栈技术,期待能独立交付产品,但真的很迷茫。
- 具体某项技术还好说,可全栈包含了那么多技术,眼都要看花了。
- 我该从哪里开始,遵循哪些原则,学习哪些技术?
修炼全栈技术
工程师也有自己的必修课,比如数据结构和算法。对于任何一个领域的软件工程师而言,它们都是基础,怎样强调其重要性都不为过。并且无论你是刚入行的程序员,还是打拼了几十年的架构师,标准都是一样的。
以 Amazon 和 Oracle 来说,虽然对技术级别高的程序员候选人,会更多地考察基于经验和思路的系统设计等方面,但代码层面的要求,包括数据结构和算法,对于不同级别的工程师来说 ,基本是一样的。
请注意,这里的要求不只是能够写代码,而是要在面试现场,在有限的时间内,在白板上写代码
对于进阶的工程师来说,英文能力是突破天花板的一个必选项。因为基于 Web 的全栈技术迭代很快,新的技术资料一般都是英文的,英文能力,尤其是英文的阅读能力会很大程度地影响知识获取的速度。
其次,在获取知识的基础上思考,尤其是从比较中思考。思考,我认为是一个软件工程师所有习惯中最重要的一项。我们在实际工作中需要解决各种各样不可预料的问题,缺乏思考的人只会用自己所知道的技术生硬地往上套,而不去考虑是否适合问题本身,不去分析和比对不同解决方法的优劣。对于全栈技术学习而言,由于技术种类多,同类技术多,基于比较的思考就显得更为重要
专栏内容设计
专栏的主要目的是介绍原理、分享认识、探讨观点、串联知识,并引发思考,带给你进一步学习和实践的机会,而不是完全一步一步教导具体怎么做。因此,这些内容最直接的目标不是希望你了解所有的细节,或者一下子精通其中的某一项技术
比如,不会具体而全面地讲解 Spring MVC 怎么配置,Tomcat 怎么搭建,而是希望能突出某几项有代表性的技术特性来介绍——它们为什么被创建出来,它们的价值在哪里,都有什么优劣,并在整体上着眼于全局,对基于 Web 的全栈技术有一个认识和把握
即便没有这些内容,你也一定可以学习自己感兴趣的全栈技术,但是这些内容可以帮助你开拓眼界,将这些知识点逐项整理并系统化,帮助你养成在学习实践中思考的良好习惯。先知道“有什么”,才知道“学什么”,最后才能具体去学习,虽然具体的学习往往是没有捷径的,但是“有什么”和“学什么”却可以充分借由他人经验。
再进一步说说内容广度和深度的问题。
- 内容广度:选择每个核心领域的代表性技术来介绍
- 内容深度:把深度控制在合适的位置,让入门到进阶的工程师都有收获
具体内容上,专栏包含网络协议和 Web 接口,MVC 架构相关,前端技术,持久层技术和最佳实践等几大章
在文章中,会提到一些工具,也会谈到一些关键的命令执行和配置过程,但具体到某些工具的安装,部分我会给出网址,还有一部分工具则是可以使用常规的包管理工具下载安装,比如 macOS 下的 Homebrew,比如 Ubuntu 的 apt-get。通常情况下,请尽量使用 *nix(包括 Linux 和 MacOS) 而不是 Windows
每个全栈工程师的学习路径都是独特的,全栈和许多其它软件领域的技术一样,五花八门,日新月异,因此并不好学。我想很少有职业和程序员一样,需要持续、广泛地学习。有诸多品质在学习的过程中都起着至关重要的作用,但是我认为,恒心的作用尤为突出
课程设计
这些内容围绕基于 Web 的全栈技术进行展开,主要包括“网络协议和 Web 接口、服务端 MVC、前端技术、数据持久化、最佳实践和专题”
1. 学习目标
学完之后,你可以对基于 Web 的全栈技术有一个系统的认识,深度掌握全栈工程师必备技能,理解技术本质,而不仅仅是停留在技术配置和使用的表象,能够将作者交付的知识复用到自己的实际进阶中去。另外,你还可以将零散的知识点联结成一棵全栈技能树,培养“全栈思维”
2. 内容优势
专栏内容可以帮助你在入门或者进阶全栈的道路上,梳理出一条高效的学习路径,并掌握这条路径上有代表性的技术。
目前市面上针对单一 、具体技术的教程有很多,但我们独辟蹊径,以系统的全栈技术关系树为基石,重点关注核心技术栈主流技术之间的关联和演进,介绍这些技术间的权衡,探究它们的本质,结合实践、沉淀知识、带动思考。
3. 特色板块
热点答疑:基于内容性质,我们在前五章的最后一讲都设置了热点答疑,目的就是综合你的留言反馈进行分享,定位是较为开放式的,不局限于每一讲中的问题解答。关于“全栈工程师”这一职位,除了某一特定技术点,如果你有更感兴趣的内容,也
总结思考:鉴于这些内容的总结和思考是有强关联的,所以合并到了一起,总结主要就是回顾本文所学的内容,很好理解了。要特别说明下思考题部分,每一讲的末尾我们会设置两道思考题,一道难度较低,另一道难度略有升级,你可以根据自己的学习程度和本身积累在留言区中分享答案,作者会有针对性地进行回复。当然了,如果可以,十分鼓励你两道都解答一下,对于消化理解所学的知识内容,培养自己的全栈思维很有帮助。
选修课堂:这是一个全新的板块,如果我们将总结思考之前的内容,定位为必修,那么选修课堂的功能就一目了然了。这部分的内容你可以结合自身情况,选择性阅读,它们是与该讲主题强相关的知识,但不会影响必修部分的学习,它们可能该讲中某一步骤的实践过程,帮助你强化认识,也可能是某一重要知识点的详细讲解,帮助你查漏补缺。同时,这个板块是根据每一讲的主题进行考虑的,对于无需增设选修课堂的主题,总结思考之后会直接进入“扩展阅读”板块。
扩展阅读:同上,也是一个全新的板块,每一讲作者都精心准备了一组链接,大致 3~5 篇,每个链接都有文字说明。出于对质量的考虑,这里有部分是英文资料,这里要再强调一下,英文能力也是软件工程师进阶的必备能力之一,这一点作者在学习路径中已经谈过了,但修炼英文非朝夕之事,你也不必过于担心,同等质量下作者会优先选择中文资料进行推荐,如果理解上有困难,还可以借助一些翻译软件,遇到难点,也
这些资料有自己的定位,不是“有了更好、没有也行”的可有可无的内容,而是可以帮助你进一步展开学习的重要资料。考虑到每个人的基础不同,它们有的是简单的教程,也有的是技术背景介绍,还有某一技术长项和短处的拓展分析等等。
值得注意的是,少数资料前会标有【基础】字样,这表示该内容涉及的知识点较为基础,如果你对该讲的理解有困难,可以去这样的链接中找找答案。另外,这些资料中没有大厚书,并不是说它们不好,而是作者希望每一讲的内容,你都能在有限的时间内完成阅读、思考、练习和拓展这样的一个闭环
学习攻略
攻略一:利用好特色板块
鉴于全栈工程师的学习性质,这些内容我们开创了不少特色板块,每个板块的作用在上面我都做了详细说明。请你一定要结合自身情况利用好它们,尽可能不要错过“选修课堂”和“扩展阅读“,它们是可以帮助你快速提升,且拓展你知识版图的内容
攻略二:勤于动手实践
全栈所包含的知识点非常多,最好的记忆方式就是实践,亲身操作一遍,你会打开一扇新世界的大门——原来全栈并没有那么难。跟着作者文章中分享的小案例亲自做一做,跑一跑代码,自己验证下结论,这是个很高效的学习方法,我十分鼓励你这样做
不过也正因为这些案例,我推荐你首选文字 + 音频这样的学习方式,只听音频的话,对于这些内容来说,理解上会有一定难度
攻略三:在联想和比较中学习
基于全栈知识树庞大和繁杂的特点,它的学习方法会有所不同,它需要你多去尝试比较同类技术,并且将所学理论和工作中实际应用的技术、遇到的问题结合起来。它需要你掌握隐藏在具体技术背后的通用“套路”,联结不同技术,使之成为一个健壮的知识网格,真正将技术的理解落实到本质上去
攻略四:充分利用留言区
留言区最直观的作用就是完成思考题,每一讲的思考题都是作者精选的,如果你能解答,并分享出来,得到作者和其他同学的肯定,相信你已经对该讲的内容有了深度的认识了,通过这样的方式对所学进行自我检验,是个非常高效的方法。
除此之外,你还可以在这里进行学习总结、强化输出,提出问题、解决困惑,回复他人留言、发起互动,从“消费者”角色升级到“生产者”角色。
攻略五:善于分享
极客时间平台提供了很多分享功能。比如,看到硬核知识点、金句或深有感触的内容,你可以长按做划线笔记,点击分享就可以生成精美的知识卡片,将所学随手记录或分享出去。如果你希望分享整篇文章,或者邀请你的朋友一起打卡学习,还可以点击文稿右上角的“请朋友读”,把这门课推荐给朋友。
这里的分享更像是一种知识交换,给予越多,收获自然也就越多,期待在这个过程中,你的知识体系也能得到锤炼。
攻略六:有计划地学习
这些内容的更新频率为每周一、三、五,共计 40 讲,更新时间 14 周,你可以跟着作者的更新频率进行学习。一篇文章发布后你有两天的学习时间,你可以一天学习每讲的必修内容,一天学习选修课堂和扩展阅读,当然了,你也可以根据自身情况,自己制定合理的学习计划
修炼全栈,横向对比技术,纵向挖掘技术,再串联知识,形成一个知识体系,这本身并不是一件容易的事儿