背景
面试一家使用 rust 开发的数据库公司。
面试前
约定 2023-08-25 星期五下午两点钟的 zoom 会议,面试官个人原因稍迟了一点,延后到两点十五分左右开始。顺便一提,他是在附近找了家星巴克加入会议的。
面试 conversations
面试官: 🤔Int我: 🥺Me
🤔Int & 🥺Me: [互相打招呼]
提到了我读书的城市,勉强套了一点近乎。
🤔Int: 做一下自我介绍吧。
🥺Me: 我从初中毕业开始对计算机感兴趣,学习过若干语言。
脑子里根本没考虑好要说什么,随便就说出来了。
🤔Int: 这个环节一般是介绍一下简历上的内容。
🥺Me: 哦哦,[按照简历介绍了一下教育经历,实习经历,开源贡献和掌握的知识]。
多亏面试官素质真高吧,还认真听完我说话不打断。
🤔Int: 那么我接下来有几个问题要问。
🤔Int: 你对 sql 和 nosql 的理解是什么?它们的区别在哪里?
🥺Me: 传统 sql 是以 sql 为查询/定义语言的 dbms,后者现在扩展之下常常也可以是 NotOnlySql,可以做不止传统 sql 的事,比如 redis 也可以做为消息队列,对于一些不方便 sql 的情况可以做特别的优化和特化的保证。
🤔Int: 主要的区别是存储模型的不同。前者是关系模型,后者有如 redis 的 KV 模型。
寄点+1
🤔Int: 你有过多少写复杂 sql 的经历。
🥺Me: cmu 15445 的 homework 1。
我这个时候还没有感觉到不妙。
🤔Int: 那我现在给你一个经典的模型吧。
🤔Int: products (product_id, product_name, category)
🤔Int: orders (product_id, sales)
🤔Int: 写一个 sql,查询每一个 category 的最畅销的 5 件商品。
🥺Me: ok。
WITH pro_with_rank (
SELECT
category,
product_id,
row_number() over (pritition by category ORDER BY SUM(amount) GROUP BY category) as rank_
FROM products JOIN orders ON products.product_id = orders.product_id
GROUP BY product_id, category
)
SELECT
category,
product_id,
FROM pro_with_rank
WHERE
rank_ <= 5
🥺Int: 大致没问题,只是为了考察一下 row_number() 和 join 的使用能力。
这是现场花了好多时间写的第二版,第一版是我直接在 chat 上写的,没写完很着急就发出去了。 面试官让我共享出屏幕写,因为我刚装的 zoom,mac 没有权限,授权之后重启了一下 zoom,重新入会,在编辑器里写下的第二版。
🤔Int: 那么现在写一个简单的 HashTable 吧。
🥺Me: ok。
啊?还真要写啊?我当时是这么想的。 总之是新建项目开始用 rust 写了。
🤔Int: 你确定要用 rust 写吗?
🥺Me: 呃,类型确实有点麻烦。
我是很慌的。 定义 struct:
HashMap<K, V> {data: Vec<(K, V)>}; impl method:new,insert,get,remove。
🤔Int: 可以不实现 remove。
🥺Me: 好的。
约束了
K: Hash,还是大致成功地写出来了。
🤔Int: Hash 碰撞之后要怎么处理?
🤔Int: 桶指向链表或数组;开放地址。
其实说了一大堆,因为我想不起来了,疯狂回忆。原来面试真的会问数据结构和算法。
🤔Int: 用你喜欢的方式实现碰撞之后的处理。
🥺Me: 桶。
本来是要用链表的。
🤔Int: 桶指的只能是链表吗,其他的可以吗?
🥺Me: 能迭代找到对应 K 的都可以。
这里是我寻思着的。rust 里链表确实非常难处理,还是直接用 vector(array) 了。
HashMap<K, V> {data: Vec<Option<Vec<(K, V)>>>}花了好多时间,勉强写出来了。
🤔Int: 如果太大了要 rehash,实现一下吧。
🥺Me: 好的。
什么?
rehash是什么?我直接凭感觉“嗯嗯嗯”的。
🤔Int: 没事,你可以花 20 分钟来完成。
🥺Me: 奥。
这给的时间是不是太多了,寄点又+1。 想了半天,硬着头皮写,慢慢回忆起来。 最后是实现了
fn rehash(&mut self, new_capacity: usize), 直接重新声明了一个新的与HashMap { data }相同类型的空容器,迭代自身的数据插入容器,还是花了很长时间。
🤔Int: 我之前也面过 xx,他是这么处理的,用 HashMap 自己的 insert 方法来做 rehash 的,
🤔Int: 因为其实逻辑都已经在 insert 里实现了,不需要你再重新直接写。
🥺Me: 哦哦。
我本来想说我也想过这么做(没说),但是我根本不知道用
insert要怎么new_capacity。
🤔Int: 一个 ui 有很多 integration 为用户提供服务,我们的 [产品名] 就是作为 integration。
🤔Int: 请问你要如何测试系统,我需要一个系统的工程的方法。
🥺Me: 呃,我试图分为健壮性和安全性的测试。前者可用成熟的集成测试和 fuzz test;后者可用渗透测试,sql 注入脚本的方式测试。
🤔Int: 我主要是想问整个系统的,所以最好要能检查系统bug,及时写 issue,讨论之后解决,对于 CI/CD 的维护也要到位。
我说着说着就感觉好像是在说对单独的系统的测试,但是确实没明白这个前端的 ui 是什么关系,这个答案我也觉得蛮奇怪的。
🤔Int: 为什么离职前一家公司?
🥺Me: 不想继续做 crud,想做有意思的东西。
真实想法。
🤔Int: 开学之后时间能怎么安排?
🥺Me: 根据前实习的经验,每天有 5-6 小时的可支配时间。
我寻思应该差不多,这学期的课也差不多的样子。
🤔Int: 学业上有什么安排?
🥺Me: 大一大二疯狂实习;大三开始准备考研。
美好的愿望。
🤔Int: 你面的这个岗位我们不打算招太多人,需要资深的工程师。
🥺Me: 哦哦...
貌似不妙。
🤔Int: 其实不见得会特别的 不 crud。
🥺Me: 哦哦...
应该不至于。
🤔Int: 如果你入职,是如果,我们也会对你进行考核,如果一周两周不满足要求,我们也会有一些考虑...
🥺Me: 哦哦...理解理解。
...。
<> 扯了一些其他的东西。
🤔Int: 我会和 hr 反馈一下,之后给你通知。
🥺Me: 好的,谢谢,再见。
好多问题记不清了。
总结
面试了一个半小时左右,总的来说还是很失败的,准备也很不充足(事实上根本就没有准备,在面试前完全不知道准备什么)。没有一个问题是解答得不错的。面试官总是在提示我:还有其他的吗,但是我真的慌张,想不到说什么。两个写的题目也很拉垮,时间花得很多,暴露了很多问题,面试官也指出我工程上的经验不足。我觉得这也是他为什么提到了几次需要“资深的”。
现在是 2023-08-28 星期一的凌晨。今天开始是工作日,我想法这两天应该就会通知吧... 虽然理性告诉我大概率没戏唱了,但是希望总还是在心里的,万一呢。
updates
2023-08-29:
上午 hr 微信联系我,约了明天(08-30 星期三)二面。除了还能二面这件事让我很惊讶/惊喜之外,还注意到了另一件事...
R 告诉我两次面试官都是产品经理(虽然都会写代码)——我疑似要转行了,product engineer 是这种职业??
突然有了一种,不管面试成功与否都不亏的感觉了😢。
2023-08-30
二面结束,没有太多可以说的,比第一次还失败。
面试官很努力在带了,问了两个题目。一道 medium 的算法题,一个非常简单的 SQL 查询。
前者当场没写出来,结束后通过邮件发给他了。
其实比一面要简单很多,但是一面的 HashMap 是运气好正好知道。这次算法确实没刷过题,出不来手。
进一步问了关于这个岗位的情况:只对接 W 和 L 两位产品经理,不接触 kernel 开发,但是也没有界限分明; 如果有能力 cover kernel,可以参与/慢慢转过去,没有限制。
工作安排是弹性的,只会要求一段时间内的产出,不要求什么时间什么会议,也不要求打卡。
面试结果快则本周内,迟则下周内通过 hr 通知。