写点什么

开源新生代的成长之路:从校园到开源,需要迈过哪些挑战?

  • 2023-03-16
    北京
  • 本文字数:4823 字

    阅读完需:约 16 分钟

开源新生代的成长之路:从校园到开源,需要迈过哪些挑战?

#17176 (https://github.com/apache/doris/issues/17176) 在 Apache Doris 社区是一个特殊的存在。跟大多开源社区相似的地方在于,这属于社区为了吸引更多新生力量参与而设置的 Good First Issue。不同的地方在于,新生力量对于参与开发任务的热情超乎想象,每一批新任务的公开就如同春运期间火车票的发售——可能迟了一小会儿,就与心仪的任务擦肩而过。



Issue 发起人是廉玉康(GitHub id:Yukang-Lian),一名来自哈尔滨工业大学深圳校区的研二学生,2022 年开源之夏 Apache Doris 社区项目的参与者之一。或许玉康同学从未想到,一次偶然的机会,会将他的成长经历与许多身处异地素未谋面却志同道合热爱开源的同路人串联在一起。这其中也包含了唐思阳(GitHub id:TangSiyang2001),来自中南大学人工智能专业的在读学生,怀抱着无限热情立志在开源世界贡献自己的力量。也正是因为在社区的相遇,会让他坚定地在开源世界中探索。


2023 年开源之夏再次启程,我和两位同学聊了聊,希望诸位可以听听他们的社区成长故事。

从校园到开源

与步入真实职场所不同,学校的课程学习中接触的知识大都是抽象而离散的,以理论知识居多,很难有机会将它们进行工程化的整合。而当一个成熟的、可供实际生产使用的项目呈现在面前时,往往学校所授予的知识是远远不够的,也是一种截然不同的体验。


玉康很认同这一点,他之前参加过几次国外的公开课,写过一些 Project。而面对 Apache Doris 这样一个实际生产应用的项目,相较于课程项目来说,规模和难度都不可一并语之,具体体现在:


  • 代码的严谨性与复杂性。课程 Project 代码总行数往往在数千行左右,相比之下 Apache Doris 有着近百万的代码、包含C++/Java 等多门语言,庞大的代码量需要在结构复杂且逻辑抽象的同时令人易于理解是十分不易的,同时还需要兼顾内存管理及系统最终性能表现,这对工程师的 Coding 能力是极高的。而在课程学习中考虑的就相对单一,仅需考虑如何实现即可。

  • 项目的稳定性与测试的完整性。对于能够支持实际生产的项目,稳定性是重中之重。为了保证运行稳定,需要引入各种实际生产场景的测试 Case,从单元测试到回归测试,每一个 PR 都要经过测试流水线的检验以及 Reviewer 的评审才能合入。在开发过程中,玉康也逐渐开始大量写测试 Case 来覆盖更多场景,以保证开发功能的正确性,这个过程非常提升自身工程能力。相比之下课程中的 Case 就不那么完整、质量相对也不是太高。

  • 与工业前沿接轨。时代在不断发展,很多前沿的论文在不断发表,但这些论文的工程实现与落地非常困难,通常一个想法在多年后工业界才会实现。而 Apache Doris 社区对科研前线关注程度非常大,去年启动重构的查询优化器和向量化执行引擎项目就是业界前沿论文的实际工程落地,这也使得 Apache Doris 在性能上取得飞跃性进步。对于学生群体来说,有机会能阅读到这部分源码无疑对论文和前沿趋势的理解更加深入。


思阳同学同样意识到了这一点,每一行代码的敲打都需要思考实现是不是清晰的、可维护的、可验证的、易扩展的......开源社区中的代码除了需要自己的认可,更需要经由同行前辈的评审并通过广大用户群体的考验。这和以往自己作为唯一的作者和 Maintainer 的项目相比都非常不同,挑战性、成就感和技术上获得的提升都有着质的飞跃。参与开源社区可以接触到很多课堂上从未学过的知识,参与 Apache Doris 社区的实际感受来看,刷新了自身对 SQL 执行引擎的认知,突破了课堂上学习的 Volcano Model,认识到了 Pull-based 和 Push-based 的差异,认识到了 Vectorized Execution Engine……这些知识以前虽有耳闻,但终究不如实际的设计文档和工程例子来得生动具体。

