2019暑期實習面試心得

2019-05-27
面試

緣起

大學的時候就很想參加暑期實習,今年終於有機會申請了!我大概是去年 12 月的時候決定要開始找實習,但後來在一下的時候進資策會實習又是另一個故事了,總之我還滿想到北部看看的(純軟公司大概有 90% 都在台北吧我猜XD),所以還是決定在暑假的時候再找一個實習。

沒有算得很清楚,不過我總共投了大約 10 多間公司,大多為軟體開發、資料分析以及與機器學習有關的職缺。總共拿到 6 個面試機會,有完整參與整個面試流程的有 4 間,最後拿到 2 個 offer。

準備

首先最重要的就是履歷的撰寫,我有寫中文以及英文兩個版本,中文版是使用 CakeResume 撰寫,英文版則是使用 overleaf,以 latex 語法撰寫。

履歷的重點主要放在自己做過的專案及作品,強調使用的技術以及解決的成效,可以用條列式的方法寫,比較能整理出重點。學經歷的話我簡單敘述在資策會實習的貢獻,還有在大學、研究所待的實驗室做了什麼這樣。我認為履歷的內容要與應徵的職缺有符合是一個大重點,甚至可以針對不同的公司製作不同的履歷。

至於程式測驗的話就是靠平常的累積吧,大學的時候 UVa 大概寫了 200 多題,而 Leetcode 大概寫了 100 多題,雖然練得不多但有寫還是有一點差啦,看到題目會多少有一些方向。還有就是我之前有買一本 Cracking the Coding Interview 中譯本回來看,不過大概只看了一半吧。

至於資料科學、機器學習方面的領域:

面試

趨勢科技 - 軟體開發與測試

  • 履歷投遞:3/7
  • 程式測驗:3/8
  • 面試通知:3/15
  • 現場面試:3/27
  • 電話面試:4/3

程式測驗

投了履歷之後會收到 Codility 的程式測驗,要在一個半小時內完成兩題。可以自由選擇作答的程式語言,我使用的是 Python (Life is short, you need Python.)。

第一題是給一個 list,算有幾種方法,若 remove 其中一個元素,此 list 剩下的元素會是 non-decreasing order。

第二題則是判斷兩個字串要經過多少次 insert 後才能互為 Anagram。Anagram 就是兩個長度相同的字串,組成的字母相同,但順序不同。

這兩題都不會用到特別困難的技巧,應該只是要考你是否具備基本的程式能力,我認為題目如果放在 Leetcode 上大概會是 Easy 的的難度。

大概花了30分鐘寫完,但是完成後不會知道自己的成績。於是就這樣過了一週,完全沒有收到任何通知,有點擔心想說是不是涼了,於是充滿好奇心的我就寫信去問 HR 我有沒有通過測驗,結果火速收到 HR 寄來的通知,恭喜我通過程式測驗,以及與我進行面試的邀約!

現場面試

面試是約在早上十點,於是我起了個大早驅車從台南趕往台北趨勢科技總部。

公司位於台北市大安區,是一棟外表看起來非常氣派的大樓。上樓後被人資帶領到一個小會議室等待主管進來,一會後主管進來,總共有三個人,分別代表 Commercial(Deep Security), SaaS(TMRM), Consumer(IoT Security) 三個 team,簡短自我介紹後,主管們就我做過的專案,以及在資策會實習的工作內容等進行提問,過程還滿愉快的。之後主管們就分別向我介紹每個 team 的工作內容,包括各個 team 正在進行中與 ML 相關的 project。

結束後換下一場,是跟 SaaS 有關的 team,與我面試的是一位工程師,了解到他們的 team 主要是做後端與一些資料分析,還有討論到使用哪些技術。不過感覺上他是被主管叫來面試我,所以好像也不太清楚主管的標準是什麼,所以過程感覺像是聊天而不是在面試哈哈。

最後則是 HR 進來與我確認想進每個 Team 的志願序及實習的時間上是否能配合,也問了我是否有其他公司的面試以及若錄取趨勢後是否會繼續面試其他公司。面試結束後就去在公司附近,而南部已經絕跡的漢堡王吃一波啦!

HR 電話面試

面試完的下一週就收到 HR 寄來的信,通知我已經進入面試的最後階段,跟我安排 30 分鐘的電話面試。電話面試 HR 主要問我一些與人格特質有關的問題,是否有與其他人合作專案的經驗,遇到最大的困難是什麼以及是怎麼解決的,還有確認我參與實習的意願。最後就是恭喜我成為趨勢實習生的一員啦!而且我填的第一個志願就有跟主管 match 到,所以算是進了我最想去的 team,超開心的啦!

結果:Offer get (4/3)

台達研究院 - 大數據分析實習生

  • 履歷投遞:3/13
  • 現場面試:3/27

