前言
小弟我在網路公司做了兩年左右,最近由於我們團隊接手新的 project,需要找更多人來做新的 project,因此我幫忙面了許多人,也參與了是否要錄取那些求職者的會議,看到了許多成功與失敗的面試。離我自己上次找工作是兩年了,現在累計了一些「面試者對面」的經驗,也有了一些新的想法,整理以下幾個觀察跟建議跟各位學弟妹分享,希望對大家有幫助。
先說個有趣的,也同時是整篇最重要的。許多人面試的時候,跟實際來工作後給人的感覺真差不多,也許說話的方式,解決問題的方式,對人的態度,還有各種能力,都不是一天兩天就可以培養出來的,適當技巧只是幫助你展現出你該有的實力,而沒辦法幫大家投機取巧。
溝通技巧
我覺得整個面試的溝通技巧,都可以從一個思維出發,就是「想像考官是向你請教這個問題,並且要由你帶領兩人合作找出答案,並且在過程中讓考官了解你的優點」,從這個思維可以衍伸出以下幾個要點。
- 一定要確定考官可以跟上你的思維,並且確定他也知道你是怎麼想的。想像如果是朋友來問你問題,你回答的時候很自然就會想辦法讓他能夠聽懂你的答案。面試的時候也應該如此。
- 在解釋細節前要問對方是否有興趣。如果對方覺得不必,就不用講,但如果對方想知道更多,解釋得多仔細都不是問題,好讓考官了解你知道多少。
- 如果是你剛好看過的題目,其實直接跳到答案也無妨,只要能夠清楚解釋,讓考官可以清楚理解為什麼你理解該這麼做也不錯。換個角度想,考官的工作是要找出面試者的優點,還有面試者到底會什麼,與其把時間花在慢條斯理地把明明就知道的答案一一解釋,還不如給考官更多機會發現你的優點。
- 一定要給出一個能夠解決問題的答案。我看過不少人,可能是為了想要讓考官知道自己知道很多東西,會扯得太遠,而最後無法針對考官的問題給出明確的答案,這樣反而會讓考官覺得面試者是不是故意打模糊仗,明明不知道細節還故意鬼扯。
- 不要輕視考官或題目,有時候考官會問比較簡單的問題,我有看過有些面試者看起來就一臉懶得答的樣子。這時候面試者可能就會被質疑,為什麼連這麼簡單的都做不好。
- 當考官覺得你的答案不對的時候,要了解為什麼他會那麼想。我有看過有人不停堅持自己的答案是對的,最後考官自己無奈在白板上寫一堆例子跟他說他的答案是錯的。再怎麼說這也算是合作的基本觀念。
- 同一個問題,自己問自己,而想出答案,遠比考官追問才得到答案好。
- 不用想著展現花俏的答案,一個真的能用的答案勝過花拳繡腿卻無法運作的答案。永遠可以從最簡單的第零版 (v0) 開始,在想辦法改善成第一版 (v1),如果有時間且考官有興趣,可以再提出一些第二版的想法。
白板程式題
- 由於在白板上塗寫相當費時,在做任何塗改之前,都要先想清楚。不要在寫到一半才改變你的演算法。四處修修改改可以把錯的答案變成對的機率很低。如果你的程式碼有某個 special case 會錯,先確定是什麼原因害這個 case 錯的,再找出最 general 會錯的的 input,再研究該怎麼修改你的程式。
- 我自己每次聽到刷提一詞,總覺得聽起來很像無腦的練習大量練習。我覺得練習量固然要夠,但每次做出題目後,可以盡可能想想看到底是因為這個題目/資料結構/演算法的什麼特性,才能運用同樣的訣竅解決不同的問題。舉個例子,如果你看過一個題目是:「給你一個 n 維的 array 與一個 1 到 n 的 random permutation 作為排序,請把該 array 重新按照給定的排序重新排列」,做過這個題目後,應當可以不難答出:「如果我今天一直按照這個特定的 permutation 重新排列我的 array,排列幾次後可以重新排回最初的 array」。其實解題的招就是那幾個,如果可以每次練習的時候都把題目簡化成他最本質的問題,或是可以轉化成幾個不同的問題,可以在碰到新的問題的時候更有機會可以答出來。
系統設計
- 我們團隊是做 Machine Learning 的,所以我們很少會要求有分散式系統的知識或能力,這方面我自己會的也很有限。但就以 ML 而言,我的觀察是公司通常喜歡拿自己做過的題目來問面試者,但有不少面試者連我們公司的平台都沒仔細研究過,也不知道上面有什麼可以做為 feature 的東西,就算經過提示,也不是很能把題目跟想法連結在一起。我建議準備 ML 面試的時候,可以把該公司可以用 ML 的東西全部都想過一次該怎麼做,要怎麼取 feature,要用什麼 model,要用什麼 metric,要怎麼把你的模型 productionize 等等。簡單來說,就是要思考,如果讓你來重做他們所有的 ML 系統,你會怎麼做?
- 有時候大家所謂系統設計是考經驗,理由是因為不管是 ML 還是分散式系統的系統設計,都會期望面試者自己想出,並且討論哪邊可能有什麼問題,又能怎麼解決。
到底怎樣會被錄取?
- 通常會看溝通能力、態度、coding、系統設計。如果有一兩樣特別傑出,其他普普就有機會被錄取的,但只要有明顯的缺點,我看過的就的全部都沒上了。
- coding 是門檻,沒過標準的通常就沒救了,因為必須要自己有能力把想法做出來。所謂的標準是相對的,通常考官心中會有一把尺,認為某個題目在多少時間內,應該就可以做出來,如果跟考官預期差不多,通常就算過關了。也就是說,速度其實滿重要的,並不是只是有做出來就可以。
- 面試者過去經驗中,職位或影響力的成長的「速度」也是一大因子。起步晚沒關係,但換領域後必須要有 velocity。
- 承上,通常公司會希望求職者有與他經歷相符的表現(更優秀者佳),比方說系統設計的時候,之前經驗差太多的,比方說沒有做過 large scale machine learning 的,在系統設計很容易就可以看出來。如果面試者號稱有在有處理 big data 的公司上班過,或是號稱自己有做過 big data,那可能就會與期望不符,而降低錄取機會。如果你是 new grad,而且可以看出完全沒有相關經驗,關係則比較小,但對 new grad 而言,coding 則相當重要(因為這幾乎就是 new grad 理當要最會的了)。
- New grad 有比較吃虧嗎?基本上對剛畢業的人要求會比較低,ML 實務經驗不足可以接受,但對畢業生來說 coding 跟機率統計一定不能不好。
- 不是 CS 的有比較吃虧嗎?學位基本上只會影響履歷會不會被看到,一旦開始面試了,全部都是看面試表現與工作經驗。
- 轉行有比較吃虧嗎?一旦開始面試,就是看你面試表現了。
- 說自己對這個很有興趣,很想學習會有幫助嗎?通常是有,但要先證明自己已經學習過,而不是一方面說自己對這個很有興趣,但又一問三不知。任何這種聽起來可能是屁話的東西,都是一樣的道理,只要有辦法說明或證明這你真的就是這樣,而不是只是講講屁話,就會對面試有幫助。
履歷
- 除了看你履歷的人有興趣的能力或經驗以外,一切都是浮雲。因此,可以的話,應該要盡可能客製化履歷,讓看履歷的人在最短時間內就可以找到他們想看的東西。
- 越重要、越不一樣的東西要放越上面,被看到的機會比較大。
- 所謂重要的項目,就是你認為可以展現對方想找的能力的項目。
關於考官
- 考官要湊出時間來面試其實也還滿累的,有時候面一個人,一個半小時就沒了,但有幾次我碰到幾個面試者,跟他討論東西起來相當有趣,原本漫長的一個半小時也很快就過了,自然最後也就都給了比較高分;也有碰過幾個才二十分鐘就覺得很累,想要趕快結束面試的,通常都是因為跟面試者溝通困難,最後分數自然也會比較低。
- 考官的目的是要找出面試者的優點,並不是考倒面試者,碰到不會的題目,其實有時候直接了當說不知道未必是壞事,但關鍵在於要想辦法找出一個合理的答案,畢竟工作上本來就不是所有的問題都馬上就有答案。如果真的做不出來也沒關係,投降輸一半,知道自己的弱點下次面試就會更好了。
其他
- 面試通常很短,只有一個小時,要時時確定自己有把時間花在考官覺得有意義的討論上。
- 以前很懷疑面試考 coding 的方式與工作能力的關聯性,但我後來覺得跟 job performance 還是有相當程度正相關,當然工作本身不會要 reverse a linked list,但時常的確會有各種 complexity analysis 或是要用各種 data strcuture 來達成比較有效率的運算。
- 最後,也是最重要的準備面試只是生涯的一小步,是否能夠持之以恆的自我充實,學習與進步才是接下來的 career growth 最重要的關鍵。
最後補一下我寫這篇的動機。最近看到不少人轉錄 ptt 的一篇文章,講說最近美國科技業徵才緊縮,越來越難找工作,但我跟同事們最近花了好多時間面人,又招不到人的我不禁想說「只有不爭氣沒有不景氣」之類的幹話。後來想說,與其說這種沒用的幹話,還不如把這些經驗分享給大家,幫助大家成就自己的職涯的夢想,並且成為對社會有用的人(?)。
沒有留言:
張貼留言