阿里前端社招面試總結

蒙面大蝦發表於2019-03-19

阿里前端社招面試總結
繼上次宇宙條面試之後,筆者備受打擊,決定閉關一段時間好好修煉自己的功力,所以暫時將簡歷隱藏,然鵝突然收到來自阿里巴巴的面試邀約,懷著忐忑的心裡開始了阿里的面試之旅。

電話初探

被告知簡歷通過評審之後的三天後收到一個來自上海的電話,我懷著半信半疑的心態接通了電話(害怕是辦信用卡的)。對面是個小哥哥,簡單介紹了下自己是阿里的,詢問我有沒有時間,做個簡單地電話初面,看看是否合適在發起後續流程進行正式面試。當時正在上班的我一口答應,並且快速衝到了走廊。出來的我就感覺有點後悔,因為門外那叫一個冷,我沒有穿上我一千塊的保暖大衣,又不好意思說回去工位穿衣服,所以全程都在哆嗦中度過。

一開始讓我做了個簡單的自我介紹,問我現在在哪裡工作,為什麼要離職,目前手頭上跟的什麼專案什麼的。然後讓我挑一個最近正在做的專案,聊聊技術棧。我找了一個我負責構建的專案,然後從專案背景、人員分配、技術棧說起,巴拉巴拉說了大概四五分鐘。緊接著小哥哥問我為什麼選擇這個技術棧,我又巴拉巴拉說完後就說感覺我挺合適,給我發起正式面試流程。我一聽,那個激動恨不得立馬發起流程!然後小哥哥問我有什麼問題要問他的,由於外面實在太冷了,所以我就問了一個問題,能介紹下您所在部門的業務嗎?這一問可不得了,面試小哥哥從自己的部門,再到前景,再到工作內容給我介紹的明明白白,說北京有崗位,但是會先去杭州工作半年到一年時間,最後說會在一週內聯絡我進行面試。由於太冷了,我就沒有再問問題,就這麼愉快地結束了!

這一步沒什麼問題,只要放開了和麵試官聊就行了,把你想知道的都問清楚,把他想知道的儘量都告訴他,先給對方一個好的印象,至少讓別人感覺你是積極向上的而不是死氣沉沉混機會的。

一輪技術面

由於一面告訴面試官我和他不在同一座城市,而且目前在職無法去現場面試,他很爽快地答應了可以進行視訊面試。大概過了三天的時間,又收到來自這位小哥哥的電話,具體是想和我安排面試時間,我問了下晚上是否可以,小哥哥爽快答應,此時我已經瞭解到阿里晚上也是正常工作時間,這和我目前一樣。我們相互約定了時間,互換心聲,相約不見不散!到了約定時間我會想起小哥哥說會給我進行視訊面試,我一來懵逼,既然是視訊面試莫非是QQ視訊、微信視訊?還在疑惑的我被手機鈴聲打斷,我一看還是熟悉的號碼,還是熟悉的感覺,果然是那位可愛的小哥哥。小哥哥問我準備好了沒,準備開始面試了!納尼?小哥哥竟然是我的面試官,我一直以為他是HR小哥哥呢,還沒待我詢問清楚,他說會發一條連結到我的郵箱。可能是安排的人比較多,一時間找不到我的郵箱了,就說你先來個自我介紹,此時的我心灰意冷,不是才認識的嘛,都已經這麼熟悉了還需要自我介紹?是不是早已經忘記人家了?當我還在傷心的時候,我發現時間已經過了三秒鐘了,於是我開始重新介紹我自己,這次的自我介紹相比之前的要更加詳細,主要是個人的基本情況、工作能力和未來規劃三個方面講的,自我介紹完後小哥哥說到挺有想法的小夥子,我給你發了連結到郵箱裡面,你去看看。說時遲那時快,我用了兩秒鐘就等進了郵箱開啟了連結,我的英俊容貌立馬出現在電腦螢幕上,我也看到了面試小哥哥!哇,簡直和我一樣英俊、瀟灑。管不了那麼多了,我已經準備好面試了。

