很早之前的PingCAP数据库开发实习挂经
HR面-电话面
PingCAP和其他公司不同的是一面为HR面。
聊一聊项目中遇到的问题
对TiDB的了解
反问
结束后会给一个小作业,时间大概为一周左右。我的小作业是:使用raft-rs和grpc-rs做一个HA KVServer。且有如下要求
- Provide basic get, set, delete, and scan operations
- The data saved in one node must be persistent in the disk (restart can't lose data)
- Need to show - Kill minority node, the service can still work
- Need to show - Kill majority node, the service can't work
- Need to support add/remove node dynamically
- [Plus Point] Use a benchmark tool to find some performance problems.
https://github.com/BanBuDu0/Simple-KV
我没有完全写完。。。
一面
自我介绍,说简历上面没有的东西
然后和我聊了聊我的小论文。
问我学校学了哪些课程,计算机科学与技术专业和软件工程专业有什么不同(我本科计科,硕士调剂到了软工)
假设有一个函数,它的作用是随机返回数组里的内容,怎么判断它是真的随机
聊了聊之前布置的小作业
算法题:DFS,记录树的每条路径,用GO写
package main import ( ) type node struct { children []*node } func restoreToSQL(*node) string { return "" } func solve(*node) []string { // implememnt this return nil } func main() { level21 := &node{} level22 := &node{} level23 := &node{} level11 := &node{children: []*node{level21, level22}} level12 := &node{children: []*node{level23}} root := &node{children: []*node{level11, level12}} // root // | \ // level11 level12 // | \ | // level21 level22 level23 result := solve(root) // assert level11.children = []*node{level21} root.children = []*node{level11} _ = result[0] == restoreToSQL(root) // root -> level11 -> level21 level11.children = []*node{level22} _ = result[1] == restoreToSQL(root) // root -> level11 -> level22 root.children = []*node{level12} _ = result[2] == restoreToSQL(root) // root -> level12 -> level23 }
反问
一面的面试官很nice,在家一边带娃一边面试,面完的印象就是那种和蔼的长辈。
二面
Chain Replication
CAP定理和C怎么理解
Raft主要解决CAP哪两个问题
Raft的figure 8
Raft persist的变量有哪些
为什么commitIndex不用persist
linearizability vs sequential consistency(没答出来,回答了Linearizability vs Serializability)
进程和线程的区别
进程的通信方式
进程申请内存的过程
算法: 二叉树的最近公共祖先
反问
只记得这些内容了,当时没录音
个人觉得PingCAP比较坑的就是面试前得花一周多的时间做小作业,我吭哧吭哧写了一周多的Rust(现学现写),然后面试的时候又让我用go写算法题,导致我手撕算法时go语法都有点忘了。。。
#实习##面经##PingCAP##数据库工程师#