腾讯WXG日常实习面经
结果
2024-01-30 一面
2024-01-31 二面
2024-02-02 主管面
2024-02-04 HR 面
2024-02-05 OC
背景
2024-01-20 左右投的简历,一开始投的是 C++后台开发 WXG——公众号与小程序 。2024-01-27, WXG 小程序客户端的面试官问我对这个方向感不感兴趣,我说还挺感兴趣的,然后约了一面 30 号下午,面试官说希望面试紧凑一点,面试顺利的话争取在年前(2024-02-10)发 offer。
项目主要一个是 DragonOS 操作系统内核,另一个是低代码平台。
一面(90min)
2024-01-30,没开摄像头,做题可以用腾讯会议里自带的 code space 也可以用自己电脑的 IDE
一面笔试(20-30min)
两道题,第一道是二叉树最大平均值,我想的是在 TreeNode 中维护以当前节点为根节点的和以及树的节点数,然后每次后序更新 max_average,第一次有点紧张,类的数据成员没初始化,然后有一个空值没判断,但是面试官也没说什么。
第二题是凑硬币,这个是很经典的 dp 了,状态转移方程大概是dp[i] =min(dp[i],dp[i-coin])
。很简单就不赘述了。
面试官说是希望我能三十分钟做两道题,二十分钟做完了,但是有蛮多小错误,第一次面试有点太紧张了。
一面简历面(60min)
- 自我介绍完了,介绍了一下第一个项目之后问了对 Rust 和 C++交融的看法,我说各取所需,但是目前看来 C++取的不是很好,比如 Rust 里面很好用的 Enum,在 C++里的 Variant 用起来就很不方便,然后个人感觉 C++历史包袱太重云云,然后又提到了所有权机制在 C++里的语义(右值引用和 std::move 等),然后我又提了一下 C++里面没有
borrow check
,所以一些used after moved
无法在编译期检查,不太好,然后面试官说有很多实现这种功能的工具。 - 接着上面的问题,面试官又问到,就是在 C++中,如果没有
borrow check
,有什么移动语义的最佳实践吗,比如能不能保证就算出现了used after moved
也不会出错。这个想了蛮久,也没想到所以然来,就随便答了一点,比如按场景,有的右值引用的场景就是编译期常量,而有的是std::move
,编译期常量不用担心,而std::move
的话可以用复制语义来避免问题,但是感觉很牵强,但是面试官也没再问,就作罢了。 - 然后问到,大家都说 Rust 是内存安全,然后又高效,比肩 C 和 C++,你怎么看。我就从所有权这个比较特殊的机制入手,解释了所有权机制移除了裸指针的问题,又结合了操作系统的项目,说了裸指针的问题。高效我是从编译器优化层面讲的,说 Rust 对程序员限制很多,但是对程序员限制多恰恰是给编译器优化的空间大
- 随后问到系统里用 musl。我解释了 glibc 和 musl 的区别,前者动态链接,后者静态链接,然后解释了一下系统暂时不引入 glibc 的原因
- 然后问我负责哪些模块。我就以我最近的工作,ELF 的 DYN 类型文件加载展开了,介绍了挺多的,然后面试官还问了一下我做的工作属于是 LOADER 还是 LINKER,我就解释了 linux 里面的逻辑,就是通过在 Load 的过程中解析.interpre 段获取动态加载器位置,然后完成加载的。
- 然后就到了下一个项目 Easycode,先是介绍项目,然后就问 jwt,然而我几乎忘光了,因为写的时候就是掉包侠,然后一顿复制粘贴,没有仔细研究原理,面试官问能不能主动使 jwt 失效,我说 emmm 可以?可以在数据库里置空,然后又问 jwt 是无状态的吗,你对无状态怎么理解。jwt 签出后需要保存吗。感觉很想把我引回去,但是我连 jwt 的基本原理都忘了,然后后面又围绕这个问了一圈,感觉有点烂尾了(后面我在面试完问面试官简历有什么能改进的地方的时候,他也说不熟的技术不要写)。但是面试官很 nice,还是围着这个讲了很多,比如 session 和 jwt 的比较之类的,完全没有追着我不会的打的意思。
- 最后问了一下简历最后的开源项目,简单说了一下做的工作就结束了。
- 然后就是聊了一些后续发展规划之类的,然后解释了很多人对客户端的误解,觉得客户端就是搞 QT 那些界面的,实际上我仔细想了一下确实不是的哈哈哈。
一面后续
面试官很 nice,问的问题都是围绕项目的实际问题。几乎没有传统八股,就只有一个 jwt 哈哈哈,而且还是唯一一个不会的,当晚九点半说面试通过,约了明天下午二面,希望一切顺利
二面(75min)
小插曲,本来是两点半的然后因为面试官临时有事,就推迟到四点半了。
二面简历面(45min)
- 先是自我介绍,然后说你为什么会学习这么多编程语言。我就说我是一个兴趣驱动型的学生,对某些技术、某些框架感兴趣,就会投入到其中云云
- 让我结合自己的实际体验,谈谈我对用过的那些编程语言都有什么看法。我当然是先吹一波 Rust,然后 Go 与 Java 做对比,忘记说 C++了,面试官又让我补充了对 C++的看法。我就说 C++其实是历史包袱很重,虽然这几年的新标准也有在学习其它编程语言优秀的地方,比如
std::variant
,但是没有原生支持,用起来其实很不顺手。而且它的代码一致性比较弱,就是不同人写出来的 C++代码可能天差地别,想要掌握所谓的C++编程范式
需要比其它编程语言多得多的时间,在代码能力强的人的手里是一把万能武器,但是在能力弱的人的手里可能光是使用都很费力。 - 就让我介绍 DragonOS 的背景,问了一下仓库地址,然后问我是哪个 contributor。
- 问我是用 C++写的吗。我说是 Rust,然后说了一下用 Rust 的背景,因为有更好的安全性。
- 问我在 C++的使用过程中有没有遇到过内存泄漏的问题,有的话是怎么解决的。我说其实我 C++没怎么做过比较大的项目,没什么处理 C++内存泄露的实际经历,但是对于内存泄露而言是有工具可以去观察这种问题的。
- 随后问这些工具的原理是什么。我说应该是通过对 malloc 的 trace 来实现的。
- 介绍一下自己在 DragonOS 的工作内容,我就以最近的 ELF DYN 文件加载为例介绍了。
- 介绍一下第二个项目的背景。介绍完之后也没再问了。
- 介绍一下 MAA 这个项目。
二面算法(30min)
第一个是 LRU Cache,哈希链表解决,但是花的时间长了一点,因为代码速度属实是有点慢。
第二个是环形缓冲区,一开始想用环形链表,但是写了 6-7 分钟又觉得好像不对劲,又用数组开始实现,然后刚开始写核心算法的时候时间就到了,遗憾离场
二面后续
第二天晚上(2024-02-01)收邮件,约第三天(2024-02-02)下午的面试
复试(30min)
上午通知延期一下,加了面试官微信,延期到下午四点半
复试面试(30min)
- 自我介绍之后让我介绍一下项目,然后问我 DragonOS 项目的背景
- 问我 DragonOS 对标 Linux 的话,有什么优势吗
- 然后跟我说了做项目,还是一定要有突出的地方,而不是单纯的 Copy
- 让我介绍了低代码平台的工作,问我有没有一些实现比较有难度的地方
- 然后就问我还有什么要补充的吗,最后就问我有什么想问的。
后续
过了不到一个钟就发 HR 面的邮件了,是约在两天后(2024-02-04)的下午
结果
2024-02-04 下午 HR 结束,2024-02-05 上午 OC