突然我的頭像縮小了,螢幕上面出現了熟悉的文字框,是的,你沒猜錯,現場編碼!第一道題是考察正則匹配的,這道題不難,但是需要考慮邊界情況,因為過於簡單所以題目沒有就不貼出來了。

大概花了一分鐘搞定,然後滿意地告訴小哥哥做好了。他看了我的結果後立馬出了第二道題:

具體題目由於時間太長沒有記太清楚,是一道運算元組的題目,暫時就以當下最火的陣列去重為例吧,該題重點考察對js陣列的掌握,不能使用ES6語法。

拿到這道題我覺得很簡單,於是就開始了正常的排序,去重。下面是我的第一次嘗試

function merge(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return [];
  
  arr.sort();
  
  var ret = [arr[0]];
  for (var i = 0, j = i + 1; j < arr.length; j++) {
    if (arr[i] != arr[j]) {
      	ret.push(arr[j]);
      	i = j;
    }
  }
  
  return ret;
}
複製程式碼

小哥哥說可以除錯,我開啟了控制檯,以最快的速度貼上了我的程式碼後發現結果不對呀,怎麼搞的?才發現是因為順序改變了,不能進行排序。再次我的第二次嘗試

function merge(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return [];
  var ret = {};

  for (var i = 0; i < arr.length; i++) {
  	ret[arr[i]] = i;
  }
  
  return Object.keys(ret);
}
複製程式碼

我發現這樣確實可以去重,奈何順序也跟著改變了,這該如何是好呢?這時小哥哥發話了,這道題很難嗎?我立馬回了句不難,我不應該排序的,然後他說根本不需要排序可以使用ES6的語法。納尼?這道題不是考察演算法而是考察ES6語法,打死我我也不信,這明明是演算法...就在這零點零一秒的時間裡,我的任督二脈突然被打通,我沒在抱怨了,而是以最快地速度進行了我的第三次嘗試

function merge(arr) {
  if (!Array.isArray(arr) || arr.length == 0) return [];
  var ret = [];

  for (var i = 0; i < arr.length; i++) {
    // 或者 ret.indexOf(arr[i] == -1)
  	if (arr.indexOf(arr[i]) == i) {
    	ret.push(arr[i]);
    }
  }
  
  return ret;
}
複製程式碼

還沒寫完,小哥哥就同步到我的想法了,順利過關!順便一提,其實去重還可以用一句程式碼搞定:

[...new Set(arr)]; // 不符題意
// or
Array.from(new Set(arr)); // 不符題意

// 感謝評論區大佬的指點,小弟想到了一句話解決的方案,包括filter,此處給出另外一種變態方案,請笑納
(arr + ',').replace(/(\d+,)\1+/ig, '$1').split(',').slice(0, -1);
複製程式碼

這裡是對ES6自帶API的考察,然後順勢給我同步出第三道題

實現函式的柯里化

還是熟悉的配方,於是開始了我的嘗試套路

function composeFunctions() {
   var args = Array.prototype.slice.apply(arguments);
   
   var _func = function() {
        if (arguments.length === 0) {
            return func.apply(this, args);
        }
        
        Array.prototype.push.apply(args, arguments);
        return _func;
    }
    
    return _func;
}
複製程式碼

以上是我的第一次嘗試,當時我因為傳錯了引數,也就是最後Array.prototype.push.apply那句傳錯了引數除錯死活出不來,我感覺我的思路沒錯呀,為什麼結果不對呢,正打算開啟debug工具除錯,小哥哥開口說話了,問我這個題目很難嗎?我當然說不難了,這輩子都不會覺得難的。然後他開始幫我分析,他說這個題怎麼能返回一個函式呢?我...emm?我說對,不應該返回函式,此時估計小哥哥意識到把我帶偏了,於是趕忙說道是返回一個函式哈,我...emm(被支配的恐懼感讓我留下了沒有技術的淚水)?此時我已無法用言語表達我的尷尬之情。他問我那問題出在哪裡?我說我感覺寫的沒問題,但是死活出不來,然後我看他在閱讀我的程式碼,然後說了句好的,我們直接開始面試吧!本來有四個題,我覺得你做三個就可以了!

前戲大概花了十五分鐘左右,然後直奔主題。

