如何在面试中 确定 Rust 程序员水平?

原创
07/04 00:51
阅读数 0

本文为 RustFriday 飞书群线上沙龙 第十三期 (2021.7.3) 同名主题的文字版,并不是视频的简单记录,只是为了再次完善对这个主题的思考和表达。

视频回放地址:https://www.bilibili.com/video/BV1ZV411p7Y3/






引子

在我的读者微信群里,有朋友提出了这个问题:《如何在面试中 确定 Rust 程序员水平?》。我认为这是一个好问题,但是在微信群里三言两语没有办法回答这个问题,至少没有办法把我对这个问题的想法表达出来。于是,就在今天组织了这次线上沙龙来讨论这个问题。

希望这次讨论,可以帮助引入 Rust 的公司一些参考。

在讨论之前,我用思维导图,画出了我对这个问题的思维框架。如视频内所示。。

今天的讨论就是围绕这个思维框架来展开。

基本原则

要组织一次比较合格的面试活动,既对企业负责,也对应聘者尊重,需要遵循一些原则,或者说是一些出发点。

我认为基本原则包括但不限于下面两条:

  1. 企业要招的,首先是一名合格的程序员,其次才是 Rust 程序员。
  2. 能掌握 Rust 语言的人,至少在技能层面,算得上是一名合格的程序员。但反之则不然。一名合格的程序员,他有这个潜力,但不一定掌握了 Rust。

合格程序员的标准是什么?

所以,问题就来了,怎么样才算是一名合格的程序员?

一名合格的程序员,至少可以从两个方面考察:

  1. 工作态度。
  2. 工作技能。

工作态度

一名合格的程序员,至少是靠谱的。

靠谱,即做事认真负责,让同事领导信任。

有人问了,难道就给什么活都干吗?这不是让人接受压榨吗?

靠谱不等于逆来顺受,或者是做一个老好人。

靠谱是对自己承诺的事,做到有头有尾,至少让自己满意,不欺骗自己。

靠谱是你懂得拒绝,不随便承诺你自己很可能办不到的事情。

一名合格的程序员,至少是上进的。

他希望工作应该充满挑战,并且乐于接受挑战,喜欢在挑战中成长。

工作技能

一名合格的程序员,应该是掌握了元技能的人。

所谓元技能,包括学习能力、解决问题的能力、沟通能力和基础知识牢固。

学习能力,包括信息收集、信息提取和整理、信息输出的能力。

解决问题的能力,代表能够自己独立思考和定位问题,能够主动面对问题拿出解决方案,哪怕并不是最佳方案。而不是被动等待别人帮他解决。

沟通能力,包括可以安静和耐心地倾听别人和准确表达自己想法的能力。这其实是一种能够融入团队的基本素养。

基础知识,包括计算机组成、操作系统、网络、算法等基本技能。不一定是精通的,但至少形成了一定的知识体系结构。当然,不同岗位对这个知识体系结构的粒度是不同的。比如实习生和社招,要求就不一样。

一名合格的程序员,应该有一定的从业经验。

至少有一门已经掌握的语言,对软件工程和架构有一定的了解,并且拥有一定的领域知识。

结论

所以,能在工作态度和工作技能上匹配当前应聘岗位,就算是一名合格的程序员。

为什么说掌握了 Rust 语言的人算得上是一名合格的程序员?

拿我自己来说。在我学习并努力掌握 Rust 的过程中,我发现了自己很多基础知识不足的地方。

学习和掌握 Rust 的过程,就是我提升自己的过程。

上述感受,并不是我一个人的。

这是Rust 社区很多人的共同感受:Rust 让我成为一名更好的程序员。

从工作态度来说,每个学习 Rust 的人并入门的人,是否靠谱,不敢说,但至少是上进的。

从工作技能来说,每个学习 Rust 的人并入门的人,学习能力都不会太差,元技能至少是及格的。Rust 语言又是一门系统级混合范式通用编程语言,能入门并进一步掌握 Rust ,是需要比较充足的基础知识才行的。

最关键的是,Rust 编译器能够帮助团队在短时间内检验这一切。但是其他语言就不敢说了。

如何在面试中确定 Rust 程序员水平?

这个问题意味着,如何在面试中判断一名 Rust 程序员水平是否合格。

或者说,如何通过只考察 Rust 相关问题而判断应聘者是一名(准)合格的 程序员,并且还是一名(准)合格的 Rust 程序员?

因为实际招聘是分为校招和社招,应聘者是新手和老司机 两类,所以面试的要求还是不同的。

面向新手

如果是招 Rust 实习生,就变成了考察他有成为一名 Rust 程序员的潜力。

可以着重于以下几个问题:

  1. 如何理解编程?

    能应聘实习工作的,应该不会是零基础,至少是有一定的计算机和编程基础的,虽然不一定有项目经验。这个问题的意图是判断新手对编程的认知程度。

  2. 你是如何自学编程的?

    通过此问题来获得应聘者的学习方法,以便推断应聘者的学习潜能。

  3. 自己捣鼓过什么项目?

    通过此问题来判断应聘者的兴趣所在,以及做事的动机。

  4. 获得了什么经验?

    用于判断应聘者的信息整理和总结能力,也是学习能力的一种体现。以及应聘者的沟通表达能力。

  5. 你打算如何学习 Rust ?

    用于判断应聘者对 Rust 的了解程度,以及进一步判断他的学习潜力。

