记录一下提前批暑期实习的面经吧
0. 介绍
渣硕,不会算法,只能做做开发,八股文也背不来,下面面试顺序不是时间顺序(记下流水账)。
项目比较杂,有分布式,有大数据,有图计算,也有简单CRUD业务。
仅有小厂实习经历。
总结下来的经验就是:
- 算法题要多刷,medium为主,hard随缘(别看阿里笔试超难,面试还是easy、medium为主)
- 开发一定要有一个对应语言的项目,不管烂大街的还是高大上的,一定要:
- 思考“为什么选这个技术/架构/第三方库/实现...”
- 一定要做足测试(单元、集成、压力),尤其要对程序profiling,不要冒烟一下就完事了
- 八股文背不出很正常,我也背不出,不过基本的CS基础课(DS、DB、OS、Network)概念还是得说个大概,到时候出问题Google啥都不知道
- 优秀的源码可以看看(可以挑简单的,如Netty, Redis等,我没看过Spring,因为我挺不喜欢这个框架)
- 优秀的论文可以看看(开发可以看SOSP/OSDI/VLDB/FAST/SIGMOD/ICDE等,算法可参考自己领域的)
1. 阿里云某部门A(挂)
一面
差不多这些吧,记不清了,两个面试官锤烂我了,大概60-70分钟
- 项目一堆,主要是不断challenging一些测试和不同场景的性能数据,怎么profile的,profile结果是啥之类的
- JMM模型
- volatile原理
- GC说明,包括CMS与G1的原理与区别
- 数据库索引,B+树与散列索引
- MySQL的隔离级别
SELECT ... FOR UPDATE
如何实现避免幻读- select, poll, epoll
- 通信可靠相关,扯一些TCP的
- 操作系统,抛了一个很开放的问题,什么都能说,我扯了个生产的问题(swap分区相关的),扯了分页、一些内核参数、透明大页之类的
- Redis为什么慢(扯了I/O瓶颈+零拷贝+Thread Local,但我也没profile过,只阅读过源码)
代码:最长公共子串(动态规划)
2. 阿里云某部门B(Offer)
一面
大概40分钟,都答了,然后时间莫名其妙过去了:
- 项目相关,不多(Storm/Flink相关,为什么用ZooKeeper等)
- HashMap原理
- LRU实现原理
- NIO相关(扯了File和网络的Channel,Selector,多路复用,ByteBuffer/ByteBuf,Netty,零拷贝传输,说的很乱)
- 锁有哪些(扯了synchronized,重入锁,重入读写锁,StampedLock),是否公平
- 进程与线程
- TCP/UDP区别
- 拥塞控制算法
- HTTP请求GET与POST区别
- ACID概念
- 数据库索引,B+树和散列索引的对比
代码:手写散列表
Follow Up:rehash(简要说思路即可)
二面
大概30~40分钟:
- 项目相关(如架构设计、profile怎么做、测试怎么做等等)
- 了解的复制协议(如2PC/3PC、Paxos、Raft、NWR、多主复制、无主复制、Gossip等等,可以看下DDIA和OSDI/SOSP相关论文)
- 场景设计题:任务调度,需要分类
- 架构是什么
- 网络断了怎么办
- 节点挂了怎么办
- 任务怎么去重
- 开源项目看了哪些
- 未来的打算
- 感兴趣的方面
三面
大概30分钟
- 项目介绍相关和提问
- 开源项目看了哪些
- 论文看了哪些
- 未来的打算
四面
大概30分钟
- 项目相关
- 题目:https://leetcode-cn.com/problems/interleaving-string/ (动态规划)
3. 蚂蚁某部门A(放弃)
一面
大概70分钟
- 项目相关
- 如何使用ZooKeeper实现选主
- 为什么选择RSocket+自定义的协议
- Java GC以及项目选择理由
- Java并发处理(锁、CAS、如何规避并发的设计——如状态机)
- 数据结构:数组与链表对比、散列表解决冲突方法(分离链表(Java的)+开放地址(hppc))
- 如何profile Java程序
- 进程与线程
- 虚拟内存、物理内存、页表、换入换出、透明大页等
- 如何优化网络吞吐(程序上批量+非阻塞/异步,系统改内核参数)
- 流式计算相关(watermarks,asynchonized snapshot等)
- 了解什么开源项目(项目相关的看看,其他不懂)
- 了不了解云计算(不了解)
- 看什么论文(最近偷懒没怎么追)
- 未来的打算
二面
感觉纯聊天,该面试不典型,30分钟
- 项目相关
- 讲下为什么项目不用RocksDB、HBase、Redis等开源存储(3个原因都是不一样的)
- HBase底层存储是什么(讲了个BigTable,具体也忘了,我怎么有幻觉说了个LSM,忘了)
- 瞎扯了Oak
- 为什么Redis慢?(没profile过,瞎说的)
- Netty的I/O线程堵住了会怎么样?怎么解决?
- Java Reactor在执行阻塞I/O时该怎么操作?
- 平时怎么学习的?
- 平时看什么书和代码?
- 有什么感兴趣的方向?
- 有什么个人爱好?
4. 蚂蚁某部门B(放弃)
一面
40分钟,感觉是没有之前好,这是当天第3次面试,头晕
- 项目相关
- 一致性散列
- Java 8的新特性
- Java GC(扯CMS和G1的选择)
- 并发流(本来不知道,后来问了是不是
parallel()
算子,面试官说是的) - 常见的设计模式
- 问题:10亿个身份证号码,如何查找某个身份证号
- Spring Transaction传递(记不住,只知道那个注解最后运行是用AOP实现,然后处理嵌套事务的)
- 如果应对支付宝这样体量的负载,项目还需要改进什么
5. 微软某部门(Offer)
笔试
我笔试是一面之后做的,试了2次(都懂有一次系统崩了),第2次比较简单所以AK了。
题目就不放了,主要加强英语阅读能力,千万别读错题。
一面
英文自我介绍
题目:https://leetcode-cn.com/problems/furthest-building-you-can-reach/
二面
- 中文自我介绍
- 项目:挑一个自己比较能说的模块,讲一下设计
- 题目:2个无序链表,找第
k
大的节点- 全程英语口语
- 开放题:有个果园,种了3种树,每种树若干棵,前几年没问题,今年发现有2棵树发不了苗了,问到底出了什么问题?
6. 阿里云某部门C(放弃)
一面
很多都不会,面傻了
- 项目相关
- 如何实现背压
- 如何排查Java GC的问题,比较CMS和G1,是否了解ZGC
- jemalloc原理,比ptmalloc好在哪,了解tcmalloc吗
- 如何管理堆外内存
- 缓存淘汰算法,如何实现高性能的LRU
- ZooKeeper Leader挂了后怎么选主
- Java Reactor的处理流程是什么
- Guava的2个限流器的原理
- 如何设计一个高可用系统
- 设计一个并行流,并行流当出现偏移(bias/skew)的时候怎么处理
- 设计一个分布式的限流器,如何处理突发的流量,如何设计的高性能(考虑Lease)
- 如何设计一个系统能处理高并发的请求,延迟要求尽量低
- TCP/IP拥塞算法(建议看下BBR算法)
- Netty的线程模型
二面
简单面了下,15~20分钟
- 项目介绍
- 项目的瓶颈在哪,对比
- 如何排查进程Java CPU使用过高,如果不使用其他工具(如
arthas
) - Java线程池原理