自我介绍

普通二本本科,毕业5年,待了2家独角兽公司,28岁,上家公司在杭州的一家独角兽,没带过团队,只是一个小组长之前带2个人。

面试结果

蚂蚁 1,2,3,4+笔试+总监面+hr面,年薪差不多45W左右吧

如何准备面试和学习

这次面试其实没准备充分,因为是约想线下面试本来想是去补补不足,回来好有准备的方向来着,没想到.....

如何准备:

  1. 平时工作中积累项目经验,多画图,多理解,对自己项目要求深入详细理解,并且要关注上下游项目
  2. 技术的学习和积累,跟着石杉老师的架构课长期系统的学习,以及儒猿的面试突击做一些总结和扫盲
  3. 学会通过思维导图和画图去总结,养成画图的习惯,可以在面试时表达的更加清晰,并且平时经常去复习自己画的图
  4. 简历方面,提前找石杉老师进行简历指导,并根据老师的建议进行复习。然后在整个面试的过程中遇到什么问题,一定要及时跟老师反馈交流。不仅仅是技术面试,包括hr面的准备

如何学习:

  1. 业务层面多理解,多讨论,多画图,这个只能靠自己谁都帮不了
  2. 技术层面,跟着架构课系统的深入学习,配合着课外的一些书籍,每到一定阶段做一个总结和反思
  3. 我算是学的慢的,差不多一天2个小时视频吧,然后晚上自己会花1小时左右重新看文档,提炼一些重点要点然后记笔记,画图,然后周末会过一遍这一周学习的内容,一个技术体系学完会尝试着画点思维导图(大概要点,不会很细)
  4. 然后就是一些博客,特别是儒猿技术窝的jvm,面试突击,课外其他的一些博客啦
  5. 力扣刷算法,目前不多180道,估计面头条啥的够呛。

面试精华提炼

技术层面:

  1. 技术要扎实,技术要广而且有几样要深(能聊源码,聊架构),你不仅要会,而且要能说,最好能说的通俗易懂
  2. 业务要精,视角要广,针对自己的业务要有长久的眼光,针对自己业务的上下游也要做一些了解。
  3. 要习惯去写博客,写github源码框架(很low的demo不算),阿里面试官感觉很喜欢一个人的求知欲和分享能力。
  4. 简历上一知半解的东西千万别写,写上去的自己一定能hold住。

面试层面:

  1. p7以下尽量找认识的朋友内推,可以协商1,2面是否可以走线下。千万别找猎头(90%不靠谱)。
  2. 面试过程自己要变成主动,把面试官往自己的方向引导,一旦你被动了70%基本就凉了。
  3. 遇到不会的问题,一定要谦虚,不会就是不会,自己可以说下替代方案,然后虚心可以请教下面试官具体如何解决。

面试背景说明:

因为这次面试就是直奔阿里去的所以也就没面其他的公司,直接就面了阿里。因为阿里认识人,所以直接就找朋友内推了 一共面试了阿里的2个部门,因为是内推,所以1面2面都是走线下面试(意思是说不进阿里系统,就算面试挂了也不会有任何记录),本着就当锻炼锻炼弥补不足的态度就展开了阿里的面试之旅。

面试详细说明(附录面试题)

首先面试的是阿里本部的a团队,给了简历之后,本来约的是在线下一个咖啡馆喝喝咖啡顺带把1面2面过掉的,但是后来他们年底估计太忙,约了2次都被放鸽子了,后来就约了电话面试。 后面的蚂蚁前2轮也是电话面试,因为一些特别细的面试题也记不起来了,所以把两个部门的面试题做了一个整理,就当成一次面试写在一起了。

附录:面试题

电话面试1(基础考察)

叮铃铃......晚上9:00这次没放我鸽子,电话声响起。

1、首先是自我介绍,巴拉巴拉,我自己讲了大约15分钟

2、所以问你这两年具体做了哪些事情,做了哪些优化

我:巴拉啦.....可以很流畅的说,并且给出相应的数据提升

3、说下对ThreadLocal认知,项目中的应用场景

我:巴拉啦.....可以很流畅的说,并且给出相应的数据提升 我:ThreadLocal是一个创建线程局部变量的类。。ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改 然后说了下内存数据结构,常用的方法,说了下Key为什么是弱引用。可能出现的内存泄漏问题。还说了一下ThreadLocal在项目中的应用场景:实现单个线程单例以及单个线程上下文信息存储,比如交易id等

4、讲讲你知道的一些锁

我:公平锁和非公平锁,可重入锁(可递归)和非可重入锁,独享锁和共享锁,互斥锁 / 读写锁,乐观锁 / 悲观锁,自旋锁......

5、然后根据锁提出的,讲讲synchronized和ReentractLock的原理和区别

