淘宝面试回来,想对程序员们谈谈

原由:

由于我是一个无论作什么事情都喜欢进行总结的一我的。因此对于在上周去淘宝面试的经历,如今面试回来总结,我想对全部程序员们谈谈。java

以前我是在一家外企工做的,待遇还算不错,本身也作了快五年了,由于考虑到家庭的缘由,因此在前面几周辞职回了杭州。在朋友听到我辞职回来后,好多关系比较好的同事朋友也向我推荐了好多家企业。如:蚂蚁金服;支付宝;蘑菇街;阿里云;淘宝;挖财等~~~~这几家公司我都去面试了,状况还算不错,基本都能聊的来,不出什么意外状况,应该都能过。面了这么多家大厂,那么我先来总结一下我在面试淘宝时的经历。程序员

面试经历

今天自我感受良好的去该公司面试,接待个人是一位漂亮的小姐姐,把我带到会议室,而后来了一个没有我帅的·`哈哈哈“自恋不花钱,要保持住心态”
面试官一进来,我一看,窃喜,没有我帅,接下来的开场很是直接,直接进入正题:(我通常只总结重要内容,其余的我就带过,大家本身想象)web

淘宝一面:

1.简单介绍你目前的工做状况面试

2.在这些工做项目当中有没有哪些项目是你主导或者比较了解的,详细说明一下状况,包括技术的设计redis

3.由项目中所使用的框架,介绍一下对公司内部框架的具体实现(我这里主要是亚信的CSF和AICACHE)算法

4.csf是怎么实现的?spring

5.csf是亚信内部的分布式通讯框架,经过zk去管理服务注册和发现,那么,若是当zk集群压力过大,是如何动态扩容和管理的?好比像阿里这样体系的公司, 对于服务注册和发现,能够如何设计,去承载搞负载,高并发的,也就是主机集群并无宕机,可是负载很高,如何作扩展和优化?数据库

6.当前是一个服务提供者,我发布了服务以后向zk注册,此时,服务调用方来调用服务,会首先询问zk我要调用的服务有哪些提供者,这些服务信息是缓存在 服务调用者这一方,仍是每次调用时都问zk要呢?segmentfault

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了。不过大家不用担忧,我此时我也懵了,内心想骂娘。不过心态不能慌呀~~~~
(内心想着,稳住,他没我帅~~~~哈哈哈)

面试总结

不知道大家看完了发现没,就一个淘宝,就要懂不少知识点,那若是阿里巴巴,支付宝,等一线大厂呢?是否是感受本身还要学习的还有不少~

通过此次面试,我总结一下几点:

一、基本语法

这包括static、final、transient等关键字的做用,foreach循环的原理等等。今天面试我问你static关键字有哪些做用,若是你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,由于能看出你很是热衷研究技术。

二、集合

很是重要,也是必问的内容。基本上就是List、Map、Set,问的是各类实现类的底层实现原理,实现类的优缺点。集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利做答,固然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一句,ConcurrentHashMap的问题在面试中问得特别多,大概是由于这个类能够衍生出很是多的问题,关于ConcurrentHashMap,我给网友朋友们提供三点回答或者是研究方向:

(1)ConcurrentHashMap的锁分段技术
(2)ConcurrentHashMap的读是否要加锁,为何
(3)ConcurrentHashMap的迭代器是强一致性的迭代器仍是弱一致性的迭代器

三、设计模式

设计模式在工做中仍是很是重要、很是有用的,23种设计模式中重点研究经常使用的十来种就能够了,面试中关于设计模式的问答主要是三个方向:

(1)你的项目中用到了哪些设计模式,如何使用
(2)知道经常使用设计模式的优缺点
(3)能画出经常使用设计模式的UML图

四、多线程
这也是必问的一块了。会问得深刻一些好比说Thread和Runnable的区别和联系、屡次start一个线程会怎么样、线程有哪些状态。固然这只是最基本的,出乎意料地,几回面试几乎都被同时问到了一个问题,问法不尽相同,总结起来是这么一个意思:假若有Thread一、Thread二、Thread三、Thread4四条线程分别统计C、D、E、F四个盘的大小,全部线程都统计完毕交给Thread5线程去作汇总,应当如何实现?
聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可使用。
另外,线程池也是比较常问的一块,经常使用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。最后,虽然此次面试问得很少,可是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等

五、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。

六、JDK源码
要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是否是爱钻研了。
JDK源码其实没什么好总结的,纯粹看我的,总结一下比较重要的源码:

(1)List、Map、Set实现类的源代码
(2)ReentrantLock、AQS的源代码
(3)AtomicInteger的实现原理,主要能说清楚CAS机制而且AtomicInteger是如何利用CAS机制实现的
(4)线程池的实现原理
(5)Object类中的方法以及每一个方法的做用

七、框架
老生常谈,面试必问的东西。通常来讲会问你一下大家项目中使用的框架,而后给你一些场景问你用框架怎么作,好比我想要在Spring初始化bean的时候作一些事情该怎么作、想要在bean销毁的时候作一些事情该怎么作、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习框架的使用细节天然都不成问题。
若是上面你的问题答得好,面试官每每会深刻地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,固然这个很简单啦,两句话就搞定的的事儿,即便你不会准备一下就行了。

八、数据库
数据库十有八九也都会问到。一些基本的像union和union all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,若是对于数据库的性能优化一窍不通,那么有时间,仍是建议你在面试前花一两天专门把SQL基础和SQL优化的内容准备一下。

不过数据库却是不用担忧,一家公司每每有不少部门,若是你对数据库不熟悉而基本技术又很是好,九成都是会要你的,估计会先把你放到对数据库使用不是要求很是高的部门锻炼一下。

九、数据结构和算法分析
数据结构和算法分析,对于一名程序员来讲,会比不会好并且在工做中绝对能派上用场。数组、链表是基础,栈和队列深刻一些但也不难,树挺重要的,比较重要的树AVL树、红黑树,能够不了解它们的具体实现,可是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。

十、Java虚拟机
Java虚拟机应该是很重要的一块内容,谈谈Java虚拟机中比较重要的内容

  1. ava虚拟机的内存布局
  2. GC算法及几种垃圾收集器
  3. 类加载机制,也就是双亲委派模型
  4. Java内存模型
  5. happens-before规则
  6. volatile关键字使用规则

也许这些内容面试无用,但在走向大牛的路上,不可不会。

十一、Web方面的一些问题
Java主要面向Web端,所以Web的一些问题也是必问的。

  1. 谈谈分布式Session的几种实现方式?(经常使用的四种能答出来天然是让面试官很是满意的)
  2. 讲一下Session和Cookie的区别和联系以及Session的实现原理

这两个问题以外,web.xml里面的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理一清二楚吧,至少能对它们的使用知根知底。另外,一些细节的方面好比get/post的区别、forward/重定向的区别、HTTPS的实现原理也均可能会被考察到。

最后,若是有兴趣有时间,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备,救命良方、包治百病、屡试不爽。

关于HR面试

若是你过五关斩六将,成功地经过了全部的技术面,那么恭喜你,你离升职加薪、出任CEO、迎娶白富美、走向人生巅峰又进了一步。可是尚未到谈薪资待遇的时候,最后还有一个考验:HR面试。基本全部的大公司都有这一轮的面试,不要小看HR面试,不少公司的HR对于面试者都有一票否决权的----即便前面的面试对你的评价再高。
因此,这轮的面试也必须重视起来,HR面试主要问的是几点:

  1. 简历中写的过去工做经历的离职缘由
  2. 当前公司薪资待遇
  3. 指望能到怎样的一家公司
  4. 我的将来的发展方向

若是你们想学习如下路线内容,在此我向你们推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

强力推荐你们学习的进阶路线

1、源码分析
图片描述

2、分布式架构
图片描述

3、微服务
图片描述

4、性能优化
图片描述

5、Java工程化
图片描述

总结:

好了,个人总结就到这里了,若是大家也想面试BAT,建议大家把基础学好,偷偷的告诉大家,他们都是很喜欢问基础知识的哦......如今想着那个面试官,真心感受他没我帅~~~~哈哈哈哈。
你们能够关注个人公众号:《Java烂猪皮》,日常我也会发写技术文章,好比:架构,分布式,微服务spring,jvm,MySQL等知识点。面试经验也会分享给你们。在此谢谢你们的关注支持~~~~

 

注:你们转载请注明原文出处,原文链接:     https://segmentfault.com/a/1190000015433230

相关文章
相关标签/搜索