GitHub 爆火!银四巨作:拼多多 / 蚂蚁 / 百度面经分享
⽂章有点⻓,请耐⼼看完,绝对有收获!不想听我 BB 直接进⼊⾯试分享:
准备过程
拼多多⾯试分享
蚂蚁⾦服⾯试分享
字节跳动⾯试分享
总结
资料分享
准备过程
我 2016 先在蚂蚁实习了将近三个⽉,然后去了我现在的⽼东家,2.5 年⼯作经验,可以说毕业后就⼀直⽼⽼实实在⽼东家打怪升级,虽说有蚂蚁的实习经历,但是因为时间太短,还是有点虚的。
准备过程其实很早开始了,而且⼯作之余常常会去额外研究⾃⼰感兴趣的技术以及⼯作⽤到的技术,⼒求把原理搞明⽩,并且会⾃⼰实践⼀把。什么操作系统、数据结构与算法、MySQL、JDK 之类的源码,基本都好好温习了,我深知基础就像“⽊桶效应”的短板,决定了能装多少⽔。
剩下的准备就是找平台和内推了,除了蚂蚁,头条和拼多多都是找⼈内推的,感谢蚂蚁⾯试官对我的欣赏,以后说不定会去蚂蚁咯
平台:脉脉、GitHub、v2
拼多多面试
一⾯
Java 中的 HashMap、TreeMap 解释下?(TreeMap 红⿊树,有序,HashMap⽆序,数组+链表)
TreeMap 查询写⼊的时间复杂度多少?
HashMap 多线程有什么问题?
CAS 和 synchronize 有什么区别?
如果要保证线程安全怎么办?(ConcurrentHashMap)
ConcurrentHashMap 怎么实现线程安全的?(分段锁)
get 需要加锁么,为什么?(不⽤,volatile 关键字)
volatile 的作⽤是什么?(保证内存可⻅性)
底层怎么实现的?(说了主内存和⼯作内存,读写内存屏障,happen-before,并在纸上画了线程交互图)
在多核 CPU 下,可⻅性怎么保证?(思考了⼀会,总线嗅探技术)
聊项⽬,系统之间是怎么交互的?
系统并发多少,怎么优化?
给我⼀张纸,画了⼀个九⽅格,都填了数字,给⼀个 MN 矩阵,从 1 开始逆时针打印这 MN 个数,要求时间复杂度尽可能低(内⼼OS:之前貌似碰到过这题,最优解是怎么实现来着)思考中。。。
可以先说下你的思路(想起来了,说了什么时候要变换⽅向的条件,向右、向下、向左、向上,依此循环)
有什么想问我的?
二面
⾃我介绍下
⼿上还有其他 offer 么?(拿了蚂蚁的 offer)
部⻔组织结构是怎样的?(这轮不是技术⾯么,不过还是⽼⽼实实说了)
系统有哪些模块,每个模块⽤了哪些技术,数据怎么流转的?
链路追踪的信息是怎么传递的?
SpanId 怎么保证唯⼀性?(UUID,说了下内部的定制改动)
RpcContext 是在什么维度传递的?(线程)
Dubbo 的远程调⽤怎么实现的?(讲了读取配置、拼装 url、创建 Invoker、服务导出、服务注册以及消费者通过动态代理、filter、获取 Invoker 列表、负载均衡等过程
Spring 的单例是怎么实现的?(单例注册表)
为什么要单独实现⼀个服务治理框架?(说了下内部刚搞微服务不久,主要对服务进⾏⼀些监控和性能优化)
谁主导的?内部还在使⽤么?
逆向有想过怎么做成通⽤么?
有什么想问的么?
三⾯
⼆⾯⽼⼤⾯完后就直接 HR⾯了,主要问了些职业发展、是否有其他 offer、以及⼊职意向等问题,顺便说了下公司的福利待遇等,都⽐常规啦。不过要说的是⼿上有其他 offer 或者⼤⼚经历会有⼀定加分。
⼩结
拼多多的⾯试流程就简单许多,毕竟是⼀个成⽴三年多的公司。⾯试难度中规中矩,只要基础扎实应该不是问题。但不得不说⼯作强度很⼤,开始⾯试前 HR 就提前和我确认能否接受这样强度的⼯作,想来的⽼铁还是要做好准备。
蚂蚁⾦服面试
⼀⾯
⼀⾯就做了⼀道算法题,要求两⼩时内完成,给了⻓度为 N 的有重复元素的数组,要求输出第 10⼤的数。典型的 TopK 问题,快排算法搞定。
⼆⾯
⾃我介绍下呗
开源项⽬贡献过代码么?(Dubbo 提过⼀个打印 accesslog 的 bug 算么)
⽬前在部⻔做什么,业务简单介绍下,内部有哪些系统,作⽤和交互过程说下 Dubbo 踩过哪些坑,分别是怎么解决的?
开始进⼊正题,说下你对线程安全的理解
事务有哪些特性?(ACID)
怎么理解原⼦性?
乐观锁和悲观锁的区别?
HashMap 为什么不是线程安全的?
jdk1.8 对 ConcurrentHashMap 做了哪些优化?
redis 主从机制了解么?怎么实现的?
有过 GC 调优的经历么?(有点虚,答得不是很好)
有什么想问的么?
三⾯
简单⾃我介绍下
监控系统怎么做的,分为哪些模块,模块之间怎么交互的?⽤的什么数据库?(MySQL)
使⽤什么存储引擎,为什么使⽤InnnoDB?(⽀持事务、聚簇索引、MVCC)
订单表有做拆分么,怎么拆的?(垂直拆分和⽔平拆分)
⽔平拆分后查询过程描述下
如果落到某个分⽚的数据很⼤怎么办?
哈希取模会有什么问题么?
分库分表后怎么解决读写压⼒?(⼀主多从、多主多从)
拆分后主键怎么保证惟⼀?(UUID、Snowflake 算法)
Snowflake⽣成的 ID 是全局递增唯⼀么?
怎么实现全局递增的唯⼀ID?
Mysql 的索引结构说下
主键索引和普通索引的区别(主键索引的叶⼦结点存放了整⾏记录,普通索引的叶⼦结点存
放了主键 ID,查询的时候需要做⼀次回表查询)⼀定要回表查询么?(不⼀定,当查询的字段
刚好是索引的字段或者索引的⼀部分,就可以不⽤回表,这也是索引覆盖的原理)
你们系统⽬前的瓶颈在哪⾥?
你打算怎么优化?简要说下你的优化思路
有什么想问我么?
四面
介绍下⾃⼰
为什么要做逆向?
怎么理解微服务?
服务治理怎么实现的?
这个不是中间件做的事么,为什么你们部⻔做?
说说 Spring 的⽣命周期吧
说说 GC 的过程
CMS GC 有什么问题?(并发清除算法,浮动垃圾,短暂停顿)
怎么避免产⽣浮动垃圾?
强制 young gc 会有什么问题?
知道 G1 么?(了解⼀点 )
回收过程是怎么样的?
你提到的 Remember Set 底层是怎么实现的?
有什么想问的么?
五⾯
五面是 HRBP⾯的,和我提前预约了时间,主要聊了之前在蚂蚁的实习经历、部⻔在做的事情、职业发展、福利待遇等。
之前蚂蚁实习三个⽉怎么不留下来?
实习的时候主管是谁?
实习做了哪些事情?
你对技术怎么看?平时使什么技术栈?
你对 SRE 怎么看
对待遇有什么预期么
字节跳动(百度)面试
⼀⾯
先⾃我介绍下
聊项⽬,逆向系统是什么意思
聊项⽬,逆向系统⽤了哪些技术
线程池的线程数怎么确定?
如果是 IO 操作为主怎么确定?
如果计算型操作⼜怎么确定?
Redis 熟悉么,了解哪些数据结构?
红⿊树了解么,时间复杂度?(说了是 N 叉平衡树,O(logN))
既然两个数据结构时间复杂度都是 O(logN),zset 为什么不⽤红⿊树(跳表实现简单,踩坑成本低,红⿊树每次插⼊都要通过旋转以维持平衡,实现复杂)
CAS 了解么?(说了 CAS 的实现)还了解其他同步机制么?
那我们做⼀道题吧,数组 A,2*n 个元素,n 个奇数、n 个偶数,设计⼀个算法,使得数组奇数
下标位置放置的都是奇数,偶数下标位置放置的都是偶数
时间差不多了,先到这吧。你有什么想问我的?
⼆⾯
⾯试官和蔼很多,你先介绍下⾃⼰吧
你对服务治理怎么理解的?
项⽬中的限流怎么实现的?(Guava ratelimiter,令牌桶算法)
具体怎么实现的?(要点是固定速率且令牌数有限)
如果突然很多线程同时请求令牌,有什么问题?(导致很多请求积压,线程阻塞)
如果不⽤消息队列怎么解决?(说了 RateLimiter 预消费的策略)
分布式追踪的上下⽂是怎么存储和传递的?
Dubbo 的 RpcContext 是怎么传递的?
你说的内存泄漏具体是怎么产⽣的?
线程池的线程是不是必须⼿动 remove 才可以回收 value?
可是主线程不是都退出了,引⽤的对象不应该会主动回收么?
那你说下 SpringMVC 不同⽤户登录的信息怎么保证线程安全的?
这个直接⽤ThreadLocal 不就可以么,你⻅过 SpringMVC 有锁实现的代码么?
我们聊聊 mysql 吧,说下索引结构(说了 B+树)
为什么使⽤B+树?
什么是索引覆盖?
Java 为什么要设计双亲委派模型?
什么时候需要⾃定义类加载器?
我们做⼀道题吧,⼿写⼀个对象池?
有什么想问我的么?(感觉我很多点都没答好,是不是挂了(结果真的是)
⼩结
头条的⾯试确实很专业,每次⾯试官会提前给你发⼀个视频链接,然后准点开始⾯试,⽽且考察的点都比较全
总结
从年前开始⾯试到头条⾯完⼤概⼀个多⽉的时间,真的有点身⼼俱疲的感觉。最后拿到了拼多多、蚂蚁的 offer,还是蛮幸运的。头条的⾯试对我帮助很⼤,再次感谢⾯试官对我的诚恳建议,以及拼多多的 HR 对我的啰嗦的问题详细解答。
专业技能如何掌握?
计算机网络、数据结构、算法、操作系统等课内基础知识:掌握.
Java 基础知识:掌握
JVM 虚拟机(Java 内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM 内存管理)∶掌握
高并发、高可用、高性能系统开发︰掌握
Struts2、Spring、Hibernate、Ajax、Mybatis、JQuery :掌握.
SSH 整合、SSM 整合、SOA 架构:掌握
Dubbo:掌握
Zookeeper:掌握
常见消息队列:掌握.
Linux:掌握
MySQL 常见的优化手段:掌握
Spring Boot +Spring Cloud +Docker:了解
Hadoop 生态相关技术中的 HDFS、Storm、MapReduce、Hive、Hbase :了解. Python 基础、一些常见第三方库比如 OpenCV、wxpy、wordcloud、matplotlib:熟悉
如果还不清楚自己如何准备面试,我自己用 xmind 手绘了一份:Java 面试梳理,这样更加直观形象⼀点,细化到某个知识点,要把每⼀个知识点都搞得很熟悉,还要分清主次。
资料分享
面试突击手册
这份面试突击手册涵盖了备战面试,Java 基础+集合+多线程+JVM,计算机,数据库,常用框架,系统设计常用面试题,整体分为当季最新系列、大厂面试真题系列、技术系统分类系列三部分。(纯文字文本占内存 46.97MB)
备战面试
1.1 校招/社招求职指南
1.2 程序员简历就该这样写
1.3 大部分程序员在面试前很关心的一些问题
1.4 如何学习?学会各种框架有必要吗?
Java 基础+集合+多线程+JVM
Java 基础
Java 集合
多线程
JVM
三、计算机基础
四、数据库面试题总结
sbs
六、系统设计
算法这一块,可以刷看这本《leetcode 刷题笔记》,此 pdf 书籍:主要关注经典的算法,但同时会为读者理解基本算法问题和解决问题打下很好的基础。分别介绍了字符串,栈和队列,树,排序,查找,暴力枚举法,广度优先搜索,动态规划,图等内容。且每一章结束的时候均有练习题和参考资料,这为读者的自我检查以及进一步学习提供了较多的便利。
大厂面试:
转发此文关注我后添加小助理 vx:mxzFAFAFA 即可获取大厂面试资料以及文章中更多面试资料
Java 核心知识笔记整理:
点到为止,今天的分享就到这里结束,篇幅已太长,而要分享的东西也实在是太多了,小编就不在一一列举了,各位小伙伴们,如需下载我在本文所涉及的全部的 Java 面试突击手册+学习资源等,皆可 100%发送给你!
请注意获取方式:添加小助理 vx:mxzFAFAFA 即可获取大厂面试资料以及文章中更多面试资料
版权声明: 本文为 InfoQ 作者【比伯】的原创文章。
原文链接:【http://xie.infoq.cn/article/375e849294e4ab7f788a9a22c】。文章转载请联系作者。
评论