請給我黃金 — 關於面試

陳先灝 (Hsien Hao Chen)
11 min readMar 12, 2022

寫在前面

我在去年九月去了新加坡工作,在 SMU 的 LARC 研究中心當研究工程師,主要是做 Singlish (新加坡式英文)相關的研究跟開發。

去那邊的本來目的,是為了為自己的 PhD 申請做準備,累積研究經驗,發點論文啥的,就像去中研院工作一樣,還可以順便練個英文,習慣國外生活等等。

後來卻發現自己對於要再花五年念個學位,並忍受某種相對不穩定的物質生活這件事,不是那麼確定了,也感謝喻能跟其他已經在念 PhD 的好夥伴的說明跟鼓勵,讓我稍微對於唸 PhD 的生活與 trade-off 有了更明確的想像。

總之,我就,跑去面了業界的工作,主要在台灣、新加坡跟香港,都是和 Machine Learning 有關的職缺,主要是做 NLP or/and 推薦系統。這篇主要想分享一些我對於面試的觀點,還有一些準備的過程。

是說我們 LARC 最近絕讚招人中,老闆是新加坡 AI 研究的超級大佬,六十多歲了還在第一線,工作比我們還認真,而且樂於指導跟溝通,是很好的學習對象。而新加坡雖然比不上台灣舒服,但是個大部分時候講中文都會通的英語系國家,也蠻適合大家來做個出國工作的體驗,加上最近疫情,他們缺乏外籍勞工(XD),應該是相對有機會面上。

TL; DR:
1. 整個面試其實就是溝通與說服的過程,你要說服面試者「我有能力」、「我有值得培養的潛力」、「我是個有理想有抱負的好同事」。因此,不管是實際解題、履歷,跟一些觀念性的問題,都是在為這個目的服務。
2. Every interview is a guided interview.

挑選職位

雖然稍嫌拖沓,但我還是覺得職位挑選挺重要的,畢竟好的面試體驗不但讓你更想進那間公司,也能夠對你後續的工作有幫助。

我的作法一開始和大部分的文章一樣,總之,就是,幹你娘投爆。設定好 filter 之後,把 Linkedin 上的職缺、塞滿廣告的奇怪求職網站的推薦全部都投一次,而且每投一間就把它開的相關職缺也全部丟一丟。

這樣的好處是,對於面試經驗不多,或有一陣子沒有面試的人,可以快速的 pick up 面試的手感,也會知道自己面什麼樣的職缺很有幫助,還可以摸清楚你在求職市場到底值多少錢(!)。缺點是非常累,準備會很趕,被拒絕率也比較高,畢竟跟你的經驗並不完全相關。這時候調適心情就會變得蠻重要的。

所以當我發現自己在推薦跟 IR 相關的職缺裏,比較有優勢的時候,後來就以申請這類職缺為主了。畢竟有相應的實績,而且這兩個領域相關的人還沒那麼多(大概還在學校XD),兩個領域又還算蠻有關係。

前期提高 Recall,想辦法快速累積面試經驗蠻重要的。而後面慢慢收斂到固定類型的職缺時,你則會開始感覺面試能夠互補,上一家問的問題跟解釋,往往下面一家還會再問一次,這時候,把前一個面試官的回答稍微轉換一下,就會變成很理想的答案XD

刷題

現在這個年代,是個人都得刷題的吧。

要很老實的說,我一開始會想做研究,就是因為前幾年刷題遇到一堆挫折,覺得大概是不能成為一個太好的工程師了,所以為了逃避刷題,決定好好做研究這樣。但現在既然要去業界了,只好摸摸鼻子,拿出我的魔法小卡買了 LeetCode Premium 開始刷。

但其實刷題對理解資料結構和演算法非常重要,也能夠幫助你練習對各種問題有更明確的想像,並擬定實踐的計畫。此外,現在本來就有一派的研究非常重視實用性,或是從演算法的角度出發去做研究 idea 的發想跟創新:

比如我們 GNN 領域的神 Jure Leskovec,他的 PinSAGE, 合作撰寫的 GIN 等等,就有從演算法出發去理解、改善並有效實踐模型的章節。Reformer, MONGOOSE 也都是從 Locality Sensitive Hashing 出發,分別對 Transformer 的架構和神經網路訓練去做效率和效果的改善。

總之,刷題對 Computer Science 的人來說,大概就像是微積分和線代對唸數學的人一樣,是非常重要的基本功,也會對你理解更深入的題目有幫助。

雖然有買 Premium,但我的用法好像跟沒繳錢的時候差不多(?)。首先建議那些和我一樣,跟刷題不太熟的人去看看這個 Blind Curated 75,非常基本非常紮實,而且出鏡率非常、非常、非常的高,總之越快刷完一次越好。

