天天看點

2015校招面試回憶錄 阿裡2015校招面試回憶錄(成功拿到offer)

引言

盼望着,盼望着……今年終于輪到我找工作了,還深深記得去年跟在師兄後面打各種醬油的經曆,當時覺得找工作好難啊,怎麼面一個敗一個,以後還能找到工作不?

不過當時的失敗也是理所當然的,那時候沒有做任何準備(連程序間有幾種通信方式這樣老掉牙的題我都不知道),沒有任何找工作的經驗,甚至一個簡單的自我介紹都吞吞吐吐的。

經過一年時間的磨練,特别是近幾個月的強度知識吸收,感覺個人在能力和知識儲備方面有了質的提高,這大大提高了我的自信心,也讓我在這個秋季的求職生涯最終以較滿意收場。

截止目前為止,找工作總算告一段落。初次找工作,隻投了前面的幾家公司(有百度、阿裡、美團、搜狗、華為等),今年比較幸運,面的幾家公司都成功拿到offer,也算是初戰告捷。這些公司的招聘結束後我就沒再參加後面的一些大型網際網路公司了,比如奇虎360、網易、愛奇藝、金山等等,不像我的一些同學,手裡offer多的都拿不動了,也有滿意的了,可還是滿懷幹勁的參加後面的招聘,真心不知道他們的精力和耐力從何而來,可能是他們想成為傳說中的offer帝和面霸吧。我個人無喜于那些稱謂,既然有了較滿意的offer就不想再耗費太多的精力去争根本不會考慮的offer,也可能是自己的惰性所為……

OK,廢話到此為止,下面簡單回顧下自己在百度面試過程中的一些題目,給還在找工作或将來要找工作的同學一個淺薄的參考。

百度面試題

一面(1 hour):

1.面試官從履歷裡抽了一個較感興趣的項目,讓把項目簡單介紹了下,針對項目問了幾個技術問題

2. 介紹Java中垃圾回收機制,程式員平時需要關注這個嗎?為什麼?請舉例說明。

3. 資料庫隔離級别介紹、舉例說明。

4. override和overload的差別。

5. 求二叉樹的最大距離(即相距最遠的兩個葉子節點),寫代碼。

6. 兩個棧實作一個隊列,寫代碼。

7. 你覺得你的優勢是什麼?有什麼技術薄弱點嗎?

8. 目前手上有offer嗎?

二面(40 minutes):

1.詳細介紹研究所學生期間的小論文項目。

2. 求二叉樹的寬度,先簡介思路再寫代碼。

3. Hashmap、Hashtable和cocurrentHashMap的差別,要講出它們各自的實作原理才行,比如Hashmap的擴容機制、cocurrentHashMap的桶分割原理、多線程安全性。

4. 程序排程算法,有哪些算法比較難實作?

5. linux下如何修改程序優先級?(nice指令的使用)。

6. linux下性能監控指令uptime介紹,平均負載的具體含義是什麼?建議看server load概念。

7. linux下如何調試程式?說到gdb,具體如何調試?如何檢視core檔案中的堆棧資訊等(bt指令)。

三面(1 hour and twenty minutes):

1.介紹我研究所學生期間的論文,講的很詳細,每個點具體采用的技術、實作方法等,花了較長時間。

2. 列印二叉樹兩個葉子節點間的路徑,寫代碼(汗,百度這麼喜歡問二叉樹)。

3. 字元串中第一個隻出現一次的字元,如何優化算法使得周遊次數更少?

4. socket程式設計相關,如果伺服器這邊調用write寫了100個位元組的資料,用戶端想要獲得這個資料,是直接用read系統調用,參數也是100嗎?

5. 百度新聞緩存預算問題:一般為了追求時間性能,都需要緩存一些新聞資料,你怎麼計算所需預算?然後申請需要的主機……

6. 多線程的适用場景是什麼?為啥要用多線程?

7. 問是否會go語言,……

8. 為啥對技術感興趣,一些相關問題讨論。

9. 聊北京、談offer。

最後面試官說像計算機體系結構、作業系統這樣的書一定要看國外的,國内的有時候會誤導人。

總結

三面都是技術面,總體下來沒有特别難的題目,從我的面試情況來看,百度這次非常看重面試者對二叉樹的掌握情況,還有所做的項目詳細介紹。後面我會繼續分享自己在面試過程中的一些個人經驗和技巧。

阿裡2015校招面試回憶錄(成功拿到offer)

1. 引言

繼上次“百度2015校園招聘面試題回憶錄(成功拿到offer)”文章過後,大家都希望除了題目之外,最好能給出自己當時的回答情況,看看有沒有什麼回答技巧,這樣更有參考價值。

嗯,建議的很對,是以這次對于阿裡的面試回憶,我下面以對話的形式盡可能複現我當初的面試場景。

