客座文章最初由CommunityBridge导师计划TiKV项目的学员Alex Chi在TiKV博客上发表。他也是上海交通大学的一名大二学生。
https://tikv.org/blog/communitybridge-mentorship/
CommunityBridge是一个由Linux基金会开办的为期12周的全日制导师项目。它旨在帮助具有必要技能的开发人员进行试验、学习,并有效地为开源社区做出贡献。该计划被CNCF积极使用,作为跨CNCF项目的指导平台。我有幸参与了CNCF孵化项目(注:2020年9月2日CNCF宣布毕业)TiKV提出的Full Chunk-based Computing项目。在这篇文章中,我想分享我作为TiKV项目的学员在CommunityBridge导师计划中的经验。
https://github.com/cncf/mentoring/blob/master/communitybridge/2020/q2/selected_projects.md#tikv
申请
作为一名计算机专业的学生,我一直对创作玩具项目充满热情,尤其是使用Rust构建应用程序。今年春天,我开始寻找机会在一个真实的Rust项目中工作。幸运的是,我发现有人将CommunityBridge项目中TiKV项目的参与过程发布给了一个Rust研究小组。在浏览了所有的资料后,我意识到这个项目可以让我与TiKV社区紧密合作,为TiKV做贡献,所以我毫不犹豫地决定申请这个项目。
这个项目中的每个项目都有不同的选择过程。对于TiKV项目,申请人需要提交一份简历、一封求职信和两份编码任务。我的编码任务是编写一个简化版的TiKV协处理器向量化框架。这些任务并不困难,但与学员在接下来几个月将要做的事情密切相关。因此,我格外注意和努力地阅读了TiKV源代码,并优化了我的代码,使其更加健壮和高效。同时,我也帮助了其他在Slack频道上没有任何Rust背景的候选人,因为我总是觉得分享我的想法和帮助别人的过程比自己编写代码有趣得多。这给导师们留下了深刻的印象,最终我被选为TiKV项目的学员。
编码阶段
我的项目是Full Chunk-based Computing。它是关于在计算过程中如何在内存中存储数据。以前,TiKV的内存布局非常松散,对缓存不友好,因为所有数据都存储在一个Rust向量中。使用块格式将使一个更紧凑的内存布局--有一个位图表示,如果一个单元格是空或不;字符串是连续存储的。这使得计算过程更加高效。
https://github.com/tikv/tikv/issues/7724
用新的数据结构替换Rust向量乍一看似乎很简单,但实现起来并不容易。在与我的导师进行了一周的讨论后,我们提出了一个三步迁移计划。
- 根据RFC修改外部开发人员接口
- 重构协处理器框架
- 引入新的块向量结构并完成迁移过程 https://github.com/tikv/rfcs/pull/43
根据这个计划,我为这个项目制定了如下路线图,以便更好的管理和监控我的任务。
TiKV全块计算的路线图
在编码期间,我发现与社区和导师的及时沟通是这个项目中至关重要的一部分。因此,我将自己的一些经验总结如下,希望它们能对参与开放源码社区的任何人有所帮助。
提前计划。我花了大约一周的时间阅读TiKV代码库,以获得一些关于如何实现“基于块的计算”的基本想法。在那之后,我制定了计划,并把它们分成小任务。然后这些任务被添加到我的GitHub项目中。我使用GitHub项目来跟踪我的进度。这样,我的导师就会知道我做了什么,我接下来要做什么。
https://github.com/skyzh/tikv/projects/1
我的TiKV全块计算GitHub项目
获得建议。编码过程一开始很顺利,直到我发现有些东西被忽略了:引入块向量需要重构另外两个模块,这超出了计划!经过几次尝试,我仍然无法编译重构后的代码。我向我的导师解释了障碍,并提出了我失败的尝试。幸运的是,我的导师在几分钟内想出了一个解决办法。他们的建议给了我很大的启发,最终我成功的提交了这份PR并继续这个项目。
https://github.com/tikv/tikv/pull/8141
保持同步。检查和合并一个拉请求可能会花费很长时间。因此,重要的是与社区沟通,使PR合并到上游分支。每周我都将未合并的PR发布到Slack频道,并详细解释我的变化,以使审查过程更快。
分享想法。当我有新的想法时,我总是很乐意与TiKV社区的其他贡献者讨论。这个过程有助于使想法成熟,并提前发现可能的缺陷。清楚地解释想法可以帮助导师和其他合作者更好地了解我在做什么,这样他们就可以提供更具体的建议。
计划之后
我在TiKV项目中度过了一段美好的时光。我的导师都是非常有经验的人,他们总是能就如何把这个项目做得更好提供非常好的建议。TiKV社区非常友好。审查和合并过程是清晰和容易遵循的。许多检查和评估可以用自动化机器人“ti-srebot”来完成,这使得过程一致且高效。
在实现“基于块的计算”RFC时,我觉得自己的编码技能随着时间的推移得到了提高。现在我对Rust类型系统、泛型和过程宏有了更好的理解。除了编程技巧,我对如何在开源社区中协作也有了更清晰的认识。我在自己的开源项目中应用了一些最佳实践,这使得我的团队的代码审查过程更加高效。
最后,我要感谢@breeswish和@TennyZhuang对我的指导,他们对TiKV项目非常熟悉,给了我很多帮助。也要感谢这个项目所属的TiKV社区和sig-copr成员。感谢CNCF和Linux基金会组织这个CommunityBridge项目。还有TiKV社区的项目管理员Wenting,在这个项目中帮助我处理一些行政事务。
关于作者:
Alex Chi是CommunityBridge导师计划TiKV项目的学员。他也是上海交通大学的一名大二学生。