本文字数:8888字
阅读时间:23分钟
序
先自我介绍一下,乔嘉林,网名铁头乔,2016年西安交大计算机系本科毕业之后,来到清华大学软件学院直博,师从王建民教授,大师兄黄向东,今年顺利毕业。回首往事,没有虚度年华,也不算碌碌无为,主要在做一款时序数据库:Apache IoTDB。
五年时间,见证了 IoTDB 从发布第一个版本,到应用于数十家企业;从公开源代码,到成为 Apache 基金会顶级项目;从只有实验室同学参与,到形成百余贡献者的开源社区。博士阶段最开心的不是论文中稿,而是做的系统能够运行在祖国的大地上。
毕业的事情忙完之后,便开始准备这篇文章了,总结了一下博士阶段的经历和教训,历时两周终于完成,献给大家。
前言
读博第一阶段
读博第二阶段
后记
前言
为什么读博?
选择读博的都是勇士,我读博的理由有三点:
(1)科研初体验还不错:15年在中科院自动化所实习,过了两周读论文写代码的生活,这种生活简单纯粹,像是回到了高三。
(2)简单的执念:清华是我从小的梦想,觉得在清华多待两年,就能多跟老师学点知识。
(3)想了解自己:本科经常听说读博压力大,想看看自己在这个过程中会有什么想法,做出什么选择。
读什么方向?
做系统。15年在西安神州数码实习,7人一组,两周做一个银行贷款系统,也是第一次领略到做系统的魅力,当把系统从用户到后台每一步都调通的时候,就像打通了任督二脉,这种爽劲也支撑我演示前一晚写代码写到2点多。
作为组长,我的职责就是把流程跑通,然后大家一起完善业务逻辑。演示当天,还有半个小时展示,系统又出幺蛾子,于是继续调,终于在演示之前搞定,顺利通过。
这次经历让我对做系统产生了浓厚的兴趣,而且很期待有一个紧密的团队,大家一起写代码,就像一起扛过枪上战场。那个时候对系统的感觉就是构建一个虚拟国家,定义各种规则,让各个部门协同运转起来。
但是同时,我也意识到,这种系统第一次做很新鲜,如果总做类似技术栈的系统,也会感到无聊。做系统不是单纯的堆功能、拼广度,而要追求深度。因此,读研的方向选择了做系统,希望能够学一学大型系统里的知识和优化方法。
初见导师
读研时候有一次听刘璘老师说,读博就像是选择一种婚姻,一辈子就一次,也不会有心境再来一次。这也说明了选择导师的重要性。结合自身的经历,我觉得选导师的原则就是:你想成为像导师一样的人。
15年与导师第一次见面,这次见面给我留下的最深刻的印象就是:王老师的精神状态比很多20多岁的年轻人还要好。
为什么这么说呢,以我本科为例,大四经常和舍友玩游戏到一两点,早上没课就睡到十一点。上午无精打采,下午逐渐恢复正常,晚上贼精神。到了暑假寒假,作息就更混乱了,闲的难受。后来也意识到这种生活没什么意思,我需要一些长远的目标,来保持良好的精神状态。
保研面试
在保研面试时,我说自己的梦想就是做系统,当架构师。
于是,一个斗志昂扬的23岁年轻人,就这样通过了面试、走进了读博生活。
读博第一阶段
本科毕设
博士的生活要从2016年3月来清华做毕设开始算,那个时候大家正在开发一种叫做 TsFile(Time series File) 的文件格式,主要用来存储时间序列数据。
我的第一个任务就是实现 Spark 和 TsFile 的连接器。对于一个本科只写过一些数据结构与算法,github、maven 都没怎么用过的人来说,从哪下手都不知道,只能在 github 上找类似的项目,然后看他们的源码。
以前自认为写代码不发愁,很多时候写一遍代码,没有bug直接能跑。那时候才意识到仅会给输入输出,写个算法是不够的。很多时候不是哪个算法写不出来,而是不知道在哪写这个算法。而在大型项目中,经常需要尝试新技术,走通一条技术路线,显然我在这方面缺乏经验。
进度缓慢,于是开始堆时间,每天早上8点多到实验室,晚上10点多出实验室。也因此没怎么锻炼身体。碰巧这时候又遇到了我的中国好舍友,孙林。他买了各种各样的零食,但是他不怎么吃,都给我吃了,于是一直 62.5Kg 的我,这时候到了 73Kg。
于是我逐层分析原因,从本科没重视实践,只学了书本知识,到高考没考好,再到初中经常玩电脑。把当时的困难归咎于过去的经历。甚至在想,如果当初没来清华,可能就不会遇到这些困难。
后来想通了,悟已往之不谏,知来者之可追。过去的事情已经无法改变,无论我做何选择,总会在前进的道路上遇到困难,而这时候只能硬着头上。
当你真心想做一件事时,全世界都会来帮你。当时有三个复旦的同学也来我们实验室,嘉烨、仔仔和齐童,其中嘉烨做的工作和我相关,于是我有了可以请教的人,在他的帮助下,我又开始有了进展。
此外,有时候遇到问题,我开始在其他开源项目里提问,有个国外小哥经常及时帮我解答,有时候甚至直接给我丢过来一段代码,这也是第一次接触开源。
于是,项目逐渐步入正轨。还好大四下学期提前来适应了一下实验室生活,不然博一又要上课,又要做项目,估计忙不过来。所以,如果有机会提前进入下一阶段,就要主动。
团队成型
2016年秋天,IoTDB 初始团队成立。
(1)东哥:在我逐步适应项目节奏时,那个男人回来了,他就是从遥远的澳大利亚留学归国的东哥。作为我们组的头,统筹全局。
在科研方面,带我一篇篇读论文,每篇论文读完之后讨论半个多小时,也让我这个科研小白逐渐学会了怎么读论文。
项目方面,他需要做 IoTDB 的规划和项目实施,经常熬夜。所以我就尽量帮他分担一些工作。
(2)宗姐姐:实验室的行政老师,和我们打成一片,在生活上对我们非常关照,思想上排忧解难。
铁头乔也是宗姐姐叫出来的,我觉得非常适合自己,哈哈哈。
(3)大哥:实验室的山东大汉,比我高一级,他平时开发经常涉及到位运算,但是从他嘴里说出来的位都成了“味儿”,大家可以感受一下,“这一味儿与上那一味儿”。大哥是海底捞黑海会员,于是有时候也不可避免地成为了大鸽。
我经常会找大哥要接口,我们的经典对话就是,“大哥,这个接口能不能支持?”,大哥回:“你问我支持不支持,那肯定要支持啊!”
(4)康博:比我高一级的博士师兄,主要做写入和存储引擎,康博是典型的很负责任的清华学子。
在我们研一准备考试时候,又有新任务,康博说了一句让我至今印象深刻的话:“交给我们,让他们去复习考试吧”。
(5)馨逸:我们级唯一的女生。也是我们实验室唯一的产品经理,在馨逸的努力下,我们有了第一版高质量用户手册和Apache IoTDB沿用至今的logo图标。
馨逸买了零食之后,她的桌子放不下,就放在作为同桌的我的桌子里了,就被我吃吃吃。
(6)小飞飞:实验室的另一位山东小汉,是大哥的接班人,也是我们每天的快乐源泉。
有一次写代码写的比较晚,一直在优化一个数据结构 DynamicOneColumn(DOC),我和小飞飞骑车回宿舍的时候,小飞飞就快乐地唱了起来:“DOC~ DOC~ 我是一个DOC~”。
(7)老年人:康博的接班人,他的爱好和老年人一毛一样。性格也比较稳,被东哥认定为磐石。
当时做毕设时候,我们去吃快餐炸鸡,老年人说:“来个冰激凌,吃点甜的,每天过的太苦了。” 老年人的口头禅:“这个鬼东西”。
(8)徐总:清本毕业,自成一派,负责SQL解析和RPC,平时负责审PR,被东哥认定为利刃,把好最后一道关。
徐总非常自律,从来不吃外卖,实验室集体加班时候也不吃外卖,只吃食堂,风雨无阻。
横空出世
我们每个月会进行 IoTDB 的版本发布。第一个版本发布是 2017 年4月1日愚人节,我们发布了 0.1.0 版本,也标志着一个产品的诞生。
这时候的 IoTDB,在我看来就像是一个刚出世的孩子,无法预料它会发展成什么样子,又会对我的人生轨迹产生怎样的影响。
公众号的前身
2017年夏天考完最后一科,正好去做了一个膝盖的手术,做完手术后只能在家做康复训练,并且注册了一个公众号 “乔村儿”,也就是这个公众号的前身,主要用来记录和分享生活,也收获了很多:
(1)与家人分享日常生活。可能男生都或多或少跟家人交流不多,通过写作的方式,让家人感受到我的关心。虽然不能常回家陪伴,但是可以让我的文字陪伴他们。很开心的是,有一次姐姐说,爷爷在给奶奶读手机上的东西,一看是我写的文章。
(2)与朋友紧密联系。许久不见的朋友,读到我的文章之后,也来分享自己的生活。也让自己时刻意识到,生活有千百种过法,我只是其中一种,就让我们在各自的生活中加油吧!
(3)在更广阔的的天地寻找自己的位置(来源于阿德勒心理学)。生活不能全部被工作和科研占据,当工作的小圈子遇到问题,需要有更广阔的的圈子接纳自己。而公众号就是一个更广阔的共同体。
(4)锻炼文字表达能力。我从来不喜欢写作文,但是写这些还可以。写得多了,对于写作也就不发愁了,也算克服了一项缺点。
青海西宁的日子
2017年10月左右重返学校后,我和学弟江天(我的天)被派往青海西宁,和昆仑数据的团队一起参与青海新能源大数据平台建设,应该是国内第一个风电物联网平台。
我们的目标有两个,一个是用国外产品接住线上数据,第二就是验证 IoTDB。不得不说,这一次近距离体会到了和国外技术的差距。也从这次实践中,我们开始重视乱序数据的处理,并且完善自己的产品。
出差过程中也结识了一帮好朋友,我的天话不多,代码写得贼6,平时比较宅,晚上下班却乖乖被我拉出去,在冬天的西宁吹着冷风溜达。
还有昆仑数据的一帮兄弟,统筹帷幄的蒋总,数据平台总负责人鹏哥,负责数据接入的景帅,负责查询的一鸣,驻场的陈明、远程支援的振兴哥,还有上飞机前一分钟还坐地上抱着电脑运维的远哥。
那时候每天中午大家会去一个小饭馆吃碗面,晚上就找大饭店吃一顿好的,涮羊肉、涮牛肉、烤鱼,附近的饭店基本都被我们吃遍了。周末不忙的时候大家还会一起爬个山,在西宁的日子还是很不错的。
读博之路如此艰辛我始料未及
这是2017年龟给我分享的一句话,我觉得非常贴切那时候的我。我高中最差的科目就是语文,大学好不容易不用学语文了,可把我高兴坏了。读了博发现要发英文论文才能毕业,我就意识到了,这将是我人生中最艰难的一段时期。
尽管项目开始有了起色,但是论文的压力又逐渐增大。此时,机器学习方向逐渐火热。相比之下,数据库系统方向不是那么好发论文。这时候有两个选择摆在我面前,是去做机器学习,还是继续数据库系统方向。
当这个问题从脑子里冒出来的时候,其实就已经有了答案:还是做系统。
读博并不是为了毕业的那个时刻,而是为了过程中的每一天,每一件事。当下定决心在一条路走到黑的时候,就没有那么多时间纠结和彷徨了,也就进入了博士第二阶段。
读博第二阶段
积极的生活状态
2018年过了几个月非常规律的生活。
7点30:起床
7点50:去食堂点一碗小米粥和两个鸡蛋,后来打饭阿姨看到我直接给我固定套餐。
8点30-12点:干活
12点-12点30:去离实验室最近的食堂吃饭
12点30-13点30:午休
13点30-17点:干活
17点-18点30:去操场锻炼,吃饭
18点30-22点:干活
回顾整个博士阶段,这应该是我最喜欢的生活节奏。如果说找到健康的生活节奏是安装了一台高级发动机,那接下来的事情就是找到前进的方向。
走向开源
2018年夏天,王老师做了一个开创性的决定,要把 IoTDB 捐给 Apache 基金会,从内部项目转为开源项目。原因有几项:
(1)当时的开源大数据软件大多是国外贡献的,国内大多是在使用,我们应该为中国的开源软件做出自己的贡献。
(2)学校里很多项目随着一波学生毕业也就停掉了。而系统软件是需要五年、十年的投入,并且需要众多优秀的贡献者参与,形成良好的社区才能长久发展。
就这样,我们提交了申请书,经过投票进入了 Apache ,成为 Apache 唯一的物联网时序数据库项目。
所有进入 Apache 的项目都要先进入孵化器,完成相应的任务(建设社区)后,才能毕业成为顶级项目。而无法毕业的就会退休,退出 Apache 基金会。
在进入 Apache 后的一段时间,我们把项目代码从清华的仓库迁移到了 Apache 的仓库。并且按照 Apache 的要求做了很多事务性工作。同时,在项目导师的指导下,我们尽量把讨论放到了邮件列表中(这是一件很痛苦的事情)。
尽管我们是 Apache 开源项目,但是并不知道怎么建设开源社区。好像进入 Apache 开源对我们来说,只是增加了一些繁琐的工作。github star 也并不多,更不知道怎么吸引社区开发者和用户。在幻想一进入 Apache 之后就能拥有活跃的社区开发者和用户的我们,被泼了一盆冷水。
第一道坎:上海地铁
2019年5月30号要上线上海地铁,需要写入延迟低于200ms。线上系统是用的 KairosDB,我们首先需要适配 KairosDB 接口,于是从2月开始,学弟刘睿带一个实习生做了 IoTDB 兼容 KairosDB 的 Rest 接口:IKR(起名就是这么直接),到5月基本完成。
经过初步测试,我们的写入延迟有时候会达到几十秒,平均延迟也不满足要求。说实话,这个时候我对存储引擎并不熟悉,看了看代码只觉得很复杂。但是我也知道,这是 IoTDB 的一道坎,迈过去了就一马平川。
这时候,正值女朋友毕业旅行,我跟她说:“你去吧,等你回来之前我肯定把系统搞好!”
送走了女朋友,我拉上了我的天和天安两大主力学弟,在东哥初步趟了路之后,开始重写存储引擎。
已经毕业的大哥听说我们的计划之后,说你们不要太激进。确实,我没什么把握,但是还是想拼一把。借用 stormzhang 的一句话,就是干!
就这样,三个人结对编程,每天早上9点到晚上11点,花了一周时间,基本写好了一版,开始测试。测试能看到初步结果需要半个小时,这半个小时就像等出高考成绩一样忐忑。而第一次的测试结果也没有让我们失望,果然不稳定,稳定才见鬼了。但是不怕,我们还有一周,带周末的那种。
找问题,完善方案,继续修改,提交测试。这个过程持续到了第二周的周六。周六下午组会东哥需要汇报一周的工作,我们周六上午10点出了一波结果,发现还有问题,东哥说:“我心脏难受。。。”
经过了一周的磨合,我隐约感觉,这次改完估计就稳了。11点开始提交测试,测到下午1点30,看写入延迟监控,系统一切正常,平均延迟25ms,起飞!
后续芮蕾和苏月适配完查询引擎,成功上线上海地铁,替换了之前的 9 台 KairosDB 集群。
同级硕士毕业
我这个人经常后知后觉,在我忙完上海地铁项目,才发现同级的硕士朋友们已经离校了(尤其是拉开抽屉,发现没有零食了...)。对于博士生来说,这是一个标志性的时刻。曾经用在东哥身上的 “干走了一届又一届硕士”,我也能够体会到是什么感觉了。
作为还在学校的我们,能做的唯有坚持,不让大家的努力白费,希望他们之后在和别人聊天,听到 IoTDB 在某个场景里被用起来的时候,能够开心地和别人说:“我也是 IoTDB 的贡献者”。
借用《1408幻影凶间》结尾的台词:We are here to do the job, and we don't rattle(我们是为了这个故事而来,我们要镇定自若)。
从哪里入手呢?好的开源项目都有活跃的社区,因此,我的想法就是建设开源社区。社区是一帮有共同目的的人,接下来就是怎么找到这些人。
盘点了一下手上的资源,我们可以在一些大会上进行宣传,也能够通过实验室的一些项目打磨产品,但是这还不够。我们需要更多的用户、贡献者和更丰富的测试场景。
实验室没有专门做社区运营的同学,也没有打广告的预算,只能自己想办法了。
社区建设
“乔村儿”断更的时候,我并没有停止写作,而是新开了一个技术公众号“数据库漫游指南”。刚开始并没有推广 IoTDB,主要原因是那时候还不稳定。但是,在经历了上海地铁的洗礼之后,我对 IoTDB 和自己的运维能力已经有了的信心,于是开始在公众号上进行宣传,后来直接改成了 Apache IoTDB。
除了公众号,也在CSDN、OSChina上写文章,包括版本发布、使用教程、常见问题、运维经验等,前前后后估计写了上百篇。此外,组建了微信和QQ用户群,并且把自己的微信放到了公众号上,很多加过来的用户跟我说的第一句话就是:“看了你的文章,很有帮助,希望进群”,这也是对我的激励。
此外,还有一些用户加好友的备注是“IoTDB爱好者”,这应该是每个软件开发者最开心的时刻了。当然,也不乏扔臭鸡蛋的,而我们需要做的就是及时改进,勇往直前。
我曾经想过要不要弄个机器人加群,后来想想还是算了,毕竟不是所有人都习惯在群里说话,直接加到我,能够让用户和开发者第一时间找到我,离社区更近一些。
找到第一个贡献者
开源社区的发展是从找到第一个社区贡献者开始。对于我来说,就是刘大伟。
2019年底大伟哥进入我们社区,他比我大两岁,是四维智联的架构师,也是我的老乡。正好年底升级查询引擎,就拉上他一起讨论设计方案,而且初步实现就交给了大伟哥。
查询引擎涉及的地方非常多,他第一版改完之后,上百个测试类不通过,搁谁都头大。本来我预想的是等我忙完,我们就一起来修测试,没想到他一个人把测试一点一点都调好了,那段时间他经常搞到晚上两三点。实话说,这股精神我非常佩服。
除了社区的活动,我们也会经常约饭,并且一起参加其他开源社区的活动。大伟哥凭借优秀的人格魅力,已经成为社区的明星人物,现在也是社区的 PMC。
如何参与开源社区?我尝试从大伟哥的经历总结一下:贡献、认可、热爱。这三个词每一个都不是单向的,而是社区和贡献者之间的双向互动。
第一个开源用户
2020年疫情爆发,开始在家办公,疫情期间我们主要做了一件事:和大唐先一的张景一起,让 IoTDB 在湖南几个电厂上线。
最开始景哥跟我交流,说:“5月有个项目准备上线 IoTDB,能不能支持一下”。我说:“只要你们决定用,我们就全力支持。”
正值重构完查询引擎,bug 比较多,时不时就给我反馈测试问题,而我们就通过微信沟通,一步步排查。
就这样,过了一段时间解 bug 的日子,每次我自认为没啥 bug 了,就跟女朋友说:“这肯定是最后一个 bug。” 然后马上就来打脸,她就在旁边乐。
有的bug我自感一天搞不定,没思路,就拉上田原、我的天、劳模昊男四堂会审。事实证明,及时求助他人,确实能够加速问题的解决。虽然过程比较艰难,磨合了三四个月,最后终于成功上线。
我对用户的态度就是大哥的那句话:“你问我支持不支持,那肯定要支持啊!”
开源社区
在参与开源项目的日子里,也接触到了不少中国的开源人物。包括我们项目的姜宁导师;开源布道师李建盛老师;在家脱产写了一年代码的APISIX的温铭总;Sharding Sphere 的亮哥和娟神;海豚调度的东哥;Pulsar的翟哥、示说网的程总等等。
关于社区建设,我时不时会想,如果有个人能够全职宣传就好了,但是 Apache APISIX 的温总的一句话改变了我的想法:“社区建设这么重要的事,当然要自己上了。” 一件让 CEO 亲自上阵的事情,值得我们认真对待。
我们的开源社区也在不断壮大,现在已经有122位贡献者了。其中不仅有战队,如东方国信的超哥、厚亮、海媚、艳虹;阿里的金竹老师团队;云智慧的红闪;用友的永伟、瑞杰;华为的秉华、超哥、一夫、鲁铭。也有如宗翰、魏小涵、宇翔、刘煜、亚东、佳俊等单兵联盟。此外,也有非技术同学的加入,如禹任、李琳、泰丞等等,大家一起组织活动,编辑公众号文章。
铁打的实验室流水的兵,实验室的队伍也在不断融入新鲜血液,我们的团队也在壮大,我也有了自己的小弟,田原、书记泽嵩、老中医恺丰、愈园、祥威、新宇、凌哲、Steve宇荣、旭鑫。在学校的好处就是能够接触年轻人的新思维,心态永远年轻。
收获
个人收获:2020年,学院奖学金的评审规则进行了修改,增加了开源贡献。这也标志着,不仅仅发论文能够受到学院的认可,做系统、做软件的同学也能够受到认可。对于我们实验室这些做系统的同学来说,无疑是一个好消息。在学生时代的最后一年,我也有幸获得了国家奖学金和清华软件奖。
产品方面:不完全统计,IoTDB 已经有数十家用户,部署的实例有数百个,在多个场景中实现了对 InfluxDB 等国外产品的替代,实现了工业软件的国产化。
社区方面:随着社区的成长,每个参与社区的人都会共享社区发展的成果,近期最直接的例子就是招聘 IoTDB 人才的岗位越来越多。可以说,社区是一个为大家创造机会的平台,我也希望能够让参与 IoTDB 的朋友们有所回报,不仅是精神方面,还有物质方面。
毕业
不得不说,博士毕业都要脱层皮,预答辩、毕业论文、格式审查、盲审、学位答辩,每个环节都有可能挂掉,庆幸的是在朋友们的帮助和鼓励下,都顺利通过,也深刻感受到了开源对于我的影响。毕业答辩时,评委老师说了一句话:做系统不容易,尤其是做生产级的系统。
如果说淮海战役是人民群众用小车推出来的,那我的博士之路则是学校和开源社区共同铺就的。
毕业答辩很多素材和场景都来源于社区,感谢中车的晓晨哥、大唐的张景、瑞恩的李总、嘉信的万总、绍兴的发哥、拓维的斌哥、华哥、鹤爷、平哥、天远的翟哥。感谢所有 IoTDB 的用户、贡献者和帮助过我的朋友们。
五年的博士生涯即将结束,但对于数据库系统软件却刚刚起步,我会继续在 Apache IoTDB 社区发光发热,和社区的朋友们一起打造世界级的时序数据库产品。
后记
总结
总结一下经验教训:
(1)在团队中,做一个许三多一样的人,利人就是最大的利己。
(2)时常反思,找到原因后不纠结,想如何解决问题,并且避免再次掉坑。
(3)坚持长期主义,多阅读、多分享。
(4)坚持锻炼,为祖国健康工作50年。
(5)建设开源社区没有捷径,唯有付出真心。
一句话概括:找到热爱的事业,用创业的态度去对待。
欢迎关注个人公众号:「铁头乔」,会分享个人成长、实验室生活、物联网时序数据库等知识。