天天看點

阿裡、百度、搜狐等公司社招面試記錄與總結

這個跳槽季大概面試了近十家公司,也拿到了幾個Offer,現在面試告一段落,簡單總結下面經,

我現在主要的方向是Java服務端開發,把遇到的問題和大家分享一下,也談談關于技術人員如何有方向的提高自己,做到有的放矢。

一、面試遇到的問題        

1.百度  

百度最近真是炙手可熱,貼吧事件剛結束,醫療競價排名又鬧得沸沸揚揚,一些論壇上連帶程式員都開始招黑了,友誼的小船可是說翻就翻。

說回面試,百度面了兩次,分别是百度糯米和金融事業部,百度目前隻有這兩個部門的招聘崗位和我比較比對。

面試都在西二旗的百度新總部,園區還在施工,離地鐵也比較遠,需要打車過去。

面試官自帶電腦,整個面試過程都在記錄,首先詳細詢問了最近一份工作項目的架構和工作内容,

面試主要圍繞工作中用到的元件和中間件技術來擴充,考察掌握程度。

MySQL InnoDB存儲的檔案結構

索引樹是如何維護的?

資料庫自增主鍵可能的問題

Redis的主鍵争用問題如何解決

了解Redis事務的CAS操作嗎

分析線程池的實作原理和線程的排程過程

動态代理的幾種方式

Spring AOP與IOC的實作

為什麼CGlib方式可以對接口實作代理?

RMI與代理模式

Dubbo的底層實作原理和機制,

描述一個服務從釋出到被消費的詳細過程

算法方面考察了一個簡單的數組就地去重問題,用丢棄數組尾部元素的方式實作了。

百度金融的面試安排在了周六,最近應該在各種擴張,各個招聘網站随處可見招聘啟事。

一面面試官很贊,态度認真,有些問題沒有思路會給你提示,交流的不錯,二面被告知缺少金融支付背景,

不過作為一名工作不到兩年的新人,我覺得被Pass主要原因應該是工作經驗比較少,教育背景也不太亮眼。

面試中的問題:

分布式系統怎麼做服務治理

接口的幂等性的概念

Maven出現版本沖突如何解決

JVM垃圾回收機制,何時觸發MinorGC等操作

新生代和老生代的記憶體回收政策

Eden和Survivor的比例配置設定等

Synchronized和Lock的差別

兩次面試,感覺百度的流程比較嚴格,面試官挺不錯的,簡單可信賴,雖然工作中一般都用谷歌,

想起一個段子,哈哈。

有次面百度,我提到了一個比賽,面試官很感興趣,想搜一下,

于是先用百度搜了一下關鍵字,首屏沒有找到,面試官面不改色,熟練的打開了谷歌輸入關鍵字,發現第一個就是官方網站。

傳回頂部

2.阿裡巴巴

在内推網上收到了阿裡菜鳥和阿裡雲安全部門的面試,後來參加了阿裡雲的面試。

阿裡的面試安排的很快,這次止步二面,兩輪面試都是電面。聽朋友說阿裡五輪面試,四輪技術一輪HR,技術面試是部門的幾個同僚交叉面試,也有了了解。

一面總體上還是圍繞項目架構、Java基礎、JVM、并發程式設計、資料庫操作、中間件技術和Dubbo服務治理架構等展開,

可能因為是雲安全部門,有一半時間在考察JVM,還提問了一些編譯優化的知識,

一面結束後很快安排了二面,相對一面,二面的問題更深入,問題比較刨根問底,更加注重對一些技術細節的了解和把握。

比如資料庫操作,面試官會詳細的問你資料庫插入和删除一條資料的過程在底層是如何執行的,項目裡配置了讀寫分離,也會比較深入的就實作方法和底層邏輯展開讨論。

一些值得記錄的問題:

JVM記憶體分代,

Java 8的記憶體分代改進

深入分析了Classloader,雙親委派機制

JVM的編譯優化

對Java記憶體模型的了解,以及其在并發中的應用

指令重排序,記憶體栅欄等

HashMap的并發問題

了解LinkedHashMap的應用嗎

在工作中遇到過哪些設計模式,是如何應用的

由于阿裡杭州目前社招都是P6起,自我感覺和崗位要求有差距,二面在電話裡和面試官交流了,沒有再參加後面的面試。

