由于自己太菜,近几个月时间都在为暑期实习发愁,茶饭不思,学校的网课也没心思上了。最近总算是收到了腾讯的 Offer, 才暂时能舒口气。我在这里把这几个月的应聘经历写在这里,也算是为我第一次应聘做个总结。

背景

我在这一博客的第一篇文章中说过,我的技术栈主要在 .NET/UWP 客户端开发。然而年初开始着手春招时我才注意到,在校招中这种技术栈基本是找不到工作的,于是只能转向别的技术栈。多数互联网企业都有大量的后端岗位与 Android 客户端开发岗位,而这两类岗位都需要 Java. 而 Java 刚好与 .NET 中的 C# 十分相似,于是我转 Java 栈便是理所当然的了。

当然这也不是说转就转的。后端开发方面,C#/CLR 与 Java/JVM 虽然思路十分相似,但细处还是有相当多的区别,外加我之前就没有多少后端经验,也就只能说玩玩;而在 Android 客户端方面,WPF/UWP 与 Android 之间的区别则更大。想要在一个不熟悉的技术栈和方向上取得实习机会,真的是相当困难。

两个方向都需要不少转换成本。在经过反复权衡与几次尝试后,我选择弃后端而选安卓。原因如下:

  1. 后端开发经验不足
    如果转向后端,我需要学习的不仅是 Java 语言与 JVM 原理,还包括各种后端框架、中间件、数据库、分布式系统等等。这一体系相当庞大,仅凭我几个月的突击是难以与从一开始就学习后端开发的大佬竞争的。而我已经有了不少 Windows 客户端开发的经验,这些经验有很多在 Android 平台上可以重用。

  2. 算法能力一般
    在先前的实践中过多注重功能实现而轻视了算法,而后端对算法与性能的要求比客户端高得多。此时春招已经开始,本人时间所剩不多,很难兼顾平台框架的学习与算法能力的提升。因此暂时降低对自己的要求,选择客户端开发。
    这里插一句,算法能力与工程能力的平衡,好像是许多人的弱点。像我这样只重视工程能力而忽视算法的人不在少数;而获得各类算法竞赛奖项却连 VSC 的编译也不会配置的人我也见过。我认识的一位大佬则在两方面都相当强,相信这类人是不愁选择的。

准备

本人从三月初开始准备春招,略有些晚,对于我这种情况来说更是相当致命。此时我已通过本学期初的学校课程入门了 Android 开发。最初的半个月是不敢投递简历的,集中做了如下准备:

  • 力扣刷题 60 道
    这个数量绝对不算多。如果应聘的公司对笔试成绩有硬性要求,这肯定是不够的。即使通过了笔试,想要通过后端开发岗位的面试也比较困难。但是根据我个人的经历,这个题量能解决客户端岗位面试中的多数问题。

  • 牛客刷面经
    根据别人的面试经历做准备。这显然有 “应试教育” 的弊端,但是在有限的时间下,的确能提供一个方向。后期购入了相关著作,进行系统的学习。

后续面试中也同时在做类似的准备。

微软

在同班大佬的引诱下,首先投递了微软。同班大佬较早地求得了内推,直接进入面试环节。而我因为投递较晚,已经超过了内推的时限,故需要进行笔试。事实证明,对于我这类平时不重视算法的人,指望通过笔试获得微软的面试机会简直是天方夜谭。本人笔试后直接挂掉,后来收到了调剂到技术支持岗位的通知。我选择接受,但后续再无消息。6 月 26 日微软春招结束,至此微软结束。

根据同班大佬透露的信息,微软面试分为三轮。一二轮为平行面,只需通过任一轮即可进入第三轮。第三轮为主管面,主管具有一票否决权。根据他的描述,由于防疫策略的影响,今年微软的实习条件并不理想。

字节跳动

投递字节跳动的动机是得到了同校学姐的内推。申请客户端开发岗位,无笔试。

这是本人第一次面试。一面问题如下:

  1. Activity 的生命周期
  2. 触摸事件响应机制
  3. Java 线程池
  4. 静态锁与实例锁
  5. 双检测单例模式
  6. 可见性,原子性,重排序
  7. 编码:基于数组的大数相加

一面后挂。个人认为一是因为准备还不够,例如本人对问题 2, 6 的回答并不能令人满意;二是因为第一次面试,心态不正。

第二志愿填了后端开发,简历筛选未通过。至此字节跳动结束。

网易互联网

与字节跳动同期投递了有道的客户端开发岗位。网易内推仅能免除简历筛选,笔试仍需照常参加。本人笔试未通过。至此网易互联网结束。

腾讯 (提前批)

几日后又投递了腾讯科技,岗位选择了 Java 后端开发。此时已是腾讯提前批末期,简历被腾讯安全部门 (管家系) 捞起,岗位是运营开发。说到运营开发,我纠结了好久,未明白这个词的含义。几周以后突然想到,运营开发应该就是 DevOps 的意思。

