🌊一直游到海水變藍

OceanBase2023 赛后记

🕔 6 mins

开始写这篇记录的时候已经是 11 月 9 日,距离比赛结束已经过去了 3 天,但是我却依然感觉时间截止就在昨天。这次长达三周的比赛,是我参加过的赛程最长也是最辛苦的比赛。

我与数据库

第一次接触数据库是在大二的暑假,当时和我的好友 soulter 聊天的时候聊到计算机系统能力大赛的事情,soulter 问我是否有兴趣参加暑假的数据库赛道,是今年新办的。我想反正暑假没什么事情,那就不妨试试。于是,我和数据库的缘分就这么开始了。

其实在还没真正了解数据库之前,我对数据库的看法一直是很带有偏见的。究其原因主要是在我大一因兴趣做一个 Android App 的时候,需要用到 sqlite 数据库,在编写数据库的查询之类的语句的时候我觉得:这个东西的语法好奇怪,而且和 java 语句好有割裂感。现在看来其实当初在数据库还是理论阶段的时候,这套语法就大致被确定下来了,这样做可以对用户的查询定义的更明确而不会产生歧义,也更方便进行语法解析和查询优化。

事情的转机出现在 6 月份准备比赛的时候。我开始学习数据库的经典也是公认的神课 CMU-15/445,打开课程网站的一瞬间,我就被课程安排的详细程度所震惊。从每一堂课都有 Youtube 录播,再到每节课都提供 ppt 和 pdf 教案,再到大实验 bustub,甚至还提供了 gradescope 来给校外的同学们进行评测。课程安排之详细完全超越了以往我做过的所有课程。不愧是世界计算机第一名校 CMU。

Youtube 上的课程录播 Youtube 上的课程录播
实验安排 实验安排

不仅仅是课程安排,上课的老师 Andy 也十分的有趣,他会在每节课上课前邀请他的 dj 来打碟(这就是世界名校吗🤯),还会表演一小段十分尴尬的相声。讲课的时候会仔细认真的回答每一个同学提出的问题,还会为了录播的同学把问题自己重复一遍,防止我们听不清同学的提问。不得不说,名校的学生思维确实是不一样,提的问题大多都是非常有深度的问题,而且他们也很敢于提问,有什么不清楚的都会提出来。

于是,我逐渐对数据库产生了兴趣,开始一点一点跟着课程学习下去。在做大实验的时候,我又被 CMU 之体贴所震撼,你只需要按照每个实验的要求,修改对应的文件内的代码。这完美贯彻了接口编程的思想,你可以随意添加自己的函数,只需要把它提供的接口给写好,评测的时候调用接口来进行评测。实现方式非常自由。

时间过得很快,一下子就到了 7 月比赛,由于暑假还有小学期等其他课内的事情,导致比赛开始的时候我还没完整学完课程,7 月份的比赛就只能陪跑。不过这段时间的学习还是让我逐渐确定了我以后走数据库方向的道路。

8 月很快过去,在这个月接了一个竞赛辅导的任务,没有太多的时间放在数据库的学习上。开学后,备战 ACM,一系列课内的安排让我只能在课余的间隙才有机会继续学习数据库。不得不吐槽我们学校的课程安排,把计算机三大件全部放在大三上,计组实验也什么资料都没提供,我一开始甚至不知道计组实验该写什么,这样一对比 CMU 的课完全不在一个层次,甚至差了好几个层次。

OB2023

时间很快到了 10 月 21 日,OB2023 比赛正式开始。我和 soulter 还有另一名临时招募的同学配置好环境,分配了一下任务便开始了比赛。由于之前我们学校没人打这个比赛,没有学长可以传授经验,我只能自己阅读源代码,花了足足 4 天的时间才把代码的基础框架读懂,理解了数据库是如何解析语句,如何生成算子、调用算子,并且完成了第一个聚合函数的任务。这也直接导致了后续时间太赶。

从看懂代码开始到第二周结束,过程都还算顺利。索引部分由于不需要实现 B+Tree 因此也过得比较轻松。但是由于没有经验,我们是按照题目顺序依次完成功能。等到后面需要实现表达式功能才发现,前面写的很多东西都需要进行重构,包括聚合函数。这也间接导致了时间不够用的问题。这种大项目的比赛是十分吃经验和资源的。

最后一周也是最辛苦的一周,这周基本上每天 coding 的时间高达 8 小时。并且我周末还需要飞去南京参加 ACM,只能压榨尽可能多的时间来写数据库。这几天基本上电脑随时带在身边,有空就写一会儿。

由于对项目的不熟悉,再加上临时队友的基础薄弱,基本上相当于我和 soulter 两个人在打比赛。我们队伍的排名一直徘徊在 70、80 名上下。然而在周日的晚上,也就是我打完 ACM 的那个晚上,我把表达式写好了,同时还过了 alias,又稍微研究了一下 update-mvcc,发现直接调用之前写好的 update 就可以了,一瞬间加了 70 分,分数达到了 440。而此时复赛线是 500(满分 520,今年也太卷了),也就是说再过 3 道题我们就可以进复赛!此时我手上还有一个 function 已经写好,就差提交了,这样只需要再写两道题就可以了,我们能够进入复赛的几率大大提升!

不过现实终究是残酷的,纵使我熬了整整一晚上,第二天回北京的飞机上还在写代码,在 18 点比赛结束前也没能和 soulter 一起弄出来这两道题。我和 soulter 都深感可惜。最终队伍排名止步在 62 名。

miniob git graph miniob git graph

总结原因,还是我们对项目不够熟悉,比赛开始的时候浪费太多时间在熟悉项目代码上面了。其实 miniob 一直是开源的,也有训练营来给我们练习,可以提前熟悉项目。但是由于没有参加过类似的比赛,对赛制不熟悉,最终导致浪费太多时间在这上面。

不过这场比赛也极大地提高了我的代码能力,团队合作能力,以及让我对一个 C++ 大型项目有了更完整的认识。在打 OI 的时候接触到的 C++ 是不够完整的,总觉得类没什么用,知道现在才发现对于一个大项目的编写,面向对象有多么的优雅。我也对数据库这个方向有了浓厚的兴趣,我很高兴我能够找到一个我喜欢的方向。

虽然没有国奖,但是学校很贴心地提供了校内奖,意外收获 3000 元,也算是对我这段时间努力的激励吧!🥰

— Nov 9, 2023