兩次面試,阿裡給我留下的印象很好,面試官都是大牛,面試結束後第二天,收到了阿裡的郵件拒信,點贊。

阿裡的崗位大都在杭州,面試結束特意關注了一下那邊的生活成本,目前杭州房子均價不到兩萬,相比浙江一些縣市的房價都破兩萬,杭州的房價應該比較正常。

如果拿到阿裡和網易等幾家網際網路公司的高薪,買房和生活的确比北京要輕松很多,果斷決定再沉澱一段時間,兩年後P7再戰。

3.優酷洋芋

優酷的面試都是二對一,每輪面試兩個面試官,

一面比較順利,主要是Java基礎,Spring原理,Java NIO,并發和集合架構等,

可能是因為視訊網站,優酷考察網絡原理的知識多,比如TCP/IP協定、長連接配接與短連接配接等。

一面提到了自己可能會在下半年學習大資料與機器學習相關的知識,二面就在這上面栽了跟頭,問了很多海量資料的問題。

TCP/IP協定

長連接配接與短連接配接

mapreduce過程

多路歸并的時間複雜度

海量url去重類問題

Java NIO使用

反向索引的原理

對分詞技術的了解

面試中給了一個具體場景,考察對MapReduce過程的了解,比如Map階段和Reduce階段是如何進行的等,

Reduce階段面試官希望分析給出一個多路歸并的時間複雜度,用外排序的知識簡單分析了一下,回答的不太好。

回來以後搜尋了勝者樹和敗者樹的優化,發現這裡面的内容還挺多,深刻體會到有些知識點如果平時掌握的不夠全面深刻,很難信手拈來。

4.搜狐新聞

搜狐最近應該是沒有招聘計劃,面試等待時間比較長。

做了筆試題,一面是個和我年紀相仿的面試官,針對筆試和履歷提問了一些基礎問題,聊得挺投機,

二面技術經理就比較偏架構和中間件的應用,提問了項目,主要考察了服務治理和消息隊列等中間件使用的問題,

消息中間件如何解決消息丢失問題

Dubbo的服務請求失敗怎麼處理

重連機制會不會造成錯誤

對分布式事務的了解

深入分析幾個設計模式

面試最後提問了一個不定長字元串轉為定長字元串的問題,

剛剛面過優酷,這個簡單的問題被我想複雜了,沒有Get到面試官的點,考慮了唯一性,性能等,扯了一大堆。

也提醒一下大家,面試過程中要保持清醒,不要有思維定式,除非是底層研發崗位,社招對算法的考察不會特别難,用正常的思路去解決就可以。

5.58趕集

58總部在798附近,全天有班車可以過去。總體上,感覺面試官的問題非常接地氣,

三輪技術面,大部分是實際場景的算法和系統設計類問題。

HTTP請求的封包格式

Spring的事務實作原理

實際場景問題,大量使用者資料如何在記憶體中排序和去重

緩存機器增删如何對系統影響最小,一緻性哈希的實作

Redis持久化的幾種方式

Redis的緩存失效政策

實際場景問題解決,典型的TOP K問題

實際場景問題,海量登入日志如何排序和處理

SQL操作,主要是索引和聚合函數的應用

三面面試官提問了一些優點和缺點的自我評價類問題,簡單交流以後對我給出了一些中肯的建議,非常感謝。

6.國美線上

國美線上面試最開始是部門經理溝通,在知道我畢業不滿兩年以後,重新去做了一份筆試題,

題目品質不錯,主要考察Java基礎,資料庫,設計模式以及資料結構,要求寫出B-Tree的節點結構,

算法題目是一道等機率抽獎的題目,用蓄水池抽樣算法解決了。

SQL語句編寫

MySQL的幾種優化

Spring行級鎖

Spring衍生的相關其他元件整理

RMI的幾種協定和實作架構

BTree相關的操作

資料庫鎖表的相關處理

考察跳台階問題

和面試官的交流比較輕松,面試官提示我要加強資料庫操作的掌握,另外面試過程中詢問了一些工作中用到架構群組件的版本等細節問題,平時沒太關注,

後來思考了一下,對開源元件的應用,版本的管理很重要,不注意可能會發生一些詭異的問題。

