我是刘继聪,2020 年毕业于复旦计算机专业,目前在涛思数据任职流计算引擎研发工程师。这篇文章是关于我过去这些年所做出选择的复盘与回顾,我曾经历的迷茫与困惑——关于为什么放弃保研与出国、又为什么从如火如荼的 AI 转做数据库、以及为什么离开大厂加入 Startup 的故事。不知其中是否有与你相似的经历,你又能否从中获得一些共鸣,希望能给到迷茫的人一些走出困境的灵感。
和很多人一样,我在进入大学时对自己感兴趣的专业并不清晰,从自然科学试验班分流进入物理系一段时间后,我才决心调转方向进入计算机专业。
我和计算机结缘于物理系的一个项目——实验室设备管理系统,需要完成的是 Web 与服务器相关的功能,我自己在网上找教程,用世界上最好的语言 PHP 写出了人生中的第一版程序——一个 LAMP 架构的 CRUD 系统。同时我选修了物理系的 C++ 课程,第一个相对较大的 C++ 项目就是这门课的期末项目,用经典的蒙特卡洛方法做 Ising model 的模拟。
一来二去,我发现写代码比在物理实验室修设备更有趣,加之复旦还提供转专业机会,就动了这个念头。不过那时我已经大二了,按照规定大二转专业必须降一级,虽然在当时看来代价很大,不过现在想来,这绝对是个正确的选择。
话虽这么说,但在我刚转入计算机系时,也属实是被各路大神虐得体无完肤,甚至一度怀疑自己是不是做错了决定。
当时我所在的拔尖班的数据结构课每周都会有机考打 OJ,OJ 和 LeetCode 有点像,但有一个典型的区别是,你只知道你的答案错了,却不知道有哪些测试数据,更不知道错在了什么数据上,所以 Debug 完全靠看代码猜。一开始,我做机考经常一分都拿不到,每周光是完成作业就几乎要花掉我所有时间。为了获得更好的成绩,我有很多次写代码直到天明。但进步是看得见的,慢慢地我能够在每周机考上取得满分,最后不仅这门课程我拿到了 A,绩点也获得了全系第一。
现在想来,我觉得这应该是一个台阶,你需要拼尽全力才能登上去,但只要登上去就会看到不一样的风景。这段竭尽全力刷算法题的经历对我后来找实习、找工作也起到了非常大的帮助,基于此我才能够在临时起意、几乎没有什么准备的情况下进入字节跳动实习以及拿到各大厂的秋招 Offer。
拔尖班的好处是选择的余地很多。除了数据库课外,我还选修了分布式系统、数据挖掘、密码学原理等课程。我和朋友们组队一起做了很多有趣的项目,部署 Hadoop 与 Hive,分析不同任务中的性能瓶颈;使用 Spark 进行分布式的计算;实现数据库的块嵌套循环连接,将执行时间从十几秒优化到一秒以内……
在复旦,我拿过各种各样的奖励,除了一等、二等、三等奖学金,还有数模竞赛、物理学术竞赛的国家一等奖和上海市一等奖、泛海学者、优秀学生等等。在求学之路上,我遇到了很多优秀的同学、名师以及挑战,也收获了一路成长。
大学时的获奖证书
在研究领域上,我也并非一开始就关注数据库,这其中还有一段曲折的摸索过程。
我进入计算机系后,应拔尖班要求加入了 NLP(自然语言处理)实验室。在大三上学期期末考试结束之后,我成为了字节跳动 AI Lab 的一名 NLP 实习生,做的是中文错别字检测的工作,实习结束后进入港科大做暑期交流,尝试做更深入的研究。在这么几段短暂而又截然不同的 AI 研究经历中,虽然导师都是业界、学术界的大牛,但我却没有做出什么厉害的成果。
由此我产生了一些新的想法,要不要去做一些别的事情,或许我会觉得更有趣、也更能发挥我的长处,就像我从物理转到计算机一样。我把这些想法和在不同研究领域的朋友们交流了一下,之后一位做数据库的同学引领我看到了另一个领域——Data Infra。接下来我成为了 TiDB 的贡献者并开始系统性地学习分布式系统和数据库,算是正式迈进了数据库的门槛。
但我在参加工作时却并没有直接进入这个行业。临近毕业季,我面临着参与保研还是出国抑或是参加秋招的选择。由于保研外校需要参加夏令营(但我那时在港科大交流),而本校又没有特别合适的导师,于是我放弃了保研,赶上了秋招的末班车。我做了两手准备,即使没有找到合适的工作,仍然可以申请出国,结果没想到秋招超乎想象地顺利,我拿到了参加面试的所有公司的 Offer:其中既有阿里、腾讯这类大厂,也有 PingCAP 这类创业公司。
在某互联网大厂的终面中,我遇到了一位同样复旦毕业、工作十多年的学长,他问我手上有哪些 Offer 以及倾向的选择,我如实地回答了,并说我现在想去做数据库。他不置可否,只是反问我:“年轻人都想去做些有技术的事情,我当年也是。但去 Startup 做数据库,你是否真的想好了?在未来好几年,你可能都比你在互联网大厂做业务的同学薪资更低,同时还要承担更多不确定性的风险,你真的能接受吗?”
我真的想好了吗?或许确实没有。最终,我选择了去阿里云,从事基础架构的工作,希望能取得一定的平衡。
疫情在那个冬天爆发、无法返校,毕业时只来得及和部分同学匆匆相聚又相别。上海到杭州的动车不过 49 分钟的车程,恰如从学生到职场人的转变,快得令人猝不及防。下一站,杭州阿里。
或许是得益于我之前还算丰富的实习经历,又或许是我在学生时代就做了很多有挑战的课程项目,我很快上手了新的工作内容。第一个令我印象深刻的任务,是我入职的第一个月,就解决了一个困扰了组内技术专家们半年之久的问题。
背景是这样的,我们有一个监控系统,监控的探针直接安装在客户 ECS 上,客户可能会购买很多 ECS,用 Kubernetes 或非 Kubernetes 的方式组成集群,我们要做的事就是抓取出集群内的网络拓扑关系,比如 TCP 连接,然后绘制成可视化的拓扑图。与一般的分布式微服务相比它存在三个难点:
我们是通过轮询/proc 目录下的 TCP 文件来解决这些难点,但无法保证抓取到全量数据。最好的解决方法是用当时比较新的技术 eBPF 来做,却因为绝大多数客户环境不能很好地支持 eBPF 而难以落地。我花了一周业余时间做调研,发现一个内核模块 auditd 可以较好地解决这个问题,几周时间后我们的新版探针上线了。这个半年无解的难题得到了解决,也成为我进入职场之后第一件很有成就感的工作成果。
但逐渐地我发现,组里的工作属于典型的管控侧,管控侧的麻烦是适配用户各种各样复杂的环境,但自身的核心能力、技术难度与挑战都明显弱于平台侧,因此,我能挑战的问题没有想象中那么多,进步的速度也渐趋缓慢,组里业务的发展状况也并不好。
为了排解工作的枯燥乏味,再加上做数据库之心一直不死,我和朋友们一起参加了 PingCAP 2020 年的 Hackathon。我们选择的题目是基于 Raft Log 来实现物化视图,属于改内核的工作。在赛程中,我和小伙伴们通宵达旦地写着代码,调试与解决问题,这让我感到了在工作中久违的快乐——写代码、解决难题与自身进步的快乐。
经此一役后我开始思考未来,在当下的工作中虽然我得到了老板的信任、成为了一些项目的 Owner,或许会有按部就班的晋升,但这些毫无波澜的人生轨迹也让我越发感到工作中的枯燥乏味。我决定要离开,但为了避免重蹈覆辙,我必须要先确定好目标。
我筹划着两条路——转岗或跳槽。我开始和公司内不同团队接触,但是结果却让我失望:很多我以为做着内核研发的部门却实际上只做管控和写控制台;而另一些内核部门,一整个组的 Scope 都小得令人失望;还有一些,并不欢迎校招新人转岗……
而另一方面,整个 Data Infra 的环境却在悄然改变。我身边开始出现了一些令人振奋的声音,比如:
“所有人都看好 DoorDash 这些明星 Pre-IPO,而 Snowflake 这类公司招人都很困难,但后来发现那些去了的人拿得是几百万刀的大包……”
“Snowflake 的发行价已经上调了,上市当天就暴涨了超过 100%……”
“Snowflake 的数据确实好:它的 NRR 是 173%,也就是说假设一个用户去年在 Snowflake 上花费了 1 美元,那么今年他将平均花费 1.73 美元……”
“Confluent 上市、Databricks 大额融资……”
……
这时我才惊醒,当时那位校招的终面官,有许多年工作经验、在大厂管着几百人的复旦学长所说的已经不对了——去 Startup 做数据库,已经不再是一件需要靠情怀去支撑的事。随着这个行业内热钱的涌入,很多有前景的 Startup 实现了大额融资。更关键的是,对于这类技术公司而言,技术人才是核心,因此他们愿意花钱、也给得起钱去和大厂抢人;而互联网的 ToC 业务却因流量见顶,发展前景反而没那么乐观。
经过一段时间系统性的学习与研究,我认为自己已经准备充分,我的首选目标是做 TDengine Database 的涛思数据。原因有二:首先,TDengine 是开源的,在此之前,我已经多次看到过 TDengine 登上 GitHub Trending 榜;我能够直接去看代码、通过实践直接判断它是否有真材实料。其次,通用 OLAP 虽然被炒得火热,但竞争也非常激烈,或许不如从细分赛道入手,而细分赛道中时序数据库与图数据库的增长是最为迅速的,我相信 IoT 设备会持续不断增长,产出越来越多的数据,我看好它的前景。
为了了解时序数据库这个领域,我完整阅读了 Jeff(涛思数据创始人陶建辉)所创作的“十大特点”、“架构设计”等文章。在细分赛道中,只有静下心来对问题进行实实在在的建模与分析、对领域进行深刻洞察,才能真正做出有核心且有竞争力的产品,在 Jeff 的文章中我切实体会到了。此外,涛思数据的招聘页上醒目地写着“超越 BAT 的薪资”,我认同这样的人才观,想要招聘到优质人才,愿景与待遇缺一不可。
在涛思的故事其实才刚刚开始。
2021 年 7 月,我正式加入涛思数据,很快上手了数据库内核的研发工作。在转正后的第一次季度总结时我拿到了“最佳新人奖”。
现在,我在涛思数据负责流式计算引擎的研发。TDengine 2.0 中提供了连续查询的能力,它本质上是一个时间驱动的批处理,无法处理乱序数据的问题,且性能消耗很大。我的目标是为现有的 TDengine 实现一个真正的流式计算引擎。
这项工作的 Scope 与挑战远远超过了我之前的所有工作与项目。我一边系统性地学习流式计算中 EOMP(Exactly Once Message Processing)、分布式快照等容错理论,一边研究 Kafka、Flink 的源码与实现机制,一边跟踪 SIGMOD、VLDB、ICDE 等峰会中相关研究的最新进展、了解 Railgun、Hazalcast Jet、Ray Streaming 这类新引擎的设计,同时关注着 Materialize、Decodable 这类流式 ETL 工具与 KsqlDB 这类流式数据库的产品形态与定义。我时刻提醒自己必须要关注前沿技术与新玩家,因为我不希望做一个在设计之初就落后于时代的东西。
以一套执行引擎来融合 OLAP 的查询与流式计算,我会用代码来践行我的想法,也期待着焕然一新的流式计算引擎,在今年下半年,随着 TDengine 3.0 的发布,一同与大家见面。
在我过去的这些岁月中,得到了很多人的帮助,帮我找到新的方向与道路,让我有勇气和决心来接受新的挑战。因此我也愿意分享出我的经历,或许能给你一些启示与帮助。
比起盲目地埋头苦干,我更相信“选择”会对人生与职业发展产生更大的影响,这篇文章中复盘了我人生中几个至关重要的选择:从物理转入计算机、从当时如火如荼的 AI 转做 Data Infra、放弃出国与保研加入阿里、从阿里离开加入涛思。当然这些选择的结果还远远没有盖棺定论,但至少现在来看正确与否也开始渐渐清晰了,我相信读者们也会有自己的判断。
想了解更多 TDengine 的具体细节,欢迎大家在GitHub上查看相关源代码。