无论从年初开源社发布的《2020 中国开源年度报告》还是整体的大环境,不难看到中国的开源正在崛起,越来越多的来自中国的开源项目和开发者们正在走入大家的视野。在开源浪潮的大趋势下,程序员又该如何规划自己的职业以及个人成长呢?不如听听正在全职做开源的工程师张晋涛怎么说。

本文根据张晋涛在又拍云 Open Talk 技术沙龙北京站主题演讲《开源浪潮下程序员的职业规划和成长》整理而成

张晋涛,支流科技云原生技术专家,Apache APISIX committer, Kubernetes ingress-nginx reviewer,containerd/Docker/Helm/Kubernetes/KIND 等众多开源项目 contributor,对 Docker 和 Kubernetes 等容器化技术有大量实践和深入源码的研究,著有 《Kubernetes 上手实践》和 《Docker 核心知识必知必会》等专栏。


大家好,今天我分享的主题是《开源浪潮下程序员的职业规划和成长》。今天在这里聊两个项目,一个是 Apache APISIX,APISIX 是 Apache 基金会旗下的顶级开源项目。第二个项目是 ingress-nginx,它是 Kubernetes 整个生态圈里头,除去 Kubernetes 自身以外使用频率最高的软件之一了。搞过 Kubernetes 的同学应该基本上都用过这个项目。

今天我分享的内容主要从四个方面来聊:

  • 开源的文化

  • 如何参与开源

  • 关于我的故事

  • 职业规划相关的内容


了解开源文化

自由软件运动

提到开源文化,首先需要了解自由软件运动。

1.png

图右是被称为自由软件之父的斯托曼,他在 1983 年提出了 GNU 计划。1984 年,斯托曼提出了 Copyleft 的概念,Copyleft 跟我们平时用到的版权 Copyright 是相对应的,它放弃了 Copyright 类似对版权的严格限制。

1985 年,斯托曼成立了自由软件基金会,目的是为了能够让自由软件更好地发展。在当时,很多软件都是专有软件或者商用软件,任何人使用这些软件都是需要付费的。斯托曼认为随着计算机的发展,如果商用软件、付费软件掌握在极少数公司的情况下,那么我们将会逐步失去自由。因为很多商业软件或者专用软件都是由商业公司,或者是极少数的人掌握着,如果你依赖这些软件,都必须依赖于其他人,你的命脉就掌握在了他们手中,就不可能获得自由。

1989 年,出现了第一个 GNU 的通用协议,叫做 GPL。

接下来,我们来看下在自由软件运动之后发生了什么事情。想必大家都接触过 Linux 操作系统。Linux 操作系统的创始人是林纳斯·托瓦兹,他在 1991 年首次发布了 Linux 操作系统,并且选择了将它的源代码直接发布到网络上,供其他人去使用和分享。

在这个时候,斯托曼找到了林纳斯。GNU 自由软件基金会的主要目标是希望能够创建出所有人都可以使用的基础软件,包括操作系统。直到 1991 年 Linux 操作系统发布的时候,GNU 自由软件基金会已经完成了所有基础类的自由软件开发,但是它没完成最核心的操作系统的开发。所以,斯托曼找上了林纳斯。结果我们都知道,Linux 操作系统的完整名字是 GNU/Linux。

开源协作与文化

聊完自由软件运动、Linux 操作系统,来看下我们现在所接触到的开源协作和开源文化。

开放

在开源协作中,基本的理念就是开放。但很多人可能对此有误解,认为开放源代码就等于开放,其实不然。源代码的开放和真正的开放并不一样。举个简单的例子:MongoDB。

MongoDB 是一个文档类型的数据库。近几年,MongoDB 修改了一次协议 SSPL,称之为服务端公共许可证,协议更改之后有什么变化呢?它的协议规定任何一个云厂商,如果在云服务上使用了 MongoDB,就必须把在 MongoDB 之上所做的更改,包括管控端的源代码都开源出来。

大家想一下这个事情可能吗?