7.去哪兒網,口袋購物等公司

除了上面的公司,還參加過去哪兒網,口袋購物,鍊家等幾家公司的面試。

去哪兒網中規中矩,口袋購物的工作環境非常不錯。鍊家網最近有新浪的鳥哥加入任技術總監,在IT圈子裡挺火,面試了鍊家旗下的兩個租房部門,技術氛圍不錯,前景看好,很值得去的一家公司。

幾家公司的模式和問題都類似,注重對基礎和程式設計能力的考察,以及對分布式系統設計和架構的了解,一些有代表性的問題: 

JVM記憶體檢視與分析,編寫記憶體洩露執行個體

線上CPU100%,如何定位和排查問題

如何在運作時确定對象類型?

引用傳遞和值傳遞

類加載過程,如何獲得目前對象的ClassLoader

Git操作,Maven多項目聚合

10萬個ip段如何快速查找

Java記憶體模型,volatile和i++的線程安全

線程池實作原理,Lock機制的實作

JVM對final關鍵字的編譯優化

ConcurrentHashMap深入分析

HashMap和HashSet的使用

Synchronized和Lock的使用

Dubbo底層實作,Dubbo相比webservice等方式的優勢

設計模式,服務治理等

Spring動态加載資料源

Spring boot應用

Spring中的設計模式

Linux的常用指令,簡單shell編寫

Linux系統監控指令

Redis的持久化方式

緩存和資料庫的一緻性問題

Redis、MongoDB和Memcached的差別

Solr和Lucene,中文分詞技術

爬蟲的深搜和廣搜,隊列和棧

資料庫索引的實作,B+樹的結構和操作,為什麼不用紅黑樹

SQL表設計 Join操作

資料庫範式,聚集索引與非聚集索引

資料庫存儲過程,SQL注入

值得一提的是一家創業公司的面試,過程十分簡單粗暴。

沒有自我介紹,面試官看完履歷就在白闆上提了一個多線程排程問題,遞過來MAC就開始敲代碼+_+

寫完以後我表示這題目意義不大,問了Redis,要求十五分鐘實作一個LRUCache,再次現場寫代碼。

寫到一半面試官看沒問題就打斷了,問對公司有什麼想了解的,等了一會讓我回去了,就這麼被Pass,創業公司效率果然高(此處/dog臉)。

上面提到面試中要保持清醒,比如ip段查找這個問題,首先是一個典型的查找問題,

明确了這個,就可以針對性的選擇相關的算法實作,如二分查找、二叉查找樹等。

另外推薦畫圖表達的方式。

做過的項目架構,各種架構和中間件的設計實作,通過畫圖的方式都可以很好的闡述,

可以随身帶着紙和筆,面試本來就是一次很好的學習過程,一些問題也可以記錄下來。

一般來說,面試過程類似一個尋路算法,交流過程中如果提到了面試官感興趣的某一點,

就會就這個點展開,然後一直提出問題到你不能回答為止,或者你特别牛在這個領域直接秒殺面試官,這樣一條路線走通,再換下一條路線。

二、程式員如何用正确的姿勢提高技術水準   

相比程式員,我更喜歡攻城獅這個名字,

程式員在不了解這個行業的人眼裡已經被貼上了各種标簽,諸如各種宅,不修邊幅,

其實作為聽了喬丹話的孩子,寫代碼真的是高端大氣上檔次好嗎?

阿裡、百度、搜狐等公司社招面試記錄與總結

還是聊工(cheng)程(xu)獅(yuan)如何有針對性的提高技術水準,進入目标公司。

一般來說,主流網際網路公司都在用的就是業内比較成熟和流行的技術,最簡單的方式就是看招聘要求,

雖然大部分公司的Job Description都有抄襲的嫌疑,但是多比較幾個招聘,還是可以了解主流網際網路公司的技術方向。

還是拿熟悉的Java服務端業務開發來說明,部落格園.NET方向的同學比較多,不過技術學習的過程都是相通的吧,

從拉勾上找幾個招聘,

百度核心業務部門:

阿裡、百度、搜狐等公司社招面試記錄與總結

阿裡巴巴:

阿裡、百度、搜狐等公司社招面試記錄與總結

美團酒店事業部:

阿裡、百度、搜狐等公司社招面試記錄與總結

