池建强的公开课

讲讲咱互联网行业自己的故事

个人成长,观点,认知, 软技能

池建强 极客时间创始人、墨问西东创始人

第362期 | 一个学习开源项目的进阶方法

讲述:池建强 大小:7.87MB 时长:00:08:12
00:00
1.0×

你好,这里是卖桃者说。我是池建强,我回来了,感谢我们的团队和代班主播正兵。上周家人生病,我回老家照顾了一周,过了一段黑白颠倒的生活。医院总是更多的生老病死,让我觉得,人生最值得的就是一场场经历和体验,我们在年轻的时候,应该努力去奋斗、去体验、去连接,去爱和追求自由。年老后能留下啥呢?唯有回忆。

所以大家平时一定要注意身体健康,多运动,定期做检查。健康就像基础技术一样,是一切的基石。

今天和你分享什么呢?聊聊开源项目的学习,介绍一个进阶方法。

对程序员来说,更快更好地掌握开源项目是必备技能。其中,知道项目的大概情况,能用会用,是基础;更进一步,就是深入项目内部,读懂源码,对实现原理和设计细节非常熟悉,知道这块代码是为了解决什么问题、如何解决问题;再进一步,要抓住项目背后的设计思想。

关于如何学习开源项目,之前卖桃者说也分享过不少方法和技巧,比如《第27期 | 阅读源代码的一些心得》、《第180期 | 如何高效地学习开源项目?》、《第262期 | 如何快速且深入地学习一门新技术?》等等,这几期文章里都有相关的内容,你可以翻回去看。

比如阅读项目文档、run 样例代码、搞清楚源代码实现、试着写个小项目、把学习过程记录下来分享出去,参与开源项目,甚至是推动这个项目在公司内部落地等等。相信你们或多或少都尝试过其中的某几个方法,并取得了一定的成果。

前阵子极客时间专栏作者杨波老师在极客时间直播的时候,分享了一个学习开源项目的小方法,我觉得挺有效果,今天也想分享给你。

什么方法呢?开发原项目的克隆版,这个和书籍翻译有点类似,比如说,原项目是用 Go 语言开发的,那你可以克隆出一个 Java 版本,并且分享到开源社区。这个可以说是学习开源项目的进阶方法了。

杨波老师还在直播中分享了他的亲身经历。比如,去年他在极客时间上输出了一门课程《Spring Boot 与 Kubernetes 云原生微服务实践》,为了开发这门课程,他在 GitHub 上找到了一个叫 Staffjoy 的项目。Staffjoy 是一个工时排班(scheduling)应用,原来是一家创业公司的 SaaS 产品,后来公司关闭就把项目给开源了。

这个项目是用 Go 语言开发的,采用微服务架构,总体质量还不错。于是,他花了将近两个半月的时间,深入研究了这个项目的源码,并且用 Java/Spring 技术对这个项目进行了克隆,也适当做了调整和简化,最后开源在他的 GitHub 上。

相当于通过这次克隆,他不仅进一步学习了 Spring 和微服务等技术,同时还产出了一个课程产品,现在那门课在极客时间上已经有超过 6000 订阅量了。

类似的例子还有很多,比如业界知名的开源消息队列 Kafka,就有不少克隆版。其中有一个叫 Jafka,它是在 7 年前,由一个叫Andy Liu的搜狐架构师开发的。因为 Kafka 是 Scala 写的,Andy Liu 就把它克隆成 Java 版,所以取名就叫 Jafka。Kafka 本身还是比较复杂的,深入理解它的源码并不容易,但是 Andy Liu 通过克隆的方式去学习 Kafka,同时还产出了一个 Jafka,可以认为他已经完全深入理解和吸收了 Kafka 的源码和设计。

还有一个项目叫 Jocko,它是 Kafka 的 Golang 语言克隆版,当然不是简单的克隆,还做了一些简化和优化。它是由一个叫 Travis Jeffery 的老外开发的。Jocko 这个项目比较成功,目前在 GitHub 已经上有了 3.9K 星,业界也有不少公司在用。也就是说,通过 Jocko 克隆项目,Travis Jeffery 不仅深入理解了 Kafka 的源码和设计,还给社区贡献了价值。

其实,这个方法的优点和缺点都很明显。我们先来看优点:

1.通过对知名的、高质量的开源项目进行模仿克隆,不仅可以提升源码阅读的能力,还可以更切身地体会它背后优秀的设计思路、高超的优化技巧,以及巧妙的代码结构,也就是关于技术更本质、更精髓的东西,能将你的技术深度和代码能力再提升一个层次。

2.动手模仿克隆也是一个实践过程,这个过程中肯定会遇到各种问题、踩进各种坑。你能做的就是发现问题,然后解决问题,就像升级打怪一样。而带着问题去学习,不一定是效率最高的,但一定是让你印象最深刻的方式。

另外,这样对照着模仿,你还能掌握不同语言之间的差异,它们实现同一功能时的对比,哪个更高效等等,这种视角对于技术广度的拓展是非常有好处的。

3.使用这个方法的话,一定会有克隆版项目产出,放在 GitHub 上还可以获得社区反馈。就像我之前强调的,有效学习一定要有产出,不管是什么形式,分享也好文章也好,有产出才能更好地吃透所学内容。没有产出的学习,一般效果都比较差。

另外,产出了才有可能得到用户的反馈,之后你就可以根据用户的反馈改进你的学习,从而形成一个正向的、可以持续改进的循环。一般用户越多,反馈就越多,学习效果也就越好。说不定还能收获影响力提升的意外之喜。

我们再来看缺点,缺点其实也很明显,总的来说就是难度比较大、耗费时间比较多。高难度是与这个方法伴生的,但有两个小 tips 能稍稍减弱这种难度。首先,选择克隆项目的时候,量力而行,选择适合自己当前能力水平的开源项目,别一上来就挑战 Tomcat、Hadoop、MySQL、Kubernetes 这样的终极大 Boss。

其次,别想着一蹴而就,也不要贪多,把一个项目拆解成多个模块,然后每周克隆一点,慢慢来,给自己一个消化吃透的时间。这样,就算要花一个季度或者半年才能仿写一个项目,积累几年后数量也是很可观的。而且,越到后面,你的技术水平在不断提高、你对技术的认知也在不断加深,这件事对你来讲是会越来越简单的。所以,不要惧怕开始。

好,今天的话题就先聊到这儿。你觉得今天分享的方法对你有用吗,会想去尝试么?你平时学习开源项目会采用哪些方法呢?欢迎在留言区一起讨论。另外,如果你喜欢今天的内容,也欢迎评论、收藏和分享三连发。

卖桃者说,明天见。

(编辑:夏天)