匆匆忙忙的春招告一段落了,自己最后也找到了数据库内核方向的工作,希望以后能在数据库领域有一番建树。
在这篇文章中我将我的学习路径贴出来,帮助对这方面有兴趣的人提供一点指南,当然也只是仅供参考。
其实如果按照我的路径学习,我个人觉得可以找的工作不光仅限于数据库这块,像分布式存储,分布式xx,基础架构等都是可以的(不含操作系统)。
个人背景
在开始 guideline 之前,我罗列下自身的硬件,这样大家会更加有信心。因为我个人觉得,想找这方面工作人的硬件条件一定是比我好的。
原有基础
在学习数据库知识之前,我是一个连 ACID 都说不清的懵懂少年。
智力
说实话我不是那种很聪明的人,有些面试官给我讲一个概率题,我会半天想不明白。
LeetCode 也不是那种刷一遍就能记住的人,我个人 LeetCode 差不多是刷了400 多道题才勉强够用(有些题重复刷了不知道多少遍)。
学历
学历这块大家不用担心,基本可以尽情吊打我。
本科:三本,软件工程。
研究生:专业型硕士,普通一本大学的研究生,计算机技术。
大环境
我没有参加过秋招,而是直接参加了春招。总所周知,春招坑位很少,难度可以想象,外加互联网大裁员的背景下,更是难上加难。
半年学习路线
我学习某个项目,通常都是梭哈的,也就是把所有的时间都放在了这上面。这里我按照先后顺序,贴出我完成的项目。
我这里其实推荐做的项目就三个,6.824 -> TinyKV -> CMU 15-445,另外两个项目说实话收益率不是很大。
MIT 6.824(推荐)
MIT 6.824,我只完成了项目,论文并没有看过。其中 Project4 并不是 Bug Free 通过的,因为要超过一个月的工期了,故没有继续较真了。
推荐资料:https://github.com/OneSizeFitsQuorum/MIT6.824-2021
MIT 6.s081(一般)
MIT 6.s081,一门操作系统课。因为我不想投入时间去学汇编,整个项目是半抄半做的。我个人觉得收益率不是很高,说实话,可能还不如背八股省时间。
推荐 现代操作系统:原理与实现(银杏书) 这本书,讲的不错,配合 6.s081 效果很好,当然你可以学这本书配套的实验,不过我没了解过。
CS144(一般)
我计算机网络很差,通常背了就忘,索性就写个 TCP 加深下记忆。
说实话当我写完了 CS144,有些计算机八股还是不会,仍要配套适当的八股背诵一下。
当然我觉得网络扎实的小伙伴,直接忽略即可。
推荐资料:我的博客
CMU 15-445(力荐)
说实话这门课非常不错,强烈建议好好学。
实验部分我差不多是花了一个月完成的,代码全部是 gradescope 满分通过的。
剩下的一个月主要就是看书,书本是我着重就看了 Query Planning,Query Execution 和 Concurrency Control 这三章。着重注意 Concurrency Control 这块,面试高频点。
配套的书是:《Database System Concepts》 第七版,考虑到数据库有很多专业名词,防止中文翻译误导,我买的是英文版。
推荐资料:我的博客
TinyKV(力荐)
PingCAP 的一个学习项目,难度非常大,完成之后写在简历上很加分哦,基本够和面试官扯一壶了。如果没做过 6.824,我觉得直接上手 TinyKV 难度会非常之大。
推荐资料:https://github.com/Smith-Cruise/TinyKV-White-Paper
其他
剩下的时间就是补一些边边角角的知识点,例如 Raft 相关优化技术,LSM 树等。
也许有些人会去阅读经典论文比如 Paxos,GFS,MapReduce,Spanner 或一些新的数据库顶会论文等等,我个人觉得性价比不是很高,因为通常你作为一个校招生,面试官不会对你有这么高的要求,主要还是更看中你的基本功。当然如果你时间充裕的话可以看看,毕竟这属于锦上添花的事情。
简历
我的简历非常简单,直接突出重点。很多 HR 和我说按照我的学历应该是直接挂的,但是看完了我的简历,还是给了一次面试机会。我的简历主要包含如下 5 个栏目。
注意,我没有在简历里面写啥技术栈,啥编程语言,上过啥课等这方面的内容,因为我觉得这些东西并不是重点,除了浪费版面就没啥用。
个人信息
一定要有邮箱和微信号,HR 根据微信号来联系你,邮箱则用于发 Offer Letter。个人头像不放,当然帅哥美女可以放。
教育经历
这个还是要写的,学历注意从高往低写!!不要从低往高,否则有些 HR 一马虎就 PASS 了。
项目经历
我这里就写了 6.824,CMU15-445,TinyKV 和本科的一个 JavaWeb 项目。这边大家自己体会吧,反正基本你写了啥面试官就盯着啥问。
论文发表
因为我研究生有两篇论文,而且做的都是系统架构这块的,就写出来了,基本这块面试官还是很有共鸣的。
当然如果你是机器学习一堆数学公式这种论文,我觉得写出来的意义不大,因为面试官大概率也不懂,不会去问。
我两篇论文都是水会,其中一篇是水会的最佳论文。
个人荣誉
存粹撑简历的,就随便挑了几个荣誉写了写。
面试高频知识点
这里我只罗列一些被经常问到的知识点。
- 算法,通常都是远程屏幕分享,你用 IDE 现场写,一定要写出来,写不出来就人才库了。大多数是链表,树(很少),基于数组深度遍历或 DP 的题,难度在 LeetCode 简单到 LeetCode 中等之间。时间复杂度和空间复杂度一定要会分析,注意递归的空间复杂度。我 LeetCode 刷了 400 多题,差不多凑合够用。这里我列几个我遇到的题:
- 基于链表的插入排序。
- 买卖股票最入门版。
- 实现 LRU。
- 实现一个 Hash 表。
- 最大频率栈。
- 归并排序。
- 快速排序。
- 非递归的中序排序。
- 用两个栈模拟队列。
- 树的层序 S 形遍历。
- 合并 K 个有序链表。
- 忘了。。。。
- Raft 的优化,通常是 PreVote,ReadIndex,LeashRead 这三个。问题来自 Raft。
- Raft 的选举机制说一下。问了 n 次。问题来自 Raft。
- Raft 哪些 state 需要持久化,为什么。问题来自 Raft。
- Raft applyIndex 和 commitIndex 的关系以及区别,是否需要持久化,持久化有什么好处。问题来自 Raft。
- Raft 成员变更介绍一下,就是单步成员变更和联合成员变更这两个说一下。问题来自 TinyKV。
- Percolator 边边角角的问题,比如 Percolator 解决了什么问题。相比于 2PC,3PC 有什么好处等等。这块问的频率很高,估计比较有搞头吧。问题来自 TinyKV。
- Percolator 说完会问 2PC,3PC,它们有啥优缺点。问题来自 TinyKV。
- 说说 ACID,其中 C 和 CAP 的 C 有啥区别。ACID 分别通过什么技术来实现。
- 说说 CAP。
- 事务四种隔离级别,从低到高说一下。使用怎么样的并发控制手段,实现这四种隔离级别。问题来自 CMU 15-445。
- 数据库 Buffer Pool 的作用,为什么要用 Buffer Pool,和操作系统的虚拟内存有什么区别。问题来自 CMU 15-445。
- CPU Cache Line,缓存可见性,violate 这块内容。
- CPU 各级缓存访问时间概念,比如访问一级缓存耗时多久,二级缓存耗时多久等等。有一个数量级概念就行了,不用准确答出。
- Join 两种实现方法 Hash Join,Sort Merge Join 的优缺点,什么时候应该用哪个。问题来自 CMU 15-445。
- B 树,B+树,红黑树,跳表的优缺点,什么场景用什么。
- 布隆过滤器作用。
- B+树和 LSM 树的区别,什么场景用什么。问题来自 TinyKV。
- 设计题,这个很喜欢问,而且频率非常高。我随便举几个例子,如何实现一个 WAL 日志来保证 ACID 中的 A 和 D?如何实现分布式 Hash Join?如果一个 Raft Group 中存在多个 Learner,如何防止多个 Learner 同时同步数据给 Leader 造成压力?如何在 TP 数据库中实现 AP 的功能?反正很宽泛,全靠结合自己目前已知的各种技术吹。
- 操作系统若干八股,比如虚拟内存,协程是啥等。
- 计算机网络少许八股,基本就没被问到过。
- 编程语言八股,如 Java JVM,C++ virtual,我直接都说不会,说自己没有深究过编程语言,然后面试官通常就不会追问了。
其实很多面试官是不屑于上来直接问八股的,通常是你在讲到什么东西的时候,随便和你扯一句八股。反而是那种上来问死锁产生条件的面试官,水的不行,这样的公司不去也罢。
编程语言相关问题就因人而异了,反正我都说自己编程语言只局限于调包层面,面试官一般就不会深入问了。
计算机网络方面真的问的很少,好像也就字节一面问过,别的公司就没了。
不要认为你写数据库内核一定要会 SQL,反正我没花时间学 SQL,一些公司笔试的 SQL 我都写不出来。
本人公司面试记录
一般公司都是三轮技术面外加一轮 HR 面。三轮技术面中,一二面纯技术,三面更多是主管和你交流人生加适当技术,比较宽泛。当然也不乏有些公司有四面,五面。反正先拿不去的公司练练手,固化一些套路,再去尝试自己心仪的公司。
很可惜,在大裁员背景下,很多大厂春招基本都不开了,有些公司面进了也锁 HC,所以我觉得还是有点可惜。我用我的血泪教训告诉大家,非必要不要到春招找工作,还是秋招靠谱。
失败公司列表:
- Databend,一面挂。
- 矩阵起源,一面过,后面要做一个 raft kv 小作业,直接放弃,挺花时间。
- 云和恩墨,一面挂。
- 星辰天合,要做一个爬虫,直接放弃。
- 字节跳动,三面挂。
- Zilliz,简历挂。
- 大应科技,一面挂。
- 易鲸捷,一面挂。
- 杭州四大坑,一面挂。
- 理想汽车,一面挂。
- Singularity Data,简历挂。
- …
成功公司列表:
- 兴业数金,数据库写 SQL 岗:),两轮。
- PingCAP,三轮+HR。
- StarRocks,五轮。
- DolphinDB,四轮+HR。
- 星环科技,两轮。
- 网易研究院,两轮+HR。
- 声网,三轮+HR。
- …
我自己的面试基本上要么一面挂或简历挂,要么就通关。实际上到了面试后期,基本上公司都是面一个拿一个,也不知道是运气好还是已经掌握了套路。
Lab 简历模板
因为有人问我怎么把这些 Lab 经历写成简历,我这里贴出我的简历模板,注意仅供参考。
TinyKV 基于 Go 开发的支持横向扩展,高可用,分布式事务的 KV 数据库:
开发了 Raft 模块,支持 Leader 选举,Leader 转移,日志复制,单步成员变更,Snapshot 等基础功能。
采用 Multi-Raft 架构,数据基于 Region 进行分区,每一个 Region 为一个 Raft Group。Region 支持数据规模较大时自动分裂。
实现了 MVCC 多版本控制,并基于 Percolator 模型设计了分布式事务系统。
CMU15-445 基于 C++ 开发的支持简单 SQL 操作的单机数据库:
底层基于 LRU 设计了 BufferPool,所有 page 操作在 BufferPool 上进行。同时在 Buffer Pool 实现了可扩展哈希表。
语句执行采用火山模型,支持 SELECT,DELETE,UPDATE,JOIN,AGGREGATION,LIMIT,DISTINCT 操作。Join 有 Nested Loop Join 和 Hash Join 两种实现。
并发控制采用 2PL 设计,实现 RU, RC, RR 3种隔离级别。
实现全局的 Lock Manager 管理 R/W 锁,死锁处理是基于死锁预防中的 wound-wait 算法。
MIT 6.824 基于 Go 开发的分布式 KV 数据库:
采用 Multi-Raft 架构,支持数据分片处理,分片迁移。
Raft 支持 Leader 选举,日志复制,Snapshot 等基本功能。
小结
后序持续补充吧,可能有些地方忘了。
感谢女朋友在无数个夜晚我通宵 DEBUG 时没有发出太大的呼噜声。
原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/how-to-find-a-database-job
评论列表(105条)
大佬可以求一份15445的源码嘛,邮箱:mujian2009@126.com
大佬我能看你的15445的代码吗?邮箱293407911@qq.com
老哥我照着你帖子学找到饭碗了,爱你。记得以前有二维码可以赞助,现在找不到了,想给你爆金币。
@nnr:我特意回复你了哈,恭喜啊,大厂吗。
@Smith:老家中厂的sp,很满意了,感谢博主!
@nnr:你太大方了,是我博客有史以来收到打赏的总和。祝你马到成功!
天哪 设计题太难了 实习面会问的这么难吗
@yt:实习可能不会吧,我没有面过实习。
@Smith:老哥你没有实习经历吗?太强了
@yt:没有实习经历,在学校玩不好嘛
你好,请问个CMU 15-445的问题哈,在Task 2 – LRU-K Replacement Policy这道题目中,SetEvictable(id, false)和remove(id)有啥区别,两个不都是把frame强制变为Evict吗?主要是想知道SetEvictable和remove函数的差别
@xinglan:你问我具体的,我也忘了。但是应该,SetEvictable 只是说允许 evict 了,而 remove 就是直接移除了。
你好,请问个CMU 15-445的问题哈,在Task 2 – LRU-K Replacement Policy这道题目中,SetEvictable(id, false)和remove(id)有啥区别,两个不都是把frame强制变为Evict吗?主要是想知道SetEvictable和remove函数的差别
大佬,15445 project4 代码可以参考一下吗?感激不尽 1396812324@qq.com
请问你投春招的时间是从什么时候开始的
@rush:春节后
@Smith:能分享下完整的tinyKV源码吗?我打算也学习下这个项目,这是我的邮箱:15119573190@163.com
问下大佬,做824不看论文只做项目,是纯自己写,还是有参考些博客?目前想入手,但无从下手。能不能麻烦大佬分享下824的代码学习下,谢谢。1281663148@qq.com
@BruceLiu:发你了。没说一篇论文没看,只是说那些用不着的论文我没看。Raft 的论文我还是看了很多遍的。
大佬求一份完整的tinyKV源码,刚做完6824想再深入进阶一下 mxz1525117344@gmail.com
@xmao:发了
我看你们很多都刷了mit-824分布式,是不是现在做数据库一定要分布式呢
@xinglan:不一定,反正到目前分布式碰都没碰到,不过了解下还是可以的。
@Smith:我看你给出的谭新宇的博客链接,他工作是数据库内核开发,关注分布式系统,共识算法,性能优化,所以我想他是不是在数据库内核开发中会有分布式方面的东东
@xinglan:你可以去他博客下面问问他,一般分布式都调包的,轮不到我们优化。
@Smith:那为啥你面试面了那么多raft,还有mp,gfs的东东呢,你博客也有很多分布式方面的研究
@xinglan:因为那时候我自学的就这些东西,所以面试就问这些。只是说后面工作的时候,压根用不到。
@Smith:请问下CMU 15-445的lab是在哪的呀,课程主页上没找到呢
@xinglan:https://15445.courses.cs.cmu.edu/fall2023/schedule.html
@Smith:请问下你这个网站是什么,https://www.inlighting.org/? 是你自己做的网站吗
@xinglan:是的,这个是我的博客
佬,求一份15445的源码,十分感谢,1977216208@qq.com
大佬好,“我这里其实推荐做的项目就三个,6.824 -> TinyKV -> CMU 15-445”。我想问一下这些项目是在哪里学习的😂
@JYan:网上一搜,不就有了,都有官网的。
大佬你做cmu15445时有没有参考一些曾经的代码呢,我现在在写B+树那一部分,属于是逻辑知道但是对于一些API或者写法转换太痛苦了呜呜呜(Java选手转的C++太痛苦了),可以加大佬联系方式吗
@100cc_oxygen:我那一年的课不是b+树,是 Extendible Hash Table,是挺痛苦的。
不过B+树网上应该有很多代码了吧,照葫芦画瓢呗。
大佬求一份tinykv的源码 邮箱grewangwenhua@gmail.com 感谢
牛B. 请问CMU15445 对有工作经验的人帮助大吗?
不错不错,很踏实,向博主学习