本次面试发生在 2023 年 7 月,面试的公司的名字隐去,并且这是一家初创公司。
算了,我还是不太会从头开始写这种东西,只记录一下最**的部分吧。
# “你会前端吗?”
我面试的岗位是 Rust 工程师,我的邮件中明确说明了“我对前端完全不熟悉,并且也完全没兴趣”。 然而面试中,在问了一堆问题,并且我给出了自认为比较满意的答复以后, 面试官仍然直接提问(以下用 Q 表示面试官,A 代表我,括号代表心理活动):
- Q:你会前端吗?写过前端吗?
- A:(废话,怎么可能没写过)写过,但是我对前端完全不熟悉,并且也完全没兴趣(再次强调我来面试你司不是为了干前端的),这个博客里的文学模式那一段就是我写过最复杂的前端了。
- Q:(完全没听见我的强调,这让我很不爽,你给我发多少钱啊让我干这么多?)这个博客是用什么框架写的?
- A:(出于礼貌,还是回答一下)
VuePress
,一个静态博客生成器。但是我真的不熟悉前端,也不感兴趣(再次强调)。 - Q:哦好吧,那我就不问太复杂的了,......
后面的问题我就不记得了,当时心里只能说是非常生气,完全没有听见我说的话,这是什么意思啊? 你招的是什么岗位自己心里没点数吗?再三忽略我的强调,想测试服从性?
# Copy
和 Clone
这个问题给我的感觉是,面试官完全不知道 Copy
和 Clone
的本质区别,只是像应届生那样认为一个是浅拷贝,一个是深拷贝。当然这个结果我肯定是回答了的,毕竟我知道他肯定想问这个。
之后的回答的时候完全站在编译器的角度上看待这两个问题:
- 遇到
Copy
的对象,逐字节拷贝 - 遇到
Clone
的对象,按照 AST 上各个子节点的Clone
实现来构建一颗一模一样的 AST,语义上还要求且这颗新的 AST 和老的 AST 之间不存在引用
面试官问出了让我惊掉下巴的问题:
- Q:为什么要在 AST 上考虑这二者的区别?
- A:(你写个编译器就知道了啊!)因为这两个都是内建的 trait。类型检查阶段,编译器会检查一个类型是不是真的可以 Clone。之后 IR 里这对两个 trait 的使用就已经被替换成 IR 内建的代表这两种操作的 intrinsic 了。代码生成的时候会直接根据 intrinsic 展开成栈上复制或者是调用
Clone
的实现的那个函数。此处用 AST 举例子是因为其表现形式最接近源代码,更容易理解。其实也可以用任何一种 IR 来举例子,只要表达出语义上的区别就行了。
然后没有继续问了。
接下来是代码习惯上的问题:
- Q:你平时写代码的时候,什么情况下会用
Copy
,什么情况下会用Clone
?
这简直是送分题好吧,在我看来这个问题和上面的问题完全相同。不明白为什么要再问一次。
我的回答非常贴合我的实际代码习惯:
- A:需要浅拷贝的时候用
Copy
,需要深拷贝的时候用Clone
。比如,在写Box
类似物的时候,只能写成Clone
,不然就不是std::unique_ptr
了。但是我在写一个Rc
的时候,我会把它实现成Copy
,不然就不符合引用计数的初衷了。但是就算要浅拷贝,我也不会选择#[derive(Copy)]
,我会手动#[derive(Clone)]
并且.clone()
,因为这样可以明确地表达我的意图就是要“拷贝”。而#[derive(Copy)]
会让我在写代码的时候不知不觉地就把一个大对象栈上复制了,这是我不想看到的,但是用.clone()
我至少知道这里有一次复制。(我觉得写过 C++ 项目的应该都知道这是为什么,C++ 隐式操作太多,让人调试的时候非常痛苦,语义不能直接一眼看出来)。这基于一个前提:如果一个对象可以被 trivially copied as a Plain Data Object,那么它就应该可以被 trivially cloned,因为都只是内存的逐字节拷贝罢了。 - Q:不是说
Copy
是浅拷贝,Clone
是深拷贝吗,为什么在浅拷贝的时候你还要用Clone
? - A:对于 Plain Data Object 来说,这二者没有区别,我用 Rust 主要写编译器,在编译器内部如果 IR 之间没有引用,那么都是 Plain Data Object。但是在用 RAII 类似对象的时候,这两种的语义不可混淆起来,该
Copy
的时候就Copy
,该Clone
的时候就Clone
。
然而面试官似乎不太能理解这个前提,并且对这二者的本质认知不够深刻, 又或者是我说的编码习惯太领域特定了,我只能认为是他对编译器不够熟悉。
还有一些地方就不写了,总之我觉得这个面试官的水平不够。 并且非常不尊重人,把我当应届生一样问问八股文问题,那我自然答不上来啊,我都有多少年的工作经验了谁还在意这些八股,我觉得这是对我的侮辱。 我刚学习计算机那会儿,这些问题我是能答出来很多的,而且回答的还非常好。但我现在更多的精力会放在:业务抽象、功能实现、模块架构、性能优化、开发体验、稳定性维护、可持续性开发等地方。 每一块都有很多关注点,不太可能记住每一个细节点,像这种八股,只能记个大概,也只需要记个大概内容,做相关技术方案设计时遇到了自然知道有这样的东西存在,然后去查一下即可,很快就能唤醒以前的记忆。 但是我不可能每天都去记这些八股,甚至为了面试去把这些八股都温习一遍,我觉得这是浪费时间。
觉得这是侮辱人主要是因为,我的工作经验加起来也多多少少由 6、7 年了,把我拉到和应届生同样的层次上,用八股问题来考察我解决问题的能力和经验, 这无疑是对我的不信任。我带过的应届生,我都不会这样对待他们,我会让他们去解决一些实际问题,然后看他们的解决方案,看他们的代码,看他们的思路,看他们的设计,看他们的代码风格等等, 就大学那种教育体系,你用八股问题去考察候选人,这不是什么都考察不出来吗?就大学那种教育质量,应届生的解决问题的能力和经验和有工作经验的人会在一个层次上吗?适合用同样的方法去考察吗?
并且之前跟 HR 聊的时候,HR 还展现出了一种“狼性文化”,什么“团队是 CTO 直接带的,大家都在跟着一起边学习边奋斗”, “团队里的大佬很多,大家都很拼,经常一起干活忘记时间”。甚至还表示“周末和下班时间需要一定的 on call”,“可能也有安排加班”。 我能接受给加班费的加班,但我不接受下班时间 on call。
最主要的原因还是,给的太少了,还不如我现在的工作给的多,并且公私分明,下班了我就是可以不看任何消息,不回任何邮件,不接任何电话。
这个经历又一次告诉我,少碰初创公司,钱少事多,还有一种“我们一定会成功”的蜜汁自信。