1. 引言
繼上次“百度2015校園招聘面試題回憶錄(成功拿到offer)”文章過后匾寝,大家都希望除了題目之外盯蝴,最好能給出自己當時的回答情況碘耳,看看有沒有什么回答技巧,這樣更有參考價值僻澎。
嗯,建議的很對十饥,因此這次對于阿里的面試回憶窟勃,我下面以對話的形式盡可能復現(xiàn)我當初的面試場景。
聲明:下面只復述我覺得有參考價值的面試題逗堵,實際面試題比這多些(有些不記得了)秉氧,需要找工作的請認真看完(對Java方向的同學更有幫助),不需要的大牛們請一笑置之蜒秤。
2. 阿里面試回憶
在說具體的面試場景之前汁咏,一個小插曲很有必要說一下:
由于我面的是Java開發(fā),但當時負責人員給我安排了一個C++面試官(在面試官桌子上放著一個“C++方向”的牌子)作媚,然后我就跟負責人說“我是面Java方向的攘滩,不是C++方向的”,結(jié)果那個面試官笑呵呵的說“沒關(guān)系掂骏,在我這面一樣的轰驳,如果你不懂C++,我可以不問你C++語言方面的細節(jié)問題”,當時我心里想:雖然我C++學的和Java差不多级解,就算面C++也沒有問題冒黑。但是既然面試官這么說了,肯定不問C++了勤哗,Java估計也不會問(C++方向的工程師不一定懂Java呢)抡爹,應(yīng)該是問數(shù)據(jù)結(jié)構(gòu)、算法芒划、網(wǎng)絡(luò)冬竟、操作系統(tǒng)方面的問題了。雖然都有所準備民逼,面起來也可以泵殴,但是鑒于兩個方面的原因,我還是沒答應(yīng)在這面拼苍。
(1)據(jù)說阿里90%都是招Java工程師笑诅,如果在這面后面肯定會以為我是面C++的,勝算就少了疮鲫;
(2)我這幾個月基本上都在專研Java方向的知識吆你,也研究了不少JDK源碼和Java相關(guān)的項目,感覺自己的Java方向知識有了一個質(zhì)的提高俊犯,因此希望面試官能夠考查和檢驗我這方面的知識妇多。
因此我當時跟那個面試官說“不好意思,我還是希望能面Java方向的知識”燕侠,那個面試官依舊笑呵呵“如果你對Java知識的確非常自信者祖,那么可以給你換個Java方向的面試官”,然后我只能說“是的贬循,我有研究過很多JDK源碼咸包,也做了不少Java項目”。最后杖虾,我出去找負責人給我安排Java方向的面試官烂瘫,負責人說“那你要等會兒才行,估計要半個小時”奇适》乇龋“哦,沒關(guān)系嚷往,那我等會吧”葛账,心里想:等不怕,方向搞錯了才要命皮仁。
說上面這段插曲的目的是想告誡大家籍琳,如果你有比較明確的方向菲宴,比如“我以后一定要做C++/Java方向的開發(fā)”,那么一定要強調(diào)出來趋急。如果像阿里這樣每個面試官都有個方向牌那很容易搞定喝峦,如果沒有則可以在面試一開始的自我介紹或找其它機會說出來讓面試官知道,可能有人認為語言不重要呜达,關(guān)鍵是算法谣蠢、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)云云……是的查近,很多面試官都跟我說過:在以后的工作過程中眉踱,語言不重要,重要的是你以后做的東西是不是你感興趣的霜威,但是我認為語言在面試過程中是有非常大的關(guān)系的蔚携,如果你是C++方向贡这,那么面試官可能會問你一些虛函數(shù)機制卫袒、Linux下的內(nèi)存分配策略齐婴、內(nèi)存管理、常用系統(tǒng)調(diào)用等這方面的知識矮冬;如果你主攻Java,可能會問集合類區(qū)別次哈、可研究過jdk源碼胎署、數(shù)據(jù)庫等方面的知識。
因此面試的第一步就是讓面試官明確知道你主攻的語言方向(可能也有較好的面試官會在提問之前首先問你懂Java還是C++)窑滞,如果你兩個方向都非常懂并且沒有比較偏愛的方向琼牧,那就無所謂了。
一面:技術(shù)面(大概40 minutes)
半個小時沒到哀卫,終于給我安排了個Java方向的面試官巨坊,這次交流非常愉快。下面的“面”代表面試官此改。
第一階段:自我介紹
面: 請簡單自我介紹下趾撵。
我: 我是XX大學計算機專業(yè)的一名XX,我研究生期間的方向是XX共啃,……(方向簡單描述)占调。12年暑期在XX公司實習了4個月,做的是XX(在一所不知名的本地小公司實習過)……(其它重要項目的簡述)移剪。另外究珊,自己是名開源積極分子,有自己的Github纵苛,而且今年暑期參加了CSDN舉辦的開源夏令營活動剿涮,做的是……
階段總結(jié):上面只是我自己當時的一個簡單自我介紹言津,經(jīng)驗不足講的比較亂,而且忘了講自己十分熱衷技術(shù)取试,平時喜歡寫技術(shù)博客等事情(有些情況下可以加分呢)纺念。建議大家都定制好自己的版本,講出自己的亮點想括。
第二階段:介紹研究生期間的論文項目陷谱,針對介紹提出幾個相關(guān)的技術(shù)問題
面:好,我看下簡歷瑟蜈。(然后對著我的簡歷看了十幾秒烟逊,指著我的第一個項目)這是你剛說的研究生的論文項目吧(我嗯),那你把這個項目詳細說下铺根。
我:我從項目的選題(為啥要做這個方向)宪躯、項目采用的技術(shù)、新穎的地方位迂、最終達到的效果(由于我做的是某個算法的性能提高访雪,那么我就會講速度提高了多少?空間壓縮了多少掂林?)這幾個方面詳細介紹了自己的項目臣缀。
下面就是針對我的敘述具體問了幾個技術(shù)相關(guān)點,這沒什么好說的泻帮,因為每個人做的項目不一樣精置,問的東西也不一樣。
階段總結(jié):其實要求講的這個項目是用C++寫的而不是Java锣杂,不過沒關(guān)系脂倦,對于項目而言,語言就不是很重要了元莫,關(guān)鍵是項目的架構(gòu)赖阻、所采用的技術(shù)、能達到什么樣的效果踱蠢。面試官選的項目一般要么是簡歷中項目經(jīng)驗的第一個火欧、要么是有他感興趣的、要么項目做的時間比較長的朽基,因此建議在寫簡歷時布隔,把你認為最有把握的項目放在第一位(而不是傳說中的要按時間倒序來寫項目經(jīng)驗),沒太大把握的不要寫(被抽問到就慘了)稼虎。只要你真真正正的吃透了被抽到的項目衅檀,那么這個項目提問階段是完全easy的。
第三階段:Java方向的知識霎俩,包括JVM原理哀军、垃圾回收機制等
面:你Java學的怎么樣沉眶?
我:還可以,有研究過部分JDK源碼杉适,比如常用的集合類如HashMap/Hashtable谎倔、ArrayList/LinkedList、Vector等猿推,還有Java5之后的并發(fā)包JUC如concurrentHashMap片习、Executor框架、CopyOnWrite容器等蹬叭。自己很欣賞Java巧妙的垃圾回收機制藕咏,看過周志明的《深入理解Java虛擬機》,因此對JVM相關(guān)的知識有所掌握……
面: 嗯秽五,學的挺深的孽查,那你把JVM的結(jié)構(gòu)和類加載原理說下。
我:馬上拿起桌上的筆和紙坦喘,把虛擬機運行時包含的幾個數(shù)據(jù)區(qū)和執(zhí)行引擎畫了下,包括方法區(qū)瓣铣、虛擬機棧、本地方法棧绿映、堆和程序計數(shù)器,然后介紹每個區(qū)域有什么作用腐晾,最后講ClassLoader的類加載機制,還順便說了下雙親委派機制丐一。
面:(面試官點頭表示滿意)你剛剛說Java的GC機制很巧妙,那么它的巧妙之處在哪里巨柒?
我:我從兩個方面說下自己的理解:一是Java的內(nèi)存分配原理與C/C++不同,C/C++每次采用malloc或new申請內(nèi)存時都要進行brk和mmap等系統(tǒng)調(diào)用柠衍,而系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間洋满,每次都要中斷進行切換,這需要一定的開銷牺勾,而Java虛擬機是先一次性分配一塊較大的空間阵漏,然后每次new時都在該空間上進行分配和釋放翻具,減少了系統(tǒng)調(diào)用的次數(shù)回还,節(jié)省了一定的開銷,這有點類似于內(nèi)存池的概念柠硕;二是有了這塊空間過后,如何進行分配和回收就跟GC機制有關(guān)了闻葵,然后我詳細介紹了GC原理诫咱、畫圖表示年輕代(Eden區(qū)和Survival區(qū))、年老代竟痰、比例分配及為啥要這樣分代回收(我認為巧妙就在于這里)掏呼,有了GC基本結(jié)構(gòu)后,我又詳述了下GC是具體如何進行內(nèi)存分配和垃圾回收的莽鸿。
面:(面試官一直點頭表示對我回答的贊同)嗯拾给,看來你對這塊的確掌握了,對了蒋得,你說你參加的CSDN開源夏令營項目是阿里的是吧(我點頭)额衙,這個夏令營是什么情況?
我:我簡單介紹了CSDN舉辦此次夏令營的目的窍侧,順便說道此次夏令營活動當初有2000多人報名參加,最終只篩選出60多名硼啤,自己憑著開題報告和對開源的熱愛贏得了導師的青睞得以入選锋爪。
面:你導師是誰爸业?
我:淘寶的XX亏镰。
面:哦索抓,他啊,我認識呢逼肯,他是……(后面就簡單閑聊了幾句篮幢,該階段結(jié)束,面試官讓等會兒準備二面)
階段總結(jié):上面的對話有人看了過后可能會說:好簡單啊三椿,問的題目都是你會的搜锰,當然能過啦。是的蛋叼,其實這是有技巧在里面的,就是要想辦法“先下手為強”狐胎,啥意思歌馍?即讓自己成為主動攤牌者而不是被動回答者,找機會跟面試官說自己熟練掌握了哪些方面的知識、自己喜歡專研什么等等玻褪,就像上面我所做的公荧,一開始攤牌說明自己掌握的知識處在哪些地方,引導面試官去問你想讓他問的知識點窟社,這樣達到雙贏的目的(你爽了,面試官也輕松了灿里,因為他不用老是猜你可能知道哪些東西然后試探性的問你這個會嗎那個了解過嗎)匣吊。
二面:技術(shù)面 + HR面(大概1 hour)
一面很輕松的就過了,但是二面就相對而言有些吃力色鸳,問的完全是項目相關(guān),而且不是我最熟的研究生期間的論文項目蒜哀,而是另外兩個項目吏砂,由于復習不到位,某些地方回答的不完善统倒。
第一階段:自我介紹氛雪,同上
第二階段:介紹面試官感興趣的兩個項目,一個與推薦系統(tǒng)相關(guān)报亩,另一個與Java web相關(guān)
面: 介紹下你簡歷上的這個電影個性化推薦引擎,使用的是哪種推薦算法弦追?
我: 改進的基于用戶的協(xié)同過濾推薦算法。
面: 那好掸哑,那你從項目的基本架構(gòu)零远、所使用的算法原理牵辣、如何改進的、數(shù)據(jù)如何處理這幾個方面介紹下你的項目吧。
我: 我首先畫了下項目的架構(gòu)圖戴卜,據(jù)此圖詳細講了下UserCF的原理及如何使用用戶的社交數(shù)據(jù)和六維理論改進傳統(tǒng)的UserCF琢岩,并寫出了改進后的算法公式。然后又說這個項目的數(shù)據(jù)多大薇缅,代碼中采用什么數(shù)據(jù)結(jié)構(gòu)進行處理的攒磨。
面: (介紹原理中提到了利用用戶相似性來作為推薦的一個參考娩缰,面試官追問)那用戶的相似性你怎么算的?
我: (汗拼坎,這個有個計算公式泰鸡,我不太記得了,最后根據(jù)自己的理解講了下余弦相似性的計算方式盛龄,公式?jīng)]寫全余舶,面試官問公式里的根號怎么算的,我說直接用Java的庫函數(shù))
面: 你這數(shù)據(jù)哪來的匿值?有幾類數(shù)據(jù)挟憔?數(shù)據(jù)的存儲格式是什么?
我: (該項目時間有點久了厘唾,前幾天只復習了項目的整體架構(gòu)和算法原理龙誊,忘了看具體的數(shù)據(jù)了喷楣,這里只能憑自己的記憶講了下數(shù)據(jù)的存儲格式鹤树,回來后發(fā)現(xiàn)自己講的雖然沒錯但不夠具體)
附:該電影個性化推薦引擎我早已經(jīng)放到了自己的Github上面逊朽,是自己在老師的指導下做的叽讳,純算法,還比較簡單有待于改進邑狸。
介紹完了這個項目涤妒,馬上面試官又看中了另一個Java web相關(guān)的項目,馬上追問硅堆。
面:嗯贿讹,你這個XX系統(tǒng)是用ssh2框架做的,那你對這個框架熟嗎茄菊?
我:嗯助赞,當時在公司實習時對ssh的掌握程度只是會使用級別,那時候沒時間去研究框架背后的原理畜普。后來有閑暇時間后群叶,我就深入研究了下這幾個框架的原理,還看了部分spring的源碼舶衬,學到了不少知識赎离。
面:嗯,那你把這三個框架都介紹下虽画。
我:我開始按自己的理解按Hibernate、Struts渗柿、Spring的順序開始講脖岛,Hibernate講到它的使用原理及與iBATIS的對比,順便說了下現(xiàn)在似乎大家更傾向于使用iBATIS陨溅、myBATIS這樣更加靈活的輕量級框架轩性。struts講了下它的作用就是“將請求與視圖分開”揣苏,然后講述從輸入url到使用struts處理的控制流程(struts從tomcat那接管、action處理)卸察,然后也說struts現(xiàn)在似乎也不那么傾向于使用因為它有漏洞坑质。最后重點講了下重頭戲Spring,詳細講述了它解耦的功能稼跳、AOP原理及自己有利用動態(tài)代理簡單模擬實現(xiàn)過一個簡單的AOP功能吃沪、IOC(DI)等。最后說红淡,從web應(yīng)用層面上看降铸,Hibernate屬于持久層,struts屬于表示層桶蝎,而Spring卻貫穿所有于所有層(表示層、業(yè)務(wù)層雾家、持久層)绍豁,Spring也有自己的MVC模塊竹揍、web模塊及JDBC和DAO模塊邪铲,只是很少使用,也就是只用一個Spring也是完全可以的昧碉。
面:(點頭表示肯定)你剛說到struts有漏洞揽惹,那么Hibernate是安全的嗎?有沒有可能發(fā)生xss攻擊和sql注入攻擊狭握?
我:(汗疯溺,這個問題真心沒想過囱嫩,對Hibernate的掌握沒有Spring那么深,只能硬著頭皮按自己的理解回答)這個問題沒想過今妄,不過我覺得框架沒有絕對的安全损俭,Hibernate是用來操作數(shù)據(jù)庫的,hql語句里也有select雁仲、where判斷琐脏,應(yīng)該有可能發(fā)生sql注入攻擊,xss攻擊就不太清楚了吹艇。(這個回答太糟了)
面試官沒說啥,一直在電腦上寫著什么東西抛猖。這時候旁邊的HR終于發(fā)話了鼻听。
HR: 你本科是哪的撑碴?為什么選擇考研?
我: 開始說出我的“發(fā)家史”伟姐,從一所不知名的小二本考到了中科大亿卤,……
HR: 那你技術(shù)上是怎么學習的怠噪?
我: 又從本科說起,本科技術(shù)很差傍念,到了研究生期間才真正開始技術(shù)上的修煉憋槐,……balabala
HR: 你的職業(yè)規(guī)劃是什么?
我: ……(每個人的想法不一樣)
HR: 你最大的優(yōu)勢是什么忧陪?
我: (自己吹吧近范,也要根據(jù)實際情況看)
……
階段總結(jié):再次說明項目的重要性评矩,第一個項目有些記憶模糊,答的有瑕疵虱颗,這里要引以為戒(一定要對項目知根知底),第二個項目感覺答的還可以高帖,不過Hibernate安全問題沒答出來畦粮,我覺得只要你其它問題答的很好,有個別問題答不出來是不會影響最終的offer的爪飘。HR面也很重要拉背,你得說通了椅棺,需要提前考慮好常見問題的回答齐蔽。
第三階段:到你提問了
自由發(fā)揮階段,可以問問公司內(nèi)部的培養(yǎng)計劃诱渤、晉升機制谈况、是否經(jīng)常有大牛分享技術(shù)讓我們學習等等……
3. 總結(jié)
(1)整個面試過程中沒讓寫代碼碑韵,沒問Linux下的一些知識,也沒問操作系統(tǒng)占卧、計算機網(wǎng)絡(luò)相關(guān)联喘,我覺得可能是Java面試更傾向于從項目中問相關(guān)的技術(shù)問題,如果你沒項目或項目不多叭喜,那么就可能問這些計算機基礎(chǔ)知識了堤框。
(2)由于之前內(nèi)推電面的失敗,讓我喪失了一些小自信启绰,因此在這次阿里的整體面試過程中還是有些緊張委可,大家請引以為戒,務(wù)必在面試中保持淡定的心態(tài)拾酝,就當是和朋友在一起交流技術(shù)問題卡者。
(3)最后崇决,希望我上面對話形式的面經(jīng)能夠給正在找工作或以后找工作的同學們帶來一些借鑒意義,希望你們能夠從中看出某些問題的答題技巧和所做的準備工作脸侥。
PS:更多的筆試面試分享文章可以去看我的CSDN專欄《敏敏筆試面試分享》盈厘,也會將有用的文章逐步移至我更喜歡的簡書平臺來沸手。