提前批无笔试。初试前进行了一次非正式的电话面试。问题如下:

  1. 数据库事务
  2. 数据库锁
  3. 数据库分布式锁
  4. Git 怎么处理冲突
  5. 数据库索引
  6. B+ 树
  7. 通过执行计划优化查询
  8. 数据分片与查询拆分
  9. TCP 的握手与挥手
  10. 进程间通信方式
  11. 异步 I/O, I/O 多路复用
  12. 简述快速排序
  13. 描述如何求两市市民姓名交集的大小

这次面试表现并不好,几个问题回答都不如人意。因此也没有进入正式面试流程。面试最后询问发现团队在使用 C++/Python 开发,并非本人特别熟悉的技术,因此即使通过面试,我可能也难以有效参与工作。

美团点评

经过几次惨败后一段时间没有再敢莽撞投递。又准备一段时间后投递了美团点评,职位继续选择了客户端开发,简历被美团到店团队捞起。首先进行笔试,这次笔试则较为顺利地通过了。

美团点评共两次技术面。一面问题如下:

  1. 项目中遇到的困难
  2. 为什么要对项目重构
  3. 什么是多态,如何使用,实现原理
  4. 接口继承与实现继承
  5. 抽象类与接口
  6. C# 与 Java 的相似与不同
  7. Java 的垃圾回收
  8. 举例说明基于寄存器的虚拟机与基于栈的虚拟机
  9. Android 中的 Java 虚拟机
  10. TCP 的握手与挥手
  11. HTTP 的请求与响应格式
  12. HTTP 的四种请求方式
  13. HTTP 与 HTTPS 的区别
  14. 编码:求两个数组交集。元素可能重复,此时取最小出现次数
  15. Android 开发中用到了哪些库
  16. Volley 中的常用 API
  17. ZXing 扫描二维码的使用方法与原理
  18. Android 中触摸事件的响应机制
  19. Android 中控件布局与绘制的流程

一面后 10 分钟通知已通过,并希望 20 分钟后进行二面。由于本人要上课,于是不得不推迟至两天后。二面问题如下:

  1. 你关注的技术热点
  2. 无服务器的原理
  3. 容器化解决了什么问题
  4. 简述多态
  5. GC 为什么要多代回收
  6. GC 是同步过程还是异步过程
  7. 是否有 JVM 调优的经验
  8. 简述 Y 形相交单向链表如何求交点
  9. 简述最大根二叉树
  10. 进程间的通信机制
  11. 比较共享内存区域通信与管道通信
  12. 编码:用数组实现一个队列
  13. 你的职业规划

两次面试自认为表现都不错,与面试官聊得也很投机。同时我认识的人中有另外两人也成功收到了美团到店的 Offer, 因而自以为稳了。然而由于本人未知的原因,时至今日我也未收到美团点评的 Offer. 目测已凉。

阿里巴巴

阿里巴巴校招倾向于技术熟练,能直接干活的候选人。因而考虑到自己的技术水平,本未打算投递阿里巴巴。但后来受到校友内推,故还是投递了简历。内推部门为淘系技术部,岗位为 Java 后端开发。参加了 5 月 11 日场次的笔试,题目较为简单,是本人多个公司笔试中成绩最好的一次。

简历评估过程中接受了一次非正式的电话面试,问题如下:

  1. 项目中遇到的困难
  2. 为什么要重构
  3. 技术学习的方式
  4. 是否有技术博客
  5. 进程与线程的区别
  6. 进程间通信的方式
  7. 死锁的条件
  8. TCP 协议的三次握手
  9. HTTP 中 Cookie 与 Session 的区别
  10. 简述快速排序
  11. 简述红黑树,平衡二叉树
  12. 数据库索引的用途
  13. 数据库索引是否越多越好
  14. 数据库事务
  15. 乐观锁与悲观锁
  16. Java 中的线程安全
  17. HashMapHashtable 的区别
  18. Java 中的类加载
  19. Java 中的垃圾回收
  20. Java 后端开发中常用的中间件
  21. 分布式系统如何保证实例间数据的一致性
  22. 如何为高并发设计优化系统
  23. 是否参加过竞赛
  24. 在校成绩如何

前面回答得还算可以;后面几个问题,尤其是分布式相关的几个则多数不能令人满意。这也反映了我后端开发经验的欠缺。直至目前也未进入正式面试环节,目测已凉。

腾讯 (常规批)

腾讯提前批失败后一段时间,我意识到客户端开发可能是更适合我情况的岗位,于是我将在腾讯注册的简历改为客户端开发。后来简历又被微信事业群捞起,岗位为客户端开发。此时我自认为美团点评已稳,因此主要抱着 “面着玩一玩” 的心态进行面试,没有太在意结果。然而意想不到的是,我并未像预期一般收到美团点评的 Offer, 反是腾讯让我在最后时刻上了车。

