“野生”程序員面對阿里社招面試應該如何準備才能事半功倍呢?

我會分為四個部分來談論這個問題,由于LZ本身是Java出身,因此關于主語言的問題,都是與Java相關,其它語言的同學可以選擇性忽略。此外,面試的時候一般面試官的問題都是環(huán)環(huán)相扣,逐漸深入的,這點在下面大家可以更明顯的感受出來。


1、主語言本身以及它的高級特性。

主語言當然就是你平日里拿來賺錢的家伙。不要告訴LZ你沒有主語言,你會N多種語言,或者是你精通N多種語言,你要非這么說的話,你可以來杭州試試,LZ保證不打死你,最多打殘。

LZ的主語言很顯然是Java,那么對于Java來說,它的語言本身以及它的高級特性,都有哪些比較容易在面試中問到呢?

一般情況下,主要有以下知識點很容易被問到。(PS:以下所列舉的,都是一些Java相對而言比較高級一點的知識點,因為這里談的是社招,而不是校招)

1)Java的數(shù)據(jù)結構相關的類實現(xiàn)原理,比如LinkedList,ArrayList,HashMap,TreeMap這一類的。以下簡單模擬一個數(shù)據(jù)結構的連環(huán)炮。

比如,面試官先問你HashMap是不是有序的?

你肯定回答說,不是有序的。那面試官就會繼續(xù)問你,有沒有有順序的Map實現(xiàn)類?

你如果這個時候說不知道的話,那這個問題就到此結束了。如果你說有TreeMap和LinkedHashMap。

那么面試官接下來就可能會問你,TreeMap和LinkedHashMap是如何保證它的順序的?

如果你回答不上來,那么到此為止。如果你依然回答上來了,那么面試官還會繼續(xù)問你,你覺得它們兩個哪個的有序實現(xiàn)比較好?

如果你依然可以回答的話,那么面試官會繼續(xù)問你,你覺得還有沒有比它更好或者更高效的實現(xiàn)方式?

如果你還能說出來的話,那么就你所說的實現(xiàn)方式肯定依然可以問你很多問題。

以上就是一個面試官一步一步提問的例子。所以,如果你了解的不多,千萬不要敷衍,因為可能下一個問題你就暴露了,還不如直接說不會,把這個問題結束掉,趕緊切換到你熟悉的領域。

2)Java并發(fā)包當中的類,它們都有哪些作用,以及它們的實現(xiàn)原理,這些類就是java.concurrent包下面的。與上面一樣,咱們也簡單的模擬一個并發(fā)包的連環(huán)炮。

比如面試官可能會先問你,如果想實現(xiàn)所有的線程一起等待某個事件的發(fā)生,當某個事件發(fā)生時,所有線程一起開始往下執(zhí)行的話,有什么好的辦法嗎?

這個時候你可能會說可以用柵欄(Java的并發(fā)包中的CyclicBarrier),那么面試官就會繼續(xù)問你,你知道它的實現(xiàn)原理嗎?

如果你繼續(xù)回答的話,面試官可能會繼續(xù)問你,你還知道其它的實現(xiàn)方式嗎?

如果你還能說出很多種實現(xiàn)方式的話,那么繼續(xù)問你,你覺得這些方式里哪個方式更好?

如果你說出來某一個方式比較好的話,面試官依然可以繼續(xù)問你,那如果讓你來寫的話,你覺得還有比它更好的實現(xiàn)方式嗎?

如果你這個時候依然可以說出來你自己更好的實現(xiàn)方式,那么面試官肯定還會揪著這個繼續(xù)問你。

為什么說面試的時候要引導面試官,原因就在這了。因為面試官的提問很多時候都是有跡可循的,你如果抓住了他的軌跡,能夠猜到他下面很可能會問什么,那你在回答的時候就可以往你想要談的方向去說。這樣面試時就會顯得更加從容,更加的游刃有余。

3)IO包和NIO包中的內容。這部分里面NIO會是重點,IO包大部分都會比較熟悉,因此可能會直接略過,直接問你NIO的內容。

IO包和NIO包的內容相對來說不是很多,首先NIO模型要熟悉,特別是其中的selector一定要非常清楚它的職責和實現(xiàn)原理。其實NIO的核心是IO線程池,一定要記住這個關鍵點。有的時候,面試官可能也會問你IO包的設計模式(裝飾器模式),為什么要這樣設計?

有的面試官還會問你有沒有更好的設計,這個時候如果你不知道請果斷說自己現(xiàn)在的水平有限,想不出來更好的設計,千萬不要信口開河,隨意YY。

4)Java的虛擬機的內容。這部分主要包括三部分,GC、類加載機制,以及內存。

一個GC部分簡單的連環(huán)炮。

面試官可以先問你什么時候一個對象會被GC?

接著繼續(xù)問你為什么要在這種時候對象才會被GC?

接著繼續(xù)問你GC策略都有哪些分類?

你如果說出來了,繼續(xù)問你這些策略分別都有什么優(yōu)劣勢?都適用于什么場景?

你繼續(xù)說出來了以后,給你舉個實際的場景,讓你選擇一個GC策略?

你如果選出來了,繼續(xù)問你,為什么要選擇這個策略?

下面是關于類加載機制的簡單連環(huán)炮。

首先肯定是先問你Java的類加載器都有哪些?

回答了這些以后,可能會問你每個類加載器都加載哪些類?

說完以后,可能會問你這些類加載之間的父子關系是怎樣的?

你在回答的時候可能會提到雙親委派模型,那么可以繼續(xù)問你什么是雙親委派模型?

