天天看點

阿裡面試經曆-2014.4.18研發實習生面試經曆

        碩士期間的處女面給了阿裡,感覺還是收獲蠻多。我感覺如果面試做到了邏輯思維中羅胖子所說的“有種、有趣、有料”,那肯定就沒問題了。有種就是回答面試官問題膽大心細、有自信;有趣就是要和面試官聊的很開心,有共同話題;有料當然是基礎夠牢固,代碼能力夠強,算法能力夠紮實,項目經驗夠充分。話又說回來,如果自己沒料,又怎能去有種和有趣,是以還是一句話能力最重要,其次要掌握一些面試技巧,應該就沒問題了。

       今天去參加阿裡巴巴的面試,安排的時間是早上10點40,昨晚沒睡好,不是因為面試,而是看網易新聞,看到太晚,最後看得太精神睡不着了。10點左右就趕過去了,然後簽到,還發了水和早餐,接着在一個小會議室等待。等待期間聽到幾個中科大在聊天,他們3個中有一個進了2面,正在等2面,心想科大的都被刷成這樣,我也就隻能打個醬油了,從他們幾個那了解到2面就是終面了(回來聽師兄說,其實有些人會有3面的,估計都是神級别的)。基本準時從業人員讓我去到另一個會議室面試。

        來到面試官(簡稱他為羅吧)前,給了他履歷,他沒讓我自我介紹,首先問了我下筆試感覺答的怎麼樣,我說除了選擇中的機率題目其他選擇題沒問題,大題做的不太好,他說還是比較自信的啊,然後就沒繼續談筆試了,在我說話的時候,他掃了下履歷,然後讓我講了下我履歷上的一個項目,然後在我講的時候,羅說你們的項目其實涉及到了分布式,裡面有個問題--單點故障,然後讓我想一種處理這個單點故障的方法,我根據分布式資料庫中的方法講了下,他說也隻能這樣了。接着羅問我熟悉哪些資料結構,我說從順序表、連結清單、棧、隊列、樹、堆都有了解,他接着問順序表和鍊式表有什麼差別,為了将話題引向了C++,我說如果比較順序表和連結清單的差別,可以從C++的vector和list比較下,vector順序結構,list雙向連結清單,沒等我繼續說下去,羅就說vector查找快O(1),list插入快O(1),C++容器裡有沒有一種插入和查找都是O(1),我想哪有這樣的,說沒有,他說map啊,沒用過?我說map基于紅黑樹查找不是O(1)啊是logn的,羅說反正不是O(n),可能是我聽問題的時候聽錯了吧。然後問了些C++的東西,首先問我 C++為什麼要繼承,其實我感覺這種問題更不好回答,我說可以縮減代碼量(居然忘了代碼複用這個詞),羅說還有多态嘛,然後問我多态是怎麼實作的,其實這個問題我想肯定會被問到的,我說是通過虛函數表實作,然後羅寫了三個類A、B、C,B、C均繼承自A,均有虛函數f,然後定義了3個指針,讓我畫下虛表,其實很簡單,不過我說錯了一點,我說虛表儲存在對象記憶體空間的最前面,然後羅說如果虛表儲存在對象的最前面的話,那麼每執行個體化一個對象都有一份拷貝,是不是有問題,接着說程式運作都有哪些記憶體空間,我說當然是棧、堆、全局、代碼段,然後他問虛表應該放在哪,我突然發現自己了解錯了,對象中儲存的應該是指向虛表的指針,虛表在代碼段啊(後來在群裡讨論才知道虛表是放在rdata,虛表也是運作時不變的),虛表具體内容參見 C++學習之深入了解虛函數--虛函數表解析,不得不佩服面試官每句話都聽的很清楚,而且能找出問題。然後問我項目中用到多态的例子,我突然想到前段時間師兄要在項目中加一個小的記憶體池,裡面對不同大小的類型記憶體分為不同的隊列,為了便于管理,不同類型繼承自同一個基類,通過虛函數實作各自的記憶體配置設定,介紹的時候我說到了裡面用到了工廠模式和單例模式,羅問我還熟悉其他設計模式,我說就是從gof23的了解了下,平時也就是使用單例和工廠模式,還問我看了多久gof23。後面話題到了智能指針,他問我auto_ptr與shared_ptr的不同,我從轉移權和共享說了下,然後說讓我寫一下auto_ptr的實作,這個對看過C++primer和BOOST的來說不難,我寫好後他說,你是不是看過實作代碼,我說是的,然後問我auto_ptr有什麼問題,我從作為函數參數會發生指針管理權轉移和不能管理數組,因為析夠調用的是delete說了下。然後話題轉向了算法,問我算法怎麼樣,我居然很誠實的回答很一般,感覺有點犯2,然後他說那好,我們來玩個遊戲,問我玩過掃雷沒,我說沒怎麼玩過,他說那不影響回答這個問題,問題是在一個儲存了0、1的矩陣中,現在給一個坐标i,j,和(i,j)在同一個連通塊内(即數字相同)的數字個數:如下圖,輸入(i,j)=(2,2)傳回5,(i,j)=(4,5)傳回1,我想到的是按資料結構書中講解迷宮求解的方法,分四個方向進行深度優先搜尋(根據坐标和來的方向判斷剩下3個方向是否被通路過),然後簡單寫了下遞歸實作的代碼。