初印象

“说起来纯属偶然,我是在开源之夏的众多数据库项目中随手挑了一个 Logo 简洁好看的开源项目,恰巧就是 Apahce Doris。”玉康同学这样讲到。最初在开源之夏申请开源项目时,玉康同学对 Doris 的了解还比较有限,查阅资料后了解到 Doris 与他未来立志从事的数据库领域十分契合,于是抱着试一试的心态联系了导师杨勇强(GitHub id:dataroaring),对于不明白的地方一直秉承主动提问、穷追不舍的态度,正是凭借锲而不舍的精神才赢得了开源世界的入场门票。


相对于廉玉康的缘分使然,唐思阳的选择显得自有定数。一方面,是在日常学习和实践中接触了大量的开源项目,了解过许多开源社区的工作模式、也学习过许多开源项目的源码,但是另一方面,自身却从来没有亲身参与到开源的建设中,一直处于好奇、观望的状态,但开源开放、自由、理想化的协作模式一直深深吸引着他。


也正是因为有类似 GSoC 谷歌编程之夏和 OSPP 开源之夏之类面向学生的开源活动,帮助学生可以寻找到参与开源的契机。恰巧那段时间思阳同学正在学习 OLAP 相关的知识,因此尝试在社区的 Good First Issue 留言领取任务,也正是这条留言,玉康同学成为了思阳同学在社区第一个接触的开发者,在深入的沟通交流后,思阳同学对 Apache Doris 社区也有了进一步的认识。对于思阳同学来说,Apache Doris 社区不仅欢迎新鲜血液的加入,还不断推出一些开发任务供学生开发者完成,这对学生群体参与开发十分友好,这也坚定了他持续贡献的决心。


值得一提的是,加入社区以来,玉康同学也在向思阳同学分享了许多学习经验和技术成长经历,给予了他很大的启发与帮助。

第一个 PR 的合入

对于志在参与开源社区的学生而言,第一个 PR 的成功合入至关重要,这不仅代表成功迈入开源世界,还将是未来继续参与社区开发的莫大激励。


刚开始加入社区接触的 PR 都比较简单,虽然第一个 PR 的代码量只有不到 100 行,却正式将玉康同学引入开源之路。而思阳同学则是将 GitHub 头像第一次出现在项目主页的短暂瞬间截图记录了下来。或许对于社区的许多开发者来说这样的画面司空见惯,但作为第一次参与贡献的他来讲,确实有一种神奇又美妙的体验感。也许多年以后回头看到这出发里程碑,也会为当年初出茅庐的自己感到欣慰——参加开源,成为 Doris 社区的一份子,是他心中在大学生涯做过最有意义的事情之一。



或许有很多同学同样期待通过开源社区来提升自己,却苦于无从下手,对此思阳同学有不少想法。


首先要找到适合自己的社区,可以根据自己的学习方向先大致过滤出合适的领域,其次根据开源社区的活跃程度、文档建设、协作形式进一步筛选合适的社区。再进一步,观察社区是否对新手友好,比如 Good First Issue 标签下 的 Issue 数量、难度以及时间分布、回应的积极程度,这些都是非常可靠的指标。


在进入社区后,可以尝试积极地沟通。遇到困难时首先尝试自行思考、检索予以解决,解决不了的情况下将问题清晰地描述出来、提供充分的有效的辅助信息,向 Mentor 提问、向社区报告,积极寻求解决方法。


勇于踏出第一步是至关重要的。毕竟自己也因为观望而错过了许多参与开源的机会。之前也害怕以前从来没开发过 OLAP 系统、没有足够的相关知识的储备,甚至对项目的代码都不太熟悉,害怕不能胜任这些任务。但是来到 Apache Doris 社区后发现,我们的新手任务对知识储备并没有想象中那么深的要求,甚至有些任务和 OLAP 甚至并无联系,比如实现一个简单的 SQL Function、做个简单的日志改善、实现一些 HTTP 接口等,也只需要熟悉相关的开发语言便可上手。即便遇到了困难,也有 Mentor 来指导帮助我们。