聲明:下面隻複述我覺得有參考價值的面試題,實際面試題比這多些(有些不記得了),需要找工作的請認真看完(對Java方向的同學更有幫助),不需要的大牛們請一笑置之。

2. 阿裡面試回憶

在說具體的面試場景之前,一個小插曲很有必要說一下:

由于我面的是Java開發,但當時負責人員給我安排了一個C++面試官(在面試官桌子上放着一個“C++方向”的牌子),然後我就跟負責人說“我是面Java方向的,不是C++方向的”,結果那個面試官笑呵呵的說“沒關系,在我這面一樣的,如果你不懂C++,我可以不問你C++語言方面的細節問題”,當時我心裡想:雖然我C++學的和Java差不多,就算面C++也沒有問題。但是既然面試官這麼說了,肯定不問C++了,Java估計也不會問(C++方向的工程師不一定懂Java呢),應該是問資料結構、算法、網絡、作業系統方面的問題了。雖然都有所準備,面起來也可以,但是鑒于兩個方面的原因,我還是沒答應在這面。

(1)據說阿裡90%都是招Java工程師,如果在這面後面肯定會以為我是面C++的,勝算就少了;

(2)我這幾個月基本上都在專研Java方向的知識,也研究了不少JDK源碼和Java相關的項目,感覺自己的Java方向知識有了一個質的提高,是以希望面試官能夠考查和檢驗我這方面的知識。

是以我當時跟那個面試官說“不好意思,我還是希望能面Java方向的知識”,那個面試官依舊笑呵呵“如果你對Java知識的确非常自信,那麼可以給你換個Java方向的面試官”,然後我隻能說“是的,我有研究過很多JDK源碼,也做了不少Java項目”。最後,我出去找負責人給我安排Java方向的面試官,負責人說“那你要等會兒才行,估計要半個小時”。“哦,沒關系,那我等會吧”,心裡想:等不怕,方向搞錯了才要命。

說上面這段插曲的目的是想告誡大家,如果你有比較明确的方向,比如“我以後一定要做C++/Java方向的開發”,那麼一定要強調出來。如果像阿裡這樣每個面試官都有個方向牌那很容易搞定,如果沒有則可以在面試一開始的自我介紹或找其它機會說出來讓面試官知道,可能有人認為語言不重要,關鍵是算法、資料結構、作業系統雲雲……是的,很多面試官都跟我說過:在以後的工作過程中,語言不重要,重要的是你以後做的東西是不是你感興趣的,但是我認為語言在面試過程中是有非常大的關系的,如果你是C++方向,那麼面試官可能會問你一些虛函數機制、Linux下的記憶體配置設定政策、記憶體管理、常用系統調用等這方面的知識;如果你主攻Java,可能會問集合類差別、可研究過jdk源碼、資料庫等方面的知識。

是以面試的第一步就是讓面試官明确知道你主攻的語言方向(可能也有較好的面試官會在提問之前首先問你懂Java還是C++),如果你兩個方向都非常懂并且沒有比較偏愛的方向,那就無所謂了。

一面:技術面(大概40 minutes)

半個小時沒到,終于給我安排了個Java方向的面試官,這次交流非常愉快。下面的“面”代表面試官。

第一階段:自我介紹

面: 請簡單自我介紹下。

我: 我是XX大學計算機專業的一名XX,我研究所學生期間的方向是XX,……(方向簡單描述)。12年暑期在XX公司實習了4個月,做的是XX(在一所不知名的本地小公司實習過)……(其它重要項目的簡述)。另外,自己是名開源積極分子,有自己的Github,而且今年暑期參加了CSDN舉辦的開源夏令營活動,做的是……

階段總結:上面隻是我自己當時的一個簡單自我介紹,經驗不足講的比較亂,而且忘了講自己十分熱衷技術,平時喜歡寫技術部落格等事情(有些情況下可以加分呢)。建議大家都定制好自己的版本,講出自己的亮點。

第二階段:介紹研究所學生期間的論文項目,針對介紹提出幾個相關的技術問題

面: 好,我看下履歷。(然後對着我的履歷看了十幾秒,指着我的第一個項目)這是你剛說的研究所學生的論文項目吧(我嗯),那你把這個項目詳細說下。

我: 我從項目的選題(為啥要做這個方向)、項目采用的技術、新穎的地方、最終達到的效果(由于我做的是某個算法的性能提高,那麼我就會講速度提高了多少?空間壓縮了多少?)這幾個方面詳細介紹了自己的項目。

下面就是針對我的叙述具體問了幾個技術相關點,這沒什麼好說的,因為每個人做的項目不一樣,問的東西也不一樣。

階段總結:其實要求講的這個項目是用C++寫的而不是Java,不過沒關系,對于項目而言,語言就不是很重要了,關鍵是項目的架構、所采用的技術、能達到什麼樣的效果。面試官選的項目一般要麼是履歷中項目經驗的第一個、要麼是有他感興趣的、要麼項目做的時間比較長的,是以建議在寫履歷時,把你認為最有把握的項目放在第一位(而不是傳說中的要按時間倒序來寫項目經驗),沒太大把握的不要寫(被抽問到就慘了)。隻要你真真正正的吃透了被抽到的項目,那麼這個項目提問階段是完全easy的。

第三階段:Java方向的知識,包括JVM原理、垃圾回收機制等

面: 你Java學的怎麼樣?

我: 還可以,有研究過部分JDK源碼,比如常用的集合類如HashMap/Hashtable、ArrayList/LinkedList、Vector等,還有Java5之後的并發包JUC如concurrentHashMap、Executor架構、CopyOnWrite容器等。自己很欣賞Java巧妙的垃圾回收機制,看過周志明的《深入了解Java虛拟機》,是以對JVM相關的知識有所掌握……

面: 嗯,學的挺深的,那你把JVM的結構和類加載原理說下。

我: 馬上拿起桌上的筆和紙,把虛拟機運作時包含的幾個資料區和執行引擎畫了下,包括方法區、虛拟機棧、本地方法棧、堆和程式計數器,然後介紹每個區域有什麼作用,最後講ClassLoader的類加載機制,還順便說了下雙親委派機制。

面: (面試官點頭表示滿意)你剛剛說Java的GC機制很巧妙,那麼它的巧妙之處在哪裡?

我: 我從兩個方面說下自己的了解:一是Java的記憶體配置設定原理與C/C++不同,C/C++每次采用malloc或new申請記憶體時都要進行brk和mmap等系統調用,而系統調用發生在核心空間,每次都要中斷進行切換,這需要一定的開銷,而Java虛拟機是先一次性配置設定一塊較大的空間,然後每次new時都在該空間上進行配置設定和釋放,減少了系統調用的次數,節省了一定的開銷,這有點類似于記憶體池的概念;二是有了這塊空間過後,如何進行配置設定和回收就跟GC機制有關了,然後我詳細介紹了GC原理、畫圖表示年輕代(Eden區和Survival區)、年老代、比例配置設定及為啥要這樣分代回收(我認為巧妙就在于這裡),有了GC基本結構後,我又詳述了下GC是具體如何進行記憶體配置設定和垃圾回收的。

面: (面試官一直點頭表示對我回答的贊同)嗯,看來你對這塊的确掌握了,對了,你說你參加的CSDN開源夏令營項目是阿裡的是吧(我點頭),這個夏令營是什麼情況?

我: 我簡單介紹了CSDN舉辦此次夏令營的目的,順便說道此次夏令營活動當初有2000多人報名參加,最終隻篩選出60多名,自己憑着開題報告和對開源的熱愛赢得了導師的青睐得以入選。

面: 你導師是誰?

我: 淘寶的XX。

面: 哦,他啊,我認識呢,他是……(後面就簡單閑聊了幾句,該階段結束,面試官讓等會兒準備二面)

階段總結:上面的對話有人看了過後可能會說:好簡單啊,問的題目都是你會的,當然能過啦。是的,其實這是有技巧在裡面的,就是要想辦法“先下手為強”,啥意思?即讓自己成為主動攤牌者而不是被動回答者,找機會跟面試官說自己熟練掌握了哪些方面的知識、自己喜歡專研什麼等等,就像上面我所做的,一開始攤牌說明自己掌握的知識處在哪些地方,引導面試官去問你想讓他問的知識點,這樣達到雙赢的目的(你爽了,面試官也輕松了,因為他不用老是猜你可能知道哪些東西然後試探性的問你這個會嗎那個了解過嗎)。

二面:技術面 + HR面(大概1 hour)

一面很輕松的就過了,但是二面就相對而言有些吃力,問的完全是項目相關,而且不是我最熟的研究所學生期間的論文項目,而是另外兩個項目,由于複習不到位,某些地方回答的不完善。

第一階段:自我介紹,同上

第二階段:介紹面試官感興趣的兩個項目,一個與推薦系統相關,另一個與Java web相關

面: 介紹下你履歷上的這個電影個性化推薦引擎,使用的是哪種推薦算法?

我: 改進的基于使用者的協同過濾推薦算法。

面: 那好,那你從項目的基本架構、所使用的算法原理、如何改進的、資料如何處理這幾個方面介紹下你的項目吧。

我: 我首先畫了下項目的架構圖,據此圖詳細講了下UserCF的原理及如何使用使用者的社交資料和六維理論改進傳統的UserCF,并寫出了改進後的算法公式。然後又說這個項目的資料多大,代碼中采用什麼資料結構進行處理的。

