

博士五年,我在清华做时序数据库
source link: https://my.oschina.net/u/3664598/blog/5085818
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

博士五年,我在清华做时序数据库 - 铁头乔的个人空间 - OSCHINA - 中文开源技术交流社区
本文字数: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)建设开源社区没有捷径,唯有付出真心。
一句话概括:找到热爱的事业,用创业的态度去对待。
关于本公众号
个人公众号《铁头乔》重新开张,本号有留言功能,会长期经营,分享生活感悟、读书笔记、研究生生活、时序数据库知识,欢迎大家关注转发。
本文分享自微信公众号 - IoTDB漫游指南(Apache-IoTDB)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK