1. 程式人生 > >如何準備阿裏社招面試和面試各個階段的小建議

如何準備阿裏社招面試和面試各個階段的小建議

而且 RR VM data 它的 總結 如果 data- 為什麽

引言 其實本來真的沒打算寫這篇文章,主要是我得記憶力不是很好,不像一些記憶力強的人,面試完以後,幾乎能把自己和面試官的對話都給記下來。我自己當初面試完以後,除了記住一些聊過的知識點以外,具體的內容基本上忘得一幹二凈,所以寫這篇文章其實是很有難度的。 但是,最近問我的人實在是太多了,為了避免重復回答,給自己省點力氣,幹脆就在這裏統一回復了。 其實之前我寫過一篇文章,但是那篇文章更多的是在討論“面試前該不該刷題”這個話題,而這篇文章將會更加聚焦在面試前如何準備,以及工作當中如何學習這個話題上,而且會盡量寫出一些幹貨。

技術分享圖片

第一個問題:阿裏面試都問什麽? 這個是讓我最頭疼的一個問題,也是群裏的猿友們問的最多的一個問題。 說實話,我只能隱約想起並發、JVM、分布式、TCP/IP協議這些個關鍵字,具體的問題真的是幾乎都沒記住。而且就算我記住了,也告訴你了,你也背會了,但我覺得,在面試中,你被問到一模一樣問題的可能性依然很小。 甚至,就算你運氣好被問到了,你也照著背下來了,也不一定就能對你的面試起到正面的作用,因為面試官萬一多問一句,你可能就露餡了,那還不如幹脆點說不會更好。 我參加的是阿裏的社招面試,而社招不同於校招,問題的範圍其實是很隨機的。因為能參加一些比較知名的互聯網公司社招的人,70%以上都會有個3-5年的經驗。這倒不是說一兩年經驗的同學沒有機會進這些公司,而是因為這種公司,大部分情況下只招一些比較資深的開發和應屆生,而不招那些處於中間階段的人。而1-2年經驗的同學,往往就剛好處於這個尷尬的階段。 對於能有3-5年經驗的這部分人中,每個人的經歷又都不同,所擅長的點也不一樣,因此這就會導致每個人的問題和範圍都不太一樣。 很少說有哪個知名的互聯網公司,比如BAT、京東、360、搜狐、網易等這些公司,其社招面試還有固定的問題和模式,讓你可以像應屆生面試一樣,在面試前靠臨時抱佛腳度過這一關。 大部分公司在社招的時候,不光是阿裏,其它公司也都一樣(因為我在一年多前也參加過很多其它知名互聯網公司的面試,詳情見《記錄2015年年初跳槽的經歷!》),基本上都分為兩個階段的提問。 第一個階段是主語言本身以及它的高級特性,第二個階段是講述自己的項目,並在中間穿插著問題。 所以,我不妨就這兩個階段,談談社招面試的準備,而不是去把阿裏面試的過程背一遍。說實話,我也確實記不住,所以不要再問我阿裏面試都會問哪些問題了,你看看上面那個連接裏的文章,也會發現,我裏面也基本上沒有寫具體的問題,原因是一樣的,真的記不住啊。(就是因為記憶力的問題,導致我從小偏科,文科成績一直堪憂,-_-) 社招面試如何準備 我會分為四個部分來談論這個問題,由於我本身是Java出身,因此關於主語言的問題,都是與Java相關,其它語言的同學可以選擇性忽略。此外,面試的時候一般面試官的問題都是環環相扣,逐漸深入的,這點在下面大家可以更明顯的感受出來。 1、主語言本身以及它的高級特性。 主語言當然就是你平日裏拿來賺錢的家夥。不要告訴我你沒有主語言,你會N多種語言,或者是你精通N多種語言,你要非這麽說的話,你可以來杭州試試,我保證不打死你,最多打殘。 我的主語言很顯然是Java,那麽對於Java來說,它的語言本身以及它的高級特性,都有哪些比較容易在面試中問到呢? 一般情況下,主要有以下知識點很容易被問到。(PS:以下所列舉的,都是一些Java相對而言比較高級一點的知識點,因為這裏談的是社招,而不是校招) 1)Java的數據結構相關的類實現原理,比如LinkedList,ArrayList,HashMap,TreeMap這一類的。以下簡單模擬一個數據結構的連環炮。 比如,面試官先問你HashMap是不是有序的? 你肯定回答說,不是有序的。那面試官就會繼續問你,有沒有有順序的Map實現類? 你如果這個時候說不知道的話,那這個問題就到此結束了。如果你說有TreeMap和LinkedHashMap。 那麽面試官接下來就可能會問你,TreeMap和LinkedHashMap是如何保證它的順序的? 如果你回答不上來,那麽到此為止。如果你依然回答上來了,那麽面試官還會繼續問你,你覺得它們兩個哪個的有序實現比較好? 如果你依然可以回答的話,那麽面試官會繼續問你,你覺得還有沒有比它更好或者更高效的實現方式? 如果你還能說出來的話,那麽就你所說的實現方式肯定依然可以問你很多問題。 以上就是一個面試官一步一步提問的例子。所以,如果你了解的不多,千萬不要敷衍,因為可能下一個問題你就暴露了,還不如直接說不會,把這個問題結束掉,趕緊切換到你熟悉的領域。 2)Java並發包當中的類,它們都有哪些作用,以及它們的實現原理,這些類就是java.concurrent包下面的。與上面一樣,咱們也簡單的模擬一個並發包的連環炮。 比如面試官可能會先問你,如果想實現所有的線程一起等待某個事件的發生,當某個事件發生時,所有線程一起開始往下執行的話,有什麽好的辦法嗎? 這個時候你可能會說可以用柵欄(Java的並發包中的CyclicBarrier),那麽面試官就會繼續問你,你知道它的實現原理嗎? 如果你繼續回答的話,面試官可能會繼續問你,你還知道其它的實現方式嗎? 如果你還能說出很多種實現方式的話,那麽繼續問你,你覺得這些方式裏哪個方式更好? 如果你說出來某一個方式比較好的話,面試官依然可以繼續問你,那如果讓你來寫的話,你覺得還有比它更好的實現方式嗎? 如果你這個時候依然可以說出來你自己更好的實現方式,那麽面試官肯定還會揪著這個繼續問你。 為什麽說面試的時候要引導面試官,原因就在這了。因為面試官的提問很多時候都是有跡可循的,你如果抓住了他的軌跡,能夠猜到他下面很可能會問什麽,那你在回答的時候就可以往你想要談的方向去說。這樣面試時就會顯得更加從容,更加的遊刃有余。 3)IO包和NIO包中的內容。這部分裏面NIO會是重點,IO包大部分都會比較熟悉,因此可能會直接略過,直接問你NIO的內容。 IO包和NIO包的內容相對來說不是很多,首先NIO模型要熟悉,特別是其中的selector一定要非常清楚它的職責和實現原理。其實NIO的核心是IO線程池,一定要記住這個關鍵點。有的時候,面試官可能也會問你IO包的設計模式(裝飾器模式),為什麽要這樣設計? 有的面試官還會問你有沒有更好的設計,這個時候如果你不知道請果斷說自己現在的水平有限,想不出來更好的設計,千萬不要信口開河,隨意YY。 4)Java的虛擬機的內容。這部分主要包括三部分,GC、類加載機制,以及內存。 一個GC部分簡單的連環炮。

技術分享圖片

面試官可以先問你什麽時候一個對象會被GC? 接著繼續問你為什麽要在這種時候對象才會被GC? 接著繼續問你GC策略都有哪些分類? 你如果說出來了,繼續問你這些策略分別都有什麽優劣勢?都適用於什麽場景? 你繼續說出來了以後,給你舉個實際的場景,讓你選擇一個GC策略? 你如果選出來了,繼續問你,為什麽要選擇這個策略? 下面是關於類加載機制的簡單連環炮。 首先肯定是先問你Java的類加載器都有哪些? 回答了這些以後,可能會問你每個類加載器都加載哪些類? 說完以後,可能會問你這些類加載之間的父子關系是怎樣的? 你在回答的時候可能會提到雙親委派模型,那麽可以繼續問你什麽是雙親委派模型? 你解釋完了以後,可能會繼續問你,為什麽Java的類加載器要使用雙親委派模型? 你回答完以後,可能會繼續問你如何自定義自己的類加載器,自己的類加載器和Java自帶的類加載器關系如何處理? 再來一個關於內存的連環炮。 首先肯定就是問你內存分為哪幾部分,這些部分分別都存儲哪些數據? 然後繼續問你一個對象從創建到銷毀都是怎麽在這些部分裏存活和轉移的? 接著可能會問你,內存的哪些部分會參與GC的回收? 完事以後,可能還會問你Java的內存模型是怎麽設計的? 你回答了以後,還會繼續問你為什麽要這麽設計? 問完以後,還可能會讓你結合內存模型的設計談談validate關鍵字的作用? 你在談的時候,肯定會提到可見性,那麽接著可見性這三個字,還可以繼續問你並發的內容。 基本上Java語言本身以及語言稍微高級點的內容就是以上部分,如果你能把以上四部分了解的非常透徹,那基本上Java這部分就沒啥問題了,因為光以上的內容就夠你跟面試官聊很久了。你聊這些聊得久了,自然問你其它問題的時間就會短點。 你從我寫這些問題的過程也應該能感受出來,很多時候,面試官都是順著一條線一路問下去的,如果你覺得這條線你不熟悉的話,就要及時拐彎,引導面試官去問其它方面的問題。千萬不要一直往下深入,直到自己跳不出來為止,那就尷了個尬了。 2、講述自己的項目,並在中間穿插著問題 這一部分是面試過程中必問,也是聊得最久的一個階段。除非你前面的語言部分非常紮實,紮實到面試官問了一兩個小時,依舊沒有探出你對語言本身的了解到底有多深。否則的話,你一定逃不過自己的項目這一關,而且一般情況下聊得時間不會太短。 這一部分內容,一般的模式就是你自己去講你做過的項目,然後面試官會冷不丁的讓你去解釋其中某一部分,比如讓你解釋當時為什麽要這麽做,或者問你現在覺得有沒有更好的辦法。而這些穿插的問題,大部分與你的項目所用到的技術有關。而你需要做的,就是充分、再充分的去總結自己做過的項目(尤其是最近的一兩個項目),挖掘出一個甚至N個亮點,以備於到時候可以讓面試官產生眼前一亮的感覺。如果你能達到這種效果的話,基本上離你成功就不遠了。 這部分內容由於和每個人自己的經歷息息相關,因此這裏也沒法列舉可能問到的問題。這篇文章《程序員面經:面試前到底該不該刷題以及面試前該如何準備》是我之前寫的,裏面大概討論了下如何在面試前總結,有興趣的可以去了解一下。 3、額外的加分項 上面兩個階段基本上是必問的,還有一些加分項。這些加分項中,有些內容面試官也會問你(比如TCP/IP協議、算法),但更多的是會先問你了解不了解,你了解的話再繼續聊,不了解的話就直接略過了,不至於因為這種問題而直接把你打入地獄。