阿裡面試經曆-2014.4.18研發實習生面試經曆

寫完後,他看了下,然後看了看表,說我給你的時間隻能到這了,問我有問題問他不,我問了阿裡是不是java很多,C++的很少,他說不是,不要看筆試題附加題是道java題就這樣想,還是很多做C++的,然後閑聊了幾句,就出去了。一面持續了1個多小時,結束都快12點了,整體聊的很開心,出來從業人員要我等一下,我想應該是進2面了,大概不到5分鐘,就被叫去2面。

        2面是兩個面試官,感覺一個是技術(簡稱為唐),一個是hr,接下來的一個1小時就是被虐啊。首先還是要我介紹下我們采集組的項目,然後唐得出的結論就是我們的項目就是在買來的硬體上面稍微加了點代碼,感覺自己太不會吹項目了,然後就是問項目中涉及到的多線程,居然又問到了線程和程序的差別,還有就是什麼時候用線程,什麼時候用程序,這個問題平時還真沒認真思考過,感覺好難回答,可以參見這篇部落格線程or程序,僅僅從線程和程序的差別回答了下,然後唐問我多程序和多線程程式的代碼量,我說千行級别(在一面的時候也有問到我C++的代碼量)。然後又轉到了C++上面,唐問我看過哪些書,我說C++primer、BOOST,然後就讓我實作下boost裡面的shared_ptr,在寫的時候将引用計數部分寫錯了,改好引用計數後,又被告訴線程不安全,問我如何解決線程安全,我說對引用計數操作加鎖,然後唐要我寫下線程安全的shared_ptr的reset成員函數,唐在這他提示我當引用計數到0後,析夠是在鎖外還在鎖内,我簡單寫了代碼,然後他又問我加鎖的代價,這個我直接回答了沒關注過這個問題,然後唐說他的問題完了,女hr開始發問,首先她先問了下我大學學校,然後問是個專科?着實鄙視了我下,接着問題就是認為大學和現在的自己最大的差別是什麼,我實話實說地告訴她,忍耐力強多了,現在所裡面的活全是沒技術的,很是不喜歡幹,自己還是忍下來,耐心做好了,不像大學那樣,感覺回答地太不合女面試官的口味了,唉~~,第三個問題是以後打算做那個方向,我居然說想去做遊戲開發,感覺說錯了,說實話自己真沒想好做哪個方向,所裡面的項目太坑,真的是迷失了方向,然後就是亂談。接着問我有什麼問題,我問了唐對我整體評價,還有該如何學習C++,他的意思我感覺還是要注重項目中多用,不要空學。

         二面大概也是持續了1個小時左右,整體感覺一面還可以,二面就被虐了,女hr的問題也沒回答好,回來後去官網看結果:終面未通過,已在意料之中。

這次面試的收獲:

技術方面:

(1)要有解決實際問題的能力。面試官可能會提出一個問題,要你給出解決方案;

(2)要注重細節,技術要了解透徹,比如這次的“引用計數隻能指針”,不僅會用,而且自己能實作。我們看C++方面的書,經常看到一句話“避免重複造輪子”,記得Boost程式庫完全開發指南的作者說過,這句話應該這樣了解:非不能也,是不為也。

(3)算法和代碼都很重要,代碼量确實能反映一個碼農的水準。

其他:

       要能适當的吹噓下自己的項目,讓面試官感覺項目有技術含量。還有要準備一些常用問題的回答方法,尤其是最後hr的問題,要回答的有水準。看别人的面經都說,面試不能太誠實啊,不能暴露太多缺點,感覺确實如此。

繼續閱讀