其实不可能,任何一个云厂商,它对所有基础软件,或者所有开源软件的变更,都是它的核心,是它的命脉。所以说,MongoDB 这一次修改其实是带有针对性的,它针对的是这些云厂商。在开源软件的基本协定之下,这其实属于不开放的协议。

再有就是前段时间,Elasticsearch 也宣布其使用 SSPL,这导致 AWS 基于之前 Apache 协议的代码直接 fork 了一个版本,并称之为 OpenSearch 。这也是对这种不开放的行为的一种应对方式。

协同

开源文化当中提到另外一点,就是协作。Linux 操作系统为什么能够获得成功?因为 1991 年的时候林纳斯发布了第一个 Linux 的版本,把源代码直接公开到了互联网上,其他人可以直接下载源代码,并且对这些源代码进行修改。

在 1991 年,林纳斯发布完 Linux 第一个可供下载和使用的版本时,其实自由软件基金会旗下还有其他人也在写给 GNU 使用的内核,只是没有 Linux 的完成度高。

为什么它没有发展起来呢?因为它是由固定的几个人在做这个事情,且仅有那么几个人,只有它真正对外公开发布了一个版本,外界才会了解到。这里就不得不提到一种思想,那就是大教堂与集市。这是一个什么概念呢?

可以这样理解,传统的软件开发过程像大家在修建一个大教堂一样,只有极少数的精英工匠参与其中。而开源软件提倡的开放和协同,主要指将软件当成一个大集市,每个人都是自由的,大家都可以互相协作,每个人贡献自己的一份力量。有专门一本书,来阐述这些理念,就叫做《大教堂与集市》,感兴趣可以看看。

开源软件

聊完开源理念,我们最后来说说开源软件。

2.png

开源软件的前提是开放源代码,这是必不可少的。另外,其实每个开源软件都是有开源许可证的,刚才我们聊 MongoDB 的时候也提到了,它的许可证是不被认可的。开源软件核心价值观就是不歧视、中立、开放。

目前国内开源生态整体向好,有很多进入开源软件基金会的项目,无论是进入 Apache 软件基金会,还是 CNCF,亦或 Linux 的基金会。其中有很多的项目例如 ApacheAPISIX 就是 Apache 基金会旗下的顶级开源项目,通过 Apache-2.0 License 进行分发,这是一种非常开放且友好的协议。


如何参与开源

很多人对于参与开源有一些误解。有些人认为,我在使用一个开源软件,并且在它的 GitHub 上面提交了 issue,提交了 pull request 之类的,认为就是在参与开源项目了。还有一些人认为,我写了一个软件或者程序,我把它放在 GitHub 上面,代码是公开的,认为自己在做开源了。其实不然(尽管我们也认可为开源项目所做的贡献)。

做开源的前提是基于你对开源文化的认同。

3.png

开源文化的最主要是平等、中立、开放、一致、文档优先。一致是什么意思呢?意味着你的软件在这个环境和在另外一个环境当中产生的结果是一样的。

那么如何选择一个开源项目呢?

从我个人角度来讲,首先一定是兴趣使然的。我不会选择一个自己并不太感兴趣的项目去参与。因为这样子是不可持续的。也有很多人问过我,参与开源你能收获什么?为什么你愿意花费那么多的时间和精力在这个事情上面?在参与开源项目的前期,或者很长的一段时间,其实没有任何收获,尤其是物质上的收获一点都没有。所以这也是我为什么提了一定是要自己感兴趣的。

其次,持续投入非常重要。在一个开源项目中,如果你只是想起来了参与一下,而不是持续地投入,也不会有较高的价值产生。

最后,应该选择一个比较活跃的社区。如果项目的社区已经非常的不活跃,你参与到这个项目当中就很难。比如你提交 issue,提交 pull request,很少有人会给你对应的回复。

4.png