我:从硬件层面讲到java层面,举出了区别和应用场景,说道了哪些框架和源码用了

6、线程的一些方法wait,notify,condition await() signal()

我:先从方法属于什么类,有什么作用,一般什么场景用,有什么区别,甚至可以说下替代方案(表明自己的一个技术广度)

7、redis分布式的认知,让你自己线程一个redis分布式锁你怎么实现

我:应用场景,不用分布式锁会有什么问题,分布式锁如何解决这个问题,还存在什么问题,如何去解决,原理清楚吗?是否还有其他的替代方案,让你自己设计你怎么写

8、讲讲mysql索引,原理是什么,如何优化索引

我: xxxx,B+树,为什么要用B+树,有什么优点

9、讲讲你对垃圾回收机制的理解(问题问的很宽泛,就看你怎么回答和理解)

我:什么是垃圾,为什么要回收,不回收有什么问题,jvm有哪些区域,分别采用哪些回收方案,每个方案有哪些优缺点,为什么适合这个区域

10、面试官: 为什么年轻代eden、s1、s2是8:1:1

我: 说了下JVM的内存模型,eden区和s0 s1区的划分,S区是用来存储新生代GC后存活下来的对象,而我们知道新生代GC算法使用的是复制回收算法。

GC 算法总体就是三种:

  • 复制
  • 标记
  • 标记整理

垃圾回收算法将这几种选择起来相互组合。毫无疑问,只存在少量存活的对象,只需复制少量存活的对象,远远比标记和标记整理高效多。

除了复制算法需要大小相同,老年代都是活得久的或者大对象,另外,这里应该就是还有个二八原则。

11、面试官: 工作中有解决过gc问题吗?什么场景下出现的,如何去排查和解决

我:这块,参考后面的文章就可以搞定。

电话面试2(项目架构,框架源码考察)

2面最久,2个部门加起来估计有3.5小时

1、也是先自我介绍

2、redis了解多少?需要设计一个大数据新闻推荐功能你怎么设计?设计一个附近的人功能你怎么设计

我:从数据结构,架构说,新闻推荐可以往布隆过滤说,附近的人可以往基于geohash和有序集合

3、讲讲zset的数据机构,一般应用在什么场景,你项目中有用过吗?解释下跳表

我:底层是调表实现的,比如会应用在点赞排行榜之类的场景

4、说下HashMap吧,1.7和1.8有什么区别,了解红黑树吗?1.8为什么这么用红黑树

我:最关键是死循环,底层数据结构的变化,说了一些红黑树特性,具体没特别深入研究

5、讲讲为什么ConcurrentHashMap是并发安全的吧,既然有锁怎么去统计size呢

我:从1.7讲到1.8,从分段锁讲到cas+sync....size的统计1.7和1.8也有区别

6、说说springBean的一个加载流程吧,如何解决循环依赖问题

我:,讲下什么是循环依赖,哪些情况会造成循环依赖,如何解决循环依赖(重点说明单例,缓存)

7、spring事务了解吗,讲一讲原理,@Transactional作用在方法A,B的事务生效情况

我:从代理层面,从事务的传播特性讲

8、讲讲spring的AOP吧,业务中有用到吗?如何实现的,不同代理实现的区别

我:xxx面向切面编程,jdk动态代理和cglib代理方向讲,区别最主要是属于不一样,修饰地方不一样。

9、说说CAP理论吧,为什么只可能是CP或者AP呢?C和A为什么不能共存?

我:先解散概念,举例说明一致性和可靠性为什么不能共存,最好可以举例哪些框架是CP或者AP的

10、了解gissip协议吗?跟raft和paxos有什么区别,zk有了解吗?用的什么协议

我:主要从CP和AP入手,以及协议的应用框架,优缺点,为什么这么用

11、讲讲分布式事务吧,你熟悉的分布式事物框架,项目中有应用吗?框架的原理是什么?如果让你自己去设计你怎么设计

我:ttc,最终消息一致性,最大努力通知,分别用在什么场景,底层怎么实现的去回答

12、我看你们项目中有用消息中间件,你们用的哪些,怎么去选型呢

我:主要是mq和kafka,讲讲区别,讲讲不同的应用场景

13、讲讲kafka的实现原理,为什么能支撑这么高的吞吐量,如何保证高可用,讲讲高水位机制的原理和流程以及ISR机制

我:主要从batch+oscache+磁盘顺序写讲,讲讲partition的多副本存储,如何去选举leader的等等---一般面试官都

14、kafka网络协议是怎么样的?为什么不用netty去写?你了解nio吗?讲讲跟bio的区别

我:关注直接用nio写网络编程,netty第三方框架可能不稳定,主要从同步阻塞和同步非阻塞入手

15、mq的原理你有了解吗,跟kafka有什么异同点

