“大战”阿里面试官 7 回合,险胜!完成了我的第一个“五年计划”

前言

今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这次阿里面试真的太难为我了,可以说是和面试官大战了 7 个回合,不过好在最后给了 offer。

我个人情况是 5 年 Java 后台经验,阿里定级 P7 的样子,下面是我的面试经历分享,希望能带来一些不一样的启发和帮助。

我与阿里面试官“大战”7 回合,胜

第一轮:

第一轮面试是电话面,以基础知识为主,前后大概 2 个小时左右,这个阶段我是比较紧张的。

  • 先自我介绍,包含日常工作

  • 多线程,ThreadLocal,问了父子线程怎么共享数据 interitableThreadLocals

  • Lock 和 Sync 的区别

  • AQS 原理(执行过程源码,入队出队的细节,源码细节)

  • CountDownLatch 和 CyclicBarrier 的区别是什么源码级别

  • volatile 从指令重排序,内存屏障

  • 数据库,MySQL 索引,执行计划、count1*区别、举例优化 sql、MVCC 和事务隔离级别的关系、间隙锁、行锁

  • JVM 调优(可达性分析算法中根节点有哪些、cms 和 G1 区别、怎样 GC 调优、怎样排查 CPU 彪高、内存彪高、逃逸分析)

  • redis 数据结构、跳跃表、redis qps 能上多少,怎么知道的、sentinel 和 cluster 区别和各自适用场景、redis cluster 集群同步过程、redis 单线程为什么快、多大叫大 key、热 key 产生原因和后果以及怎么解决、本地缓存需要高时效性怎么办?

  • spring 的作用、spring 循环依赖怎么解决(说出三级缓存源码细节)、spring aop 原理(动态代理)、spring bean 生命周期(源码细节,以及各个位置的设计思路,有什么可扩展的)

  • dubbo 服务暴露和引用过程,负载均衡策略,容错机制在哪里实现的源码

  • 项目中碰到的问题。

  • 为什么换工作,如果通过会直接说有笔试题,和你确认笔试时间。

第二轮:

第二轮是笔试,总共两道题,第一题是写代码,第二题是写技术方案。

  • 主要是以查询为主,考察锁粒度、时间粒度上的细节点。(详细省略)

第三轮:

第三轮是现场面试,这一轮面试以解决方案为主,前后大概约 1 小时 20 分钟。

  • 缓存穿透,让我设计一个防止缓存穿透的解决方案,简单的就是存 null 值,但肯定会深究,可以结合布隆过滤器,设计分布式系统,里面又会问到流量分发到具体过滤器服务的方式,比如一致性 hash 算法,怎么调用?比如 dubbo 直连、等等细节会边说边问。

  • 有没有做限流,设计一个侵入性最小的限流服务。

  • 项目中碰到的问题,最好说框架本身问题,能体现个人能力,也避免问题太低级被面试官看 low,刚好之前有发现一个 dubbo 的 bug,所以这问题应该回答的还可以。

  • 为什么换工作,每轮都会问,这个得想好。

第四轮:

交叉面,项目为主,时间大概为 40 分钟,问的内容不多,这个阶段我个人的状态比较放松了,与面试官交谈的方式也自然了许多。

  • 介绍最熟悉的项目,业务上有没有什么优化点;和同行业其他公司的差距和优势(估计是 P7 的标准问题,总之我回答得不是太好)

  • Dubbo 服务调用过程

  • NIO、BIO 区别,NIO 解决了什么问题,Netty 线程模型(源码拷问)。

  • MQ 相关

第五轮:

这轮面试真的让我比较为难了,面试官问什么问题都会问到具体的数值,状态又变紧张了,如履薄冰啊。

  • 项目介绍

  • 听到说做了限流,限流标准(并发数? qps?并发数和 qps 关系?说出了 5 种限流方案和对应算法原理)

  • dubbo 调用端怎么在 jvm 中生成对应服务?dubbo 服务端和调用端超时时间设置和区别、dubbo 长连接。

  • mysql 行锁最大并发数?(秒杀项目指出)

  • 设计秒杀系统,我说的异步的方式,会问怎么优化?改为了同步的方式,异步和同步区别? 然后我也问了阿里那边

  • 碰到哪些技术难点?怎么解决?有没有参考其他大厂?其他大厂方案什么样的?有没有关注阿里这边最新的技术?

  • 刚刚的秒杀系统,会涉及到多个库表的更新,分布式事务怎么解决,我说的消息最终一致性,异步?有没有更好的方案?同步 TCC 方式,TCC 方式原理?(三个阶段的具体实现)

