2017-10-15

美國矽谷軟體業面試技巧談

前言


小弟我在網路公司做了兩年左右,最近由於我們團隊接手新的 project,需要找更多人來做新的 project,因此我幫忙面了許多人,也參與了是否要錄取那些求職者的會議,看到了許多成功與失敗的面試。離我自己上次找工作是兩年了,現在累計了一些「面試者對面」的經驗,也有了一些新的想法,整理以下幾個觀察跟建議跟各位學弟妹分享,希望對大家有幫助。

先說個有趣的,也同時是整篇最重要的。許多人面試的時候,跟實際來工作後給人的感覺真差不多,也許說話的方式,解決問題的方式,對人的態度,還有各種能力,都不是一天兩天就可以培養出來的,適當技巧只是幫助你展現出你該有的實力,而沒辦法幫大家投機取巧。

溝通技巧

我覺得整個面試的溝通技巧,都可以從一個思維出發,就是「想像考官是向你請教這個問題,並且要由你帶領兩人合作找出答案,並且在過程中讓考官了解你的優點」,從這個思維可以衍伸出以下幾個要點。
  1. 一定要確定考官可以跟上你的思維,並且確定他也知道你是怎麼想的。想像如果是朋友來問你問題,你回答的時候很自然就會想辦法讓他能夠聽懂你的答案。面試的時候也應該如此。
  2. 在解釋細節前要問對方是否有興趣。如果對方覺得不必,就不用講,但如果對方想知道更多,解釋得多仔細都不是問題,好讓考官了解你知道多少。
  3. 如果是你剛好看過的題目,其實直接跳到答案也無妨,只要能夠清楚解釋,讓考官可以清楚理解為什麼你理解該這麼做也不錯。換個角度想,考官的工作是要找出面試者的優點,還有面試者到底會什麼,與其把時間花在慢條斯理地把明明就知道的答案一一解釋,還不如給考官更多機會發現你的優點。
  4. 一定要給出一個能夠解決問題的答案。我看過不少人,可能是為了想要讓考官知道自己知道很多東西,會扯得太遠,而最後無法針對考官的問題給出明確的答案,這樣反而會讓考官覺得面試者是不是故意打模糊仗,明明不知道細節還故意鬼扯。
  5. 不要輕視考官或題目,有時候考官會問比較簡單的問題,我有看過有些面試者看起來就一臉懶得答的樣子。這時候面試者可能就會被質疑,為什麼連這麼簡單的都做不好。
  6. 當考官覺得你的答案不對的時候,要了解為什麼他會那麼想。我有看過有人不停堅持自己的答案是對的,最後考官自己無奈在白板上寫一堆例子跟他說他的答案是錯的。再怎麼說這也算是合作的基本觀念。
  7. 同一個問題,自己問自己,而想出答案,遠比考官追問才得到答案好。
  8. 不用想著展現花俏的答案,一個真的能用的答案勝過花拳繡腿卻無法運作的答案。永遠可以從最簡單的第零版 (v0) 開始,在想辦法改善成第一版 (v1),如果有時間且考官有興趣,可以再提出一些第二版的想法。

白板程式題

  1. 由於在白板上塗寫相當費時,在做任何塗改之前,都要先想清楚。不要在寫到一半才改變你的演算法。四處修修改改可以把錯的答案變成對的機率很低。如果你的程式碼有某個 special case 會錯,先確定是什麼原因害這個 case 錯的,再找出最 general 會錯的的 input,再研究該怎麼修改你的程式。
  2. 我自己每次聽到刷提一詞,總覺得聽起來很像無腦的練習大量練習。我覺得練習量固然要夠,但每次做出題目後,可以盡可能想想看到底是因為這個題目/資料結構/演算法的什麼特性,才能運用同樣的訣竅解決不同的問題。舉個例子,如果你看過一個題目是:「給你一個 n 維的 array 與一個 1 到 n 的 random permutation 作為排序,請把該 array 重新按照給定的排序重新排列」,做過這個題目後,應當可以不難答出:「如果我今天一直按照這個特定的 permutation 重新排列我的 array,排列幾次後可以重新排回最初的 array」。其實解題的招就是那幾個,如果可以每次練習的時候都把題目簡化成他最本質的問題,或是可以轉化成幾個不同的問題,可以在碰到新的問題的時候更有機會可以答出來。

系統設計

  1. 我們團隊是做 Machine Learning 的,所以我們很少會要求有分散式系統的知識或能力,這方面我自己會的也很有限。但就以 ML 而言,我的觀察是公司通常喜歡拿自己做過的題目來問面試者,但有不少面試者連我們公司的平台都沒仔細研究過,也不知道上面有什麼可以做為 feature 的東西,就算經過提示,也不是很能把題目跟想法連結在一起。我建議準備 ML 面試的時候,可以把該公司可以用 ML 的東西全部都想過一次該怎麼做,要怎麼取 feature,要用什麼 model,要用什麼 metric,要怎麼把你的模型 productionize 等等。簡單來說,就是要思考,如果讓你來重做他們所有的 ML 系統,你會怎麼做?
  2. 有時候大家所謂系統設計是考經驗,理由是因為不管是 ML 還是分散式系統的系統設計,都會期望面試者自己想出,並且討論哪邊可能有什麼問題,又能怎麼解決。

