你好,我是软件工程师熊燚,网上大家都叫我四火,很高兴在这个专栏和你见面。
先介绍下我自己。最早我在华为工作,曾是华为某大型视频门户和视频平台的初创人员,也是一名不折不扣的长期看护其基线版本的全栈工程师,这段经历其实为我的全栈技能打下了一个很好的基础。
后来我加入了亚马逊(Amazon),负责数千万商品销量预测系统和成本利润计算平台的研发,从 0 到 1 重新设计并开发了数据分析和可视化系统,还维护和优化过数据分发的高可用服务,也改进过核算平台的分布式计算架构和工作流引擎,这些多领域的工作让我快速成长,并积累了大量的宝贵经验。
现在,我在西雅图甲骨文(Oracle)的云计算部门就职,职位是首席软件工程师,主要负责研发云基础设施的分布式工作流引擎。
入行这十来年,从前端页面到后端服务,从大小网站到分布式系统,从数据分析处理到可视化,从设计开发到线上运维,我都参与过,并带领团队攻克了很多大的项目堡垒,也以全栈工程师的身份上线了不少核心业务产品。
可以说,我是一名全栈工程的实践者,也是一名程序员综合发展的信奉者,还是一名工程师文化的鼓吹者,有一个建立了很长时间的独立博客“四火的唠叨”。
那提到全栈工程师,你可能第一时间会想到 “全能”“大神”这些词语,也可能听到过其他人对它或褒或贬的评价。那么,究竟该怎么恰如其分地认识这个角色呢?我想和你说说我的看法。
软件工程的范畴里,人类创造了大量的概念和术语,绝大多数都清晰而精确,但“全栈工程师”却是个反例。在互联网出现以前,甚至在客户端和服务端模式出现以前,大多数的程序员,就已经是一定意义上的“全栈”了,他们往往涉足硬件、软件,完成程序从开始到终结各个阶段的工作。
千禧年之后,Web,特别是 Ajax 等前端技术迅猛发展,而技术的进步就自然而然地带来了分工,于是有人负责前端,有人负责后端,甚至划分得更细,此时能够做两头事情的人,才显得更加珍贵。因此,我认为 Web技术的发展和自然而然引发的分工才是全栈工程师出现的最重要的因素。
2008年,在 forge38 上面出现了一篇题目为“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 只招全栈工程师这样听起来似乎有些“极端”的故事,可事实上,几乎所有的互联网大型公司,都会招聘大量的全栈工程师。