而刷的方法就像很多教學一樣,先用力想 20 分鐘,還是想不出來就馬上翻去看 discussion,而且要看到完全懂,重寫一次會過的程度。另外建議要好好寫註解、命名跟讓程式乾淨,畢竟這也是面試重點考核的一環。而且還要能想出每個解法的 time/space complexity,前面會花很多時間看懂一題也是很正常的。

之後就是固定每天刷幾題,比如 daily problem 之類的,而且一定要去比週賽跟雙週賽。

LeetCode 競賽的規則是四題一個半小時,而大部分(?)公司的面試是四十五分鐘兩題,這不但可以讓你具備時間壓力下做題的經驗,還可以讓你掌握一題二十分鐘左右的手感,更因為題目變多,變相提高你連續解題的 capacity。

現在每天都還是固定寫個一兩題跟比賽,畢竟誰知道人生什麼時候會需要面試呢XD 而且刷題的確讓我的程式能力進步蠻多的。

還有,如果沒有特別偏好的話,Python 實在是太強了,語法糖滿地都是,光是 queue 跟 stack 不用自己做,加上什麼都吃的 listdict,完全可以把實作時花的腦筋減到最小,只要專心想解題就好。

設定每次面試的標的:

對一個專案而言,最重要的事應該是,基於自身或客戶的需求,設定專案的願景以及想要達成的目標,面試也是一樣的。我覺得面試基本應該達成的目標包括:

  1. 我有能力有效完成日常工作
  2. 我是個值得培養的人才
  3. 我是個有理想有抱負的好同事

你在「整個面試」中的時候表現出來的東西,應該要能完全地為你的基本目標服務,並達成一些額外的目標。

比如說,能在時間內解完題目,就是你能有效完成日常工作的的信號之一,所以刷題才那麼重要,畢竟你要是連基本的演算法都不熟,那面對情況更複雜,功能更多的專案肯定會出事。

而像是我們 Machine Learning Engineer 來說,這可能還代表你有一些不錯的專案經驗,並且在 case study 上能夠給出一個相對完整的規劃,比如清楚地定義問題, 要用哪些 baseline/metrics,你的初步解決方案是什麼,要怎麼逐步地改善最終的 performance 等等。

而每些公司除了這些基本的東西,可能會希望你有額外的能力和特質,這個也最好要找到並表現出來。

比如我面某家推薦系統關的時候,就在回家作業裏明確感受到他們對 candidate 的期待:你實作要超強、理論也不能落掉,最好還有點 business 思考。所以我在情境題基本跟寫論文一樣,完整的 state 了所有數學式,並詳細說明了為什麼我的模型要這樣設計,trade off 是什麼,我有什麼方法可以讓它 scalable,還順便附了個 GitHub Repo 的實作連結。
(感恩志明,讚嘆志明,SMORe 千秋萬載,一統江湖。)

在這個過程中,觀察每家公司的需求,並找出/培養需要的能力是很重要的,這也是為什麼我建議後段要集中特定類型職缺,因為這些都可以互補,上一家重視的東西,用到的面試材料,全部都可以回收再利用XD

不管是人資關、面試、白板題、behavioral interview 到談 offer,其實都是一個說服的過程,我們要從有限的資訊裏找出公司/面試官的需求,並試圖去滿足這些需求,才會提高我們的面試成功率。此外,在我的面試過程中,我也隱隱感覺,具備「找出這些需求的能力」也是公司的考核重點之一。

履歷與簡報

作為憨慢講話但實在的理工肥宅,大部分的時候我們都不太重視履歷/簡報的規劃與美觀,總覺得內容塞滿就好,有一種桃李不言,下自成蹊的驕傲。但自從在研究所遇見了簡報的神之後,我才發現簡報不只是裝飾用的工具,而是能夠幫助聽眾更理解你想表達的事情,並在面試過程中幫助你的說明和人設建立。

沒錯,除了履歷,簡報肯定得做,自介或是講過去經驗時肯定得拿來用,而且很好用。

當然內容是最重要的,但也不是無腦的塞進去,而是要像上一段那樣,找出每家公司的需求,並在履歷和簡報裏做客製化。比如我在面不同的職缺時,就會在履歷跟簡報上調整我的專案順序,也會依照公司業務性質做不同的舉例,這樣才能讓公司覺得我是真的想加入他們,而不是幹你娘投爆,還能順便說明我有「找出需求的能力」,摸蛤仔兼洗褲。

另外,「捏人設」也是很重要的一件事情。你必須摸出公司想在這個職缺找什麼樣的人,並且想辦法讓自己的履歷、自介和面試過程看起來是具有這些特質的。

