这是「跟我来面试」系列的第二篇,被面试人是我隔壁宿舍的好友,近期刚刚结束了蚂蚁金服的三轮技术面试,面完之后他跟我说很累,直言不想再体验了。
因为学院的安排,我们被要求暑期实习,近期也有各种内推信息发在群里,和大多数人边面试边复习不同,我的这位好友在我们疯狂投简历的时候就一直踏踏实实准备,因为我们会在自己的小群里分享自己的面试经过,他就一直潜水,直到有一天突然告诉我们蚂蚁金服的 hr 说他通过了我们才知道他已经成功上岸了。这种人,我们一般只能用五个字来形容:闷声发大财。
他的面试经历我仔细看了看,一面重点在基础知识的考查,二面重点在项目以及对框架的使用与理解上,三面压力面,是很熟悉的套路,考察的知识点也是经常问到的,具有一定的参考价值,接下来我们就来看看他的这几轮面试经历吧。
一面
笔试题很简单,多线程循环打印 1-100 奇偶数
- 你觉得项目中用了 MQ 给你带了什么好处,设计初衷是什么?会带来什么缺点嘛?(项目针对性比较强,不细说)
- 在网页键入 taobao.com,到返回一个页面,这期间都发生了什么?
- 你说到了 session 和 cookie,这两者有什么区别,应用场景是啥?
- 返回界面的文字,图片,链接,你觉得是从哪里来的,或者说储存在哪里?
- 描述一下 TCP 三次握手,这期间可以携带数据吗?携带了数据会造成什么后果?
- 描述一下四次分手,第二次和第三次中间处于何种状态?
- 说一下 object 类的所有方法以及他们的功能(真的是所有:clone,notify/all,finalize,wait,hashcode,equals,tostring,getclass)
- 抽象类和接口有什么区别?说一下你的个人理解。
- 详细说一下 final 关键字,修饰变量,方法,类都有什么不同?能想到什么具体应用场景吗?
- 说一下 equals 方法,hashmap 的底层,跟 hashtable,concurrentHashMap 都什么区别
- 静态分派和动态分派的区别?具体应用场景?
- 1.8concurrentHashMap 有什么变化,优化的意义在哪?
- hashmap 除了结点数大于 8,还有什么情况会树化(这个我没想出来,也可能是我没听清楚)
- hashcode 方法有什么特点?hashset 的底层是如何实现的?为什么用 hashmap?
- 说说 JVM 内存结构(这里要问清楚是 JMM 还是运行时常量池)
- 你刚说 1.8 后方法区移动到内存中变成元空间,为什么要移过去呢?
- 那为什么常量池没有移动到内存,而是转移到堆了呢?
- 最后一个问题,说一下线程池的饱和策略
因为项目中使用到了 MQ,所以就顺便问了下,好在并没有提问太过深入的东西,随后问题几乎每个都是高频考点,2、4、5 主要考察计算机网络中的通信过程,例如三次握手/四次挥手,7-14 考察 Java 基础,随后就是和 JVM 以及多线程有关的问题了。有需要的小伙伴可以参考这个进行针对性的复习。
二面
- 从项目启动到现在,介绍一下你的工作以及遇到的难点,怎么解决的?
- 讲一下微服务架构都有哪些模块?他们是怎么一起工作的?
- 让你实现一个 eureka,你会怎么实现?
- 用户认证,为什么要用 JWT,而没用 session-cookie,应用场景?优劣?加密用的是什么算法?
- 为什么使用 rabbitMQ,没用别的 mq?
- 说一说你项目应用了什么设计模式?适配器模式什么应用场景?
- 让你实现 AOP,你怎么实现?
- spring 事务有了解吗?是如何传播的?在你项目里的实际业务中是如何传播的?
- 例如有 ABC 三个事务,分别原子性,整体也原子性,A 事务出错回滚,整体事务也会回滚,你会怎么设计呢?
- ZooKeeper 有了解吗?redis 和 Mencache 的选型问题?
- 你之前的 webServer 项目介绍一下整个流程?你是如何做的多线程?socket 相关?
- 你怎么使用线程池?参数怎么选择?
- 你写线程的时候会给他们起个可爱的名字吗?为什么要起?线程错误排查工具用过哪些?
- spring framework 都有哪些模块?你使用到了哪些模块?怎么使用的?
- 使用的时候有没有对某模块功能进行扩展?
- 说一下集合类(线程安全角度)
到了二面,就会发现提问的重点发生了明显的变化,从之前的基础知识变成了项目架构方面的,这一轮考察的是平常学习过程中对于架构的使用与理解,现在都偏爱微服务架构,那是否思考过背后的原理?天天在用 Spring,你对他到底又有多少认知呢?都知道消息队列好,那好在哪?这些东西都是实际的项目中能接触到,但是又经常会被忽略的东西,就看你是不是一个有心人了。
三面
- 详细介绍一下点云扩增工具项目
- 你对分布式架构有什么理解?
- 总结一下你的本科与研究生阶段有过的成就?可以拿来说的那种?
- 参加过竞赛吗?
- 你的项目中或在学习过程中有没有遇到过很难的点?然后专心研究去解决掉他的?
- 周围有没有优秀的人?有没有值得你学习的点,并且你现在在跟着做的?
- 平时看什么书?
- 有没有根据兴趣学习过一些额外的计算机知识,AI 领域?
- 在 github 研究过哪些开源项目?
- 你的职业规划是什么样的?
三面是压力面,所谓压力面是指面试官有意制造紧张气氛,以了解求职者将如何面对工作压力。面试人通过提出生硬的、不礼貌的问题故意使候选人感到不舒服,针对某一事项或问题做一连串的发问,打破沙锅问到底,直至无法回答。其目的是确定求职者对压力的承受能力、在压力前的应变能力和人际关系能力。
这一轮的重点不在于对技术的考察,而在于对人的考察。我一直认为,面试最重要的是将你的核心竞争力摆上台面。之所以会问你基础知识,是因为技术能力是你的核心竞争力之一,但并不只是技术。如果面对压力,如何与人相处,是否有探索精神,这些都是很重要的,毕竟每个老板都喜欢越有压力就越有动力的员工吧。
总结
总的来说,这三次面试是很经典的套路,一面基础,二面架构,三面个人。我看完后觉得很有参考价值,便征求了原作者的同意分享给大家了。虽然他只面了这一家,但事后他说,如果可以,宁愿再也没有面试。