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

1. 引言

繼上次「百度2015校園招聘面試題回憶錄(成功拿到offer)」文章事後,你們都但願除了題目以外,最好能給出本身當時的回答狀況,看看有沒有什麼回答技巧,這樣更有參考價值。git

嗯,建議的很對,所以此次對於阿里的面試回憶,我下面以對話的形式儘量復現我當初的面試場景。github

聲明:下面只複述我以爲有參考價值的面試題,實際面試題比這多些(有些不記得了),須要找工做的請認真看完(對Java方向的同窗更有幫助),不須要的大牛們請付之一笑。web

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方向的面試官,負責人說「那你要等會兒才行,估計要半個小時」。「哦,不要緊,那我等會吧」,內心想:等不怕,方向搞錯了纔要命。spring

說上面這段插曲的目的是想告誡你們,若是你有比較明確的方向,好比「我之後必定要作C++/Java方向的開發」,那麼必定要強調出來。若是像阿里這樣每一個面試官都有個方向牌那很容易搞定,若是沒有則能夠在面試一開始的自我介紹或找其它機會說出來讓面試官知道,可能有人認爲語言不重要,關鍵是算法、數據結構、操做系統云云……是的,不少面試官都跟我說過:在之後的工做過程當中,語言不重要,重要的是你之後作的東西是否是你感興趣的,可是我認爲語言在面試過程當中是有很是大的關係的,若是你是C++方向,那麼面試官可能會問你一些虛函數機制、Linux下的內存分配策略、內存管理、經常使用系統調用等這方面的知識;若是你主攻Java,可能會問集合類區別、可研究過jdk源碼、數據庫等方面的知識。sql

所以面試的第一步就是讓面試官明確知道你主攻的語言方向(可能也有較好的面試官會在提問以前首先問你懂Java仍是C++),若是你兩個方向都很是懂而且沒有比較偏心的方向,那就無所謂了。數據庫


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

半個小時沒到,終於給我安排了個Java方向的面試官,此次交流很是愉快。下面的「面」表明面試官。tomcat

第一階段:自我介紹

面: 請簡單自我介紹下。
我: 我是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)最後,但願我上面對話形式的面經可以給正在找工做或之後找工做的同窗們帶來一些借鑑意義,但願大家可以從中看出某些問題的答題技巧和所作的準備工做。

相關文章
相關標籤/搜索