跳转到内容
View in the app

A better way to browse. Learn more.

彼岸论坛

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[职场话题] 分享个 Rust 的面试(失败)经验

发表于

虽然 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 ,可以面基

Featured Replies

No posts to show

创建帐户或登录来提出意见

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.