这里我选取了三个项目做对比,ApacheAPISIX、Kong 和 tyk。目前可以看到活跃度最高的是 Apache APISIX,每天都有很多的开发者会参与到 Apache APISIX 的社区中,帮助别人解答问题,或者为 Apache APISIX 提交 PR 等,大家彼此都会在这么活跃的社区中成长和收获。

开源协作的中立也是一种很重要的价值观。无论你是提交代码,或者回复别人的 issue,这些我认为是其次的。最重要的是应该基于平等、尊重、中立的心态去参与到项目当中。

我现在主要参与的是 Apache APISIX 当中的一个子项目 APISIX ingress,还有一个是 Kubernetes ingress-nginx。这两个项目都是 Kubernetes controller 的项目,做的事情是类似的,但是参与开源项目过程中,我始终保持着中立的态度,而不会因为我在支流科技就大力发展 APISIX ingress 项目,限制 ingress-nginx 项目的发展,这是不存在的。所以心态很重要,只有保持中立的心态才能持续地参与到开源项目当中。


聊聊我的故事

我的职业路径

接下来聊一下我发展的过程和职业规划上的选择。

我的第一份工作 title 是 Web 开发工程师,主要是在做后端开发,也会兼顾一部分的前端开发工作,以及运维及 DBA 的任务。第二份工作是在做运维开发,会涉及一部分的运维工作,主业也还是在做开发。再后来就是做容器化的开发,现在我是支流科技的技术专家,做的事情主要是做开源基础软件。这些年前端、后端、运维、数据库、中间件,基础软件,容器化技术基本都有涉及到,这是我的职业整体路线。

很多人问过我这样的问题,特别是在跟 HR 沟通的时候。他们会问我,你为什么从 Web 开发做了运维开发,这是第一个时间点。第二个时间点,为什么从运维开发,到做基础软件以及全职做开源的事情。

我做 Web 开发,大概是七八年前,那个时候像服务器通常是 32G 或者 64G 的内存。但是现在,我的笔记本已经是 32G 的内存了,可以想象当时硬件资源是比较紧张的。在实际做后端开发中,当业务量上来的时候,我们会去做很多性能优化相关的工作。

那个时候,我们会花很多的时间去做优化,现在遇到性能的问题可能很简单,加一台机器扩容一下就搞定了。但在那个时候大家的第一想法就是做性能优化,怎么样可以充分地压榨资源,这是我们当时做的事情。在这个过程当中,偏底层的事情我做得更多些。

在 2014 年,我开始接触 Docker。2013 年Docker 首次开源,我在国内算是比较早一批接触到 Docker 的。我很喜欢这些底层的技术,包括容器化的技术。在职业选择的时候,我就从 Web 开发转向了运维开发。做运维开发的时候,前期是做运维平台化的开发,运维平台化、运维自动化、包括 GitOps 和ChatOps 等等。

随着 Kubernetes 在容器化编排技术争夺战中成为了王者。很多公司开始做容器化改造,我们也选择了 Kubernetes 做自己的容器平台。这个时候,由于我在容器化技术这方面,积淀相对比较多一些,自然也就承担了相关的工作内容。

再后来工作的选择,因为我想要更多的自由,也想更倾向于自己的兴趣,而在公司做项目的话,确实不够自由,所以我现在的工作是全职做开源,我可以在任何一个我喜欢工作的时间,或者想要工作的时间去工作。

有一些人评价我说,我是把我的兴趣做成了我的工作。其实是的,即使没有这份工作,我也会持续地去做开源。工作时间做开源,闲暇的时间也在做开源,这个本身来讲也没有什么界限。这是我目前的现状,自由、全职做开源的工程师。

职业规划

接下来,我们来看一下职业规划。大家可能对于我到底是什么样的情况并不关心,更应该想知道在开源的场景里如何做职业规划。

我现在一方面是做开源相关的工作,再有一方面,也在做自媒体。我认为做职业规划最重要的一点是基于自己的兴趣。一天一共就 24 小时,除去睡觉的时间,剩下的几个小时如果做的是自己不感兴趣的工作,一直处于不开心的状态,那真是太惨了。所以一定要选择自己喜欢的、感兴趣的工作,这是第一点。

