起因:
因为我是一个不管做什么事情都喜欢进行总结的一个人。所以对于在上周去淘宝面试的经历,现在面试回来总结,我想对所有程序员们谈谈。
之前我是在一家外企工作的,待遇还算不错,自己也做了快五年了,因为考虑到家庭的原因,所以在前面几周辞职回了杭州。在朋友听到我辞职回来后,好多关系比较好的同事朋友也向我推荐了好多家企业。如:蚂蚁金服;支付宝;蘑菇街;阿里云;淘宝;挖财等~~~~这几家公司我都去面试了,情况还算不错,基本都能聊的来,不出什么意外情况,应该都能过。面了这么多家大厂,那么我先来总结一下我在面试淘宝时的经历。
面试经历
今天自我感觉良好的去该公司面试,接待我的是一位漂亮的小姐姐,把我带到会议室,然后来了一个没有我帅的·`哈哈哈“自恋不花钱,要保持住心态”
面试官一进来,我一看,窃喜,没有我帅,接下来的开场非常直接,直接进入正题:(我一般只总结重要内容,其他的我就带过,你们自己想象)
淘宝一面:
1.简单介绍你目前的工作情况
2.在这些工作项目当中有没有哪些项目是你主导或者比较了解的,详细说明一下情况,包括技术的设计
3.由项目中所使用的框架,介绍一下对公司内部框架的具体实现(我这里主要是亚信的CSF和AICACHE)
4.csf是怎么实现的?
5.csf是亚信内部的分布式通信框架,通过zk去管理服务注册和发现,那么,如果当zk集群压力过大,是如何动态扩容和管理的?比如像阿里这样体系的公司, 对于服务注册和发现,可以如何设计,去承载搞负载,高并发的,也就是主机集群并没有宕机,但是负载很高,如何做扩展和优化?
6.当前是一个服务提供者,我发布了服务之后向zk注册,此时,服务调用方来调用服务,会首先询问zk我要调用的服务有哪些提供者,这些服务信息是缓存在 服务调用者这一方,还是每次调用时都问zk要呢?
7.如果服务调用时,突然提供服务的主机不可用了,比如因为网络抖动调用不通,此时又是一个什么样的流程呢?
8.假如此时服务不可用的主机短时间内又恢复了服务提供能力,又是一个怎样的流程?
9.csf服务本身有路由规则的设计吗?双机房,相互容灾,甚至是异地多机房相互容灾,调同机柜,同机房,同城,这些调用顺序是如何设计的?csf服务是如何 做优先选择的?或者说,服务有没有进行过一些分组,类似场景,比如根据用户id分组,50%用户使用A服务提供者,另外50%使用B服务提供者,这样的场景是如何实现的,有没有这样的一种策略在里面呢?如果有的话,又是如何实现的?
10.服务注册与发现之后,是对象的序列化,对序列化这块,在Java里了解有哪些具体的序列化方式呢?彼此之间的优劣是什么样的?在CSF里又是怎么做序列化的呢?
11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点,你能说说是什么吗?
12.假如让你来设计csf框架,恰好你负责序列化这一块,你会怎么来设计高可用,或者选择哪些数据来进行压缩,哪些数据又是不能压缩的,压缩之后肯定会 带来一些负面效果,这些负面有哪些,有具体了解过吗? 比如说,原生的bmp图片,我可以压缩成jpg图片,那我们知道,jgp图片其实是有损压缩,虽然在 肉眼上其实分辨不出来,那这种压缩它是如何做的呢?那还有一些是无损压缩。你觉得protobuf是有损压缩还是无损压缩呢?异构系统之间又是采取什么样 的序列化方式呢,能采用java原生的序列化机制来实现序列化传输吗?
13.序列化传输之后,就是底层网络传输了,那nio包也出来很久了,能说明一下nio主要是做了什么,为什么要设计nio?以及nio里面主要的类和接口吗?这些类和接口分别是设么作用能详细描述一下吗?nio是基于事件驱动机制来设计的,那nio里哪个类负责nio的事件驱动呢?
14.能说一下nio和aio的区别吗?有了解过aio吗?aio有哪些主要的类和接口,主要作用是什么,能说明一下吗?
15.对java8,java9,甚至java10有哪些重大版本的更新,有了解吗?(面试官更想问的是java9和java10),java8有哪些至少是包级别的重大的功能更新,有了解过吗?(我回答了了解ConcurrentHashMap put元素导致同一个hash桶元素多于8个时,会将链表转化为红黑树)
16.能具体说一下红黑树吗?红黑树的具体实现?红黑树具体是如何提高性能的?红黑树如何做到动态调整的?
17.对于列表的流式处理(流处理)和Lamda表达式有接触过吗?
18.对于Garbage First(G1)垃圾回收器有了解过吗?
19.对于其他垃圾回收器有了解过吗?
20.jvm应用启动参数优化,有了解吗?你们这边项目当中有这样操作过吗?比如说,当你发布应用上去,通过监控发现young GC和old gc数据比较异常,有没 有试图调整年轻代和老年代之间的空间比例,以及调整垃圾回收器,以达到性能调优的目的?
21.对类加载器有了解吗?什么样的情况下需要打破双亲委派模型?打破的方式是什么样子的?你能描述一下吗?举个场景,你现在有一个web应用程序,这个war包里有a模块和b模块,a模块依赖一个jar包的1.0版本,b模块依赖这个jar包的2.0版本,这个jar包的1.0版本和2.0版本互不兼容,因为a,b模块又在一个war包里面,那就意味着这个jar包的1.0和2.0全部在这个应用程序内部,tomcat启动的时候对jar包里的同一个类只会加载一次,那么现在情况是,要么a模块起不来不能用了,要么b模块起不来不能用了,如果你是这个应用的owner,你怎么办?模块代码本身很难改,或者说比较复杂,a模块无法升级jar包,b模块无法降级jar包。
22.听说过osji吗?你知道osgi主要功能是什么吗?它大概的一个实现原理又是什么样子?
23.前面都是我在问,你在回答,比较被动,你可以说说你对那些技术或者开源框架有比较深入的了解吗?
24.选举算法,能具体描述一下吗?怎么避免死循环的选举方式呢?比如说,有三台主机1,2,3,1主机选举自己并向23发送选举消息,2和3不同意,然后2主机选 举自己然后也向1和3主机发送选举消息,1和3主机也不同意,3主机也如法炮制,这个怎么避免呢?要么全部选自己,要么全部选别人,大家都是一条,怎 么办呢?
25.能描述一下paxos算法的具体实现方式吗?这个算法里有哪些角色?
26.能描述一下raft算法,它里面哪些角色和它整个选举过程是怎么样的吗?具体是如何选举的?比如还是有1,2,3三台主机,1,2,3都分别发出选举信息,要求 选举自己,过程僵住了怎么办?paxos和raft是不一样的处理,那raft是怎么处理的?
27.redis是如何解决热点问题的呢?dedis集群是怎么实现的呢,能跟我描述一下吗?每台redis从机上都是完整的数据吗,如果这样,数据是不是太过冗余了? 那如果是这样,应用在访问缓存的时候,是随机挑选一台redis机器吗?那怎么保证不会随机挑选到同一台机器上去呢?redis数据切片这个概念有了解吗?
28.~~~等(问了好多,后面写不完了)。
看到这里,你们能回答得出来多少,有多少是你们不能回答得上的?是不是心里此刻已经mmp了。不过你们不用担心,我此时我也懵了,心里想骂娘。不过心态不能慌呀~~~~
(心里想着,稳住,他没我帅~~~~哈哈哈)
面试总结
不知道你们看完了发现没,就一个淘宝,就要懂很多知识点,那如果阿里巴巴,支付宝,等一线大厂呢?是不是感觉自己还要学习的还有很多~
经过这次面试,我总结一下几点:
1、基本语法
这包括static、final、transient等关键字的作用,foreach循环的原理等等。今天面试我问你static关键字有哪些作用,如果你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热衷研究技术。
2、集合
非常重要,也是必问的内容。基本上就是List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一句,ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于ConcurrentHashMap,我给网友朋友们提供三点回答或者是研究方向:
(1)ConcurrentHashMap的锁分段技术
(2)ConcurrentHashMap的读是否要加锁,为什么
(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器
3、设计模式
设计模式在工作中还是非常重要、非常有用的,23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:
(1)你的项目中用到了哪些设计模式,如何使用
(2)知道常用设计模式的优缺点
(3)能画出常用设计模式的UML图
4、多线程
这也是必问的一块了。会问得深入一些比如说Thread和Runnable的区别和联系、多次start一个线程会怎么样、线程有哪些状态。当然这只是最基本的,出乎意料地,几次面试几乎都被同时问到了一个问题,问法不尽相同,总结起来是这么一个意思:假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可以使用。
另外,线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。最后,虽然这次面试问得不多,但是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等
5、IO
IO分为File IO和Socket IO,File IO基本上是不会问的,问也问不出什么来,平时会用就好了,另外记得File IO都是阻塞IO。Socket IO是比较重要的一块,要搞懂的是阻塞/非阻塞的区别、同步/异步的区别,借此理解阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型,Socket IO如何和这四种模型相关联。这是基本一些的,深入一些的话,就会问NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等,这有些难,当时我也是研究了很久才搞懂NIO。提一句,NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO,面试回答的时候要注意这个细节,讲到NIO会阻塞在Selector的select方法上会增加面试官对你的好感。如果用过Netty,可能会问一些Netty的东西,毕竟这个框架基本属于当前最好的NIO框架了(Mina其实也不错,不过总体来说还是比不上Netty的),大多数互联网公司也都在用Netty。
6、JDK源码
要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。
JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:
(1)List、Map、Set实现类的源代码
(2)ReentrantLock、AQS的源代码
(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的
(4)线程池的实现原理
(5)Object类中的方法以及每个方法的作用
7、框架
老生常谈,面试必问的东西。一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做,比如我想要在Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习框架的使用细节自然都不成问题。
如果上面你的问题答得好,面试官往往会深入地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事儿,即使你不会准备一下就好了。
8、数据库
数据库十有八九也都会问到。一些基本的像union和union all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门把SQL基础和SQL优化的内容准备一下。
不过数据库倒是不用担心,一家公司往往有很多部门,如果你对数据库不熟悉而基本技术又非常好,九成都是会要你的,估计会先把你放到对数据库使用不是要求非常高的部门锻炼一下。
9、数据结构和算法分析
数据结构和算法分析,对于一名程序员来说,会比不会好而且在工作中绝对能派上用场。数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树AVL树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。
10、Java虚拟机
Java虚拟机应该是很重要的一块内容,谈谈Java虚拟机中比较重要的内容
ava虚拟机的内存布局
GC算法及几种垃圾收集器
类加载机制,也就是双亲委派模型
Java内存模型
happens-before规则
volatile关键字使用规则
也许这些内容面试无用,但在走向大牛的路上,不可不会。
11、Web方面的一些问题
Java主要面向Web端,因此Web的一些问题也是必问的。
谈谈分布式Session的几种实现方式?(常用的四种能答出来自然是让面试官非常满意的)
讲一下Session和Cookie的区别和联系以及Session的实现原理
这两个问题之外,web.xml里面的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面比如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。
最后,如果有兴趣有时间,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备,救命良方、包治百病、屡试不爽。
关于HR面试
如果你过五关斩六将,成功地通过了所有的技术面,那么恭喜你,你离升职加薪、出任CEO、迎娶白富美、走向人生巅峰又进了一步。但是还没有到谈薪资待遇的时候,最后还有一个考验:HR面试。基本所有的大公司都有这一轮的面试,不要小看HR面试,很多公司的HR对于面试者都有一票否决权的----即使前面的面试对你的评价再高。
所以,这轮的面试也必须重视起来,HR面试主要问的是几点:
简历中写的过去工作经历的离职原因
当前公司薪资待遇
期望能到怎样的一家公司
个人未来的发展方向
如果大家想学习以下路线内容,在此我向大家推荐一个架构学习交流群。交流学习群号:521353348 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
强力推荐大家学习的进阶路线
一、源码分析
二、分布式架构
三、微服务
四、性能优化
五、Java工程化
总结:
好了,我的总结就到这里了,如果你们也想面试BAT,建议你们把基础学好,偷偷的告诉你们,他们都是很喜欢问基础知识的哦......现在想着那个面试官,真心感觉他没我帅~~~~哈哈哈哈。
大家可以关注我的公众号:《Java烂猪皮》,平常我也会发写技术文章,比如:架构,分布式,微服务spring,jvm,MySQL等知识点。面试经验也会分享给大家。在此谢谢大家的关注支持~~~~
注:大家转载请注明原文出处,原文连接: https://segmentfault.com/a/1190000015433230