大家好,这里是白泽。有一些同学提问,希望在自己的简历上增加一些有含金量的项目经历,最好能够去参与一些开源项目的开发,但由于对一个庞大的开源项目缺乏认知,难以着手。同时也担心自己能力不足,不知道自己写的代码是否会被接纳。
这里我总结了遇到的一些问题:
必须能!
耐心看完这篇文章,你会发现其实参与开源并不遥不可及。在文章的后半部分,白泽将分享自己在不同社区参与的一些开源和之前在 Gitea (GitHub40.3k) 公司实习的一段时光。
公众号 「白泽talk」,白泽开源了一个 Go 学习仓库:包含我写作的 Go 各阶段学习文章、读书笔记、电子书、简历模板等,欢迎 star。最近在仓库中一并开源了一个挂机冒险游戏:《模拟龙生》,正在迭代中,欢迎大家试玩,欢迎 pr。
白泽目前正在打造一个氛围良好的行业交流群(游戏交流群),文章的更新也会提前预告,欢迎加入:622383022。
出发点:首先选择的开源仓库需要适配自己的方向,最好是自己在做什么项目,会用到某开源项目比较有价值,再去尝试了解和贡献。
为了学习而学习非上上之选,最好是有需求为出发点。
信息检索渠道:GitHub 中文社区
在 GitHub 中文社区,点击左侧菜单栏的索引,便可以跳转至分类检索目录,选择自己感兴趣的方向。
下面这些绝大部分都是白泽参与过开源或者深度使用过的仓库,十分推荐:
推荐的理由:
首先 Kitex、Hertz 是字节云原生开源社区 cloudwego 中,Go 语言的两个核心框架,当然还有 Rust 的 Volo 框架。白泽自己也是 Hertz 一位认证的 Committer。
围绕这两个仓库的生态十分丰富,社区活跃度很高,加上字节背书,又比较年轻,去年才开源年满两周年,初期学习成本不会非常高,并且 Go 云原生相关也是当下发展的热门方向,所以学习的性价比还是比较高的。 (社区仓库有飞书群二维码)
Gitea 是我去实习之后开始接触的,这个仓库用户极多,非常活跃,社区版也有 Gitea 的员工把持维护,核心开发者在群聊中回复及时,基本可以随时交流,也是很棒的一个社区! (社区仓库有Q群二维码)
Woodpecker 是 CI 引擎,用 Go 的协程控制容器启动去运行各种任务(代码检查、单元测试、构建…),面向的是真正的一个发挥 Go 语言协程性能的工作场景,因此学习 Go 它是十分合适的。
《使用 Woodpecker 与 Gitea 搭建纯开源的 CI 流程|极限降本》 我的这篇文章就讲了如何整合 Woodpecker 与 Gitea。
以 HTTP 框架 Hertz 主仓库为例,我们进入 Issues 查看有哪些代办的事项。
这里看到打有 good first issue
的 tag
的需求,就是新手可以尝试参与的。同时关注一下右侧的评论数,如果没有人评论,说明这个需求还是无人认领状态,你可以去评论 please assign me
,获得提问者的开发授权。
白泽找到了一个非常适合新手的任务,“为项目编写单测”,详见这个 issue # 257:
Issue 描述:
print
验证可以参考白泽之前写作的关于分析 Kitex 框架的文章(下文先以查看这个单测需求为场景进行分析):
git clone [email protected]:cloudwego/hertz.git
pkg/route
部分还没有分配,那么我们进入这部分的代码进行查看:// HTTP 框架 Hertz 的核心结构内的核心字段就是 *route.Engine
type Hertz struct {
*route.Engine
signalWaiter func(err chan error) error
}
由 Hertz 结构体内包含了 route.Engine
可知,pkg/route
包中的内容是整个 Hertz 框架的核心,涉及大量内容,或许这也是这部分需求没有被社区同学分配掉的原因。
# /pkg/router
baize@baizedeMacBook-Air route % go test -cover ./...
go: downloading github.com/cloudwego/netpoll v0.5.0
? github.com/cloudwego/hertz/pkg/route/consts [no test files]
? github.com/cloudwego/hertz/pkg/route/param [no test files]
# 只相差百分之0.2
ok github.com/cloudwego/hertz/pkg/route 2.732s coverage: 84.8% of statements
baize@baizedeMacBook-Air route %
xx_test.go
命名,通过调用 xx.go
当中的方法,与一个预定义的值进行 assert 断言,相同则通过测试,补充单元测试直到满足85%的阈值,我们就可以着手提交 pr 了!func TestConnectionClose(t *testing.T) {
engine := NewEngine(config.NewOptions(nil))
atomic.StoreUint32(&engine.status, statusRunning)
engine.Init()
engine.GET("/foo", func(c context.Context, ctx *app.RequestContext) {
ctx.String(consts.StatusOK, "ok")
})
conn := mock.NewConn("GET /foo HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\n\r\n")
err := engine.Serve(context.Background(), conn)
assert.True(t, errors.Is(err, errs.ErrShortConnection))
}
一般来说,开源项目的根路径下,都有一个 CONTRIBUTING.md 文档,指导你如何参与本仓库的贡献,包括 git 使用的流程、单测覆盖率、代码的格式化等需求,参与任何开源,都建议先阅读这个文档。以 Hertz 为例:
《一文搞懂Git工作流,再也不用担心入职就被辞退了》这篇文章是两年前我写作的,对 Git 工作流不甚了解的同学可以快速浏览。
针对开源项目,一般都选择 fork 仓库的形式进行开发:
remote hertz
。remote hertz
。develop
分支(或者 main 分支),切换一个新的 feature 分支出来,针对你要开发的内容,比如要增加 /pkg/router
的单测,则执行命令:# 分支命名没有绝对约束,但是希望见名知意
checkout -b test_pkg_router
开发完成之后,将本地 test_pkg_router
分支代码,提交到自己的 remote hertz
的 test_pkg_router
分支。
在自己的 remote hertz
仓库内,创建一个 pull request,将自己 remote hertz
仓库的 test_pkg_router
分支请求合并到 Hertz 官方仓库的开发分支上。提交 pr 的时候,需要描述自己的工作内容,以便 reviewers 快速明白你的意图,举个例子:
.github/workflows
目录下的各种 CI 流程,只有全部通过之后,reviewers 才能同意合入代码(code lint、test 等操作在这里也会执行,所以本地提前执行一次是未雨绸缪):参与开源过程中,一般都有社群,找到志同道合的团体,一起交流,会让你事半功倍。
Gitea 是一个轻量级的、自助的 Git 服务。它是一个开源的、基于 Go 语言的项目,提供了类似于 GitHub、GitLab 等平台的版本控制仓库管理功能。
Gitea 允许您在自己的服务器上架设一个 Git 服务,以便团队或个人能够方便地进行代码托管、协作和版本控制。(GitHub Star 40k+)
它的社区活跃度也非常高。
面试:面试 Gitea 用了一轮面试,大概90分钟。面试官是一位字节架构出来的大哥。整个面试流程体验十分特殊:面试官开了屏幕共享,在自己的白板上写出各种 Go 语言相关的语法题目,涉及切片、map、interface{} 等 Go 的语法知识。询问十分细致,但不故意刁难。因为是做开源,相对项目经历反倒问的比较少。但是要求基础扎实,对 Go 的理解较为清晰。
工作内容:
体会:
当你开始参与开源,你的编码水平将突飞猛进。天高海阔,任君腾挪。
原创不易,感谢关注!