楼主这段时间一直在找暑期实习,前几天刚结束了阿里巴巴淘系的 HR 面,现在在等通知,正好趁着这段空窗期整理回顾下前段时间的面试。
目前我是研一在读,投递的岗位是 Java 后端的暑期实习,我是在今年 2 月份开始准备实习的事情,虽然简历投递的很早,但是到面试已经是 3 月的事情了。接下来说说我前期做的一些准备吧。
不知道为什么,今年好像很多公司都加入了笔试环节,这里就要求我们对一些算法题进行针对性的训练,这里推荐力扣和牛客的剑指 offer 系列,把那 70 多道题刷两遍,心里多少就会有点底了。其次就是对于知识点的针对性复习,这个过程就跟我们高三时的一轮复习一样,力求将知识点都过一遍,包括但不限于 Java 基础、数据库、计算机网络、操作系统、组成原理、框架源码、设计模式等。这些知识点可以根据网上其他人的面经针对性学习,也可以根据市面上流传的各种面试宝典针对性复习。这里我推荐一个仓库,我复习时的知识点都是按照这上面来的,https://github.com/Snailclimb/JavaGuide
下面的内容是我整理的面试题目。大家可以参考着复习。
提前交流
我是找的学长内推的,刚开始有一次交流,也不知道算不算一面,主要问了下面的东西:
- 说一下 cas,主要应用在哪
- 说一下 Java 中的锁,自旋锁会升级成什么?
- 项目中的限流是怎么做的
- 说一下 Java 是如何加载一个类的?
- 什么是双亲委派模式?
- TCP 滑动窗口了解吗?
- 用的是什么数据库?说一下 mysql 的的事务隔离
- InnoDB/MYINSAM 的区别和应用场景
- 介绍下 MYSQL 的索引
- 进程和线程的定义
- 进程调度算法有哪些?
- 说一下你对线程池的理解
- 用过什么模式(除了 JDK 以外。自己实现的 /除了单例模式外)
- 单例模式为什么要有两个 null 判断,一个不可以吗?
- 排序(归并排序 /堆排序/快排)
- 说一下你对 Spring 的理解,AOP 的原理是什么?
- 有什么想问面试官的
因为是提前交流,感觉就是摸一下底,问的知识点都很基础,只不过因为是刚开始复习,所以有些知识点还不是很清楚,后来交流的学长也给了一些建议和指导。
一面
然后就是正式的一面了,一面比较细致,上来先做了一道算法题,题目很简单,剑指 offer 里的原题,顺时针打印矩阵,https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
还有道多线程编程题,大致意思就是提供一个多线程的工具类,打印数组。
下面是问题的记录:
- 自我介绍、说一下最近在做什么事?
- 可以跟我介绍下卷积神经网络吗?
- 可以说一下逻辑回归是什么吗?
- 你觉得反向传播和动态规划之间有什么样的联系吗?
- 我看你的微信公众号叫「01 二进制」,那你能说一下为什么计算机会使用二进制,而我们人类会使用 10 进制呢?
- 计算机是怎么做加法的?那如何用加法代替减法?
- 使用过 Linux 吗?可以说下常用的 Linux 命令吗?
- 用什么命令可以查询文本中的文字?用什么命令可以查询磁盘存储的容量?
- Vim 使用过吗?可以说下有哪些快捷键吗?
- 我看你的博客里有一篇博客写到了区块链,你可以说下去中心化对我们的生活有什么影响吗?你觉得区块链有价值吗?
- 在区块链的世界中,那些数据怎么样会变得有效?(广播机制、共识机制)
- 类比打电话,两个系统的通信我们可以采用哪些方式?(我说了 http)
- 说一下 HTTP 和 HTTPS 的区别
- HTTPS 中用了什么加密方式,在什么阶段体现的?
- 分布式的 CAP 理论了解过吗?
- 你了解的一些集群有哪些选举方式?
- 公众号里写了很多和 python 有关的文章,那你觉得这两个语言使用起来有什么差异?
- 最近有看什么书吗?
- HashMap 为什么线程不安全?是否模拟过不安全的场景?
- 说一下 Java 的值传递和引用传递
- SpringBoot 和 SpringMVC 的区别
- 说一下 Spring 中 bean 的加载过程
- JVM 的垃圾回收器了解吗?垃圾回收算法有哪些?JDK8 默认的垃圾回收器是什么?
- 有什么想跟我沟通的吗?
总的来说这一次的面试体验不是很好,因为那个时候刚大致过完一遍知识点,脑袋里的知识都混在一起了,而且偏偏问的东西也很杂,就连公众号里的文章他也看了,这点是我没想到的。不过面试官很 nice,一直都在和我探讨这些问题,气氛也不是很紧张,之后几天就迎来了二面。
这里插句题外话,在投简历的时候,一定要确保简历上的东西的真实性,你需要对你简历上的每个字负责,而且最好可以保证你写的东西自己是很熟悉清楚的。
二面
不知道为什么,总觉得二面问的问题和一面比起来侧重点是平常学习生活中的,而不是基础知识了。
- 自我介绍
- 自己做的 app 上线了吗?是自己做的吗?简单说一下
- 学校的课程中你觉得哪一门学的最好?(都差不多)
- 你学习了挺久的 Java,对于这门语言有什么认识?或者和其他编程语言比起来有什么不一样的地方?
- 那你在学习的过程中有什么事情会让你坚持做下去?
- 开发这个 app 的动力是什么?
- 有参加过什么学科竞赛吗?
- 数据结构你觉得你学的怎么样?做一道编程题(用数组模拟一个栈)
- 智力题:你雇佣一个工人,他每天工作应该获得一份金条,你有一根金条可以分成 7 份,但你只能对你的金条切 2 刀,请问怎么保证你的工人每天都得到一份金条?
- 你有什么想问我的?
三面
到了三面,基础知识问的不如前面几轮了,更多的是项目经验方面的东西,说实话这里也是我欠缺的地方,面试的问题如下:
- 介绍一下项目
- 项目是否复盘,如果说用户量/数据量/访问量非常大之后,你了解到的可以做哪些改造?
- SpringBoot 有深入了解吗?和 Spring Cloud 有什么差别吗?
- SpringBoot 核心框架包含什么?SpringCloud 一套微服务的框架中间有什么部分你是比较熟悉的,详细介绍一下。
- SpringBoot 容器启动的大致流程(这个不会)
- SpringCloud 在 SpringBoot 的基础上扩展了什么?(我提到了注册中心,作用是什么说了下)
- 多线程,几种线程的创建方式(thread、runnable、callable),使用的时候有什么场景约束(在什么场景下使用什么方式)
- 多线程情况下临界区的资源保护有哪些方式?(比如锁)
- 场景编程题(卡了很长时间) 不考虑高并发/分布式/集群/网络调用等问题,不依赖消息队列/缓存这些东西。希望你可以提供一个医院类,这个类有一个核心的方法给外部调用,这个方法实现如下功能:5 个医生,每个医生可以挂 10 个号,然后医院有 10 个窗口,也就意味着同时只能有 10 个病人挂号,那第 11 个人要挂号的话就不能立刻拿到号,得前面的用户挂完号才可以挂号,病人挂号的时候,医院给病人返回的结果是:1. 如果当前有空余号可用,就取最前的号;2. 如果没有号,就给调用的病人返回没有号的错误。注意:如果有号的话是不能允许返回给病人说没号,如何设计这个类以及这个类中的方法。(附加:如果在分配号的时候偶然出现时间抖动,你该怎么解决)
这一面说实话是我最没有把握的一轮面试,因为自己对于微服务这块确实没有实际操练过,经验很少,源码看的也不多,而且那个场景编程题答的也不是很好,没有很细致的说该怎么实现。
不过这轮面试里,面试官有句话让我印象很深刻,他说作为一个技术人,经验是没有办法衡量的,但是思维可以,我们在日常生活中,应该要善于用代码思考问题。对于一个功能/事物,我可能会想着这个功能可以通过一个消息队列去实现,可以用 redis 去实现,但这样思考还不够深入,应该在思考的时候就在脑海里构建出代码结构。不然也只能算是纸上谈兵。
交叉面
三面结束,慌张了几天之后迎来了交叉面,我看牛客网上的帖子说交叉面基本上就不刷人了,但还是有些担心,可能我运气比较好吧,简单问了我一些问题就结束了,没有太刁难我:
- 你可以讲一下做的最有成就感的项目吗?
- 这个项目是如何变现,如何带来价值?
- 是如何吸引用户的?怎么获取用户增长的数据?
- 那如果重新接收这个项目有什么想法吗?
- 之后对自己有什么规划吗?
- 你对手淘有什么样的认知?(产品很优秀,团队的技术能力也很强)
- 还有什么要问的?
交叉面的面试官跟我说因为之前每一轮面试的面试官都有记录,所以就不问我一些技术方面的问题了,另外就和我说了下在阿里工作是什么样的感受,为什么换了部门,交叉面一共就面了 20 分钟,气氛还是很轻松的。
hr 面
隔了两天接到了 hr 的电话,前面几轮面试都拖了挺久的,hr 这里反倒比较快了,问的问题也很正常:
- 有没有帮助他人的案例可以分享一下的吗?
- 你是怎么规划你未来的职业方向的呢?
- 对于以下案例,你有什么想法?
- 商家在我们这进货,为了加快货物的流通,会有赊账,在这个过程中,用户增长非常快,然后需要做一个系统,在这个系统上线的前一周,运营过来说,我们需要加一个子功能,你作为技术,是选择将原版本上线之后再升级,还是说把新系统的功能全部做完了再上线?(我选的第一个) 那按照第一个方法做了,系统也上线了,后期升级的时候你本以为 2 个星期就可以升级完成,但是你突然发现你可能搞不定,数据上出现了一些问题,产品经理此时也在国外,没办法及时沟通,作为一个技术人员你会怎么办?
- 大概什么时候可以实习?实习地点?
hr 面更多的就是看看这个人的一些性格特点以及遇到一些事情时的处理方式,大多数人走到这一步基本只要回答的不太有偏差应该都不会有太大的问题的。
总结
在面试期间我也看了很多其他人的面经,对比一下发现自己遇到的面试题难度上比他们要小一些,可能是因为自己也没做过什么太复杂的项目,所以也没深入问了。不过阿里的面试官人很 nice,面试的过程也不是单向的询问与回答,更像是一种讨论。总的来说,除了进度比较慢(将近 1 个月),其他方面的体验还是很不错,这里许波愿,希望可以收到暑期实习的 offer。
最后打波广告,如果我的文章对你有所帮助,不妨搜索一下微信公众号「梁注」,或者扫描下方二维码,后期我会不定时分享互联网上有趣的内容,也可以后台回复「微信」与我交流。