这篇源于知乎上的一个问题:为什么程序员们愿意在 GitHub 上开源自己的成果给别人免费使用和学习?
最近越发觉得,分享越多就会有更多的可能性,这里谈谈自己这些年的收获和想法。
我 2010 年开始在 Github 上分享自己的代码。在 push 代码之前我根本没想过为什么,只是因我当时学了 Git,而且又觉得 Github 很方便,可以用来备份自己的代码。
而后我就参加工作了,在工作之余我还会写一些感兴趣的代码分享到 Github,没事也经常在上面瞎逛,找一些自己感兴趣的资料和代码来学习。没想到这么多年下来,在 Github 上玩开源已经成为自己的一种习惯、爱好和生活方式。
最近一年工作轻松些了,所以有更多时间投入在这上面 (忽略最近两个月的大量提交数据,因为有个自动脚本每天在同步笔记 😁)
自我提高
我建议任何在学编程、想提高开发技能的人参与到开源中来。
现在的软件开发已经过了刀耕火种,徒手编码的年代。很多开发需要复用大量已有的库和工具,大型软件开发是一种社会化的、集体性的智慧活动。
在 Github 上分享代码,给其他开源项目做贡献,是最好的、最直接的方式来练习这种编程能力、协作能力和复用已有代码的能力。在 Github 上混久了,就形成一种自然而然做贡献的习惯,在这里我们不只是使用者,也可以是贡献者,例如:
- 我想学学 WebAssembly,所以找来一个 Runtime wasmerio/wasmer 实现看看,顺便修复一些自己发现的问题 。
- 我在使用这个 Obsidian 补全插件碰到些缺陷,提了个 PR 修一下然后和作者讨论一下怎么更完善。
- 在使用 Rust 开发的时候,我看到了一些重复的警告,在 Github 上一搜索发现别人也碰到过,所以我花了一些时间提 PR 修复。
- 我想看看 container 是怎么实现的,所以找来开源代码 containers/youki 来学习,然后顺便修复自己发现的问题,后来还成了 maintainer。
在开发中,使用者和贡献者是完全不同的态度,使用者在碰到问题的时候可能会放弃掉,而贡献者会去尝试发现原因、找到解决办法,在这个过程中我们可以学到很多。而且为开源做贡献属于 Working in Public,也是 Learn in Public。Working in Public 的好处在于我们做的贡献可以算作能力的证明,参考刘未鹏十年前的怎样花两年时间去面试一个人, Github 主页是最直观的开发人员简历。这些年我换工作就碰到过认可我开源贡献的公司,面试的时候就不考八股的问题了。
创造价值
实际上绝大多数代码不值钱。纯代码不值钱,业务才能赚钱,所以代码得运行起来、或者是交流起来。如果我分享出来的代码对别人有用,就能产生价值,能产生价值就附带可以赚钱。
举个例子,我在自己看书《Enssential of Programming Language》的时候,一边学习一边把课后习题用代码实现了:my solutions to EOPL3 。
这个代码如果一直留在我硬盘的某个角落,估计就是分文不值,我总不能把它当作传家宝留给我的后代。但是开源之后居然每年都会收到一些邮件咨询这方面的问题。因为这本书是国外一些大学的教材,他们学编程语言相关的课程就需要做这些编程题,还有一些项目之类的,有的同学就付费让我咨询。所以有的时候赚钱是结果的副产物。
更多可能
前段时间我看到 React 核心开发 Dan Abramov 的十年总结 My Decade in Review — Overreacted, Dan Abramov 在几年里就从一个 17 岁的编程小白成为行业大牛。从总结里面看好多关键节点都是因为开源和分享,开源让一个人能成长如此快。
当然每个人的故事都是独一无二无法复制的。我想分享一下自己的小例子,在学习数据结构和算法时我实现了一个生成迷宫程序,还写了一些 A* 路径规划算法相关的文章。
后来上海大学有个搞生物的教授看到我的文章,问我能不能帮他们看个程序,他们需要在多个节点里计算 k-th shortest 路径。我花了一些业余时间帮他们把核心算法用 C 实现了,他们后来把文章发表了出来,还把我的名字署上了。
我可从来没想过自己会发表一篇分子生物类的文章。最近我也开始另一种副业,在 Github 上收费帮有的公司做开源。这些就是分享的奇妙之处,我不知道自己的分享什么时候就帮助了别人,同时创造了更多的可能性。
无数人的分享让开源改变了整个软件行业,这些如今牛逼的开源项目都是从最开始一个小的分享举动开始的,Linus 在分享自己的小 Kernel 时估计未曾想过整个 IT 行业被自己改变了,尤大在分享自己的前端成果时也未料到 Vue 会被这么多企业使用。
最后,特别推荐这两期播客 :
这些开发者已经实现了全职做开源这种工作形态。另外现在国内开始出现了一波用开源软件赚钱的公司,比如 PingCap,TDengine 等。我认为这是个很好的趋势,让我们这些本身喜欢写代码的除了 996 之外有了更多选择。
这是开发人员最好的时代了,一起学习和贡献吧。