面经 | 后端 / 存储 | 🔥🔥 | Databricks
2026(10月) Senior Software Engineer, Backend (Files Team) @ Databricks | San Francisco, CA · 电面 + VO · 2 轮 | 😐 Neutral | Hard
Round 1 — 电面 Coding
要求代码能跑,自己写 test。
给一串有顺序的规则,allow /ws/a/*、deny /ws/* 这种,/x/* 管 /x 本身和下面所有的。check(path) 第一条匹配的说了算,都不匹配就 deny。
第一问线性扫。我用的 startswith,他丢了个 /ws/ab/f,居然匹上了 /ws/a/*,改成按 / 切段比。
第二问规则几万条。建 trie,规则挂节点上,沿路取最小 index。同一个前缀有两条规则,后一条把前一条盖了,跑 test 才发现。
第三问是 UI 列目录用的,any_allowed(dir) 下面只要有能读的就显示,还有 all_allowed(dir)。我先想的 dfs 整棵子树,他说目录很大。卡了一阵,他提示哪些规则其实永远不会生效。祖先里有 index 更小的,这条就是死的,所以只看比所有祖先都小的。建完 trie 标一遍活规则,每个节点记子树里有没有活 allow、活 deny,query 就只走一条路。dir 走到一半没节点了,这个 case 他提醒了我才补。
第四问规则在线增删。想到 euler tour 把子树拍成区间,区间上存什么没想明白,没写。
Round 2 — VO System Programming
单机,给 agent 用的文件元数据存储,put(path, meta) / get / delete / list(prefix)。伪代码加一部分真代码。
内存版用 dict 加一个有序结构,没多问。
然后加 WAL,他指着 append 那行问「这里断电你在什么状态」。写一半的记录靠每条 length + crc,replay 校验不过就截断。write 返回算不算成功,说到 fsync,group commit 只提了一句。
接着 rename(dir, new_dir),目录下几十万个文件。我先说一条条记 put/delete,他问那中间断电不就挪了一半。改成 WAL 里只记一条 mv。
WAL 太长要 checkpoint:临时文件、fsync、rename。目录的 fsync 忘了,他问 rename 自己会不会丢。再问 checkpoint 写完、WAL 还没截断就断电。put 重放没事,mv 重放两次就错了,给每条加 LSN,checkpoint 里记写到哪。
最后是多个 writer,有人 list(prefix) 的时候 rename 做到一半,list 不能看到一半新一半旧。我说读写锁,他说 list 慢会把 writer 全卡住。往 MVCC 说了几句,旧版本什么时候回收没讲完,时间到了。