全栈工程师修炼手册


第一次接触编程是在小学三年级,至今有二十多年了,虽然现在的主要职责是管理公司的工程师与数据团队,但仍时不时会手痒写点程序。这么多年来,从游戏到网站到移动应用,从前端到后端到系统架构,自动化运维,大数据平台,所有这些领域我都有所接触。以前像我这样乱点技能树的,只能叫作万精油,但如今这就叫全栈工程师。

回想起来,我觉得自己还是挺幸运的,比起某某某领域专家,我更喜欢自己现在的状态。如果你也想尝试这条路,今天我可以给你一些建议。

全栈适合你吗?

在开始之前,这是你该问自己的第一个问题。因为全栈只是一种选择,你也可以选择朝垂直领域专家的方向努力。如果你已经有自己的答案,那就跟随你的意愿去做。如果你在犹豫,那么让我来问你几个问题

第一个问题,你现在在大公司还是创业公司?将来又想去哪儿呢?虽然没有绝对,但在创业公司,你可以迅速锻炼全栈的能力。而大公司有更多的机会深入研究某个领域的问题。特别是对于运维和大数据方面,大公司有得天独厚的优势,许多挑战与经验是创业公司无法提供的。

第二个问题,你将来是否想成为一个管理者?现在很多公司提供了 dual-stack,就是说管理线与技术线是并行的,要走哪条路你自己选。我的建议是,如果你希望将来转管理,在做技术的时候,广度比深度更重要,也就是说你更应该往全栈方向发展。管理者到一定层次都需要对项目负责,而任何一个典型的互联网项目,前后端开发、线上部署、数据分析,这些部分都缺一不可。拥有全栈的知识,你就可以对项目与团队有更好的把控力。

第三个问题,首席科学家与首席架构师,哪个更吸引你?如果你不走管理线,继续走技术线,那前面两个选择基本就是你发展的目标。如果你选架构师,那你就更适合往全栈发展。其实架构师也是一个管理者,只是他管的不是人,而是一个个技术模块。架构师的功力体现在如何选取最适合的模块,并让它们之间无缝连接。所以你的技术知识面越宽广,你可设计的版图就越大。

最后一个问题,你在学生时代是否偏科?开半个玩笑,我想说的是人要学会从自己的过去总结经验。偏科可能预示着你更适合钻研一项技术而不适合全面发展,或许有一天你就能成为某个领域的大牛,不也是好事一桩?

除去个人的偏好外,你也要关注时代的趋势。这是个开了变速齿轮的时代,短短几年间,技术的热点一直在变化,从移动开发,到大数据,VR,再到深度学习,区块链。身上不多背几项技能,可能没几天就被淘汰了。但到最后“能否快速掌握一项新技术”或许才是唯一不会被淘汰的技能。而在成为全栈工程师的道路上,你可以很好地锻炼这项终极技能。

全栈工程师修炼手册

全栈并不是毫无章法的遍地开花,好的学习计划与方法可以事半功倍,以下是我总结的几点经验

一到多再到一

从编程入门开始,先花一至两年时间熟练掌握一门主流的编程语言。这个阶段的目标就是一个扎实的基本功,包括程序中的基本概念,例如值与引用,变量的作用域,对象与类,常用数据结构与算法等等。一旦基础扎实了,接下去的三年左右时间就要从一到多,迅速扩冲你的技能池。要做到快速学习,第一项要领就是读技术资料时要学会跳读。因为很多的技术有相通之处,学习一项新技术,只需学习它与你已掌握的技术之间的 diff 就行了。当你有了一定的技术储备之后,一到两天内学会一门新的语言与框架其实并不难。这个阶段的另一个要领是 20/80 原则,也就是用 20% 的时间来了解一项技术中 80% 的基础内容,将剩下最难啃的 20% 留在将来需要深挖时再研究。

那为什么最后还要再回到一呢?当你有了足够的技术广度之后,你对技术的洞察力与理解力都会提升一个层次,这使你能更准确地发现适合自己且有前途的技术领域。与初入行时的随大流不同,你此时的选择是经过深思熟虑,为自己量身定制的。在接下去的时间里重点深挖一个或少数几个领域,这样在俱备了技术广度的同时,你也拥有了自己的杀手锏,个人价值会再次大幅提升。

任务导向

所谓任务导向就是一切学习都应该以输出为目的。仅凭兴趣学习,往往是低效的。比如你的公司要做一款移动应用,初期的流程是开发 -> 上线 -> 运营,对应的技术能力就是前后端开发,自动化运维,数据平台与用户分析。当用户数到达一定体量以后,就需要高可用架构,推荐算法等技术。你技术学习的脉络应该顺应业务的发展,这样才有机会学以致用。

那如果你身在大公司,又该怎么做呢?有些大公司提供轮岗的机会,比如我之前在 Google,公司每 18 个月提供一次换岗机会。可以借此扩展你的技能池,要好好利用。在选择下一个岗位时,应保持一种连续性,比如从前端开发转后端开发,从开发部门转运维或是数据部门等。

不过总体来说,全栈工程师与创业公司或是发展期公司才是最佳组合。

移花接木

