1. 引言
繼上次《百度2015校園招聘面試題回憶(成功拿到offer)》文章過(guò)后,大家都希望除了題目之外,最好能給出自己當(dāng)時(shí)的回答情況,看看有沒有什么回答技巧,這樣更有參考價(jià)值。
嗯,建議的很對(duì),因此這次對(duì)于阿里的面試回憶,我下面以對(duì)話的形式盡可能復(fù)現(xiàn)我當(dāng)初的面試場(chǎng)景。
聲明:下面只復(fù)述我覺得有參考價(jià)值的面試題,實(shí)際面試題比這多些(有些不記得了),需要找工作的請(qǐng)認(rèn)真看完(對(duì)Java方向的同學(xué)更有幫助),不需要的大牛們請(qǐng)一笑置之。
2. 阿里面試回憶
在說(shuō)具體的面試場(chǎng)景之前,一個(gè)小插曲很有必要說(shuō)一下:
由于我面的是Java開發(fā),但當(dāng)時(shí)負(fù)責(zé)人員給我安排了一個(gè)C++面試官(在面試官桌子上放著一個(gè)“C++方向”的牌子),然后我就跟負(fù)責(zé)人說(shuō)“我是面Java方向的,不是C++方向的”,結(jié)果那個(gè)面試官笑呵呵的說(shuō)“沒關(guān)系,在我這面一樣的,如果你不懂C++,我可以不問(wèn)你C++語(yǔ)言方面的細(xì)節(jié)問(wèn)題”,當(dāng)時(shí)我心里想:雖然我C++學(xué)的和Java差不多,就算面C++也沒有問(wèn)題。但是既然面試官這么說(shuō)了,肯定不問(wèn)C++了,Java估計(jì)也不會(huì)問(wèn)(C++方向的工程師不一定懂Java呢),應(yīng)該是問(wèn)數(shù)據(jù)結(jié)構(gòu)、算法、網(wǎng)絡(luò)、操作系統(tǒng)方面的問(wèn)題了。雖然都有所準(zhǔn)備,面起來(lái)也可以,但是鑒于兩個(gè)方面的原因,我還是沒答應(yīng)在這面。
(1)據(jù)說(shuō)阿里90%都是招Java工程師,如果在這面后面肯定會(huì)以為我是面C++的,勝算就少了;
(2)我這幾個(gè)月基本上都在專研Java方向的知識(shí),也研究了不少JDK源碼和Java相關(guān)的項(xiàng)目,感覺自己的Java方向知識(shí)有了一個(gè)質(zhì)的提高,因此希望面試官能夠考查和檢驗(yàn)我這方面的知識(shí)。
因此我當(dāng)時(shí)跟那個(gè)面試官說(shuō)“不好意思,我還是希望能面Java方向的知識(shí)”,那個(gè)面試官依舊笑呵呵“如果你對(duì)Java知識(shí)的確非常自信,那么可以給你換個(gè)Java方向的面試官”,然后我只能說(shuō)“是的,我有研究過(guò)很多JDK源碼,也做了不少Java項(xiàng)目”。最后,我出去找負(fù)責(zé)人給我安排Java方向的面試官,負(fù)責(zé)人說(shuō)“那你要等會(huì)兒才行,估計(jì)要半個(gè)小時(shí)”!芭,沒關(guān)系,那我等會(huì)吧”,心里想:等不怕,方向搞錯(cuò)了才要命。
說(shuō)上面這段插曲的目的是想告誡大家,如果你有比較明確的方向,比如“我以后一定要做C++/Java方向的開發(fā)”,那么一定要強(qiáng)調(diào)出來(lái)。如果像阿里這樣每個(gè)面試官都有個(gè)方向牌那很容易搞定,如果沒有則可以在面試一開始的自我介紹或找其它機(jī)會(huì)說(shuō)出來(lái)讓面試官知道,可能有人認(rèn)為語(yǔ)言不重要,關(guān)鍵是算法、數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)云云……是的,很多面試官都跟我說(shuō)過(guò):在以后的工作過(guò)程中,語(yǔ)言不重要,重要的是你以后做的東西是不是你感興趣的,但是我認(rèn)為語(yǔ)言在面試過(guò)程中是有非常大的關(guān)系的,如果你是C++方向,那么面試官可能會(huì)問(wèn)你一些虛函數(shù)機(jī)制、Linux下的內(nèi)存分配策略、內(nèi)存管理、常用系統(tǒng)調(diào)用等這方面的知識(shí);如果你主攻Java,可能會(huì)問(wèn)集合類區(qū)別、可研究過(guò)jdk源碼、數(shù)據(jù)庫(kù)等方面的知識(shí)。
因此面試的第一步就是讓面試官明確知道你主攻的語(yǔ)言方向(可能也有較好的面試官會(huì)在提問(wèn)之前首先問(wèn)你懂Java還是C++),如果你兩個(gè)方向都非常懂并且沒有比較偏愛的方向,那就無(wú)所謂了。
一面:技術(shù)面(大概40 minutes)
半個(gè)小時(shí)沒到,終于給我安排了個(gè)Java方向的面試官,這次交流非常愉快。下面的“面”代表面試官。
第一階段:自我介紹
面: 請(qǐng)簡(jiǎn)單自我介紹下。
我: 我是XX大學(xué)計(jì)算機(jī)專業(yè)的一名XX,我研究生期間的方向是XX,……(方向簡(jiǎn)單描述)。12年暑期在XX公司實(shí)習(xí)了4個(gè)月,做的是XX(在一所不知名的本地小公司實(shí)習(xí)過(guò))……(其它重要項(xiàng)目的簡(jiǎn)述)。另外,自己是名開源積極分子,有自己的Github,而且今年暑期參加了CSDN舉辦的開源夏令營(yíng)活動(dòng),做的是……
階段總結(jié):上面只是我自己當(dāng)時(shí)的一個(gè)簡(jiǎn)單自我介紹,經(jīng)驗(yàn)不足講的比較亂,而且忘了講自己十分熱衷技術(shù),平時(shí)喜歡寫技術(shù)博客等事情(有些情況下可以加分呢)。建議大家都定制好自己的版本,講出自己的亮點(diǎn)。
第二階段:介紹研究生期間的論文項(xiàng)目,針對(duì)介紹提出幾個(gè)相關(guān)的技術(shù)問(wèn)題
面: 好,我看下簡(jiǎn)歷。(然后對(duì)著我的簡(jiǎn)歷看了十幾秒,指著我的第一個(gè)項(xiàng)目)這是你剛說(shuō)的研究生的論文項(xiàng)目吧(我嗯),那你把這個(gè)項(xiàng)目詳細(xì)說(shuō)下。
我: 我從項(xiàng)目的選題(為啥要做這個(gè)方向)、項(xiàng)目采用的技術(shù)、新穎的地方、最終達(dá)到的效果(由于我做的是某個(gè)算法的性能提高,那么我就會(huì)講速度提高了多少?空間壓縮了多少?)這幾個(gè)方面詳細(xì)介紹了自己的項(xiàng)目。
下面就是針對(duì)我的敘述具體問(wèn)了幾個(gè)技術(shù)相關(guān)點(diǎn),這沒什么好說(shuō)的,因?yàn)槊總(gè)人做的項(xiàng)目不一樣,問(wèn)的東西也不一樣。
階段總結(jié):其實(shí)要求講的這個(gè)項(xiàng)目是用C++寫的而不是Java,不過(guò)沒關(guān)系,對(duì)于項(xiàng)目而言,語(yǔ)言就不是很重要了,關(guān)鍵是項(xiàng)目的架構(gòu)、所采用的技術(shù)、能達(dá)到什么樣的效果。面試官選的項(xiàng)目一般要么是簡(jiǎn)歷中項(xiàng)目經(jīng)驗(yàn)的第一個(gè)、要么是有他感興趣的、要么項(xiàng)目做的時(shí)間比較長(zhǎng)的,因此建議在寫簡(jiǎn)歷時(shí),把你認(rèn)為最有把握的項(xiàng)目放在第一位(而不是傳說(shuō)中的要按時(shí)間倒序來(lái)寫項(xiàng)目經(jīng)驗(yàn)),沒太大把握的不要寫(被抽問(wèn)到就慘了)。只要你真真正正的吃透了被抽到的項(xiàng)目,那么這個(gè)項(xiàng)目提問(wèn)階段是完全easy的。
第三階段:Java方向的知識(shí),包括JVM原理、垃圾回收機(jī)制等
面: 你Java學(xué)的怎么樣?
我: 還可以,有研究過(guò)部分JDK源碼,比如常用的集合類如HashMap/Hashtable、ArrayList/LinkedList、Vector等,還有Java5之后的并發(fā)包JUC如concurrentHashMap、Executor框架、CopyOnWrite容器等。自己很欣賞Java巧妙的垃圾回收機(jī)制,看過(guò)周志明的《深入理解Java虛擬機(jī)》,因此對(duì)JVM相關(guān)的知識(shí)有所掌握……
面: 嗯,學(xué)的挺深的,那你把JVM的結(jié)構(gòu)和類加載原理說(shuō)下。
我: 馬上拿起桌上的筆和紙,把虛擬機(jī)運(yùn)行時(shí)包含的幾個(gè)數(shù)據(jù)區(qū)和執(zhí)行引擎畫了下,包括方法區(qū)、虛擬機(jī)棧、本地方法棧、堆和程序計(jì)數(shù)器,然后介紹每個(gè)區(qū)域有什么作用,最后講ClassLoader的類加載機(jī)制,還順便說(shuō)了下雙親委派機(jī)制。
面: (面試官點(diǎn)頭表示滿意)你剛剛說(shuō)Java的GC機(jī)制很巧妙,那么它的巧妙之處在哪里?
我: 我從兩個(gè)方面說(shuō)下自己的理解:一是Java的內(nèi)存分配原理與C/C++不同,C/C++每次采用malloc或new申請(qǐng)內(nèi)存時(shí)都要進(jìn)行brk和mmap等系統(tǒng)調(diào)用,而系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,每次都要中斷進(jìn)行切換,這需要一定的開銷,而Java虛擬機(jī)是先一次性分配一塊較大的空間,然后每次new時(shí)都在該空間上進(jìn)行分配和釋放,減少了系統(tǒng)調(diào)用的次數(shù),節(jié)省了一定的開銷,這有點(diǎn)類似于內(nèi)存池的概念;二是有了這塊空間過(guò)后,如何進(jìn)行分配和回收就跟GC機(jī)制有關(guān)了,然后我詳細(xì)介紹了GC原理、畫圖表示年輕代(Eden區(qū)和Survival區(qū))、年老代、比例分配及為啥要這樣分代回收(我認(rèn)為巧妙就在于這里),有了GC基本結(jié)構(gòu)后,我又詳述了下GC是具體如何進(jìn)行內(nèi)存分配和垃圾回收的。
面: (面試官一直點(diǎn)頭表示對(duì)我回答的贊同)嗯,看來(lái)你對(duì)這塊的確掌握了,對(duì)了,你說(shuō)你參加的CSDN開源夏令營(yíng)項(xiàng)目是阿里的是吧(我點(diǎn)頭),這個(gè)夏令營(yíng)是什么情況?
我: 我簡(jiǎn)單介紹了CSDN舉辦此次夏令營(yíng)的目的,順便說(shuō)道此次夏令營(yíng)活動(dòng)當(dāng)初有2000多人報(bào)名參加,最終只篩選出60多名,自己憑著開題報(bào)告和對(duì)開源的熱愛贏得了導(dǎo)師的青睞得以入選。
面: 你導(dǎo)師是誰(shuí)?
我: 淘寶的XX。
面: 哦,他啊,我認(rèn)識(shí)呢,他是……(后面就簡(jiǎn)單閑聊了幾句,該階段結(jié)束,面試官讓等會(huì)兒準(zhǔn)備二面)
階段總結(jié):上面的對(duì)話有人看了過(guò)后可能會(huì)說(shuō):好簡(jiǎn)單啊,問(wèn)的題目都是你會(huì)的,當(dāng)然能過(guò)啦。是的,其實(shí)這是有技巧在里面的,就是要想辦法“先下手為強(qiáng)”,啥意思?即讓自己成為主動(dòng)攤牌者而不是被動(dòng)回答者,找機(jī)會(huì)跟面試官說(shuō)自己熟練掌握了哪些方面的知識(shí)、自己喜歡專研什么等等,就像上面我所做的,一開始攤牌說(shuō)明自己掌握的知識(shí)處在哪些地方,引導(dǎo)面試官去問(wèn)你想讓他問(wèn)的知識(shí)點(diǎn),這樣達(dá)到雙贏的目的(你爽了,面試官也輕松了,因?yàn)樗挥美鲜遣履憧赡苤滥男〇|西然后試探性的問(wèn)你這個(gè)會(huì)嗎那個(gè)了解過(guò)嗎)。
二面:技術(shù)面 + HR面(大概1 hour)
一面很輕松的就過(guò)了,但是二面就相對(duì)而言有些吃力,問(wèn)的完全是項(xiàng)目相關(guān),而且不是我最熟的研究生期間的論文項(xiàng)目,而是另外兩個(gè)項(xiàng)目,由于復(fù)習(xí)不到位,某些地方回答的不完善。
第一階段:自我介紹,同上
第二階段:介紹面試官感興趣的兩個(gè)項(xiàng)目,一個(gè)與推薦系統(tǒng)相關(guān),另一個(gè)與Java web相關(guān)
面: 介紹下你簡(jiǎn)歷上的這個(gè)電影個(gè)性化推薦引擎,使用的是哪種推薦算法?
我: 改進(jìn)的基于用戶的協(xié)同過(guò)濾推薦算法。
面: 那好,那你從項(xiàng)目的基本架構(gòu)、所使用的算法原理、如何改進(jìn)的、數(shù)據(jù)如何處理這幾個(gè)方面介紹下你的項(xiàng)目吧。
我: 我首先畫了下項(xiàng)目的架構(gòu)圖,據(jù)此圖詳細(xì)講了下UserCF的原理及如何使用用戶的社交數(shù)據(jù)和六維理論改進(jìn)傳統(tǒng)的UserCF,并寫出了改進(jìn)后的算法公式。然后又說(shuō)這個(gè)項(xiàng)目的數(shù)據(jù)多大,代碼中采用什么數(shù)據(jù)結(jié)構(gòu)進(jìn)行處理的。
面: (介紹原理中提到了利用用戶相似性來(lái)作為推薦的一個(gè)參考,面試官追問(wèn))那用戶的相似性你怎么算的?
我: (汗,這個(gè)有個(gè)計(jì)算公式,我不太記得了,最后根據(jù)自己的理解講了下余弦相似性的計(jì)算方式,公式?jīng)]寫全,面試官問(wèn)公式里的根號(hào)怎么算的,我說(shuō)直接用Java的庫(kù)函數(shù))
面: 你這數(shù)據(jù)哪來(lái)的?有幾類數(shù)據(jù)?數(shù)據(jù)的存儲(chǔ)格式是什么?
我: (該項(xiàng)目時(shí)間有點(diǎn)久了,前幾天只復(fù)習(xí)了項(xiàng)目的整體架構(gòu)和算法原理,忘了看具體的數(shù)據(jù)了,這里只能憑自己的記憶講了下數(shù)據(jù)的存儲(chǔ)格式,回來(lái)后發(fā)現(xiàn)自己講的雖然沒錯(cuò)但不夠具體)
附:該電影個(gè)性化推薦引擎我早已經(jīng)放到了自己的Github上面,是自己在老師的指導(dǎo)下做的,純算法,還比較簡(jiǎn)單有待于改進(jìn)。
介紹完了這個(gè)項(xiàng)目,馬上面試官又看中了另一個(gè)Java web相關(guān)的項(xiàng)目,馬上追問(wèn)。
面: 嗯,你這個(gè)XX系統(tǒng)是用ssh2框架做的,那你對(duì)這個(gè)框架熟嗎?
我: 嗯,當(dāng)時(shí)在公司實(shí)習(xí)時(shí)對(duì)ssh的掌握程度只是會(huì)使用級(jí)別,那時(shí)候沒時(shí)間去研究框架背后的原理。后來(lái)有閑暇時(shí)間后,我就深入研究了下這幾個(gè)框架的原理,還看了部分spring的源碼,學(xué)到了不少知識(shí)。
面: 嗯,那你把這三個(gè)框架都介紹下。
我: 我開始按自己的理解按Hibernate、Struts、Spring的順序開始講,Hibernate講到它的使用原理及與iBATIS的對(duì)比,順便說(shuō)了下現(xiàn)在似乎大家更傾向于使用iBATIS、myBATIS這樣更加靈活的輕量級(jí)框架。struts講了下它的作用就是“將請(qǐng)求與視圖分開”,然后講述從輸入url到使用struts處理的控制流程(struts從tomcat那接管、action處理),然后也說(shuō)struts現(xiàn)在似乎也不那么傾向于使用因?yàn)樗新┒础W詈笾攸c(diǎn)講了下重頭戲Spring,詳細(xì)講述了它解耦的功能、AOP原理及自己有利用動(dòng)態(tài)代理簡(jiǎn)單模擬實(shí)現(xiàn)過(guò)一個(gè)簡(jiǎn)單的AOP功能、IOC(DI)等。最后說(shuō),從web應(yīng)用層面上看,Hibernate屬于持久層,struts屬于表示層,而Spring卻貫穿所有于所有層(表示層、業(yè)務(wù)層、持久層),Spring也有自己的MVC模塊、web模塊及JDBC和DAO模塊,只是很少使用,也就是只用一個(gè)Spring也是完全可以的。
面: (點(diǎn)頭表示肯定)你剛說(shuō)到struts有漏洞,那么Hibernate是安全的嗎?有沒有可能發(fā)生xss攻擊和sql注入攻擊?
我: (汗,這個(gè)問(wèn)題真心沒想過(guò),對(duì)Hibernate的掌握沒有Spring那么深,只能硬著頭皮按自己的理解回答)這個(gè)問(wèn)題沒想過(guò),不過(guò)我覺得框架沒有絕對(duì)的安全,Hibernate是用來(lái)操作數(shù)據(jù)庫(kù)的,hql語(yǔ)句里也有select、where判斷,應(yīng)該有可能發(fā)生sql注入攻擊,xss攻擊就不太清楚了。(這個(gè)回答太糟了)
面試官?zèng)]說(shuō)啥,一直在電腦上寫著什么東西。這時(shí)候旁邊的HR終于發(fā)話了。
HR: 你本科是哪的?為什么選擇考研?
我: 開始說(shuō)出我的“發(fā)家史”,從一所不知名的小二本考到了中科大,……
HR: 那你技術(shù)上是怎么學(xué)習(xí)的?
我: 又從本科說(shuō)起,本科技術(shù)很差,到了研究生期間才真正開始技術(shù)上的修煉,……balabala
HR: 你的職業(yè)規(guī)劃是什么?
我: ……(每個(gè)人的想法不一樣)
HR: 你最大的優(yōu)勢(shì)是什么?
我: (自己吹吧,也要根據(jù)實(shí)際情況看)
……
階段總結(jié):再次說(shuō)明項(xiàng)目的重要性,第一個(gè)項(xiàng)目有些記憶模糊,答的有瑕疵,這里要引以為戒(一定要對(duì)項(xiàng)目知根知底),第二個(gè)項(xiàng)目感覺答的還可以,不過(guò)Hibernate安全問(wèn)題沒答出來(lái),我覺得只要你其它問(wèn)題答的很好,有個(gè)別問(wèn)題答不出來(lái)是不會(huì)影響最終的offer的。HR面也很重要,你得說(shuō)通了,需要提前考慮好常見問(wèn)題的回答。
第三階段:到你提問(wèn)了
自由發(fā)揮階段,可以問(wèn)問(wèn)公司內(nèi)部的培養(yǎng)計(jì)劃、晉升機(jī)制、是否經(jīng)常有大牛分享技術(shù)讓我們學(xué)習(xí)等等……
3. 總結(jié)
(1)整個(gè)面試過(guò)程中沒讓寫代碼,沒問(wèn)Linux下的一些知識(shí),也沒問(wèn)操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)相關(guān),我覺得可能是Java面試更傾向于從項(xiàng)目中問(wèn)相關(guān)的技術(shù)問(wèn)題,如果你沒項(xiàng)目或項(xiàng)目不多,那么就可能問(wèn)這些計(jì)算機(jī)基礎(chǔ)知識(shí)了。
(2)由于之前內(nèi)推電面的失敗,讓我喪失了一些小自信,因此在這次阿里的整體面試過(guò)程中還是有些緊張,大家請(qǐng)引以為戒,務(wù)必在面試中保持淡定的心態(tài),就當(dāng)是和朋友在一起交流技術(shù)問(wèn)題。
(3)最后,希望我上面對(duì)話形式的面經(jīng)能夠給正在找工作或以后找工作的同學(xué)們帶來(lái)一些借鑒意義,希望你們能夠從中看出某些問(wèn)題的答題技巧和所做的準(zhǔn)備工作。
[阿里運(yùn)維工程師面試]