投完履歷當天就接到人資打來的電話,詢問暑期時間是否能配合以及能否自行解決住宿的問題後,就與我安排了面試的時間。

面試的地點在內湖,法拉利總部的隔壁。當天有三個面試官,首先要我介紹做過有關資料分析的專案,接著針對我履歷上的比賽經歷、修過的課、大學專題等等詢問。

面試官好像特別對我參加的比賽有興趣,問了之前 T-brain 的旅遊訂單成行預測的比賽以及我提到在 Data Mining 課堂上參與的 Gstore 收益預測的 Kaggle 比賽,問了為何選用這些 feature、為何 feature 要這樣處理等等,很多細節我都不太記得,這部分我答的真的不是很好。

面試到後來就覺得應該是沒什麼機會了,但是最後還是詢問了一下工作內容與工作環境如何。有提到他們是做 AOI 與 NLP 以及生醫相關的專案,也有提到他們是因為履歷上寫的經驗有 match 到才會找我來去面試。

整體而言我覺得我的表現非常差,畢竟面試官也只是對我履歷上寫的經歷做詢問,但我由於沒有特別複習我修過的課、做過的專題,其中的細節很多都已經忘記。不過這次的面試經驗也讓我學到了寶貴的一課:任何寫在履歷上的經驗都必須徹底熟悉,而自己不熟悉的部分則可以不提,否則就是在挖洞給自己跳。這次面試結束後算是有點小沮喪,覺得沒有發揮的很好,希望以後還有機會可以再來挑戰。

結果:感謝函 (4/10)

台積電 - IT 實習生

  • 履歷投遞:忘了
  • 現場面試:4/2

首先到台積電的官網投遞履歷,看哪個廠區的主管有 match 到你的話就會找你去面試。

邀請我去的是南科廠的 IT 部門,由於之前在資策會實習就在南科,所以大概知道台積電在哪裡。面試流程首先要做一個適性測驗,而由於我英文檢定有通過門檻因此不需做英文測驗,完成後就回到面試休息室等待。接著是一位主管與我面試,請我自我介紹並從中詢問我細節,比起技術上的細節似乎更看重求職者的個性、態度,但是到最後我還是沒有很瞭解工作的內容。

接下來是人資與我面試,詢問我人格特質相關的問題,包括說出三個自己的優缺點,並從說出的優缺點來更進一步追問是否有更具體的實例,也重視團隊合作的經驗。最後提到可能會等所有實習生面試完畢才會通知是否錄取。

結果:感謝函 (6/6)

Verizon Media - Summer Intern Multiple Openings

  • 履歷投遞:3月中旬
  • 一面:4/25
  • 二面:5/2
  • onsite:5/14

傳說中的外商,也就是大家所熟知的 Yahoo! 會知道這個實習主要是因為校園徵才時有逛到這間公司的攤位,之前就有聽說過 Yahoo 被收購後與 AOL 整併成 Oath,沒想到現在居然又改名字了XD。剛好這間公司也有資料分析相關的實習職缺,所以就投投看啦!投遞履歷過了一陣子後收到 HR 來信喬電話面試時間。

一面 (HR Phone Interview)

約定的時間 HR 非常準時的打了電話過來,提到根據我的履歷把我分配到 data team,這個 team 預計會收 1~2 位的實習生,實習過程會做一個有挑戰性的專案。

以下整理還記得的問題:

  • 人格特質與實習意願
    • 為什麼想要應徵 Verizon Media 的暑期實習?
    • 你期望在暑期實習的過程中能獲得什麼?
    • 除了我們公司之外還有投遞其他公司嗎?若都錄取會如何做選擇?
    • 你覺得你有沒有什麼特質能夠凸顯你與其他人的不同?
  • 技術問題 (ML/Python)
    • 簡述何謂監督式與非監督式學習,以及他們之間的差別?
    • 哪個方法能夠衡量排名? (1) NDCG (2) RMSE (3) F1-score
    • 什麼是 loss function?
    • CNN 中的 convolutional layer 是什麼?
    • 若一個模型的參數很複雜,學習到很多的雜訊,這個現象稱做什麼?
    • Python 中 queue 與 stack 的差別?
    • Python 中哪種資料結構具有順序性? (1) set (2) list (3) dict
    • Python 中哪些 data type 為 immutable?(多選) (1) int (2) str (3) list (4) tuple

以技術問題來說的話,問的問題並沒有很困難,應該是希望實習生至少能了解基本的 Machine Learning 與 Python 相關知識。所有問題中除了 NDCG 我沒聽過以外,其他問題我認為我自己應該都算是答的還可以,希望有機會能進入下個階段囉~

後來發現人資姊姊好像是三原的影片出現過的某一個人XD

二面 (B Round Phone Interview - Tech Test)