实际上,下定决心的第一步才是最难的一步,“敌人都是纸老虎”。

路漫漫其修远兮

乔治马洛里说,“因为山在哪里”。参与开源亦是如此,尽管过程中不可避免存在艰难险阻,但每完成一项任务就如同登上一座险峰,即享受凌绝顶的成就感,也期待开启新的征程。


玉康同学印象最深刻的任务就是 SSL 的加密传输,这也是第一个独立实现的功能/模块,完成灵感落地。独立做一件事情的时候,需要考虑的东西很多,比如如何兼顾代码的简洁与功能的完整、如何不破坏之前的代码结构,如何不影响内存与性能等等,这项任务大约持续了 1 个月的时间,期间遇到了许多困难与 Bug,除了需要不断查阅、学习相关代码与资料,还要与社区同学多多沟通、思想的碰撞会带来火花。前辈的经验和建议是值得参考和借鉴的,也正是因为有着前辈的支持和鼓励,才支撑他独立完成了功能开发。


这艰难的过程让他收获了前所未有的能力成长,熟悉了社区分布式协作的流程,包括提交 PR、Review、修改再到最后的合入流程,同时对大型工程项目的理解加深了许多。现在的他读代码和理解代码的速度相比较之前有了非常大的提升。


思阳同学同样遭遇了不少棘手的问题,首当其冲的就是 BRPC-http 这项 Task,这也是思阳同学承接的第二个 Task,目的是在 BE 端用 BRPC 实现 http-server 以取代原先基于 libevent 的 http-server。原本并非是一项困难的任务,但在实际项目过程中遭遇了多方面的挑战:


  • 其一,在回归测试的过程中碰到了许多麻烦——难以模拟的前置条件、难以获取的元数据、难以复现的、只会在线上的 P0 流水线才会触发的 crash......几乎花了实现周期 2-3 倍的时间,最后在 Mentor 勇强的指点下才顺利完成了绝大多数的测试;

  • 其二,在实现这一 Feature 的期间,恰好社区另一位开发者需要实现 https 和鉴权功能,工作内容产生重叠,其间面临了协调与合作的考验,最终通过积极沟通顺利解决了这问题;

  • 其三,也是目前正在攻克的一项难题:由于 BRPC 的 http 实现不满足当前需求,为了圆满地完成迁移必须对 brpc 本身增加 server-end-progressive-reader 的 Feature。Mentor 勇强甚至直接联系了 BRPC 的作者之一,为这个 Feature 的实现做指导。目前这个工作仍在持续沟通和推进中,也期待思阳同学能够圆满地完成这项工作。


不知不觉,从思阳同学第一次正式参与社区贡献已经数月,其间完成了 5 个 Task、合入了 9 个 PR ,目前也仍然在为下一个 Task 和 PR 持续努力着。这些在开源的旅途伊始踏下的或深或浅的脚印,也成为人生经历中不可或缺的一段收获。


这里不约而同,他们也想通过这次机会向 Mentor 勇强、正宇(GitHub id:freemandealer)以及其他导师表示感谢。Mentor 在代码 Review 时提出过许多严格又中肯的建议,也指导和推动了许多功能的实现,在遭遇问题时总能作为 Problem Killer 为他们答疑解惑,即便有时候只是些奇怪的或不合理的想法,也总能耐心地解答。同时也在开发习惯上提供了许多宝贵的建议,并为学生们提供了开发机解决了后顾之忧,使得大家能够毫无顾虑的进行任务开发。

精彩无限的未来

时至如今,从玉康同学接触 Apache Doris 社区已经有近一年的时间。在短暂的时间里,他从一个常常提出问题的开源初学者,成长为可以为新鲜血液答疑解惑、可独立实现 Feature 的活跃贡献者。不仅技术上收获巨大的成长,更是结识了一群志同道合的小伙伴,接触了许多业界资深工程师,视野得到极大拓宽。对他而言,开源给了他一个走出舒适区的机会,能够不满足于当下、不断成长。