第一個問題是老生常談的居中問題,如何用css來實現水平垂直居中。我用了六種實現方案,其中最後一種是基於vertical-align配合文字基準線來實現的,有興趣的小夥伴可以自行找下該方案。

第二個問題是Promise的用法以及實現原理。

第三個問題是前端儲存方式,以及它們之間的優缺點。

第四個問題是移動端頁面適配解決方案,我的回答是淘寶的flexible.js來做螢幕適配,然後面試官詢問了它的實現原理,以及瀏覽器中幾種長度單位(rem、em、px)的特點和區別,很可惜這塊我答得不是很好,沒有完全理清物理畫素和邏輯畫素的區別,面試官小哥哥也告訴我瞭解一個框架的實現原理比用一個框架更有意思,不是麼?

第五個問題是React、Vue之間的區別和實現原理,另外問了下React中Fibber是什麼?我只知道Fibber是排程,可以提升react渲染的效率,然鵝不太清楚具體的實現原理。

第六個問題是JS的Event Loop。

第七個問題是三次握手和四次揮手。

最後問了我最近最有成就感的專案,並介紹下專案的技術方案,哪些地方讓你特有成就感,還有遇到的困難是什麼,如何解決的?

最最後面試官對我進行了一個評價,說我知道的還挺多就是表達不是很流暢,讓我今後要多注意,我連聲達到好好好!緊接著就說先聊到這裡,有什麼問題需要了解的嗎?我問了兩個問題,第一個是他們對人才的定義,想要招個什麼樣的人?小哥哥微微一笑,說道這個問題太大了,立馬反問給我,讓我給人才下個定義,其實我就是想知道我今天的表現如何所以才提了這個問題,所以我就巴拉巴拉說了我的人才觀,隨後他也像我闡述了他的觀點。緊接著我就問第二個問題,面試結果什麼時候能知道?他說最遲一週,後來我發現這是所有面試官的一個套路,只要問道肯定就會說一週之內給結果。最後就愉快地結束了今天的面試,總體來說還是比較輕鬆的。

二輪技術面

一面面完大概過了四天左右收到了來自杭州的電話,告訴我一面通過了約個時間進行二面,並且和二面面試官互加了微信。後來我才發現,二面面試官就是當初某boss上面跟我聊天的大佬,技術專家級別!我懷著忐忑的心情等待接受二面的摧殘,因為二面是部門負責人面。

面試終究還是來了,看到來自杭州的電話迫不及待地接通,聽說話的口音感覺面試官很奈斯,瞬間就沒有了壓力。首先讓我做了下自我介紹,接著就開始正式的面試環節。

自我介紹中粗略地介紹了我目前做的業務,面試官讓我挑一個最熟悉的跟他聊聊,具體從技術方案、遇到的問題、解決情況來闡述。前十來分鐘基本上就是按照我的專案來進行的,一切都很順利。緊接著問了幾個ts相關的問題,就說今天的面試先這樣,問我有沒有問題要問!我一臉懵逼,因為整個面試過程都很順利聊得也很開心,突然結束是不是自我感覺良好,他人感覺不好呢?雖然有一系列疑問,但是我只問了一個問題,就是當天在公司幹活時遇到的一個問題,他先是笑了一下然後問了下我是如何解決的,我巴拉巴拉說完後,他提出自己的見解。說非常欣賞我的處事方法,第一次被面試官誇讚的感覺簡直受寵若驚!然後告訴我如果是他他會如何解決,大佬果然是大佬,我默默地嘆息道!隨後就結束了二面。

三面boss面

二面結束後又是漫長的等待,等了十來天時間還沒聯絡我,我覺得應該是跪了吧。由於我加有一面、二面的面試官,所以就試探性地問了下二面面試官我的情況,他說你通過了,不過boss最近比較忙沒有時間面試,所以就拖了這麼久,再耐心等等!知道結果的我受寵若驚,決心要好好準備。

距離二面結束兩週後終於有一個杭州的電話打進來,果然是阿里的HR,跟我約了週末進行視訊終面。並告訴我boss很忙一定不要失約。