data team 工程師的電話面試,簡單自我介紹以及討論我做過的 project。

接著是 online coding 的部分,使用 CoderPad,面試官問了一題 Leetcode 945,題目沒有很難但是因為太緊張所以思路一直打結,最後透過提示才解出來,超懊惱的QQ

不知道是不是 coding 部分表現太差花費太多時間,只考了一題就結束了。然後因為我專案用到很多 CNN,所以面試官最後問了我一些 CNN 的問題,像是 CNN 的原理、訓練的 weight 是什麼、為什麼 CNN 效果這麼好等等。

Onsite Interview

收到面試通知信的時候其實還滿驚訝的,原本還以為會因為 online coding 被刷掉哈哈。公司的地點在南港軟體園區的一棟超大型建築物,先到 2 樓換電梯通行證,再到 14 樓換訪客證後由 HR 帶領到 16 樓的一個小會議室(聽說 10-16 樓都是 Yahoo 的),跟趨勢還有台達一樣,由我一個人單挑三位面試官。

自我介紹

首先是自我介紹還有簡述之前做過的專案,簡單講了下實驗室做的事情,以及資策會的專案、大學專題還有之前寫的自動登入系統+驗證碼辨識,面試官會要求利用現場的白板描述專案的架構,這部分很快就結束了。

白板題

第二個部分是傳說中的白板題,面試官先詢問我擅長的程式語言後出了一題,給一個長度為 n 的 list,裡頭的值為的範圍是 \(0 < x \leq 2\),這樣 list 中一定至少會有一個值會重複,寫一個程式回傳任意一個重複的數字。

例子:輸入為[1, 2, 3, 3, 3],輸出為3

首先我給了一個最簡單的方法:統計 list 中每個值出現的次數,出現次數大於 1 的值就是要找的結果。

1
2
3
4
5
6
7
8
9
10
11
def repeat_num(a, n):
d = {}
for x in a:
if x in d.keys():
d[x] += 1
else:
d[x] = 1

for k, v in d.items():
if v > 1:
return k

完成後面試官問時間複雜度與空間複雜度,很明顯時間複雜度是 \(O(N)\),空間複雜度也是 \(O(N)\)。接著問能不能改善空間複雜度?

這部分稍微想了一下,看來要面試官要的是 in-place 的方法。我告訴面試官,因為 list 的值小於 n,因此可以利用 list 的 index 當作 key,接著透過修改對應的值來表示重複,但還沒想到具體的做法。

面試官提示是不是有方法使得 list 的值在改動之後能夠用來表示重複,並且保留原本這個值的特性。忽然間靈光一閃,我可以將值乘上 -1,這樣既可以表示重複,也可以保留原本值的特性。這個方法的時間複雜度為 \(O(N)\),空間複雜度為 \(O(1)\)

1
2
3
4
5
6
def repeat_sum(a, n):
for x in a:
if a[abs(x)] < 0:
return abs(x)
else:
a[abs(x)] *= -1

最後面試官問若 list 中的值的範圍改為 \(0 \leq x \leq n - 2\) 的話要怎麼辦?因為 0 的出現導致乘上 -1 這個方法會失效,不過既然變成負數這個方法可行,要不就就換個方式處理,因為 list 中的每個值一定都小於 n,所以減掉 n 一定可以得到負數,需要原本的值時再加上 n 就可以逆推回去了。

1
2
3
4
5
6
7
8
9
10
11
def repeat_sum(a, n):
for x in a:
if x < 0:
index = x + n
else:
index = x

if a[index] < 0:
return index
else:
a[index] -= n

開放式問題

接著面試官說時間差不多了,可以進入下一個 part,這個階段是開放性的問題,沒有標準答案,主要是想知道我遇到問題會如何思考。

若給我一些圖片,每張圖片都有 label 季節與天氣,利用機器學習預測新的圖片的季節與天氣。我說可以建構兩個 CNN 分別接上 FC layer + softmax,面試官接著問這與建構一個 CNN 並接上兩個 softmax 有何不同?我回答這樣 W 會同時對兩個 loss function 做 optimize,這樣的方法或許不會比分開訓練來得好,但我沒試過也只是推測。

接著問若將每種季節與天氣的組合都當成 label 是否可行,我回答這樣的話 class 會變多,預測的結果未必比分開訓練來得好,但一樣也只是推測。

再來是若訓練資料改成 10 張圖片為一組,label 為一種季節與天氣,測試資料也是直接預測 10 張圖片的季節與天氣。我說可以將 10 張圖片透過某些方式(例如:取平均)得到這 10 張圖片的特徵,再丟進 CNN 做訓練。或是將資料打散,同樣利用輸入為一張圖片的 CNN 做訓練,預測的時候再透過 majority vote 的方式判斷這 10 張圖片的類別。

