本来都忘了都东西,整理硬盘的时候发现了这份凉经,发出来回馈牛友(骗经验)
面试从4.29号开始,一直到五月底结束,持续了接近一个月,共经历了三轮七面,皆为电话面,其中最后一面因为忘整理了,就没了……
也怪我投实习太晚了,应该hc都没了,沦为了刷kpi的工具人……不过也是我第一次面试,就当是锻炼下好了
一轮三面挂,二轮一面挂,三轮三面挂
一面(20.04.29)
自我介绍
打开浏览器,做个题目:如何判断一棵树是二叉搜索树
最终代码如下:
public class Main { private static int last; public static boolean judge(Node root) { if(root == null) return true; if(!judge(root.left)) { return false; } if(root.x <= last) { return false; } else { last = root.x; } return judge(root.right); } static class Node { int x; Node left; Node right; } }
一面流程很短,短到我怀疑这到底算是面试还是补笔试。因为我笔试做的太差了,两个题目一题都没做出来……所以笔试之前一定要先刷刷题练练手,找找手感也好。
面试官人很好,很有耐心。第一次他打电话过来的时候我正在去实习公司的路上,不太好接电话,就把时间推到了当天晚上。结果到晚上的时候,我去走廊接电话时,他又问我手头有没有电脑……(只有台式机,但我又不能在办公室里面试),结果只好又推迟到了第二天上午。第二天我专门请了假在公寓里等面试(再错过我就没了)。即使这样,面试官也丝毫没有表现出不耐烦,还半开玩笑和我说还好遇到了他这么nice的人。
第一次面试有点紧张了,我这个人在数据结构和算法方面一直不太擅长(很不擅长),结果他在说什么树的时候我一下就懵了,缓了一会才缓过来。第一次写的时候也写的有问题,没有考虑类似左子树的最大值要小于根结点的值(忘了),直接一个递归怼上去,然后就ugauifhiohfiojfop……事实上应该用中根遍历,遍历结果应当是有序的……
结束后面试官向我介绍了他所在的部门,他所在的部门主要负责类似流式计算和海量数据处理的,可能和我简历上写的网站开发没啥关系……然后他又鼓励我说我的表现不错,毕竟在校生也一般接触不到真正的分布式和海量数据处理啥的……有种凉凉的节奏。
我这时候才发现,我投递简历的岗位上写的是“研发工程师JAVA”,后面还有一行小字“分布式存储,搜索引擎,其他,分布式计算,数据库,机器学习工程,网络,硬件,应用服务开发”。我为什么就直接当作“后端开发”投了……
总体来说,还算不错,虽然专业不太对口,可能没有下次了……
二面(20.04.30)
一面的第二天,本来已经不抱希望了,二面来的让我措手不及……急急忙忙地接,手都在抖。下面是大概的问题,因为忘录音了。
- 自我介绍
- 开发的主要语言(JAVA……)
- 简历上的项目探讨(JWT+SpringSecurity验证鉴权,Redis,Token自动刷新,Authentification域)
- 为什么用Redis实现,Redis的好处
- 用过Socket吗(网络编程,我说写过一个井字棋程序)
- 对于井字棋程序的探讨和扩展
- 介绍该程序(一个Server两个Client)
- 如果想要扩展成多个房间,该怎么抽象类(房间类,包含棋局状态和两个Socket)
- 如果有的人短线重连了,怎么保证下的还是一盘棋(类似登陆状态管理,保留房间号等信息)
- 例如一个服务器最多可以维持十个房间,怎么动态地加减房间以及分配房间(类似分布式中的服务发现和API网关,可以设立一个中心服务器用于服务器的注册,同时维护每个服务器的拥堵程度,由API网关统一对外提供服务,并引导新的连接到一个相对空闲的服务器。至于减房间,当时只想过可以借鉴线程池的思想,维持一个最小的服务或房间数量,多余的服务在空闲一段时间后自动关闭)
- 如果要实现聊天功能该怎么办(Websocket或者webflux,服务器推送SSE)
- 如何设计协议(协议头,长度,协议码,内容数据)
- 怎么用RPC实现(RPC不了解,远程过程调用)
- Java如何保证跨平台(JVM底层适配,向上提供一致的接口)
- 了解反射吗(不了解,字节码的运用,框架用的多)
- 说一说对多态性的理解(主要通过接口,运行时才确定使用哪个对象执行方法)
- 做过JVM调优吗(没有)
- JIT技术了解吗(即时编译,编译热点代码为机器码)
- 说一说对锁的了解(乐观、悲观,细分为偏向锁、轻量级锁、自旋锁和重量级锁,三种用法:锁对象、锁类、锁方法)
- 了解锁在操作系统层是怎么实现的吗(不了解,就说了在JVM的实现,且说了猜测可能和主内存与线程的缓存之间的关系,volatile关键字,又说了CAS,可能导致ABA问题)
- 如何使用Hash表(HashMap,不知道这题的意义)
- HashMap和HashTable的区别(线程不安全和线程安全,扩展说了HashTable锁整个表,效率低,应当用ConcurrentHashMap,JDK1.8之前分段锁,JDK1.8后锁表头,只会在Hash冲突的时候进行同步操作,效率高,又说了HashMap的实现,拉链法和红黑树。PS还好没问我红黑树)
- 说一下对分代垃圾回收的了解(不同代中对象的特点不同,于是采用不同的GC策略。新生代的两个S区采用复制策略,老年代采用标记-整理算法)
- Linux的文件系统了解吗,什么是文件描述符表
- 说一下进程的内存映象(顶部是操作系统内核的映射,然后是向下生长的栈,接着是向上生长的堆,底部是一些常量区等)
- 如果一个应用程序访问一个不允许访问的内存(如0x0),会发生什么(段内存机制,段描述符中存在访问特权级字段,获取段描述符时会首先与CPL对比,Linux下应用程序为3,操作系统内核部分为0,比较后会阻止访问)
大概就是这样,总觉得有点少了,可能是我的废话太多了,才讲了50分钟。之后面试官又给我介绍了他所在的部门,关于机器学习和系统架构的……我觉得我可能再也无法从事后端了(笑),而且我的简历貌似被踢皮球了?
三面(20.05.04)
话说阿里不放五一假期的嘛……五月二号的时候无聊翻邮件,忽然发现了五一时面试官给我发的预约时间的邮件,最后时间约在4号上午十点。
因为有了邮箱,提前手贱查了一下面试官的信息,结果……清华本硕毕业,毕业时入职Google,现任阿里P9……忽然就很慌。
4号上午面试如约而至,面试官听起来貌似比较忙?也没有让我自我介绍,而且果然等级越高问的越基础。
- 专业课有哪些
- 知道哪些排序算法,说一下原理与时间复杂度
- 知道哪些树
- 说一下红黑树的特性
- 如果给你一棵树,怎么一层一层地输出
- 层序遍历可以用深度优先吗(我说可以是可以,但是可能很麻烦,要记录层数,频繁回溯)
- 毕业之后的打算
整个面试就11分钟,之后面试官让我把层序遍历的代码写完给他发过去,我写完之后放在Ubuntu Pastebin里了:https://paste.ubuntu.com/p/PJzF4Zmhzf/
总体感觉,问的很基础,但是我答的不太好,很多东西都忘得差不多了,像排序和树之类的,看来还是得注重基础唉。
二次一面(20.05.06)
很凉了可以说是,第一次被拒掉之后紧接着就是第二次的一面,先扯了一堆没啥用的项目经验之后,给我出了一道题:
评测题目: 无 题目:给n个有序字符串(仅小写字母,ASCII序递增),求所能拼接的最长有序子串的长度。 例如["aaa","bcd","zzz","bcdef","def"] 所能拼接出的最长有序子串为aaa,bcd,def,zzz拼接出的aaabcddefzzz长度为12
咋想也没想出来,面试官提示用动态规划,但是我还是想了半个小时啥都没想出来,凉凉~
我起了,一招秒了,没啥好说的。
三次一面(20.05.08)
本来以为已经凉掉了,结果因为选择了调剂,就被又安排了新的一轮的面试……可以说很烦,兄弟
约的是8号晚上九点,是第一个提前和我约时间的面试官呢,好感度up。
首先上来就是自我介绍,没啥好说。很糟糕的是让我说现在实习的工作……就很丢人,随便说了个因为刚刚上任所以啥也没干就搪塞过去了。
- 介绍下项目(Spring Cloud项目)
- 分布式开发的好处和弊端(扩展性强,耦合度低,模块化;缺点:模块通信)
- RPC调用框架(Feign,读过源码吗?没有)
- RPC调用出现延时的环节(序列化反序列化,网络传输)
- 了解序列化吗,有哪些序列化反序列化方法(不太了解,只知道字节流如ObjectOutputStream,和JSON方式)
- 为什么使用Redis(内存数据库,且可以自动过期删除)
- 对比过Redis和其他的缓存吗(memcached,memcached可以存储图片和视频,Redis支持定期持久化)
以下问Java基础:
- final关键字的用法(变量、方法和类,声明变量十不允许改变初始化后的值,声明引用则不允许改变引用,声明方法时则继承时无法重写,声明类时无法继承)
- final域的重排序规则(不了解)
- final修饰形参时会怎么样(同final修饰变量)
- Object类中的方法(toString、hashCode、equals、wait、notify、notifyAll、getClass、clone和finalize)
- 对HashMap的理解(k/v存储,安排位置的方法(%与&),扩张时需要重新计算所有的hash,解决冲突的方式(拉链法、红黑树))
- HashMap的Hash时进行移位操作的作用(不知道,后来查到是扰动函数,减小碰撞的几率,增大随机性)
- HashMap的扩容(阈值0.75,对所有的key重新计算hash,所以要首先指定初始值,且会导致并发情况下成环问题)
- 高并发下使用ConcurrentHashMap,看过resize()方法的源码吗(没有),了解它的数据结构吗(类似HashMap的结果,1.8之前使用分段锁,1.8后使用节点锁)
- 对数据库的脏读和幻读了解吗(从隔离级别开始,四个隔离级别,默认隔离级别Repeatable Read,脏读、不可重复读、幻读的概念)
- 知道乐观锁和悲观锁吗(宏观概述,具体四种,基于的思想和假设(读多写少,读少写多),乐观锁CAS,悲观锁完全上锁)
- 线程池初始化方式和参数(Executors方式和ThreadPoolExecutor方式,第一种的三种都会出现OOM,第二种有几个核心参数,包括corePoolSize、workQueue、maximumPoolSize、keepAliveTime、unit和handler,handler没让我说)
- 快速向未到达corePoolSize的线程池添加两个线程,会向queue中添加然后转发运行还是直接向corePoolSize中增加并运行(不知道,不会,没看过源码)
接着开始闲扯开源,然后闲扯一些学习新技术的方式,和团队合作。对算法的看法(估计是我前几次评价都是算法不太好),最后问了我一个算法题,叙述思路就可以。后来看到是Leetcode 1162:地图分析的题目,可以用bfs来解,将所有的陆地同时进行一次bfs,最后一次才被遍历到的海洋就是结果,类似填海造陆吧,具体可以看leetcode。
最后有一个开放性的问题,分享一件自己不擅长,但是后来发现自己还不错,超出了期望的事情。我说就是面试hhh。
最后面试官夸了我动手能力很强😄,接着给我介绍了一下他的部门,大数据部。接着他说下一轮面试最迟应当就会在下一周。
难得算是比较愉快的一次面试了唉。本来就抱着破罐破摔的心态的,结果貌似还行?
三次二面(20.05.10)
二面很快就到了,约了10号晚上九点,话说面试的进度为什么这么快唉……真的很赶。
开始时例行的自我介绍,接着面试官,从项目入手,问了一些问题:
- JWT的原理,为什么可以被用于验证,和session方式的区别
- 描述一下session的产生,和与前台的交互方式,sessionid。从整体的角度描述一下session或者jwt方式的登陆
- 分布式session,各种解决方案的优点和缺点
- 如果使用JWT的方式,如何存储大量的数据(如购物车)
- JWT的结构,JWT存储信息的长度收什么限制(HTTP头的长度)
- HTTP与HTTPS的协议的关系和区别,HTTPS的交互方式
- Spring Boot常用的框架(starter)
- Spring MVC接收到请求时的处理流程
- Spring的IOC与AOP(代理)
- 描述一下HashMap的实现,扩容的原理
- 堆内存不够用时可能的操作(垃圾回收,扩容堆)
- 描述JVM垃圾回收的机制
- 堆的扩展(启动参数中的最大堆内存),如何进行扩容
- redis的存储原理
- 描述一下Spring Security及使用
问题不多,但是问的很深,往源码里问的那种,有点子狠,没真正扒过源码的话很容易现原形……话说为啥每次面试完后感觉还行,但是之后再听电话录音的时候就觉得自己怎么回答得这么惨,像个智障一样……不过也算比较难得的,虽然这个面试官还是大数据部的,但是总算遇到一个做过web的了……但是还不如没做过!web我回答得挺惨的。
害,随缘吧,都是拼的运气唉
这就是关于阿里春招实习面经的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!(老营销号了)
全部评论
(3) 回帖