到底怎樣會被錄取?

  1. 通常會看溝通能力、態度、coding、系統設計。如果有一兩樣特別傑出,其他普普就有機會被錄取的,但只要有明顯的缺點,我看過的就的全部都沒上了。
  2. coding 是門檻,沒過標準的通常就沒救了,因為必須要自己有能力把想法做出來。所謂的標準是相對的,通常考官心中會有一把尺,認為某個題目在多少時間內,應該就可以做出來,如果跟考官預期差不多,通常就算過關了。也就是說,速度其實滿重要的,並不是只是有做出來就可以。
  3. 面試者過去經驗中,職位或影響力的成長的「速度」也是一大因子。起步晚沒關係,但換領域後必須要有 velocity。
  4. 承上,通常公司會希望求職者有與他經歷相符的表現(更優秀者佳),比方說系統設計的時候,之前經驗差太多的,比方說沒有做過 large scale machine learning 的,在系統設計很容易就可以看出來。如果面試者號稱有在有處理 big data 的公司上班過,或是號稱自己有做過 big data,那可能就會與期望不符,而降低錄取機會。如果你是 new grad,而且可以看出完全沒有相關經驗,關係則比較小,但對 new grad 而言,coding 則相當重要(因為這幾乎就是 new grad 理當要最會的了)。
  5. New grad 有比較吃虧嗎?基本上對剛畢業的人要求會比較低,ML 實務經驗不足可以接受,但對畢業生來說 coding 跟機率統計一定不能不好。
  6. 不是 CS 的有比較吃虧嗎?學位基本上只會影響履歷會不會被看到,一旦開始面試了,全部都是看面試表現與工作經驗。
  7. 轉行有比較吃虧嗎?一旦開始面試,就是看你面試表現了。
  8. 說自己對這個很有興趣,很想學習會有幫助嗎?通常是有,但要先證明自己已經學習過,而不是一方面說自己對這個很有興趣,但又一問三不知。任何這種聽起來可能是屁話的東西,都是一樣的道理,只要有辦法說明或證明這你真的就是這樣,而不是只是講講屁話,就會對面試有幫助。

履歷

  1. 除了看你履歷的人有興趣的能力或經驗以外,一切都是浮雲。因此,可以的話,應該要盡可能客製化履歷,讓看履歷的人在最短時間內就可以找到他們想看的東西。
  2. 越重要、越不一樣的東西要放越上面,被看到的機會比較大。
  3. 所謂重要的項目,就是你認為可以展現對方想找的能力的項目。

關於考官

  1. 考官要湊出時間來面試其實也還滿累的,有時候面一個人,一個半小時就沒了,但有幾次我碰到幾個面試者,跟他討論東西起來相當有趣,原本漫長的一個半小時也很快就過了,自然最後也就都給了比較高分;也有碰過幾個才二十分鐘就覺得很累,想要趕快結束面試的,通常都是因為跟面試者溝通困難,最後分數自然也會比較低。
  2. 考官的目的是要找出面試者的優點,並不是考倒面試者,碰到不會的題目,其實有時候直接了當說不知道未必是壞事,但關鍵在於要想辦法找出一個合理的答案,畢竟工作上本來就不是所有的問題都馬上就有答案。如果真的做不出來也沒關係,投降輸一半,知道自己的弱點下次面試就會更好了。

其他

  1. 面試通常很短,只有一個小時,要時時確定自己有把時間花在考官覺得有意義的討論上。
  2. 以前很懷疑面試考 coding 的方式與工作能力的關聯性,但我後來覺得跟 job performance 還是有相當程度正相關,當然工作本身不會要 reverse a linked list,但時常的確會有各種 complexity analysis 或是要用各種 data strcuture 來達成比較有效率的運算。
  3. 最後,也是最重要的準備面試只是生涯的一小步,是否能夠持之以恆的自我充實,學習與進步才是接下來的 career growth 最重要的關鍵。

最後補一下我寫這篇的動機。最近看到不少人轉錄 ptt 的一篇文章,講說最近美國科技業徵才緊縮,越來越難找工作,但我跟同事們最近花了好多時間面人,又招不到人的我不禁想說「只有不爭氣沒有不景氣」之類的幹話。後來想說,與其說這種沒用的幹話,還不如把這些經驗分享給大家,幫助大家成就自己的職涯的夢想,並且成為對社會有用的人(?)。

沒有留言:

張貼留言