如何从GitHub上调研优秀的开源项目,并魔改应用于工作中?
在 Go 语言学习中,我们经常会去学习一些优秀的开源项目。但是学完之后,发现很快就忘记了或者学习效果并不好。学习一个开源项目最好的方式就是围绕这个开源项目进行实战。例如,直接魔改这个开源项目并应用于工作中。本文来介绍下如何调用,并魔改一个开源项目。
问题拆解
在学习开源项目的过程中,如果用需求来驱动学习,不仅效率是最高的,而且学习的过程也是工作产出的过程,可以说是一箭双雕。基于一个优秀的开源项目来进行魔改,可以拆解为以下 3 个问题(或者任务、方法):
- 需求从哪里来?
- 如何查找优秀的开源项目?
- 如何进行二次开发?
接下来,我们就分别看下这3个问题。
需求从哪里来?
在我看来,需求来源于工作。这些需求可以是产品经理交给你的某一个具体产品需求,也可以是能够帮助团队提高工作效率的工具,还可以是能够提高自己工作效率的工具。
总之,如果有明确的工作需求最好,如果没有明确的需求,我们就要创造需求。我们可以思考工作中的痛点、难点,并将它们转化成需求。比如,团队发布版本,每次都是人工发布,需要登陆到不同的服务器,部署不同的组件和配置。这样效率低不说,还容易因为人为失误造成现网故障。这时候,你就可以将这些痛点抽象成一个需求:开发一个版本发布系统。
有了需求,接下来我们就要完成它,也就是进入到实践环节。那么如何实践呢?在我看来精髓在于两个字:“抄”和“改”。
上面,我们抽象出了一个需求:开发一个版本发布系统。如果自己从0开发出一套版本发布系统,工作量无疑是巨大的。而且,以我们这个阶段的水平,即使花费了很多时间开发出一个版本发布系统,这个系统在功能和代码质量上也无法跟一些优秀的开源版本发布系统相比。
所以,这时候最好的方法就是在GitHub上找到一个优秀的版本发布系统,并基于这个系统进行二次开发。这样,你不仅能学习到一个优秀开源项目的设计和实现,还能够以最快的速度完成版本发布系统的开发。
如何查找优秀的开源项目?
工作中遇到工作需求不知道怎么实现,或者不太想从 0 到 1 去实现。最好的方式就是魔改一个优秀的开源项目。但是如何能查找到这个开源项目,并且确保是一个优秀的开源项目呢?本小节,以“如何在GitHub上找到优秀的版本发布系统”为例来给你介绍下。
下面,我把我自己的方法分享给你。我主要通过5个步骤来搜索,如下图所示:
这里我结合图片,具体说明下这5个步骤。
- 在GitHub搜索栏中按语言搜索:
language:go 版本发布
中,language:go
说明我们要搜索语言类型为Go语言的项目;版本发布
是我们搜索项目时的关键词。这个关键词对搜索结果影响很大,需要你合理填写。这里有个技巧,如果搜索版本发布
,搜索出的项目很少,那么可以减少关键词再次搜索,比如搜索发布
。 - GitHub搜索页面的
Sort options
选择Most stars
:因为GitHub项目很多,我们不可能看完所有搜索出来的项目,所以这里我们要选择性地去查看。你可以通过Most stars
进行排序,一般来说Star数越多说明项目越受欢迎,而受欢迎的原因很可能是整个项目在同类项目中比较优秀。根据我之前的搜索经验,一些Star数少的项目也可能很优秀,最终还是需要你根据自己的理解去判断。 - 看描述:因为项目比较多,我们不可能认真去研究每个项目,所以要快速了解项目,最简单的方式是先看描述。如果描述符合预期,那么可以将这个项目在新的浏览器Tab页打开,或者将项目地址保存起来,等初步筛选完所有项目后,再详细查看这个项目的README以及代码。
- 看项目名字:一些优秀的项目可能没有描述,这时候可以通过项目的名字来判断。
- 根据Code做筛选:如果我们搜索的项目很冷门,搜索GitHub后只有寥寥几个搜索结果,而且搜索出的项目也不是我们期望的。那么这时候,你可以从
Code
中来筛选。
通过上面这5步,我们初步搜索出了匹配的项目,并知道了如何对这些项目做初步的筛选。接下来,你就需要按页来筛选页面中的开源项目,然后从第1页一直筛选到第100页。GitHub一页默认会展示10个开源项目,所以,如果按照这种方法,最终你可能需要调研10 * 100 = 1000
个开源项目。当然,也不一定每次都要从第1页一直看到第100页,如果后面的项目明显都跟预期的需求不匹配,可以不用再继续看了。
用这样的方法,我们应该可以找到符合要求的优秀开源包,而且该开源包极有可能是“最”优秀的包。
此外,GitHub 上的 awesome-go 项目也根据分类记录了很多包和工具,你也可以在这个项目中寻找。我的建议是优先从GitHub上找,再在 libs.garden 上找,最后再参考 awesome-go项目。
到这里,我们已经通过自己的调研,找到了一堆GitHub上的开源项目。为什么我们要找这么多开源项目呢?主要目的有两个:
- 确保自己基于一个最优的开源项目来进行二次开发,一开始便站上至高点。
- 填充自己脑海中的Go生态图。
不过,这些开源项目只是经过了初步筛选,里面有很多是不满足我们需求的,甚至可能跟我们的需求完全不一致。所以,我们还需要进行二次筛选,可以通过精读开源项目的README来筛选。如果有必要,并且项目部署简单,你也可以部署这个开源项目,亲自体验一下。
经过第二次的筛选,我们已经筛选出了一些能够满足要求的优秀开源项目。这时候,我们还需要再经过一轮筛选。这轮筛选,我们要从各方面来对比这些开源项目,并从中选出一个最合适的开源项目,来进行二次开发。这个开源项目,你可以自信地跟你老板说它是一个最优解。
如何进行二次开发?
接下来,你就可以基于这个项目进行二次开发,最终出色地完成设定的需求。那么如何对选定的项目进行二次开发呢?我总结了5个步骤:
- 手动编译、部署这个开源项目。
- 阅读项目的README文档,跟着README文档使用这个开源项目,至少运行一遍核心功能。
- 阅读核心逻辑源码,在不清楚的地方,可以添加一些 fmt.Printf 函数,来协助你理解代码。
- 在你理解了项目的核心逻辑或者架构之后,就可以尝试添加/修改一些匹配自己项目需求的功能,添加后编译、部署,并调试。
- 二次开发完之后,你还需要思考下后续要不要同步社区的代码,如果需要,如何同步代码。
在你通过“抄”和“改”完成需求之后,记得还要编写文档,并找个合适的时机在团队中分享你的收获和产出。这点很重要,可以将你的学习输入变成工作产出。
看到这里,你可能想说:我开发一个项目而已,调研这么多项目,花这么多时间,值得吗?我觉得是值得的,因为这种学习方式会带来下面这几个好处。
- 最优解: 你可以很有底气地跟老板说,这个方案在这个类别就是业界No.1。
- 高效: 基于已有项目进行二次开发,可以提高开发和学习效率。
- 产出: 在学习的过程中,也有工作产出。个人成长、工作贡献可以一起获得。
- 知识积累: 为今后的开发生涯积累项目库和代码库。GitHub就是一个大的代码仓库,里面几乎囊括了你开发过程中需要的所有技术实现。你需要做的其实就是找到其中的最优实现,并升级成自己的实现。这是一个从量变到质变的过程,最终,你的研发模式会变成
Ctrl + C
+Ctrl + V
。这首先意味着你的开发工作会越来越轻松;另外,你Ctrl + C
的是一个优秀的开源项目或代码,Ctrl + V
的是经过你改进后的代码,这就意味着,你基于这个开源项目或代码二次开发后的实现一定是(你, GitHub最优解)
二元组中最好的一个实现。
- 知识星球:云原生AI实战营。10+ 高质量体系课( Go、云原生、AI Infra)、15+ 实战项目,P8 技术专家助你提高技术天花板,入大厂拿高薪;
- 公众号:令飞编程,分享 Go、云原生、AI Infra 相关技术。回复「资料」免费下载 Go、云原生、AI 等学习资料;
- 哔哩哔哩:令飞编程 ,分享技术、职场、面经等,并有免费直播课「云原生AI高新就业课」,大厂级项目实战到大厂面试通关;