面: (介紹原理中提到了利用使用者相似性來作為推薦的一個參考,面試官追問)那使用者的相似性你怎麼算的?

我: (汗,這個有個計算公式,我不太記得了,最後根據自己的了解講了下餘弦相似性的計算方式,公式沒寫全,面試官問公式裡的根号怎麼算的,我說直接用Java的庫函數)

面: 你這資料哪來的?有幾類資料?資料的存儲格式是什麼?

我: (該項目時間有點久了,前幾天隻複習了項目的整體架構和算法原理,忘了看具體的資料了,這裡隻能憑自己的記憶講了下資料的存儲格式,回來後發現自己講的雖然沒錯但不夠具體)

附:該電影個性化推薦引擎我早已經放到了自己的Github上面,是自己在老師的指導下做的,純算法,還比較簡單有待于改進。

介紹完了這個項目,馬上面試官又看中了另一個Java web相關的項目,馬上追問。

面: 嗯,你這個XX系統是用ssh2架構做的,那你對這個架構熟嗎?

我: 嗯,當時在公司實習時對ssh的掌握程度隻是會使用級别,那時候沒時間去研究架構背後的原理。後來有閑暇時間後,我就深入研究了下這幾個架構的原理,還看了部分spring的源碼,學到了不少知識。

面: 嗯,那你把這三個架構都介紹下。

我: 我開始按自己的了解按Hibernate、Struts、Spring的順序開始講,Hibernate講到它的使用原理及與iBATIS的對比,順便說了下現在似乎大家更傾向于使用iBATIS、myBATIS這樣更加靈活的輕量級架構。struts講了下它的作用就是“将請求與視圖分開”,然後講述從輸入url到使用struts處理的控制流程(struts從tomcat那接管、action處理),然後也說struts現在似乎也不那麼傾向于使用因為它有漏洞。最後重點講了下重頭戲Spring,詳細講述了它解耦的功能、AOP原理及自己有利用動态代理簡單模拟實作過一個簡單的AOP功能、IOC(DI)等。最後說,從web應用層面上看,Hibernate屬于持久層,struts屬于表示層,而Spring卻貫穿所有于所有層(表示層、業務層、持久層),Spring也有自己的MVC子產品、web子產品及JDBC和DAO子產品,隻是很少使用,也就是隻用一個Spring也是完全可以的。

面: (點頭表示肯定)你剛說到struts有漏洞,那麼Hibernate是安全的嗎?有沒有可能發生xss攻擊和sql注入攻擊?

我: (汗,這個問題真心沒想過,對Hibernate的掌握沒有Spring那麼深,隻能硬着頭皮按自己的了解回答)這個問題沒想過,不過我覺得架構沒有絕對的安全,Hibernate是用來操作資料庫的,hql語句裡也有select、where判斷,應該有可能發生sql注入攻擊,xss攻擊就不太清楚了。(這個回答太糟了)

面試官沒說啥,一直在電腦上寫着什麼東西。這時候旁邊的HR終于發話了。

HR: 你大學是哪的?為什麼選擇考研?

我: 開始說出我的“發家史”,從一所不知名的小二本考到了中科大,……

HR: 那你技術上是怎麼學習的?

我: 又從大學說起,大學技術很差,到了研究所學生期間才真正開始技術上的修煉,……balabala

HR: 你的職業規劃是什麼?

我: ……(每個人的想法不一樣)

HR: 你最大的優勢是什麼?

我: (自己吹吧,也要根據實際情況看)

……

階段總結:再次說明項目的重要性,第一個項目有些記憶模糊,答的有瑕疵,這裡要引以為戒(一定要對項目知根知底),第二個項目感覺答的還可以,不過Hibernate安全問題沒答出來,我覺得隻要你其它問題答的很好,有個别問題答不出來是不會影響最終的offer的。HR面也很重要,你得說通了,需要提前考慮好常見問題的回答。

第三階段:到你提問了

自由發揮階段,可以問問公司内部的培養計劃、晉升機制、是否經常有大牛分享技術讓我們學習等等……

3. 總結

(1)整個面試過程中沒讓寫代碼,沒問Linux下的一些知識,也沒問作業系統、計算機網絡相關,我覺得可能是Java面試更傾向于從項目中問相關的技術問題,如果你沒項目或項目不多,那麼就可能問這些計算機基礎知識了。

(2)由于之前内推電面的失敗,讓我喪失了一些小自信,是以在這次阿裡的整體面試過程中還是有些緊張,大家請引以為戒,務必在面試中保持淡定的心态,就當是和朋友在一起交流技術問題。

(3)最後,希望我上面對話形式的面經能夠給正在找工作或以後找工作的同學們帶來一些借鑒意義,希望你們能夠從中看出某些問題的答題技巧和所做的準備工作。