参与开源的这段历程也给了思阳同学不同程度的收获及感悟:从学习的角度来看,参与开源可以印证在校学习过的知识,此前阅读过的一些 Paper 的内容都能在 Doris 中找到踪迹,而通过 Doris 也能找到更多同方向的、更深入的资料进行学习。其次对工程能力的提升也十分显著,唐思阳明显感受到阅读、理解代码的能力比起以前有了不小的提升,开发、调试的技巧也有了不小的改善。从就业的角度来看,开源社区提前给了学生开发者最真实的职场体验,这份体验不只是协作沟通及能力的提升,还可以通过尝试开源帮助他们明确未来的职业方向。


身处在信息爆炸的时代,身边充斥了太多资讯,要想得到某个信息其实非常简单,只不过看自己是否愿意去努力寻找,更关键的在于是否愿意走出舒适区。如果有幸能找到自己愿意持之以恒的方向,请不要吝啬付出,因为可收获的更多,人生有无限可能。


值此 2023 年开源之夏启动之际,希望用切身感受告诉大家,“参与开源是一种成长,是一种历练,也是一种爱好,是一种理想的寄托”,也更多期待并肩作战的你。


嘉宾 j 简介:


廉玉康:哈尔滨工业大学(深圳) 控制科学与工程专业 硕士研究生(在读)


唐思阳:中南大学 人工智能专业 大三年级(在读)

2023-03-16 17:194145
用户头像
李冬梅 加V:busulishang4668

发布了 930 篇内容, 共 523.5 次阅读, 收获喜欢 1096 次。

关注

评论

发布
暂无评论
发现更多内容

ARTS打卡第一周5.25-5.31

我笔盒呢

不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...

JackTian

GitHub 学习 开源 程序员 编码

工作 vs 生活

shengjk1

Apache DolphinScheduler新特性与Roadmap路线

代立冬

大数据 数据中台 工作流调度 海豚调度 数据湖调度

愚蠢写作术(1):怎么让你的标题被读者忽视

史方远

个人成长 写作

时代在变,产品运营能力很重要

punkboy

程序员 程序人生 产品经理 产品推荐 程序媛

Element-UI实战系列:Table+Pagination组件实现已选和全选功能

AR7

Vue 大前端 Element

ARTS week 2

刘昱

RocketMQ - 如何实现事务消息

Java收录阁

RocketMQ

使用Kotlin语言初始化数组

mengxn

数组 kotlin 初始化

Kafka系列9:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(上)

z小赵

大数据 kafka 实时计算

John 易筋 ARTS打卡Week 02

John(易筋)

ARTS 打卡计划 ARTS活动 arts

工厂模式(四)泛型工厂之MyBatis Mapper代理

LSJ

Java 设计模式 泛型 工厂注册中心

游戏夜读 | 关于构图的困难

game1night

写博客的那些事

shengjk1

MAC OS 下 HomeBrew 使用

耳东@Erdong

macos brew homebrew

ARTS Week1

姜海天

B端产品经理养成记(2):用户故事

涛哥 数字产品和业务架构

产品经理 需求 产品开发

做PO难,难于上青天

刘华Kenneth

敏捷 产品经理 决策 PO

钢铁侠马斯克之仰望星空

池建强

创业 马斯克 Space X

【ARTS打卡】Week01

Rex

学习

【openlayers】在vue中使用ol

德育处主任

Java html Vue 地图 openlayers

ARTS week2

紫枫

ARTS 打卡计划

draw.io-取代visio的流程图绘制工具

Rice嵌入式开发技术分享

chrome vscode 写文章神器 draw.io

转行程序员浅谈进程间的socket通信

WB

Linux 程序员 socket

RocketMQ - 高可用设计

Java收录阁

RocketMQ

ARTS打卡Week 02

teoking

objective-c LeetCode WebRTC

B端产品经理养成记(1):业务场景

涛哥 数字产品和业务架构

产品经理 需求 产品开发

如何用CSS选择符(数字开头) 杀死队友

德育处主任

Java html css3 大前端 Web

【5月】本月读书学到了什么

Neco.W

创业 读书感悟 阅读量

你会写测试用例吗

开源新生代的成长之路:从校园到开源,需要迈过哪些挑战?_数据库_SelectDB_InfoQ精选文章