既然是社招,一定的工作經驗是必須的,三年以上最好,上面的幾個JD裡也展現了。

然後是技術方面,結合自己的體會,總結下面幾點:

傳回頂部

1.基礎知識必須要紮實,包括語言基礎,計算機基礎,算法和基本的Linux運維等

針對Java語言,需要對集合類,并發包,IO/NIO,JVM,記憶體模型,泛型,異常,反射等都有比較深入的了解,最好是學習過部分源碼。

這些知識點都是相通的,在面試中也可以展現,比如集合類的HashMap,

從源碼的角度,可以深入到哈希表的實作,拉鍊法以外的哈希碰撞解決方法,如何平衡内部數組保證哈希表的性能不會下降等;

從線程安全的角度可以擴充到HashTable、ConcurrentHashMap等其他的資料結構,可以比較兩種不同的加鎖方式,RetreenLock的實作和應用,

繼續深入可以考察Java記憶體模型,Volitale原語,記憶體栅欄等;

橫向擴充可以考察有序的Map結構如TreeMap、LinkedHashMap,繼而考察紅黑樹,LRU緩存,HashMap的排序等知識。

Java方向的中進階職位,會比較重視對虛拟機的掌握,諸如類加載機制,記憶體模型等,這些在程式的優化和并發程式設計中都非常重要。

算法方面,基本的排序和查找算法,對遞歸,分治等思想的掌握。如果算法基礎不太好,推薦《程式設計珠玑》等,每一章都很經典。

另外計算機基礎,比如TCP/IP協定和作業系統的知識也是必備的,這些都是大學計算機專業的基礎課,也是做開發基本的素養。

傳回頂部

2.設計模式,造輪子的能力,各種緩存和資料庫應用,緩存,中間件技術,高并發和高可用的分布式系統設計

大型網際網路公司每天要面對海量的請求,都會考察分布式系統的架構和設計,如何建構高并發高可用的系統,

另外因為使用者基數比較大,一個細微的優化可能會給帶來很大的收益,是以對一些技術棧的掌握要求都比較深入。

比如對MySQL資料庫,需要知道相關的配置和優化,業務上來以後如何分庫分表,如何合理的配置緩存,一個經驗豐富的服務端開發人員,也應該是一個稱職的DBA。

對常用的開發元件,比如中間件,RPC架構等都要有一定的了解,雖然工作中可能用不到我們自己造輪子,但是掌握原理才會得心應手。

這部分知識主要靠工作積累,推薦《大型網站技術架構與Java中間件實踐》,還有曾賢傑的《大型網站系統架構與實踐》,

裡面對大型網站的演變,服務治理和中間件的使用做了很詳細的闡述。

作為業務開發人員,有必要了解壓力測試相關的名額,比如QPS,使用者平均等待時間等,可以幫助你更好的了解自己的系統。

傳回頂部

3.軟性名額,包括快速學習,良好的溝通能力,以及對相關行業的了解

公司招聘會比較看重一個人的學習能力,是不是值得培養,很多公司校招的畢業生薪資會倒挂工作多年的老員工,也是這樣。

像溝通習慣,邏輯分析能力,這些都屬于軟實力,短時間内很難提高,需要長期的養成和持續不斷的投入。

好多公司還會看重所在行業,雖然是做業務,但是對産品和行業的了解也很重要。

比如網際網路金融類公司的崗位,如果有過支付和銀行相關的系統開發經驗肯定會有加分,這點和每個人的長期規劃有關。

有了方向,接下來就是如何提高,說一些自己的感想。

很多時候,除非你的工作内容就是要應對高并發,海量使用者等場景,否則通過加班或者說重複性的工作,其實很難有提高。

技術人員最直接的提高方式,還是需要跳出來,在工作以外審視自己,比如廣泛的閱讀技術書籍,多去論壇和各路牛人交流,

了解主流網際網路公司的技術棧,有針對性的去學習和了解。

同時也可以适當的了解一些産品或者設計的知識,以點帶面,複合人才肯定更受歡迎,

對待面試,要像和妹子約會一樣,表現自己平常的一面就可以了。

代碼改變世界,要早日成為明日大牛,程式員肩上的擔子可是很重啊,共勉。

繼續閱讀