你解釋完了以后,可能會繼續(xù)問你,為什么Java的類加載器要使用雙親委派模型?

你回答完以后,可能會繼續(xù)問你如何自定義自己的類加載器,自己的類加載器和Java自帶的類加載器關系如何處理?

再來一個關于內存的連環(huán)炮。

首先肯定就是問你內存分為哪幾部分,這些部分分別都存儲哪些數(shù)據(jù)?

然后繼續(xù)問你一個對象從創(chuàng)建到銷毀都是怎么在這些部分里存活和轉移的?

接著可能會問你,內存的哪些部分會參與GC的回收?

完事以后,可能還會問你Java的內存模型是怎么設計的?

你回答了以后,還會繼續(xù)問你為什么要這么設計?

問完以后,還可能會讓你結合內存模型的設計談談volatile關鍵字的作用?

你在談的時候,肯定會提到可見性,那么接著可見性這三個字,還可以繼續(xù)問你并發(fā)的內容。

基本上Java語言本身以及語言稍微高級點的內容就是以上部分,如果你能把以上四部分了解的非常透徹,那基本上Java這部分就沒啥問題了,因為光以上的內容就夠你跟面試官聊很久了。你聊這些聊得久了,自然問你其它問題的時間就會短點。

你從LZ寫這些問題的過程也應該能感受出來,很多時候,面試官都是順著一條線一路問下去的,如果你覺得這條線你不熟悉的話,就要及時拐彎,引導面試官去問其它方面的問題。千萬不要一直往下深入,直到自己跳不出來為止,那就尷了個尬了。

2、講述自己的項目,并在中間穿插著問題

這一部分是面試過程中必問,也是聊得最久的一個階段。除非你前面的語言部分非常扎實,扎實到面試官問了一兩個小時,依舊沒有探出你對語言本身的了解到底有多深。否則的話,你一定逃不過自己的項目這一關,而且一般情況下聊得時間不會太短。

這一部分內容,一般的模式就是你自己去講你做過的項目,然后面試官會冷不丁的讓你去解釋其中某一部分,比如讓你解釋當時為什么要這么做,或者問你現(xiàn)在覺得有沒有更好的辦法。而這些穿插的問題,大部分與你的項目所用到的技術有關。而你需要做的,就是充分、再充分的去總結自己做過的項目(尤其是最近的一兩個項目),挖掘出一個甚至N個亮點,以備于到時候可以讓面試官產(chǎn)生眼前一亮的感覺。如果你能達到這種效果的話,基本上離你成功就不遠了。

這部分內容由于和每個人自己的經(jīng)歷息息相關,因此這里也沒法列舉可能問到的問題。這篇文章《程序員面經(jīng):面試前到底該不該刷題以及面試前該如何準備》是LZ之前寫的,里面大概討論了下如何在面試前總結,有興趣的可以去了解一下。

3、額外的加分項

上面兩個階段基本上是必問的,還有一些加分項。這些加分項中,有些內容面試官也會問你(比如TCP/IP協(xié)議、算法),但更多的是會先問你了解不了解,你了解的話再繼續(xù)聊,不了解的話就直接略過了,不至于因為這種問題而直接把你打入地獄。

下面LZ列舉一下這些加分項,如果可以的話,這些加分項還是要爭取一下的。

1、計算機系統(tǒng)原理。

2、網(wǎng)絡通信協(xié)議(TCP/IP,HTTP等)。

3、數(shù)據(jù)結構與算法。

4、著名開源項目的源碼。

5、你自己有很棒的開源項目。

6、你的個人博客。

7、待評論區(qū)補充。

這幾項當中,對于前1-3項,如果你之前就比較了解,只是由于時間問題忘記了的話,還是可以臨時抱佛腳一下的。至于后面4-6項,就需要你日常的積累了,不是一時半會兒能做到的。如果你平日里沒有積累,那么后面這三個加分項只能拋棄了。

4、與你職位相關的內容

其實這最后一項是對前面三項的補充,你應該盡量去主攻和你面試的職位相關的內容。比如你面試一個實時計算的職位,那么你的算法最好要厲害,對于著名的實時計算開源項目要熟悉,最好閱讀過源碼,而且還要對分布式系統(tǒng)有一定的見解。

因此,這個第4部分沒有具體的內容,只是提醒你,如果你很明確自己的面試職位,最好在面試前準備的時候,盡量朝職位的需求方向靠攏,這樣成功的可能性更大。

看完以后,關于連環(huán)炮的部分,筆者這里還是想簡單再補充幾句,上面之所以舉了那么多連環(huán)炮的例子,其實并不是想讓大家背下來,而是想讓各位看官體會一下社招面試的套路。

說到底,這些連環(huán)炮的例子,就是在考驗你對某一個知識點理解的有多深。就筆者的親身經(jīng)歷而言,其實上面所提到的這些連環(huán)炮,你并不需要每個都理解的很深,只需要有那么一兩個點比較深,甚至超過面試官的理解,就可以達到要求了。

很多時候,面試官并不需要你對每一個知識點都很深入,他只是在考察你的理解能力,以及平時有沒有一些技術積累。

如果一個面試官,只因為一兩個技術知識點而否決你的話,那么只有兩種可能,第一種是這個點,可能確實是你所面試的職位中,非常重要的知識點,比如面試算法類崗位的話,算法不好是不行的,或者是面試偏運維類的技術崗位,Linux玩不好也是不行的。

第二種可能就是——他在裝逼,-_-。哈哈

大家記得關注支持一下小編的頭條號 歡迎大家在下面評論區(qū)開車的

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容