終面的前一晚HR小姐姐打來電話說需要調整面試時間,因為boss臨時有個會議,於是向後延了五天時間。

面試的時間是工作日,我請了假回到家中,雖說前兩面都很順利,但是第三面還是很緊張。三面使用的是阿里的內部會議系統,到達指定時間後我連線上去沒有任何回應,打電話給HR小姐姐始終佔線,瞬間心裡感到更加緊張,五分鐘後對方接了進來。我看到一共有兩個人,一個是傳說中的boss(男),另外一個(女)沒有猜到是什麼崗位。簡單地詢問後就直撲主題。

首先讓我做個自我介紹,介紹完後問我在京東做什麼?我當時腦子是懵逼的,我就說我在做什麼,做什麼?兩句話介紹完後,boss接著問,你所說的XXX產品是個啥?真是一波未平一波又起,我的腦子已經一片空白了,簡單地介紹了產品後,boss抬頭看了下我說,我沒有問題了,又看了下另一位面試官問到,你還有什麼問題嗎?另外一位面試官就問我離職的原因是什麼?我說想去更好的平臺工作。緊接著說我的求職意向是北京,但是他們是在杭州,我說HR告訴我北京有崗,面試官答到要先來杭州工作半年到一年才能去北京,我說沒有問題!然後就問我還有什麼問題嗎?

我提了三個問題,第一個仍然是想知道他們對人才的定義,得到的答案是問題太大了,換個問題吧。第二個問題是前端的發展路線,從ajax到node,再到資料驅動,下一個會是什麼呢?在一旁看手機的boss抬頭看了看我說道,不好意思我不是搞前端的,你換個問題!我說出了我的第三個問題:結果什麼時候能出來?得到的答覆是一週內,然後就說今天先這樣,後面有訊息會有電話通知。一臉懵逼進來,一臉懵逼出去,就這樣結束了三面。

由於是請假所以面完後直奔公司繼續工作,剛坐下就收到了來自阿里巴巴的郵件通知,以為順利通過,結果一看我的簡歷直接被推到了螞蟻金服!說明CBU流程已經結束,我的簡歷得到了釋放,也就意味了面試跪了。很是失落,於是截了個圖發給了我的一面面試官,他說幫我問問boss怎麼回事。很快告訴我未通過的原因是專案的複雜度有點問題。並不斷安慰我說很正常,面試通過率很低,讓我不要灰心,面試是很看運氣的。另外告訴我一面和二面面試官都覺得好可惜,但是沒有辦法。讓我試試其他的部門,再次感謝非常可愛的面試官小哥哥,全程對我的幫助!雖然很是失落,但是面試之後的總結還是必不可少的。

面試總結

相比其他的企業,我發現此次面試阿里過程中被問到的問題還不算很難,阿里更看重的是基礎,而不僅僅停留在會使用的階段。所以平時要多看看優秀開源專案,多看看基礎的內容,多瞭解底層的實現原理。

對於boss面問到的問題,我總結了一下其實這兩個問題都很大。首先第一個問題,你在做什麼?其實潛臺詞就是問你都做了什麼專案,此時正確的做法是介紹自己參與的專案、所在專案的角色,然後詳細講解你參與專案的技術方案,開發過程中遇到的問題以及如何去解決這些問題,將主動權完全交給你,你可以自由發揮把面試官帶到你的思路中。其實面試官更關心的是你解決問題的過程,而不是像我一樣兩句話搞定。第二個問題就是要詳細介紹自己的產品,產品和其他競品的優勢在哪裡?以及你貢獻的內容和目前取得了什麼樣的成就等等。這種開放性的問題說好答也好答,說不好答也不好答,完全看自己的語言組織能力。

阿里一直以來都是我心中想去的公司,在中國的網際網路公司中也是名列前茅。所以不是隨隨便便就能進入的,要想成功進入阿里除了過硬的技術基礎外,還需要有良好的表達能力、處事能力等軟實力。一次失敗不算什麼,認真總結,在下一次遇到同樣的問題而不至於用同樣錯誤的方法去處理才是最重要的。就和農藥裡面的程咬金一樣,反正你打不死我,不服就來打我呀!

相關文章