第二点就是核心竞争力。既然是程序员,无论是前端、后端、运维,还是其他开发,自身的技术实力才是核心竞争力。现在有个词很流行,那就是“内卷”,为什么内卷会让人产生焦虑感呢?焦虑到底是怎么来的?

我是这么理解的,焦虑就是别人在学,我不学,我可能会很焦虑;别人会,我不会,我也会焦虑;别人知道,我不知道,那更焦虑;还有就是别人在聊这些,我听的一脸懵逼,这些都是焦虑的产生原因。

那如何应对这个问题呢?那就是提升你的核心竞争力。首先选一个自己最感兴趣的方向,提升自己的技术深度,这样才能持续地提升自己的核心竞争力。技术深度就跟海面上的冰山差不多,海面上你可以看到的只有那么一小点,但在海面之下还有很多很多。

技术的深度是无限的,当你把技术深度提升到一定程度之后,你会发现好像我不知道的东西越来越多,这是一个技术人常常会有的感觉。如果你很长时间没有这种感觉了,认为好像所有的东西我都知道,所有面临的问题我都能解决。这个情况我认为,你可能需要去参与一些开源项目,或者出去跟别人交流一下,或者换一份工作,开阔一下自己的眼界。当你的技术深度到了一定程度,例如能 cover 住面临的绝大多数问题时,我建议你在这个时候尽量提升一下自己的技术广度。

第三点我要说的是价值。价值这个概念非常宽泛,在做工作中最直观体现价值的,那就是薪资。当然,薪资只是一方面,另一方面在于你能够收获到什么。

我们回到刚才第一点,也就是工作开不开心的事情。如果说你的工作薪资是令人满意的,同时你又能收获一些开心,那就赚到了。因为公司本来给你提供的,是一种雇佣关系,他给到你的本质上来讲只有你的薪资。而你做这份工作的同时,收获了一些乐趣,其实也就是赚到了。收获开心,这是我要提到价值当中的第一点。

此外,在工作的过程当中,你肯定不是一个人在独自战斗,你也会收获到一些伙伴,这是第二点。

第三点,在这份工作当中,你还实现自己价值的提升。这些价值可以理解为心理学当中或者社会学当中提到的认可,当你获得别人或者社会的一些认可。这也是价值的一部分。

程序员的副业

最后我们来聊聊程序员的副业,这个事情也许大家会比较感兴趣一些。在谈到副业的时候,你要先评估一下自己能做什么,量力而行在任何情况下都是比较正确的。承认自己在某些方面不擅长,或者某些方面不太懂这个事情其实没有什么的,如果强行做不擅长的事情,可能得到的结果并不太好。

我来聊一下我自己个人做的一些东西。我之前写了一个专栏,叫 《Kubernetes 上手实践》。后来又写了一个专栏,叫做 《Docker 核心知识必会》。我自己在这方面相对来说积累比较多一点,这里就不多说了,说多了就变成广告了(笑),不过你可以关注下我的公众号:MoeLove ,我会跟你分享一些有价值的技术和内容。

很多人可能会问我能做什么?我认为其实还是有很多的事情可以做,具体肯定看个人的选择。做副业能为自己带来最直观的,大家可能认为是金钱收益。但实际上如果你把耗费的时间精力折算一下,可能会发现这个事情收益很少。陪陪家人、跟爱人约个会,出去玩一趟,可能能收获的更多。现在整体来说就是两种选择,一是用时间换钱,另一种是用钱换时间。很多事情如果年轻的时候错过了还是会很遗憾的。所以还是要建议大家根据自己的情况衡量一下。

以上是今天的全部分享内容,来简单总结下:第一部分聊了平等、中立、自由的开源文化;接着谈了如何参与开源,心态一定要摆正,同时要基于自己个人的兴趣;最后聊到一些个人成长,还是建议大家应根据自己的实际情况,合理地规划一下自己的的职业生涯,谢谢大家。