我:(先承认没看过源码,但是有特地去了解过,所以回答的时候不用这么深)主要从mq的broker,NameNode,消费者,生成者四个模块将,然后消息的发送和写入跟kafka有什么区别,集群模式有什么区别,应用场景有什么不同。

16、你熟悉微服务,你们用什么微服务框架,讲讲springcloud dubbo选型

我:两者我在两家公司分别都用过,springcloud看过源码,dubbo也有研究过原理,xxx优缺点

17、讲讲springcloud的eureka原理,讲讲A服务是如何调用B服务的

我:从服务注册和发现入手,讲讲eureka的核心原理,二级缓存,心跳机制等

18、那再讲讲dubbo的服务注册和发现?

我:从动态代理,负责均衡,信息交换等模块讲讲

视频面试3(侧重技术视野-框架设计)

  1. 自我介绍
  2. 讲讲你们如何利用爬虫去破解(抓取)一个网站的数据的吧,中间遇到的最困难的问题是什么?(ps:因为简历上写了做过爬虫相关项目,所以问了关于爬虫的问题)
  3. 你遇到过哪些风控策略,你是怎么去解决的,图形验证码你怎么解决,对神经网络有了解吗?
  4. 反过来,你对你自己的网站,有哪些安全的风控需要注意,你一般会去如何设计
  5. 百度其实就是一个大的爬虫(搜索引擎),你觉的他是如何做的,为什么百度不把数据格式化呢?有什么难点吗
  6. 你如何设计一个通用化的爬虫,以应对我对不同网站,不同需求的变化。

面试4(设计能力,学习能力,软素质)

  1. 设计一个分布式文件存储系统,你会如何去设计
  2. 设计一个微服务注册中心,你会如何去设计(以上两个石衫老师在java架构班都分析的特别详细,而且还带着我们落地实现了。所以我回答的比较周全,考虑到的问题也全面,面试官比较满意)
  3. 最近在看什么书?你一般是如何学习一个新知识的
  4. 怎么看待加班

hr面试(价值观的考量)

  1. 讲讲你做的事情(阿里hr可能会问一些技术问题哦)
  2. 你工作中最有成就感的事情是什么
  3. 你如何看待加班,工作和生活如何去权衡
  4. 你做的最不好的项目是什么?什么原因导致的
  5. 你为什么离职,为什么选择阿里
  6. 你的职业生涯规划是什么

最后总结

通过这一轮的面试实战,我总结下某大厂核心部门简历评估、技术面试的要求有几方面:

简历评估、初筛

  1. 学校背景,top 20学校 软件工程专业加分,211学校加分
  2. 职业经历,是否具有互联网从业背景,自毕业以来一直待在BATJ & TMD & FLAG加分,P6~P6+本科毕业3年到五年 P7~+本科毕业5~8年
  3. 项目背景,有中间件研发背景加分,开源组件贡献者加分,项目深度广度、与现有业务匹配度加分
  4. 其他因素,是否跳槽频繁,kpi得分等等

第一轮技术面试考察

  1. java基础、并发基础、中间件原理、jvm、分布式协议、mysql等
  2. 系统设计能力,系统架构的设计、模块功能的划分、微服务的划分、高可用、可拓展性、稳定性的考虑
  3. 编程、算法能力(时间空间复杂度的分析)

第二轮技术面考察

  1. 中间件原理
  2. 生产事故原因的深度、广度、协调推动其他部门的能力、方法
  3. 分布式系统设计,高并发等考虑因素
  4. 工作经历,工作中遇到的最难的问题,如何排查、解决、协调、推动、获取同事们的反馈

第三轮技术面考察

  1. 软素质,沟通协调能力,人品
  2. 项目把控能力,团队成员结构选择,进度把控,风险分析
  3. 学习能力,主动学习的热情,拿到结果的学习才叫学习
  4. 职业规划,职业性(是否靠谱),自驱力,责任心,主动拿结果的想法

推荐资料

最后再给大家推荐一些某些领域深度和可靠性比较高的书,也欢迎大家给我推荐比这几本更可靠、更有深度的书,谢谢大家。

  • JAVA基础:《Effective Java》《JAVA编程思想》《数据结构与算法分析java版》
  • JAVA并发基础:《JAVA并发编程实践》
  • Spring :我还是建议看看源码,aop和ioc两条腿开始看
  • Mysql :《MySQL必知必会》《高性能MySQL(第3版)》
  • Redis :《Redis的设计与实现》
  • Apache Kakfa实战》《深入理解Kafka》
  • 分布式原理及Zookeeper:《从Paxos到Zookeeper》
  • JVM : 《深入理解JVM虚拟机》
  • 设计模式 :《大话设计模式》
  • 领域驱动设计 :《实现领域驱动设计》