通过以上五个问题(仅作参考),基本可以定位一个应聘者的潜力。当然如果应聘者已经在一定程度上掌握了 Rust ,则可以按下面的再继续考核。

面向老手

面向老司机,可以从三个方面来考核。

  1. 基本认知能力。
  2. 代码实操。
  3. 项目经验。

基本认知能力

我总结了一些问题(仅作参考),来考察应聘者的基本认知能力。

  1. 你为什么学 Rust ?

    学习 Rust 的动机很重要。因为一名合格的程序员,是独立思考和主动性的,知道自己在干什么。而非盲目跟风。

  2. 你是如何学习 Rust 的?

    通过他学习 Rust 的路径,可以判断他的基本学习能力,以及对 Rust 的掌握程度做一个预估,方便后续的提问。

  3. 你认为 Rust 语言是否优雅?

    一名合格的程序员,是不会停留于语法表面的。这个问题要考察应聘者对语言设计的理解。

  4. 你认为 Rust 语言解决了什么问题?

    这个问题并不一定需要掌握了Rust 才能回答。但至少可以确定应聘者是否真的自己去思考和学习过相关资料,而不是人云亦云。其实考察的还是元技能。

  5. 你能否对 Rust 所有权进行一个简单的总结?

    这个问题考察了应聘者对 Rust 所有权核心概念的理解,但不仅如此,这其实也是侧面考察应聘者的元技能:学习能力和沟通表达能力。

  6. 你如何看待 Unsafe Rust ?

    和第4个问题考察点有点重复,判断应聘者是否独立思考过 Unsafe Rust ,而非人云亦云。同时,也是考察应聘者对 Unsafe Rust 的理解程度,毕竟 Unsafe Rust 是 Rust 的基础。

  7. Rust 和你目前使用的语言有什么区别?各有什么优劣?

    如果能有一个比较清晰的对比,那说明应聘者对 Rust 的概念还是有一定掌握的。否则,就需要再多考察考察了。因为这不仅仅涉及Rust 的掌握理解程度,更是涉及对现在使用语言的掌握理解程度。

代码实操

考察完基本认知能力之后,就可以进入代码实操阶段。

代码实操可以是上机测试,也可以说给定一段设计好的代码,让应聘者发现并解决问题。

以下推荐四个考察方向(仅供参考):

  1. 实现算法和数据结构。

    因为 Rust 编译器会执行严格的内存安全检查,所以在实现一些基本的数据结构相比于其他语言会比较麻烦。所以用 Rust 实现 算法和数据结构,不仅仅是对算法和数据结构基础的考察,还是对 Rust 所有权机制掌握程度的考察,看能否顺利通过编译器检查。当然也可以允许使用 Unsafe Rust 。

  2. 解决 Rust Quiz[1] 问题。

    Rust Quiz 是 Dtolnay 大佬专门根据 Rust 语言特性设计的 三十多道谜题。很多人认为 Rust Quzi 属于劝退,但我并不这么认为。因为 Rust Quiz 可以细粒度地帮助检验 Rust 各个概念掌握的是否到位。比如 T&T的区别,生命周期 early boundlate bound的区别,等等。Rust Quiz 并不是为了为难大家。

  3. https://rustsec.org/[2] 中寻找出现安全问题的代码片段来考察。

    RustSec.org 是 Rust 官方安全代码工作组维护的一个Rust 生态安全数据库。并且出品了 cargo-audit 依赖于该安全数据库来检查你的crate及其依赖中的安全风险。这个网站上面罗列了很多 CVE ,里面包含很多不规范使用 Rust 而引发的安全问题,尤其是 Unsafe Rust 。只需要从中去找一些典型的示例代码,就可以拿来考察应聘者对 Rust 安全的理解和掌握程度。

  4. 代码重构。

    可以让开发者去重构一个设计好的 crate 。可以利用 Rust 生态中的各种工具,比如 fmt和clippy之类。

以上供大家参考,抛砖引玉。

项目经验考察

结合应聘的岗位职责和应聘者擅长领域,去问一些问题。

还有,是否阅读或贡献过哪些 Rust 的开源项目?有什么收获?

甚至可以布置一些开放性题目和要求,比如给定一周时间,让应聘者自己抽时间来完成一个指定的 Rust 项目。

小结

以上是我对如何考察 Rust 程序员的一些思考,仅供参考。大家有不同的看法也可以交流。

社区的朋友 @huangjj 也分享了他的两次 Rust 应聘经验,记录在此:https://huangjj27.github.io/interview.html

另外,有朋友建议,是否可以整理一份面试题的checklist,类似于心理测验?比如,第一题选 A 就跳到第三题,选B就跳到第二题,最终有几种测试结果。我觉得这种方案是可行的,对于面试是比较省时间的,可以尝试做一份。但也不应该作为唯一参考。

参考资料

[1]

Rust Quiz: https://github.com/dtolnay/rust-quiz

[2]

https://rustsec.org/: https://rustsec.org/


本文分享自微信公众号 - 觉学社(WakerGroup)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部