最後問若這一組 10 張圖片中可能包含一些室內的照片,但是對預測天氣是沒有幫助的,那該怎麼做?我說可以利用 objection detection 找出可能在室內才會有的東西(例如辦公桌、辦公椅等等),將包含室內東西的圖片過濾掉,再用剛剛的方式進行訓練。

這部分我認為與其說是在考我專業能力,我倒覺得比較像是在藉由與面試者的討論,來觀察面試者是如何思考問題、遇到問題時的解決方式、以及與同事間的溝通能力如何。是一個很有趣的面試環節,看起來 data team 的工作也是常常需要腦力激盪一下的啊。

閒聊時間

因為滿好奇 Yahoo 的現況的,所以最後問了一些跟公司有關的問題。最後也提到如果順利錄取的話會跟另一位 data team 的實習生合作完成一個專案,並在實習結束時做發表。

這次真的是耗時最長的一次面試了,從兩次的 phone interview 到最後的 on-site interview,可以看出來他們真的很重視實習生這一塊,可以說外商的 offer 真的不好拿啊!面試的題目也都很有意思,我算是個樂於接受挑戰的人,所以這次的面試算是滿樂在其中的,若有機會到 Yahoo 實習應該會是一個不錯的體驗。

後續通知

過了約莫兩週的時間,HR 寄信說要約電話通知我面試結果。當下覺得應該是錄取了,因為如果要 reject 的話直接寄感謝函就好,不用特地打電話來通知吧XD。

接到電話後果不其然的錄取啦,HR 問了我一些面試結束後的想法,應該是想要確認我的意願如何。因為聽說最後要美國總部批准後才能算真的拿到 offer,所以我也提問到是否會被美國總公司 reject,但是 HR 提到這種狀況機率很低,基本上不太會發生,所以不必太擔心。

結果:Offer Get (5/27)

Acer - RD

  • 履歷投遞:3/20
  • 線上測驗:4/17
  • 面試通知:4/26

在 104 投的履歷,投的是 RD 的職缺,看起來 Acer 實習生招的職缺大部分都是與商管、行銷有關,所以似乎也只有 RD 這個選項可以投。

之後收到一個「專業人員適職測驗」的線上測驗信,題目大多為人格特質評估、工作的情境題等等,看起來大部分的題目都沒有標準的答案,所以就有點憑感覺做答了。

完成後大約經過一週就收到了團體面試的通知,面試的時程非常的長,從早上九點到下午六點,由於時間上無法配合,就沒有去參加後續面試了。

結果:主動結束應徵流程

IBM - Data Scientist

  • 履歷投遞:3/26
  • IPAT 測驗:3/30
  • 面試通知:4/29

到官網投履歷,之後收到問卷調查以及 IPAT 的測驗信,大概就是考數列以及數學的應用問題,試題都是英文的,而且每題限制作答時間很短,感覺有點像是順便考了英文哈哈。

不久之後收到面試的邀請,但是因為不想一直南北奔波,加上當時有拿到其他想去的公司的 offer,所以就放棄了。

結果:主動結束應徵流程

心得

其實這次暑期實習能有這麼多面試的機會真的是讓我滿意外的,可能是我投的職缺都跟資料科學相關,而我的經歷剛好有符合到吧。

在找實習的過程一開始會有點覺得學經歷都不如別人,畢竟競爭對手除了台清交的學生,甚至還有國外的大學(雖然沒去不過 IBM 原本跟我同批面試的人好像還有 NYU 跟 UW 的)。但是後來想想其實也不必這麼沒自信,學歷或許只是拿到面試機會的一道門檻,面試時是否能夠發揮應有的實力才是最重要的。

至於學校成績的話,我認為並不是很重要,沒有公司有問我在校成績相關的問題,有的甚至連成績單都沒看,感覺上相關經驗及作品是公司比較重視的。

整體的面試下來,大概可以總結一下我對各間公司的看法,不過由於應徵的是實習生,面試一定會跟正職會有所差異,而且算是我的個人觀點,所以當作參考就好了。

  • 趨勢科技:工作氣氛感覺不錯、彈性工時、創新、能實際參與到正在進行中的專案(?)
  • 台達研究院:聽面試官說是類似新創的環境,少見有在做生醫及自然語言相關應用的公司
  • 台積電:感覺上是制度分明的公司,工作內容不是非常清楚,但應該不是我有興趣的哈哈
  • Yahoo:聽說目前靠電商在賺錢、工作環境不錯,會讓人想一直待著、會議室都以台灣的一些景點來命名、非常紫色

最後一定要感謝的是爸媽支持我跑那麼遠去實習,還有感謝老師出國整個暑假都不在(X),感謝資策會的 Andy 大大幫我寫推薦信,我要暫時北漂兩個月了!