舉個簡單的例子,對於研究性質的職缺,面試官通常是教授 i.e. 你未來老闆,那通常他們期待你是個有研究熱忱、熟悉領域 SoTA 跟有一定實作能力,那你當然不能只說「我愛研究」,這樣聽起來特別空洞。

你肯定得拿出一些研究經歷,說明它的優勢、跟 SoTA 的比較,在過程中展現你對這個領域的熟悉跟熱情,順便做個 Demo 來展現你的實作成果,再跟他好好討論這個題目有什麼延伸的地方,展現自己的研究品味等等。

這個人設肯定也得跟你的日常形象、過往經歷有一定的契合度,比如你就是個比起跟人類,更喜歡和自己電腦社交的人,要說自己熱愛與人相處或特別能溝通也是沒什麼說服力,但比如喜歡新技術、特別 Geek 或是做了很多 side project 等等,就會是很合理的 feature,對面試本身也有幫助。

履歷的話建議用 LaTeX 最好,那就像是會用 Vim 一樣,是某種身份地位(?)的象徵,會讓人感覺你是自己人。可以去一些名校的職涯中心找模板來改,還可以順便看看人家都怎麼寫履歷,像普林斯頓的 instructions 就很優秀,Linkedin 上一些厲害的人的 Resume 也很值得參考。但重點就是,它要能為你的面試目標服務,並且和你要捏的人設是一致、能提供佐證的。

所有的面試,都是 Guided Interview

這是我在面試某公司第二輪,被瘋狂洗臉洗爆,卻收到下一輪通知,萬念俱灰覺得被憐憫的時候,我們趴總跟我說的。也不知道是不是這句話的魔力,那之後幾週的面試,居然都通過了(害羞)。

Guided Interview 是指在面試過程中,面試官會問一個相對困難的問題,並在回答過程中給面試者提示,面試者則需要從這些提示中進行發想,修改並完善自己的答案。比如白板題環節必定會有的追問和情境修改,讓你跟隨面試官的建議去改寫程式碼就算是一種 Guided Interview。

這類考核除了能檢驗你的工作能力本身,更重要的是檢視,你能夠接受別人意見並改善自我的能力。如果你能迅速地聽懂他人的建議、做出反應,並試圖說服面試官一些你自己的想法,那不但代表你對這個領域的掌握度很高、感覺敏銳之外,也說明了你是個善於溝通、願意溝通的人,是值得培養,能夠成為好同事的人。

我在後面那幾週的面試中,其實並不是 full mark 的通過,過程也常常卡住,但我都會一邊做白板題跟情境題,一邊和他們說明我的解題規劃、為什麼會這樣想、詢問他們的意見,並在我卡住的時候說明我卡在哪、為什麼卡,並在得到他們的提示後給予回饋並努力解題。得到的面試回饋也多半是,雖然現在程式能力/業界情境不夠熟練,但積極願意學習、也有好的潛力,而且樂於溝通,值得合作,算是低空飛過XD

由於經驗有限和職涯選擇,我們終究不可能百分之百 match 職缺的要求,但展現出努力的態度和改進自己的能力,那在你技術有所不足的情況下,公司也才有可能願意投資你和收下你。

此外,在這樣的過程中,也是你觀察面試官的好時機。通常這些關卡的面試官,會有一部份是你未來的同事/老闆,如果在這樣的面試過程中,他們能很好的給反饋,給予你正確的指點,你就能期待他們能給予你職涯的成長,並有相對好的工作體驗;反之,如果他們只會一味地抨擊你的論點,沒辦法好好地討論事情的時候,你就知道有哪裡怪怪的了,特別是這個職缺卡在官網很久的時候XD

當我們有其他 offer,手上握有選擇的時候,就不只是公司在面試我們了,我們同時也在面試這間公司和面試官,能不能成為一間願意久待,好好相處的公司和同事。比如當一般公司喜歡積極、對未來有規劃、對工作有熱情跟容易溝通的 candidate 的時候,我們又何嘗不是追求態度積極、有助職涯發展的公司,和對工作有熱情又好溝通的同事呢?

畢竟現在大家都這麼卷了,已經從程式能力要求到理論能力,再到業界經驗跟溝通技巧了,那要求公司也跟著卷起來,不太過份吧?

結論:

其實關於準備面試和刷題的文章已經很多了,這篇主要是想和大家分享我在面試中得到的一點不一樣的體悟,並鼓勵一些跟我一樣,之前沒怎麼刷過題的人(汗)。覺得趴總那句 “ Every interview is a guided interview.” 實在是一語中的,讓我可以用另一個角度去看待每一場面試,並在過程中努力保持積極的態度與持續溝通,的確讓我拿到了想要的 offer。希望以後還能一直得到趴總的指點,也希望大家都能找到理想的工作。

--

--