(上图来自 HackerRank,报告原引用于 HackerRank 2018 Developer Skills Report,在开发者评价自己角色的时候,最多的人投票给了“全栈开发者”。)
最后,不妨考虑下未来的职业延伸。有了全栈工程师的底子,未来面对软件行业进一步细化,选择其它细分职业时,会因为有了全面而扎实的基础而更有利。
举例来说,假如你做过一段时间的前端程序员,那往往对用户交互设计是有一定的心得的,我有朋友就是从一个擅长前端的全栈程序员转行做了产品经理;而在 MVC 部分学习的分层和解耦经验,持久层部分积攒的那些对于一致性、可用性的理解,对于将来想投身于分布式系统设计开发的程序员朋友会很有帮助。
我认为对于大多数程序员来说,全栈工程师这个职位对于自己的发展而言,是个非常好的进阶方向。而基于 Web 的全栈技术学习,充满必要性,无论你今后是否志在互联网,无论你的远期目标是在哪个软件领域。
最后,我想认识一下你。你可以在留言区中做个自我介绍,说说你现在的工作、学习情况。或是说说你眼中的全栈工程师是怎样的?你认为应该具备怎样的特质,才能成为全栈工程师呢?欢迎你在留言区和我交流。
精选留言
2019-09-09 17:59:25
2019-09-09 23:26:00
目前回到二线城市原本是准备继续之前的职业平谈下去,理想很美好现实很残酷;去年某个DBA圈子的老友又刚好把极客时间推荐给我了,学了赵成老师的运维体系,二叉树视频陈皓老师的跳出金融业的行动引发了反思;目前在本地的某互联网企业主要负责数据库和linux系统相关的性能维护和优化。
全栈这个词我是在Google SRE这本书看到的:DepOps其实同样是全栈,这本书中强调运维开发其实不分家,其实这就是一种全栈;故而我非常想从老师的课程中去学习和明白道理的修正/调整,以便能够够好的走好后面的路。
2019-09-14 17:08:49
2019-09-12 17:00:50
1. SQL: mysql、oracle、sqlserver, db2, MongoDB, HBase, 人大金仓,神通
1.1 对接过程中需要申请应用id秘钥,解密,存库,加密。
1.2 已有应用对接办公平台,会牵扯到数据初始化,数据迁移。
2. JavaScript, html, css, Ajax, jsp前端技术
2.1 办公桌面负一屏,会牵扯到前端接口的调用,需要用到基本的JS
2.2 平台对接过程中可能会遇到应用前端代码的问题,需要阅读应用前端源码
3. vue,webpack,react等前端新技术
4.1 技术一直在持续发展,好多公司也会追随新技术的步伐,学习流行的技术也是为更好的技术支持服务做铺垫。
4. Nosql技术: memcached, redis, Ehcache, mongodb
5. elasticsearch,Lucene, solr等搜索技术
6. 负载均衡:
Nginx:高性能、高并发的web服务器;功能包括负载均衡、反向代理、静态内容缓存、访问控制;工作在应用层
LVS: Linux virtual server,基于集群技术和Linux操作系统实现一个高性能、高可用的服务器;工作在网络层
7. webserver:
Java:Tomcat,Apache,Jboss,Tongweb, AAS
8. service:
SOA、微服务、spring boot,django
9. 容器:
docker,kubernetes
10. 协调中心:
zookeeper、etcd等
11. rpc框架:
grpc、dubbo、brpc
12. 消息队列:
kafka、rabbitMQ、rocketMQ、QSP
消息队列的应用场景:异步处理、应用解耦、流量削锋和消息通讯
13. spring, spring boot, spring cloud, hibernate, mybatis, maven, gradle,网络编程,并发编程, http、tcp协议等
2019-09-10 09:26:56
对我而言,全栈不是意味着全要精通,而是需要熟悉整个研发体系,了解技术栈。这样子无论是团队合作还是后来带团队带项目都是非常有帮助的。而且通过加强全栈学习,也会改变自己思考问题的方式,这种影响不局限于工作范围
2019-09-13 09:04:30
2019-09-09 23:01:46
2019-09-09 17:42:56
自己学的话,老是觉得很多技术层出不穷,而且接触很多方向的话,每个方向的深度都不会深入太多,而且学东西,实际工作用不到,或者做不出什么东西出来的话,感觉学习效果没那么好。之前也有看到国外的full stack 培训班,可是3000,5000刀的价格确实太贵。
不知道学习这门课,是不是可以在老师的指引下,做一个完成的包含前后端技术栈的产品出来? 希望至少对软件架构这块有个入门。
2020-08-21 00:40:01
主要课程:
在学校期间,学的是计算机基础,计算机组装与维修,网络基础,ps,flash, c语言, linux, Dreamweaver, office,高数,英语,mysql,数据结构与算法,网络安全,jsp
课程情况:
1. 对于上面的课程,老师上课完全是读ppt,而且还不是这个专业的老师(除了数学英语),问他们问题,多数都是答不上来
2. 像我们计算机的,上了两年大专,还没有碰过学校的电脑,至于为啥,学校说没有多余的机房分配给我们,虽然我们老师也申请过很多次,但都被回绝了,但经过我的观察,多数的机房都是空的
3. 大专的环境,基本上上课了周边的都是打游戏的,由此上课都是自己带本书,到一个角落,学自己想学的
第一个学期,因为有c语言课程,觉得挺有趣就开始看视频自学,从c到c++再到qt,可以自己搞一些简单的小应用,工具
在第二个学期,一个同学的指引下,我接触到了html跟css,就开始了前端的自学路程,从此踏上了前端的道路
从html开始, css, js, jq, jq源码, node.js,webpack,vue全家桶, git, 中间捣鼓了一下flutter,折腾了下linux
疫情的时候使用flutter做了个起床打卡app,使用php搭建后台服务器存储数据
五月份左右,使用node.js+vue独立做了一个博客,并上线在宝塔中
至此现在毕业,找工作的时候面试了,5家公司,全是培训机构。说我能力不行,需要培养(费用2w,称可以帮我分期,培训完再开始还),知道这是个坑,果断的拒绝了。
后来在掘金看到了个内推网易的,就去试了下前端开发实习生。
笔试之前,做了很多复习: 笔试题, http,缓存,dns,浏览器渲染过程,手写各种es6的函数,this,原型链....., webpack原理, vue双向绑定, git......
到了笔试那天,怀着忐忑的心,打开了笔试网页, 先是文化题,后是数学的,然后是编程题: 打开后人都傻了,就四题,但全是算法题,虽然学过算法课,但真要写算法,我也只会个冒泡,堆栈,链表! 然后硬着头皮做,虽然在本地运行输出没问题,但一题都没过,我想应该是一些极端条件没想到,结果就是网易跟我说拜拜了
心灰意冷,进了家小公司(有多小? 只有30来人)做着学徒,因为主要业务小程序的,又没有学过,所以只好从学徒开始干,每月600的补贴(不包吃住),其实就是每天去公司自学,也没人管你,我觉得这能把我零碎的学习时间组合起来,也挺好。
我知道大专跟正常的大学生有些很大的基础差距,我希望能够转正后系统学习计算机基础知识
再等实习完,参加升本考试(招聘硬性要求本科学历)
最后,希望老师能指点下,实在是迷茫不知道怎么走下去,虽然明确了学历前进的方向,但却不知道技术的道路如何走下去,难道真的要从算法开始学起来?
2019-09-09 17:30:06
2020-05-08 15:13:49
2019-09-12 12:00:17
2019-09-12 11:12:59
2019-09-09 17:57:53
2020-05-25 20:08:03
自己今年三十多岁,十年的开发, 是从PHP开始的技能标签一大堆 :
前端:jquery、vue、bootstrap、mpvue、公众号/小程序开发、vant
后端:codeigniter、thinkphp、lumen、scrapy(python)
存储:redis、mysql
运维:zabbix
大数据:hadoop、flume、kafka、elasticsearch、filebeat
但真的觉得很杂但又没有很专,最近在补架构与算法的知识,老实说用过这么多并没有让自己感觉比别人厉害很多
2019-11-11 20:55:05
本科是跟计算机完全无关的文科,出于兴趣,研究生到了CMU读信息系统,不算是非常正统的计算机科目,但是有机会跟很多出众的同学们学习。现在在澳洲一家创业公司任职全栈工程师不到一年,看到您的文章,认同其中很多观点:选择全栈也是因为它可以让我自主构建项目;工作机会多;可以从广度上了解这个行业,为将来架构或者说管理层面打下基础。将来打算base澳洲,赶赴美国任职软件工程师,现在也是在学习全栈技术的同时,偶尔看看数据与算法的题目。文末感谢您提供的课程给了我很多很多启发。
2019-09-22 19:46:15
2019-09-13 08:41:30
对于全栈的理解我就比较模糊了. 大学喜欢前端, 后来毕业学了后端, 现在前端忘得差不多了, 主攻后端. 对于如何成为全栈工程师前途迷茫啊.
先跟着老师好好, 规划一下学习路线, 总觉得公司用什么学什么太慢, 但是不用又忘, 难受. 哈哈 学习学习
2019-09-13 00:03:55
2019-09-12 12:59:28