技術分享圖片

下面我列舉一下這些加分項,如果可以的話,這些加分項還是要爭取一下的。 計算機系統原理。 網絡通信協議(TCP/IP,HTTP等)。 數據結構與算法。 著名開源項目的源碼。 你自己有很棒的開源項目。 你的個人博客。 待評論區補充。 這幾項當中,對於前1-3項,如果你之前就比較了解,只是由於時間問題忘記了的話,還是可以臨時抱佛腳一下的。至於後面4-6項,就需要你日常的積累了,不是一時半會兒能做到的。如果你平日裏沒有積累,那麽後面這三個加分項只能拋棄了。 4、與你職位相關的內容 其實這最後一項是對前面三項的補充,你應該盡量去主攻和你面試的職位相關的內容。比如你面試一個實時計算的職位,那麽你的算法最好要厲害,對於著名的實時計算開源項目要熟悉,最好閱讀過源碼,而且還要對分布式系統有一定的見解。 因此,這個第4部分沒有具體的內容,只是提醒你,如果你很明確自己的面試職位,最好在面試前準備的時候,盡量朝職位的需求方向靠攏,這樣成功的可能性更大。 好了,說了這麽多了,就到此為止吧,希望本文可以幫助到作為程序猿或即將成為程序猿的你。 如果你也愛java喜歡java那麽加入我們的java自學交流群 544975743和我們一起學習成長,給自己一次蛻變IT高薪的機會。我們學的不僅是技術更是夢想

如何準備阿裏社招面試和面試各個階段的小建議