第六轮:

总监面,主要是自我介绍和项目介绍,聊天的方式比较舒服,大部分是对你的整体价值观做宏观的把控(比如上进心,责任心,心态,工作激情等,差不多 15 分钟就结束了。

  • 说了自己的项目

  • 主要用到的架构,做了些什么?

  • 比较复杂的业务逻辑讲一下?

  • ...

第七轮:

HR 面,阿里的 HR 很不一样,无论是气质还是谈吐都让人佩服,问的问题也很有针对性,最后告诉我会电话反馈结果。

  • 自我介绍

  • 如何学习新技术?

  • 如何团队合作的?

  • 遇到很难的问题,如何解决?如何突破?

  • 职业规划

  • ......

阿里 7 轮面试经历完整版(含答案和解析):

由于文章篇幅有限,完整版的面试题和答案解析就整理在 PDF 文档里,需要完整版笔记的粉丝朋友们可以点击这里即可获取到文章中的文档,资料!!

工作 5 年,虽然清楚现在流行什么技术,但对于互联网大公司会面试一些什么还真是不太清楚,所以面试之前刷一刷面试题还是很有必要的,能够做到举一反三。一线互联网的面试题,我整理了 2020 全年的,内容还真不少。

 

 

 

拿到 offer 后的规划和心态

毕业后,我的第一个 5 年按照计划进行了,那么拿到阿里 offer 后,下一个 5 年也有要清晰的目标。接下来的时间,是形成思维方法论和知识体系的阶段,同时也要培养自己团队协助与管理能力,提升自己的眼界,从而有更长远的发展。

至于心态,脚踏实地,不傲不馁。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的文字版植物大战僵尸游戏的Java代码: ``` import java.util.Scanner; public class PlantVsZombie { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int sun = 50; // 初始太阳数 int round = 1; // 回合数 String[][] map = new String[5][9]; // 地图 // 初始化地图 for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { map[i][j] = "-"; } } // 游戏开始 while (true) { // 显示场景 System.out.println("Round " + round); System.out.println("Sun: " + sun); for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } // 等待用户输入命令 System.out.println("请输入命令(种植:p 行 列;结束回合:e):"); String command = scanner.nextLine(); if (command.equals("e")) { // 结束回合,生成太阳并生成僵尸 sun += generateSun(round); generateZombie(map, round); round++; } else if (command.startsWith("p")) { // 种植植物 String[] tokens = command.split(" "); int row = Integer.parseInt(tokens[1]) - 1; int col = Integer.parseInt(tokens[2]) - 1; if (map[row][col].equals("-")) { if (sun >= 20) { map[row][col] = "P"; sun -= 20; } else { System.out.println("太阳不足,无法种植植物!"); } } else { System.out.println("该位置已有植物!"); } } else { System.out.println("无效命令!"); } } } // 生成太阳 public static int generateSun(int round) { if (round % 4 == 0) { return 25; } else { return 0; } } // 生成僵尸 public static void generateZombie(String[][] map, int round) { int numZombies = 0; if (round <= 5) { numZombies = 2; } else if (round <= 10) { numZombies = 3; } else if (round <= 15) { numZombies = 4; } else { numZombies = 5; } for (int i = 0; i < numZombies; i++) { int row = (int) (Math.random() * 5); map[row][8] = "Z"; } } } ``` 这个程序使用了一个二维数组来表示游戏地图,其中 `-` 表示空地,`P` 表示植物,`Z` 表示僵尸。每次回合开始时,程序会显示当前的场景,并等待用户输入命令。用户可以输入 `p 行 列` 的命令来在指定位置种植植物,也可以输入 `e` 来结束回合。每个回合结束时,程序会生成一定数量的太阳和僵尸,太阳可以用来种植植物,僵尸会向左移动并攻击植物。游戏会一直运行直到玩家失败为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值