写在年后的蚂蚁、头条、拼多多的面试总结
文章有点长,请耐心看完,绝对有收获!不想听我BB直接进入面试分享:
准备过程
蚂蚁金服面试分享
拼多多面试分享
字节跳动面试分享
总结
说起来开始进行面试是年前倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间件吧),说的很详细,然后和我沟通了下是否有兴趣,我表示有兴趣,后面就收到正式面试的通知,最后没选择去蚂蚁表示抱歉。
当时我自己也准备出去看看机会,顺便看看自己的实力。当时我其实挺纠结的,一方面现在部门也正需要我,还是可以有一番作为的,另一方面觉得近一年来进步缓慢,没有以前飞速进步的成就感了,而且业务和技术偏于稳定,加上自己也属于那种比较懒散的人,骨子里还是希望能够突破现状,持续在技术上有所精进。
在开始正式的总结之前,还是希望各位同仁能否听我继续发泄一会,抱拳!
我翻开自己年初立的flag,觉得甚是惭愧。其中就有一条是保持一周写一篇博客,奈何中间因为各种原因没能坚持下去。细细想来,主要是自己没能真正静下来心认真投入到技术的研究和学习,那么为什么会这样?说白了还是因为没有确定目标或者目标不明确,没有目标或者目标不明确都可能导致行动的失败。
那么问题来了,目标是啥?就我而言,短期目标是深入研究某一项技术,比如最近在研究mysql,那么深入研究一定要动手实践并且有所产出,这就够了么?还需要我们能够举一反三,结合实际开发场景想一想日常开发要注意什么,这中间有没有什么坑?可以看出,要进步真的不是一件简单的事,这种反人类的行为需要我们克服自我的弱点,逐渐形成习惯。真正牛逼的人,从不觉得认真学习是一件多么难的事,因为这已经形成了他的习惯,就喝早上起床刷牙洗脸那么自然简单。
扯了那么多,开始进入正题,先后进行了蚂蚁、拼多多和字节跳动的面试。
准备过程
先说说我自己的情况,我先在蚂蚁实习了将近三个月,然后去了我现在的老东家,2.5年工作经验,可以说毕业后就一直老老实实在老东家打怪升级,虽说有蚂蚁的实习经历,但是因为时间太短,还是有点虚的。所以面试官看到我简历第一个问题绝对是这样的。
“哇,你在蚂蚁待过,不错啊”,面试官笑嘻嘻地问到。“是的,还好”,我说。“为啥才三个月?”,面试官脸色一沉问到。“哗啦啦解释一通。。。”,我解释道。“哦,原来如此,那我们开始面试吧”,面试官一本正经说到。
尼玛,早知道不写蚂蚁的实习经历了,后面仔细一想,当初写上蚂蚁不就给简历加点料嘛。
言归正传,准备过程其实很早开始了(当然这不是说我工作时老想着跳槽,因为我明白现在的老东家并不是终点,我还需要不断提升),具体可追溯到从蚂蚁离职的时候,当时出来也面了很多公司,没啥大公司,面了大概5家公司,都拿到offer了。
工作之余常常会去额外研究自己感兴趣的技术以及工作用到的技术,力求把原理搞明白,并且会自己实践一把。此外,买了N多书,基本有时间就会去看,补补基础,什么操作系统、数据结构与算法、mysql、jdk之类的源码,基本都好好温习了(文末会列一下自己看过的书和一些好的资料)。我深知基础就像“木桶效应”的短板,决定了能装多少水。
此外,在正式决定看机会之前,我给自己列了一个提纲,主要包括Java要掌握的核心要点,有不懂的就查资料搞懂。我给自己定位还是Java工程师,所以Java体系是一定要做到心中有数的,很多东西没有常年的积累面试的时候很容易露馅,学习要对得起自己,不要骗人。
剩下的就是找平台和内推了,除了蚂蚁,头条和拼多多都是找人内推的,感谢蚂蚁面试官对我的欣赏,以后说不定会去蚂蚁咯??。
平台:脉脉、GitHub、v2
蚂蚁金服
一面
二面
三面
四面
五面
小结
一面
一面就做了一道算法题,要求两小时内完成,给了长度为N的有重复元素的数组,要求输出第10大的数。典型的TopK问题,快排算法搞定。
算法题要注意的是合法性校验、边界条件以及异常的处理。另外,如果要写测试用例,一定要保证测试覆盖场景尽可能全。加上平时刷刷算法题,这种考核应该没问题的。
二面
自我介绍下呗
开源项目贡献过代码么?
Dubbo提过一个打印accesslog的bug算么
目前在部门做什么,业务简单介绍下
内部有哪些系统,作用和交互过程说下
Dubbo踩过哪些坑,分别是怎么解决的?
说了异常处理时业务异常捕获的问题,自定义了一个异常拦截器
开始进入正题,说下你对线程安全的理解
多线程访问同一个对象,如果不需要考虑额外的同步,调用对象的行为就可以获得正确的结果就是线程安全
事务有哪些特性?
ACID
怎么理解原子性?
同一个事务下,多个操作要么成功要么失败,不存在部分成功或者部分失败的情况
乐观锁和悲观锁的区别?
悲观锁假定会发生冲突,访问的时候都要先获得锁,保证同一个时刻只有线程获得锁,读读也会阻塞;乐观锁假设不会发生冲突,只有在提交操作的时候检查是否有冲突
这两种锁在Java和MySQL分别是怎么实现的?
Java乐观锁通过CAS实现,悲观锁通过synchronize实现
mysql乐观锁通过MVCC,也就是版本实现,悲观锁可以通过select...forupdate加上排它锁
HashMap为什么不是线程安全的?
多线程操作无并发控制,顺便说了在扩容的时候多线程访问时会造成死锁,会形成一个环
怎么让HashMap变得线程安全?
Collections的synchronize方法包装一个线程安全的Map,或者直接用ConcurrentHashMap
两者的区别是什么?
前者直接在put和get方法加了synchronize同步,后者采用了分段锁以及CAS支持更高的并发
jdk1.8对ConcurrentHashMap做了哪些优化?
插入的时候如果数组元素使用了红黑树,取消了分段锁设计,synchronize替代了Lock锁
为什么这样优化?
避免冲突严重时链表多长,提高查询效率,时间复杂度从O(N)提高到O(logN)
redis主从机制了解么?怎么实现的?
有过GC调优的经历么?
有点虚,答得不是很好
有什么想问的么?
三面
简单自我介绍下
监控系统怎么做的,分为哪些模块,模块之间怎么交互的?
用的什么数据库?
mysql
使用什么存储引擎,为什么使用InnnoDB?
支持事务、聚簇索引、MVCC
订单表有做拆分么,怎么拆的?
垂直拆分和水平拆分
水平拆分后查询过程描述下
如果落到某个分片的数据很大怎么办?
按照某种规则,比如哈希取模、range,将单张表拆分为多张表
哈希取模会有什么问题么?
有的,数据分布不均,扩容缩容相对复杂
分库分表后怎么解决读写压力?
一主多从、多主多从
拆分后主键怎么保证惟一?
UUID、Snowflake算法
Snowflake生成的ID是全局递增唯一么?
不是,只是全局唯一,单机递增
怎么实现全局递增的唯一ID?
讲了TDDL的一次取一批ID,然后再本地慢慢分配的做法
Mysql的索引结构说下
说了B+树,B+树可以对叶子结点顺序查找,因为叶子结点存放了数据结点且有序
主键索引和普通索引的区别
主键索引的叶子结点存放了整行记录,普通索引的叶子结点存放了主键ID,查询的时候需要做一次回表查询
一定要回表查询么?
不一定,当查询的字段刚好是索引的字段或者索引的一部分,就可以不用回表,这也是索引覆盖的原理
你们系统目前的瓶颈在哪里?
你打算怎么优化?简要说下你的优化思路
有什么想问我么?
四面
介绍下自己
为什么要做逆向?
怎么理解微服务?
服务治理怎么实现的?
说了限流、压测、监控等模块的实现
这个不是中间件做的事么,为什么你们部门做?
当时没有单独的中间件团队,微服务刚搞不久,需要进行监控和性能优化
说说Spring的生命周期吧
说说GC的过程
说了younggc和fullgc的触发条件和回收过程以及对象创建的过程
CMSGC有什么问题?
并发清除算法,浮动垃圾,短暂停顿
怎么避免产生浮动垃圾?
记得有个VM参数设置可以让扫描新生代之前进行一次younggc,但是因为gc是虚拟机自动调度的,所以不保证一定执行。但是还有参数可以让虚拟机强制执行一次younggc
强制younggc会有什么问题?
STW停顿时间变长
知道G1么?
了解一点
回收过程是怎么样的?
younggc、并发阶段、混合阶段、fullgc,说了RememberSet
你提到的RememberSet底层是怎么实现的?
有什么想问的么?
五面
五面是HRBP面的,和我提前预约了时间,主要聊了之前在蚂蚁的实习经历、部门在做的事情、职业发展、福利待遇等。阿里面试官确实是具有一票否决权的,很看重你的价值观是否match,一般都比较喜欢皮实的候选人。HR面一定要诚实,不要说谎,只要你说谎HR都会去证实,直接cut了。
之前蚂蚁实习三个月怎么不留下来?
实习的时候主管是谁?
实习做了哪些事情?(尼玛这种也问?)
你对技术怎么看?平时使用什么技术栈?(阿里HR真的是既当爹又当妈,??)
最近有在研究什么东西么
你对SRE怎么看
对待遇有什么预期么
最后HR还对我说目前稳定性保障部挺缺人的,希望我尽快回复。
小结
蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
拼多多
面试前
一面
二面
三面
小结
面试前
面完蚂蚁后,早就听闻拼多多这个独角兽,决定也去面一把。首先我在脉脉找了一个拼多多的HR,加了