起因:
因為我是一個不管做什麼事情都喜歡進行總結的一個人。所以對於在上週去淘寶面試的經歷,現在面試回來總結,我想對所有程式設計師們談談。
之前我是在一家外企工作的,待遇還算不錯,自己也做了快五年了,因為考慮到家庭的原因,所以在前面幾周辭職回了杭州。在朋友聽到我辭職回來後,好多關係比較好的同事朋友也向我推薦了好多家企業。如:螞蟻金服;支付寶;蘑菇街;阿里雲;淘寶;挖財等~~~~這幾家公司我都去面試了,情況還算不錯,基本都能聊的來,不出什麼意外情況,應該都能過。面了這麼多家大廠,那麼我先來總結一下我在面試淘寶時的經歷。
面試經歷
今天自我感覺良好的去該公司面試,接待我的是一位漂亮的小姐姐,把我帶到會議室,然後來了一個沒有我帥的·`哈哈哈“自戀不花錢,要保持住心態”
面試官一進來,我一看,竊喜,沒有我帥,接下來的開場非常直接,直接進入正題:(我一般只總結重要內容,其他的我就帶過,你們自己想象)
淘寶一面:
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面試主要問的是幾點:
- 簡歷中寫的過去工作經歷的離職原因
- 當前公司薪資待遇
- 期望能到怎樣的一家公司
- 個人未來的發展方向
如果大家想學習以下路線內容,在此我向大家推薦一個架構學習交流群。交流學習群號:478030634 裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化、分散式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
強力推薦大家學習的進階路線
一、原始碼分析
二、分散式架構
三、微服務
四、效能優化
五、Java工程化
總結:
好了,我的總結就到這裡了,如果你們也想面試BAT,建議你們把基礎學好,偷偷的告訴你們,他們都是很喜歡問基礎知識的哦......現在想著那個面試官,真心感覺他沒我帥~~~~哈哈哈哈。
大家可以關注我的公眾號:《Java爛豬皮》,平常我也會發寫技術文章,比如:架構,分散式,微服務spring,jvm,MySQL等知識點。面試經驗也會分享給大家。在此謝謝大家的關注支援~~~~
注:大家轉載請註明原文出處,原文連線: https://segmentfault.com/a/1190000015433230