学技术要了解其思想,而不要留于表面形式。优秀的技术思想会从它的发源地流向其他领域。例如,

  • 前端的 MVC 结构在后端一样适用。
  • 当你理解了 Java 的 Annotation 以后,再看 Python 的 Decorator 就会觉得非常熟悉(尽管两者的实现方式完全不同)
  • 当编译语言用类型推断(Type Inference)去除类型声明的同时,脚本语言却在用类型提示(Type Hint)添加类型声明。
  • 不可变(Immutable)的思想始于函数式编程,但可以用于运维(Immutable Infrastructure),也可以用于大数据管理(Functional Data Engineering)。
  • 运维的核心是对各类服务器数据的监控与报警,同样的理念也可以用于产品与运营数据。

技术之间的联系,有些是显而易见的,有些需要你沉淀思考。真正的全栈工程师可以用一个技术领域的思想,去解决另一个技术领域的问题。再举一个我公司的例子,在学习用 Ansible 做运维时,发现它的 Playbook 不是用脚本语言而是用 YAML 来写的,这让我意识到原来 YAML 不仅可以用来描述数据,也可以用来描述逻辑关系。这个思想后来被用在我们很多的项目中,比如在设计数据产品的报表时,各种指标的计算,包括指标之间的依赖与派生关系都是直接在 YAML 中定义的,主体程序不涉及任何业务逻辑,仅仅是解析与执行这些 YAML 文件。

所以我建议在学习技术时,多做一些交叉领域的思考,这会使你在提升技术广度的同时,加强你的技术思维。

层次切换

记得以前刚进 Google 时,听的第一个内部讲座就是 Life of a Search Request,讲从用户输入一个搜索关键词到得到结果的整个过程,这个过程涉及浏览器,TCP/IP的网络传输,后台的 Web 服务集群,索引数据库群等等。对于你公司的业务,你是否能清楚地描述从用户输入到产生结果的整个周期?对于每一个环节,你又能深入细节到什么程度?

有次和公司的 CEO 聊天,他说他衡量一个产品经理的能力时,会看这个人能否从产品细节到长期战略之间的各个层次来回切换。我觉得衡量一个全栈工程师能力也是类似的,看他是否在了解系统的全貌的同时,又能深入到单个模块的细节。当系统遇到真正棘手的难题时,就非常考验技术人员在各层次之间切换的能力。就如同玩竞技类游戏,只有同时拥有良好大局观与精湛微操作的选手,才能成为顶尖高手。

在学习全栈的路上,不但要试着横向地切换层次(前台,后台,运维),也要尝纵向地切换层次,除了写业务代码之外,向下了解一些框架的底层运行机制,读一读它们的源码。向上学习一下系统设计与分布式架构。你可能会觉得什么都学会不会精力太分散?我觉得并不会,只要你顺着一条合理的脉络去学(任务导向),花三到五年的时间迅速延展你的技术广度是非常值得的。这会使你比同龄人更具竞争优势。目标要定得高,实践时量力而为。

全栈修炼入门级套餐

每个人的技术学习路线可能都不太一样,这也是为什么这篇文章着重讲的是方法而不是具体的学习内容。不过对于刚进入移动互职网开发的新人,我可以推荐一个全栈学习的新手包。编程语言方面,可以优先去学习以下语言

  • Java
  • JavaScript
  • Python
  • SQL
  • Swift (如果不做 iOS 开发,可以不学)

Java 不但可以写 Android 应用,也是目前大部分国内公司的后端主力语言,在分布式系统与大数据平台方面的生态圈非常完整,所以即使你公司不用 Java 也应该学。

写前端,JavaScript 是必备技能,要掌握一个主流前端框架,建议学 React。这是一个非常出色的框架,生态圈成熟,适用性广,在有了 ReactNative 加持之后还可以做移动应用开发。另外,在熟悉了 JS 之后,也可以用 NodeJS 来写后端。

Python 也是个全能型语言,如果之后要做自动化运维,大数据分析与机器学习,Python 在这些方面优势明显。国外有很多公司用 Python 写后端,国内相对少些,但对创业公司而言,用 Python 做大后端的主力语言(业务后端 + 运维 + 数据分析)其实是个不错的选择。

学 SQL 前期是为了研发与上线时的数据库查询与管理,后期是为了数据分析与商业智能。即使目前各数 NoSQL 百花齐放,但传统的关系型数据库,如 MySQL 或是 PostgreSQL,势头依然强劲 。而在大数据端,各类的数据仓库与数据计算框架都会提供类 SQL 的接口。在较小的公司里,开发人员还经常兼做数据分析师。所以我认为熟练掌握 SQL 是对全栈工程师一项基本要求。

除了这些编程语言外,另一部分就是了解运维的基础知识,包括 Linux 命令行,Docker,以及各类常用的基础服务与数据库,如 Nginx,MySQL,Redis,MongoDB 等。

有了这些技术基础之后,你对于一个移动应用的系统全貌,就有了大致的了解。可以再根据公司实际的业务情况,选择进一步学习的内容。

小结

全栈的路很慢长,也很有趣,祝大家成功!今天的分享就到这里,欢迎留言。