腾讯常规批需要进行笔试,然而腾讯对笔试成绩没有硬性规定,官方表示 “即使成绩为零也有被发起面试的可能”。本人笔试成绩不算优秀,但也不是太差。

与我所见到的许多大佬的面试经历不同,本人前两次面试几乎除了项目便是算法。初试问题如下:

  1. 自己最值得一提的项目
  2. 编码:求数组中指定数量元素的最大和

这次面试可能是我表现最差的一次了。第 2 题中使用了快速排序,按理说应该是背得滚瓜烂熟的。然而面试时不慎写错了一个细节,看了许久也未能看出,直接导致心态爆炸。面试官似乎也看出了我心态上出现了问题,转而询问我思路,并让我用库函数排序实现算法;同时表示看我写代码比较熟练,对我不能写出这一问题感到疑惑。我解释说我先前主要关注的是业务代码,对算法类问题还不熟练,面试官表示理解。

面试后感觉自己挂定了,但同时认为自己有美团到店保底,因此并未在意,也未登录校招网站查询状态。然而两天后收到了预约复试的电话,当时感觉真是不可思议。在这里也感谢初试面试官放我一马,再给我一次机会。

复试约在了第二天下午,问题如下:

  1. 自己最值得一提的项目
  2. 安卓进程间的通信机制
  3. 简述快速排序
  4. 编码:生成包含给定数量对括号的有效括号序列
  5. 编码:实现整数除法,要求不能使用乘除及取余运算

这次面试的表现就比上次好了很多,两道算法题也顺利地解决了。面试后当晚状态更新为 “GM/EVP/面委会”, 面试时间未电话预约,直接定为次日上午。

腾讯的面委会面试只存在于部分团队的面试流程中。有人反映这是部门大佬进行面试,会深挖技术,施加压力;另一些人则反映这是交叉面试,与正常的面试几乎无异,只是由其他团队的面试官承担;还有少数人说这一面基本是谈项目聊人生,技术问题不多。因此,这一轮次的内容似乎与团队与面试官有很大关系,面试内容与风格随缘。

好在我的面试官没有太为难我。问题如下:

  1. 详细叙述在前两次面试中提到的项目
  2. 简述学校里操作系统与数据结构课程的实验/课设
  3. 参加过的竞赛与在竞赛中的工作
  4. 个人技术发展方向
  5. 进程与线程的区别
  6. 在学校 DirectX 课程中的收获
  7. 简述 TCP 的拥塞控制
  8. 对自己项目的复杂度排序
  9. 自己的职业规划

面试完后一小时状态更新为 HR 面试。自此开始了长达五天 (三个工作日) 的等待。这五天看似不长,然而我内心十分焦虑。因为:

  • 一面的表现比较差,担心成为备胎或直接被挂掉
  • 能有幸被 WXG 捞起,又幸运地通过了前三次面试,深感机会难得
  • 春招接近尾声,而自己尚未获得 Offer, 尤其是本信心满满的美团点评已凉
  • 学校即将开学,担心面试时间与个人行程冲突

好在开学第一天便收到了 HR 的预约电话,时间定在当天晚上。问题如下:

  1. 现在手上有无其它 Offer
  2. 流程相比其他同学比较晚,为什么
  3. 假期前期在做什么
  4. 家住哪里
  5. 是否为独生子女
  6. 为什么选择求职而非读研
  7. 从事客户端开发的人越来越少,为什么自己选择客户端开发
  8. 大学以来印象最深刻的事情
  9. 办社团活动中出现过的失误
  10. 最具挫败感的事
  11. 对本次实习的期待
  12. 在腾讯与美团点评之间如何选择
  13. 对广州是否了解
  14. 可以入职的时间
  15. 学校的考试计划是否正常
  16. 是否有亲属在腾讯就职

面试结束后第三天状态变为已完成,次日收到 Offer, 至此成功上岸腾讯。

结语

为期三个月的春招暴露了本人的许多问题,包括但不限于课程基础掌握不牢固,算法能力一般。技术栈不匹配更是为我的春招增添了许多困难。最终有幸进入腾讯实习,本人深感幸运,我也将继续学习,以便快速融入腾讯团队的工作。

同时在此告诫有意在后续几年进入行业工作的同学,尽早做准备。可以及早申请企业的日常实习,是否实际选择入职不要紧,但这是查漏补缺,积累应聘经验的有效途径。

还要感谢所有对我进行面试的面试官,在面试中为我提供了许多建议与指导。尤其要感谢腾讯常规批初试的面试官,在我面试表现不佳的情况下,仍然发掘出我的优势,决定使我通过。

最后还要顺带感谢一波任天堂。在我焦虑以至于难以成事的时候,一场《集合啦!动物森友会》的直播总能使我平静下来,继续开展工作。这看起来不值一提,却给我春招期间的精神健康带来了莫大的帮助。现在我已成功上岸,本人也得以上岛。期待在无人岛上玩得开心,在腾讯也能有个难忘而有收获的实习体验。