<audio id="audio" title="开篇词 | 从成长角度看，为什么你应该成为全栈工程师？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/34/9d/34420c93edaadaba95e9d6822c78a59d.mp3"></audio>

你好，我是软件工程师熊燚，网上大家都叫我四火，很高兴在这个专栏和你见面。

先介绍下我自己。最早我在华为工作，曾是华为某大型视频门户和视频平台的初创人员，也是一名不折不扣的长期看护其基线版本的全栈工程师，这段经历其实为我的全栈技能打下了一个很好的基础。

后来我加入了亚马逊（Amazon），负责数千万商品销量预测系统和成本利润计算平台的研发，从  0  到  1  重新设计并开发了数据分析和可视化系统，还维护和优化过数据分发的高可用服务，也改进过核算平台的分布式计算架构和工作流引擎，这些多领域的工作让我快速成长，并积累了大量的宝贵经验。

现在，我在西雅图甲骨文（Oracle）的云计算部门就职，职位是首席软件工程师，主要负责研发云基础设施的分布式工作流引擎。

入行这十来年，从前端页面到后端服务，从大小网站到分布式系统，从数据分析处理到可视化，从设计开发到线上运维，我都参与过，并带领团队攻克了很多大的项目堡垒，也以全栈工程师的身份上线了不少核心业务产品。

