分享个 Rust 的面试(失败)经验

1次阅读

共计 2245 个字符,预计需要花费 6 分钟才能阅读完成。

虽然 rust 岗位不多,也希望能给相关的人一些经验启发。

本人

本人在 web3 混迹 3+ 年。目前做零知识证明的电路开发,有时需要读读论文。主用 rust 三年多,个人自认为对 Rust 及生态比较熟悉,从服务端到性能优化到各种类型体操,语法和编译器行为的很多犄角旮旯也都碰过。unsafe 代码不多但是也有涉及。

最近比较迷茫,想转变方向,做一些更偏系统底层的东西。不过离开 web3,只有 rust 这个强项了。面试的是一家做云的公司,参加某活动认识的,当时有过 rust 的交流。得知他们想用 rust 改造老的部分组件,原本的系统几乎都是 C 写的,新开了岗位。自认为自己算是擅长 rust,也挺熟悉社区,所以感觉还挺对口,了解意向后就投递了。

初次聊天

算是内推进来的。内推的人安排了初次的谈话。简单聊了经历,还做了简单的 rust 面试。问题包括:

  • Pin的作用。——防止内存移动,在接口上则体现为不让用户拿到&mut T
  • 自己实现一个 Future 的伪代码。——写出来了。
  • RefCell大量使用时,是正常现象吗?使用 RefCell 有什么问题。——trait 设计不合理,在需要 &self 的方法上要改变内部状态。使用 RefCell 的使用要遵循借用的使用规则,不然会导致运行时 panic。

算是都答出来了。

正式面试

总共 4 轮。

第 1 轮

先前本来就有了解过面试官,于是也没什么自我介绍。上来就写代码,是一个 TCP 的流处理:

  • 要求:用户按user_id(3-byte)、payload_len(3-byte)和payload(长度根据前面的定)的格式来发送数据。每个 TCP 连接会源源不断地接收这类格式的消息。
  • 后面又追加了新的要求:要求限流,每分钟只允许同一个 user_id 的最多 10 个请求,不同连接都要共享。超过就拒绝。

之前没有太多网络编程相关的经验,只能凭感觉写了。理清了需求,临时查了 tokio 的文档,就吭哧吭哧就开始写了。面试形式是一边写一边讨论,整个过程花了快 1.5 小时。代码 写得很糙,不过需求基本实现了。

最后问,如果服务器长时间运行,那限流使用的类型(我才知道我写的限流算法中的「滑动日志算法」,用一个 HashMap 维护)中的很多 user 记录得不到释放,内存会越占用越多。我回答是,用一个定时任务来清空过期的记录。但删除时需要加锁,会阻塞正常的流处理。暂时没有想到好的方法。这个问题聊完,就结束了面试。

第 2 轮

这一轮是操作系统和网络的面试。大概持续 50 分钟左右。大概 2/3 的时间都是我在说我本行的经验,从当前公司做的事,到整个 web3 的生态、我对这个行业的看法,当下市场的现状等等。感觉有点像在闲聊。

剩下的 1/3 是偶尔穿插的问题,包括

  • 线程和进程的区别?——进程分配资源,线程共享资源,切换上下文的开销不一样。
  • 发生系统调用时,内核发生了什么事情?——存系统调用号到寄存器,执行中断,切换到内核态,将用户态的数据复制到内核态,在系统调用表找到系统调用进行处理,然后返回到用户态。(有点懵,全凭印象回答)
  • 有没有 C 相关的内存排查经验?——没有,(safe)rust 帮你解决了。有过 lldb 的调试但不多。
  • 有没有看过汇编代码?——没有
  • 你知道栈指针寄存器的名字?——不知道。我只知道 EAX。
  • 你知道一个 TCP server 的进程崩溃后,客户端会怎么反应吗?——客户端下一次发送消息,超时重连后断开(答案是,Linux 内核在进程崩溃前,会向它连接的客户端发送 FIN 报文)

大部分问题,面试官没有继续追问(可能看我太菜)。我几乎没有这方面的准备,大部分都是学校学的东西,全凭记忆在回答。

第 3 轮

原本跟 manager 面试。由于时间不足,所以取消了。

第 4 轮

跟大老板面。不考技术,主要是个人意向上的问题。

有个印象比较深的问题,是希望自己能做什么样的工作。我的回答是,最好有一个能做的开源项目能持续投入,通过它有持续的收入,也有一定体量的用户使用。对方问什么项目。我说当下比较希望贡献 rustc 和 rust 相关的工具链。之前一直没有太多时间和精力,现在希望为社区做一些贡献。

最后趁机找大佬要了经验,询问如果转行,有什么建议。对方说,去看看身边的人,哪些人是你想成为的样子,向他们学习就好了。我很认同。

结果

整个面试过程持续了 3+ 小时,最后是因为操作系统和网络这一面没有过。

得知面试结果后,又尝试跟 HR 和面试官聊了,人都蛮好。对方希望候选人能维护老系统,有排查系统级别问题的能力,同时又能用 rust 重写新模块。而我算是跨领域,对标的只有 rust,那结果无可厚非。

虽然没有成功,但跟面试官都建立了不错的关系,老板人也很好(还白嫖了不少建议)。这算是意外的收获。

总结

自己复盘了一下,确实一方面确实是因为自己跨行,没有特别深的系统开发或网络开发的经验。

另一方面,写代码时也有点太依赖 rust 这门语言了。我写的大部分是算法和服务端一类的东西。内存安全,生态齐全,封装得好,就让你忽视了底层细节,不碰就生疏了。既然它属于系统编程语言,就理应多去熟悉 C 和系统层面的东西。还是菜。

目前因为觉得自己目前做的有点狭窄,才有换方向的念头。但这本来就不容易,有点在职业十字路口的困惑。但很快就清醒了,一步步来就好,哪里不足补哪里。现在的规划,是准备写一个 mini 操作系统,算是练手。

最后

最后给自己打个小广告。个人希望 rust 偏底层相关的工作,不限领域,不过要求 WLB,地点上海或 remote。有相关的岗位可以聊一聊。

cm9sbDRjQGdtYWlsLmNvbQ==

另外,下周去上海的 rust conf,可以面基

正文完
 0