很早之前的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##数据库工程师#
查看14道真题和解析