起因:
因為我是一個不管做什么事情都喜歡進行總結(jié)的一個人。所以對于在上周去淘寶面試的經(jīng)歷券犁,現(xiàn)在面試回來總結(jié)术健,我想對所有程序員們談談。
之前我是在一家外企工作的粘衬,待遇還算不錯荞估,自己也做了快五年了,因為考慮到家庭的原因稚新,所以在前面幾周辭職回了杭州勘伺。在朋友聽到我辭職回來后,好多關系比較好的同事朋友也向我推薦了好多家企業(yè)褂删。如:螞蟻金服飞醉;支付寶;蘑菇街屯阀;阿里云缅帘;淘寶;挖財?shù)葉~~~這幾家公司我都去面試了蹲盘,情況還算不錯股毫,基本都能聊的來,不出什么意外情況召衔,應該都能過铃诬。面了這么多家大廠,那么我先來總結(jié)一下我在面試淘寶時的經(jīng)歷苍凛。
面試經(jīng)歷
今天自我感覺良好的去該公司面試趣席,接待我的是一位漂亮的小姐姐,把我?guī)У綍h室醇蝴,然后來了一個沒有我?guī)浀摹哈哈哈“自戀不花錢宣肚,要保持住心態(tài)”
面試官一進來,我一看悠栓,竊喜霉涨,沒有我?guī)洠酉聛淼拈_場非常直接惭适,直接進入正題:(我一般只總結(jié)重要內(nèi)容笙瑟,其他的我就帶過,你們自己想象)
淘寶一面:
1.簡單介紹你目前的工作情況
2.在這些工作項目當中有沒有哪些項目是你主導或者比較了解的癞志,詳細說明一下情況往枷,包括技術的設計
3.由項目中所使用的框架,介紹一下對公司內(nèi)部框架的具體實現(xiàn)(我這里主要是亞信的CSF和AICACHE)
4.csf是怎么實現(xiàn)的?
5.csf是亞信內(nèi)部的分布式通信框架错洁,通過zk去管理服務注冊和發(fā)現(xiàn)秉宿,那么,如果當zk集群壓力過大屯碴,是如何動態(tài)擴容和管理的描睦?比如像阿里這樣體系的公司, 對于服務注冊和發(fā)現(xiàn)窿锉,可以如何設計酌摇,去承載搞負載,高并發(fā)的嗡载,也就是主機集群并沒有宕機窑多,但是負載很高,如何做擴展和優(yōu)化洼滚?
6.當前是一個服務提供者埂息,我發(fā)布了服務之后向zk注冊,此時遥巴,服務調(diào)用方來調(diào)用服務千康,會首先詢問zk我要調(diào)用的服務有哪些提供者,這些服務信息是緩存在 服務調(diào)用者這一方铲掐,還是每次調(diào)用時都問zk要呢拾弃?
7.如果服務調(diào)用時,突然提供服務的主機不可用了摆霉,比如因為網(wǎng)絡抖動調(diào)用不通豪椿,此時又是一個什么樣的流程呢?
8.假如此時服務不可用的主機短時間內(nèi)又恢復了服務提供能力携栋,又是一個怎樣的流程搭盾?
9.csf服務本身有路由規(guī)則的設計嗎?雙機房婉支,相互容災鸯隅,甚至是異地多機房相互容災,調(diào)同機柜向挖,同機房蝌以,同城,這些調(diào)用順序是如何設計的何之?csf服務是如何 做優(yōu)先選擇的?或者說跟畅,服務有沒有進行過一些分組,類似場景帝美,比如根據(jù)用戶id分組,50%用戶使用A服務提供者,另外50%使用B服務提供者悼潭,這樣的場景是如何實現(xiàn)的庇忌,有沒有這樣的一種策略在里面呢?如果有的話舰褪,又是如何實現(xiàn)的皆疹?
10.服務注冊與發(fā)現(xiàn)之后,是對象的序列化占拍,對序列化這塊略就,在Java里了解有哪些具體的序列化方式呢?彼此之間的優(yōu)劣是什么樣的晃酒?在CSF里又是怎么做序列化的呢表牢?
11.既然有第三方的序列化方式,說明java官方提供的序列化方式應該有一些很明顯或者很致命的缺點贝次,你能說說是什么嗎崔兴?
12.假如讓你來設計csf框架,恰好你負責序列化這一塊蛔翅,你會怎么來設計高可用敲茄,或者選擇哪些數(shù)據(jù)來進行壓縮,哪些數(shù)據(jù)又是不能壓縮的山析,壓縮之后肯定會 帶來一些負面效果堰燎,這些負面有哪些,有具體了解過嗎笋轨? 比如說秆剪,原生的bmp圖片,我可以壓縮成jpg圖片翩腐,那我們知道鸟款,jgp圖片其實是有損壓縮,雖然在 肉眼上其實分辨不出來茂卦,那這種壓縮它是如何做的呢何什?那還有一些是無損壓縮。你覺得protobuf是有損壓縮還是無損壓縮呢等龙?異構(gòu)系統(tǒng)之間又是采取什么樣 的序列化方式呢处渣,能采用java原生的序列化機制來實現(xiàn)序列化傳輸嗎?
13.序列化傳輸之后蛛砰,就是底層網(wǎng)絡傳輸了罐栈,那nio包也出來很久了,能說明一下nio主要是做了什么泥畅,為什么要設計nio?以及nio里面主要的類和接口嗎荠诬?這些類和接口分別是設么作用能詳細描述一下嗎?nio是基于事件驅(qū)動機制來設計的,那nio里哪個類負責nio的事件驅(qū)動呢柑贞?
14.能說一下nio和aio的區(qū)別嗎方椎?有了解過aio嗎?aio有哪些主要的類和接口钧嘶,主要作用是什么棠众,能說明一下嗎?
15.對java8有决,java9,甚至java10有哪些重大版本的更新闸拿,有了解嗎?(面試官更想問的是java9和java10)书幕,java8有哪些至少是包級別的重大的功能更新新荤,有了解過嗎?(我回答了了解ConcurrentHashMap put元素導致同一個hash桶元素多于8個時按咒,會將鏈表轉(zhuǎn)化為紅黑樹)
16.能具體說一下紅黑樹嗎迟隅?紅黑樹的具體實現(xiàn)?紅黑樹具體是如何提高性能的励七?紅黑樹如何做到動態(tài)調(diào)整的智袭?
17.對于列表的流式處理(流處理)和Lamda表達式有接觸過嗎?
18.對于Garbage First(G1)垃圾回收器有了解過嗎掠抬?
19.對于其他垃圾回收器有了解過嗎吼野?
20.jvm應用啟動參數(shù)優(yōu)化,有了解嗎两波?你們這邊項目當中有這樣操作過嗎瞳步?比如說,當你發(fā)布應用上去腰奋,通過監(jiān)控發(fā)現(xiàn)young GC和old gc數(shù)據(jù)比較異常单起,有沒 有試圖調(diào)整年輕代和老年代之間的空間比例,以及調(diào)整垃圾回收器劣坊,以達到性能調(diào)優(yōu)的目的嘀倒?
21.對類加載器有了解嗎?什么樣的情況下需要打破雙親委派模型局冰?打破的方式是什么樣子的测蘑?你能描述一下嗎?舉個場景康二,你現(xiàn)在有一個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全部在這個應用程序內(nèi)部惜傲,tomcat啟動的時候?qū)ar包里的同一個類只會加載一次,那么現(xiàn)在情況是贝攒,要么a模塊起不來不能用了,要么b模塊起不來不能用了时甚,如果你是這個應用的owner隘弊,你怎么辦?模塊代碼本身很難改荒适,或者說比較復雜梨熙,a模塊無法升級jar包,b模塊無法降級jar包刀诬。
22.聽說過osji嗎咽扇?你知道osgi主要功能是什么嗎?它大概的一個實現(xiàn)原理又是什么樣子陕壹?
23.前面都是我在問质欲,你在回答,比較被動糠馆,你可以說說你對那些技術或者開源框架有比較深入的了解嗎嘶伟?
24.選舉算法,能具體描述一下嗎又碌?怎么避免死循環(huán)的選舉方式呢九昧?比如說,有三臺主機1,2,3,1主機選舉自己并向23發(fā)送選舉消息毕匀,2和3不同意铸鹰,然后2主機選 舉自己然后也向1和3主機發(fā)送選舉消息,1和3主機也不同意皂岔,3主機也如法炮制蹋笼,這個怎么避免呢?要么全部選自己凤薛,要么全部選別人姓建,大家都是一條,怎 么辦呢缤苫?
25.能描述一下paxos算法的具體實現(xiàn)方式嗎速兔?這個算法里有哪些角色?
26.能描述一下raft算法活玲,它里面哪些角色和它整個選舉過程是怎么樣的嗎涣狗?具體是如何選舉的谍婉?比如還是有1,2,3三臺主機,1镀钓,2,3都分別發(fā)出選舉信息穗熬,要求 選舉自己,過程僵住了怎么辦丁溅?paxos和raft是不一樣的處理唤蔗,那raft是怎么處理的?
27.redis是如何解決熱點問題的呢窟赏?dedis集群是怎么實現(xiàn)的呢妓柜,能跟我描述一下嗎?每臺redis從機上都是完整的數(shù)據(jù)嗎涯穷,如果這樣棍掐,數(shù)據(jù)是不是太過冗余了? 那如果是這樣拷况,應用在訪問緩存的時候作煌,是隨機挑選一臺redis機器嗎?那怎么保證不會隨機挑選到同一臺機器上去呢赚瘦?redis數(shù)據(jù)切片這個概念有了解嗎粟誓?
28.~~~等(問了好多,后面寫不完了)起意。
看到這里努酸,你們能回答得出來多少,有多少是你們不能回答得上的杜恰?是不是心里此刻已經(jīng)mmp了获诈。不過你們不用擔心,我此時我也懵了心褐,心里想罵娘舔涎。不過心態(tài)不能慌呀~~~~
(心里想著,穩(wěn)住逗爹,他沒我?guī)泘~~~哈哈哈)
面試總結(jié)
不知道你們看完了發(fā)現(xiàn)沒亡嫌,就一個淘寶,就要懂很多知識點掘而,那如果阿里巴巴挟冠,支付寶,等一線大廠呢袍睡?是不是感覺自己還要學習的還有很多~
經(jīng)過這次面試知染,我總結(jié)一下幾點:
1、基本語法
這包括static斑胜、final控淡、transient等關鍵字的作用嫌吠,foreach循環(huán)的原理等等。今天面試我問你static關鍵字有哪些作用掺炭,如果你答出static修飾變量辫诅、修飾方法我會認為你合格,答出靜態(tài)塊涧狮,我會認為你不錯炕矮,答出靜態(tài)內(nèi)部類我會認為你很好,答出靜態(tài)導包我會對你很滿意者冤,因為能看出你非常熱衷研究技術吧享。
2栏账、集合
非常重要,也是必問的內(nèi)容髓绽∶⒅椋基本上就是List、Map柿扣、Set,問的是各種實現(xiàn)類的底層實現(xiàn)原理,實現(xiàn)類的優(yōu)缺點尼桶。集合要掌握的是ArrayList、LinkedList锯仪、Hashtable泵督、HashMap、ConcurrentHashMap庶喜、HashSet的實現(xiàn)原理小腊,能流利作答,當然能掌握CopyOnWrite容器和Queue是再好不過的了久窟。另外多說一句秩冈,ConcurrentHashMap的問題在面試中問得特別多,大概是因為這個類可以衍生出非常多的問題斥扛,關于ConcurrentHashMap入问,我給網(wǎng)友朋友們提供三點回答或者是研究方向:
(1)ConcurrentHashMap的鎖分段技術
(2)ConcurrentHashMap的讀是否要加鎖,為什么
(3)ConcurrentHashMap的迭代器是強一致性的迭代器還是弱一致性的迭代器
3稀颁、設計模式
設計模式在工作中還是非常重要芬失、非常有用的,23種設計模式中重點研究常用的十來種就可以了匾灶,面試中關于設計模式的問答主要是三個方向:
(1)你的項目中用到了哪些設計模式棱烂,如何使用
(2)知道常用設計模式的優(yōu)缺點
(3)能畫出常用設計模式的UML圖
4、多線程
這也是必問的一塊了阶女。會問得深入一些比如說Thread和Runnable的區(qū)別和聯(lián)系垢啼、多次start一個線程會怎么樣窜锯、線程有哪些狀態(tài)。當然這只是最基本的芭析,出乎意料地锚扎,幾次面試幾乎都被同時問到了一個問題,問法不盡相同馁启,總結(jié)起來是這么一個意思:假如有Thread1驾孔、Thread2、Thread3惯疙、Thread4四條線程分別統(tǒng)計C翠勉、D、E霉颠、F四個盤的大小对碌,所有線程都統(tǒng)計完畢交給Thread5線程去做匯總,應當如何實現(xiàn)蒿偎?
聰明的網(wǎng)友們對這個問題是否有答案呢朽们?不難,java.util.concurrent下就有現(xiàn)成的類可以使用诉位。
另外骑脱,線程池也是比較常問的一塊,常用的線程池有幾種苍糠?這幾種線程池之間有什么區(qū)別和聯(lián)系叁丧?線程池的實現(xiàn)原理是怎么樣的?實際一些的岳瞭,會給你一些具體的場景拥娄,讓你回答這種場景該使用什么樣的線程池比較合適。最后瞳筏,雖然這次面試問得不多条舔,但是多線程同步、鎖這塊也是重點乏矾。synchronized和ReentrantLock的區(qū)別孟抗、synchronized鎖普通方法和鎖靜態(tài)方法、死鎖的原理及排查方法等等
5钻心、IO
IO分為File IO和Socket IO凄硼,F(xiàn)ile IO基本上是不會問的,問也問不出什么來捷沸,平時會用就好了摊沉,另外記得File IO都是阻塞IO。Socket IO是比較重要的一塊痒给,要搞懂的是阻塞/非阻塞的區(qū)別说墨、同步/異步的區(qū)別骏全,借此理解阻塞IO、非阻塞IO尼斧、多路復用IO姜贡、異步IO這四種IO模型,Socket IO如何和這四種模型相關聯(lián)棺棵。這是基本一些的楼咳,深入一些的話,就會問NIO的原理烛恤、NIO屬于哪種IO模型母怜、NIO的三大組成等等,這有些難缚柏,當時我也是研究了很久才搞懂NIO苹熏。提一句,NIO并不是嚴格意義上的非阻塞IO而應該屬于多路復用IO币喧,面試回答的時候要注意這個細節(jié)轨域,講到NIO會阻塞在Selector的select方法上會增加面試官對你的好感。如果用過Netty粱锐,可能會問一些Netty的東西,畢竟這個框架基本屬于當前最好的NIO框架了(Mina其實也不錯扛邑,不過總體來說還是比不上Netty的)怜浅,大多數(shù)互聯(lián)網(wǎng)公司也都在用Netty。
6蔬崩、JDK源碼
要想拿高工資恶座,JDK源碼不可不讀。上面的內(nèi)容可能還和具體場景聯(lián)系起來沥阳,JDK源碼就是實打?qū)嵉乜茨闫綍r是不是愛鉆研了跨琳。
JDK源碼其實沒什么好總結(jié)的,純粹看個人桐罕,總結(jié)一下比較重要的源碼:
(1)List脉让、Map、Set實現(xiàn)類的源代碼
(2)ReentrantLock功炮、AQS的源代碼
(3)AtomicInteger的實現(xiàn)原理溅潜,主要能說清楚CAS機制并且AtomicInteger是如何利用CAS機制實現(xiàn)的
(4)線程池的實現(xiàn)原理
(5)Object類中的方法以及每個方法的作用
7、框架
老生常談薪伏,面試必問的東西滚澜。一般來說會問你一下你們項目中使用的框架,然后給你一些場景問你用框架怎么做嫁怀,比如我想要在Spring初始化bean的時候做一些事情該怎么做设捐、想要在bean銷毀的時候做一些事情該怎么做借浊、MyBatis中$和#的區(qū)別等等,這些都比較實際了萝招,平時積累得好蚂斤、有多學習框架的使用細節(jié)自然都不成問題。
如果上面你的問題答得好即寒,面試官往往會深入地問一些框架的實現(xiàn)原理橡淆。問得最多的就是Spring AOP的實現(xiàn)原理,當然這個很簡單啦母赵,兩句話就搞定的的事兒逸爵,即使你不會準備一下就好了。
8凹嘲、數(shù)據(jù)庫
數(shù)據(jù)庫十有八九也都會問到师倔。一些基本的像union和union all的區(qū)別、left join周蹭、幾種索引及其區(qū)別就不談了趋艘,比較重要的就是數(shù)據(jù)庫性能的優(yōu)化,如果對于數(shù)據(jù)庫的性能優(yōu)化一竅不通凶朗,那么有時間瓷胧,還是建議你在面試前花一兩天專門把SQL基礎和SQL優(yōu)化的內(nèi)容準備一下。
不過數(shù)據(jù)庫倒是不用擔心棚愤,一家公司往往有很多部門搓萧,如果你對數(shù)據(jù)庫不熟悉而基本技術又非常好,九成都是會要你的宛畦,估計會先把你放到對數(shù)據(jù)庫使用不是要求非常高的部門鍛煉一下瘸洛。
9、數(shù)據(jù)結(jié)構(gòu)和算法分析
數(shù)據(jù)結(jié)構(gòu)和算法分析次和,對于一名程序員來說反肋,會比不會好而且在工作中絕對能派上用場。數(shù)組踏施、鏈表是基礎石蔗,棧和隊列深入一些但也不難,樹挺重要的畅形,比較重要的樹AVL樹抓督、紅黑樹,可以不了解它們的具體實現(xiàn)束亏,但是要知道什么是二叉查找樹铃在、什么是平衡樹,AVL樹和紅黑樹的區(qū)別。
10定铜、Java虛擬機
Java虛擬機應該是很重要的一塊內(nèi)容阳液,談談Java虛擬機中比較重要的內(nèi)容
ava虛擬機的內(nèi)存布局
GC算法及幾種垃圾收集器
類加載機制,也就是雙親委派模型
Java內(nèi)存模型
happens-before規(guī)則
volatile關鍵字使用規(guī)則
也許這些內(nèi)容面試無用揣炕,但在走向大牛的路上帘皿,不可不會。
11畸陡、Web方面的一些問題
Java主要面向Web端鹰溜,因此Web的一些問題也是必問的。
談談分布式Session的幾種實現(xiàn)方式丁恭?(常用的四種能答出來自然是讓面試官非常滿意的)
講一下Session和Cookie的區(qū)別和聯(lián)系以及Session的實現(xiàn)原理
這兩個問題之外曹动,web.xml里面的內(nèi)容是重點,F(xiàn)ilter牲览、Servlet墓陈、Listener,不說對它們的實現(xiàn)原理一清二楚吧第献,至少能對它們的使用知根知底贡必。另外,一些細節(jié)的方面比如get/post的區(qū)別庸毫、forward/重定向的區(qū)別仔拟、HTTPS的實現(xiàn)原理也都可能會被考察到。
最后飒赃,如果有興趣有時間利花,建議學習、研究一下SOA和RPC盒揉,面向服務體系晋被,大型分布式架構(gòu)必備兑徘,救命良方刚盈、包治百病、屢試不爽挂脑。
關于HR面試
如果你過五關斬六將藕漱,成功地通過了所有的技術面,那么恭喜你崭闲,你離升職加薪肋联、出任CEO、迎娶白富美刁俭、走向人生巔峰又進了一步橄仍。但是還沒有到談薪資待遇的時候,最后還有一個考驗:HR面試∥攴保基本所有的大公司都有這一輪的面試虑粥,不要小看HR面試,很多公司的HR對于面試者都有一票否決權的----即使前面的面試對你的評價再高宪哩。
所以娩贷,這輪的面試也必須重視起來,HR面試主要問的是幾點:
簡歷中寫的過去工作經(jīng)歷的離職原因
當前公司薪資待遇
期望能到怎樣的一家公司
個人未來的發(fā)展方向
如果大家想學習以下路線內(nèi)容锁孟,在此我向大家推薦一個架構(gòu)學習交流群彬祖。交流學習群號:521353348???里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis品抽,Netty源碼分析储笑,高并發(fā)、高性能桑包、分布式南蓬、微服務架構(gòu)的原理,JVM性能優(yōu)化哑了、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系赘方。還能領取免費的學習資源,目前受益良多
強力推薦大家學習的進階路線
一弱左、源碼分析
二窄陡、分布式架構(gòu)
三、微服務
四拆火、性能優(yōu)化
五跳夭、Java工程化
總結(jié):
好了,我的總結(jié)就到這里了们镜,如果你們也想面試BAT币叹,建議你們把基礎學好,偷偷的告訴你們模狭,他們都是很喜歡問基礎知識的哦......現(xiàn)在想著那個面試官颈抚,真心感覺他沒我?guī)泘~~~哈哈哈哈。
大家可以關注我的公眾號:《Java爛豬皮》嚼鹉,平常我也會發(fā)寫技術文章贩汉,比如:架構(gòu),分布式锚赤,微服務spring匹舞,jvm,MySQL等知識點线脚。面試經(jīng)驗也會分享給大家赐稽。在此謝謝大家的關注支持~~~~
注:大家轉(zhuǎn)載請注明原文出處叫榕,原文連接: ? ? https://segmentfault.com/a/1190000015433230