可以说，我是一名全栈工程的实践者，也是一名程序员综合发展的信奉者，还是一名工程师文化的鼓吹者，有一个建立了很长时间的独立博客“[四火的唠叨](https://www.raychase.net/)”。

那提到全栈工程师，你可能第一时间会想到  “全能”“大神”这些词语，也可能听到过其他人对它或褒或贬的评价。那么，究竟该怎么恰如其分地认识这个角色呢？我想和你说说我的看法。

**软件工程的范畴里，人类创造了大量的概念和术语，绝大多数都清晰而精确，但“全栈工程师”却是个反例**。在互联网出现以前，甚至在客户端和服务端模式出现以前，大多数的程序员，就已经是一定意义上的“全栈”了，他们往往涉足硬件、软件，完成程序从开始到终结各个阶段的工作。

千禧年之后，Web，特别是 Ajax 等前端技术迅猛发展，而技术的进步就自然而然地带来了分工，于是有人负责前端，有人负责后端，甚至划分得更细，此时能够做两头事情的人，才显得更加珍贵。因此，我认为  **Web技术的发展和自然而然引发的分工才是全栈工程师出现的最重要的因素**。

2008年，在 forge38 上面出现了一篇题目为“[Full Stack Web Developers](http://web.archive.org/web/20101204221657/http://forge38.com/blog/2008/06/full-stack-web-developers/)”的文章，被认为是最早提及这个概念的媒体之一。

文中是这样说的：

> 
A full stack web developer is someone that does design, markup, styling, behavior, and programming.


大概意思就是说，一个全栈的web开发者，会负责设计、标记、样式、行为和编程这些全部的事情。

虽然从现在的眼光看，这个概念的解释似乎有些古老而片面 ，可从上面的历史文字中足以看出，为什么当我们提及全栈，往往总是基于“Web”，而非其他领域了。

到了今天，全栈工程师已经变成了一个有些被滥用的概念，不同人有着天差地别的理解。

我认为，首先必须明确的是，“全栈”不是“全能”，当然，在这个标准下我们依然可以将全栈理解为“广义”的全栈和“狭义”的全栈。显然前者的包容性和不确定性过大，我觉得只有后者才有更实际的讨论价值，并且，**广泛的 Web 技术才是一名通常意义上的全栈工程师最该专注的核心内容**，而此处的 Web 技术，包括网络、前端、后端 MVC、持久化技术等多个层次。

那从成长角度看，为什么我说你应该成为全栈工程师呢？

和其他软件工程师发展的路线相比，除了通用工程师的技能以外，我认为基于 Web 的全栈技术是一种非常适合用来进一步发展和修炼的技能树，和其它的技术类别比起来，它至少有下面这样几个明显的优势。

## 关于个人发展

首先，互联网是全栈概念的诞生地，也是软件领域最激动人心的产品和技术的诞生地，这是传统软件所无法比拟的。这些互联网的全栈工程师，每天都在接收新的资讯，每天都“不得不”和这些全新的技术理念搏斗，他们拥有着和这些产品与技术最近距离访问、全面接触和深入研究的机会。你可能很难预测下一波互联网的技术浪潮什么时候到来，技术主角又是谁，但全栈技术是可以帮你打好基础，做好随时拥抱它的准备的。

其次，可以掌握能够快速获得反馈的学习方法，这对于保持持续学习的动力和热情很有助益。比如说，几行 HTML 代码就可以马上看到效果，简单安装和配置，就可以搭建一个健壮的 Web 服务，对当前浏览器即时的标签、脚本、样式修改，立即就能看到变化。

再次，全栈技术的学习之路上有很多纷繁精彩的“套路”，而它们可以应用在软件工程的其它领域。可以说，**全栈技术中，有太多能帮助程序员开启新世界大门的东西了**，比如 JavaScript 的异步编程，比如各种数据、模板和逻辑的解耦和分层，再比如说持久层技术里面的读写模型分析。

最后，必然是视野的拓展。工程师的成长过程中，在早、中期可以利用全栈技术拓宽视野，并养成思考的习惯。**最终也许我们需要“学得精”，但是一开始我们一定要“学得杂”**。只有在广度上有足够的积累，足够的内容去比较，才能养成思考的习惯，拥有更全面地看待问题的视野。

拿我自己来说，工作以来我花了很多时间去做一些不同领域的项目，比如我现在的工作是研发一个分布式工作流引擎，从 Web 全栈技术上学到的东西，是能够帮助我快速上手这些技术的。同时，理解它们的本质，也能拓宽分析和解决问题的思路。毕竟，在软件领域，技术都是相通的。

## 关于就业和创业

首先，全栈工程师本身就拥有多技能、多角色。团队非常欢迎这样的人，因为当一个人可以扮演多个人的角色，就减少了沟通和配合的损耗，提高了效率。出了问题，从客户端到服务端，对多个层面都有所了解的全栈工程师可以更高效地分析和定位问题。这个世界需要专家，但我觉得更需要通晓各个层面知识，能够快速解决问题的人。

其次，全栈工程师是创业的最佳技术角色。有了创意和点子，全栈工程师就可以快速地开发原型，迅速实现第一个版本，并能马上提供优质的宣传推广和用户体验。不要小看这一点，在很多情况下，**全栈工程师不需要其它额外的协助，自己就可以很快地将想法变现**。

再次，全栈工程师拥有最多的就业机会。有朋友半开玩笑说，你知道世界上什么类型的应用最多见吗？网站！各式各样的网站，内部的管理系统、报表系统、论坛、博客，但无论是哪种类型，它们都是全栈工程师最熟悉的东西。你可能耳闻过著名的 [Facebook 只招全栈工程师](https://www.laurencegellert.com/2012/08/what-is-a-full-stack-developer/)这样听起来似乎有些“极端”的故事，可事实上，几乎所有的互联网大型公司，都会招聘大量的全栈工程师。

<img src="https://static001.geekbang.org/resource/image/f9/9e/f90b92c41ca6ecedc5d8af2224aa9f9e.jpeg" alt="">

（上图来自 [HackerRank](https://blog.hackerrank.com/full-stack-developer/)，报告原引用于 HackerRank 2018 Developer Skills Report，在开发者评价自己角色的时候，最多的人投票给了“全栈开发者”。）

最后，不妨考虑下未来的职业延伸。**有了全栈工程师的底子，未来面对软件行业进一步细化，选择其它细分职业时，会因为有了全面而扎实的基础而更有利。**

举例来说，假如你做过一段时间的前端程序员，那往往对用户交互设计是有一定的心得的，我有朋友就是从一个擅长前端的全栈程序员转行做了产品经理；而在 MVC 部分学习的分层和解耦经验，持久层部分积攒的那些对于一致性、可用性的理解，对于将来想投身于分布式系统设计开发的程序员朋友会很有帮助。

我认为对于大多数程序员来说，全栈工程师这个职位对于自己的发展而言，是个非常好的进阶方向。而基于 Web 的全栈技术学习，充满必要性，无论你今后是否志在互联网，无论你的远期目标是在哪个软件领域。

最后，我想认识一下你。你可以在留言区中做个自我介绍，说说你现在的工作、学习情况。或是说说你眼中的全栈工程师是怎样的？你认为应该具备怎样的特质，才能成为全栈工程师呢？欢迎你在留言区和我交流。


