歐洲留學CS轉職軟體工程師心得

Patrick Su
14 min readMay 6, 2021

--

前言:

從半導體設備商應用工程師到赴愛爾蘭留學轉讀CS,到前陣子拿到荷蘭軟體工程師offer,一路走來遇到不少困難也得到很多人幫助,一直想把這些經驗記錄下來,無奈拖延症老是發作,直到現在才開始動筆。希望能幫助到其他有志想在歐洲找軟體工程師(SDE)職位的人。

這篇文章會從留學,做side project,求職,刷題,四個面向分而治之,一些mindset建立或是心靈層面等比較high level的問題不會花太多筆墨來討論,畢竟看了不少文章都已有相關的陳述,會比較注重在細節以及操作面的問題上,希望能幫大家建立簡單且有系統的work flow。如果有任何錯誤或者問題都歡迎提出來討論,能力範圍內的問題我也很樂意解答,一些較為主觀的部分也希望能聽到不同的看法。

背景:

四大化工學士,材料研究所,只學過一點點fortran跟excel VBA,雖然工作之後斷斷續續有碰一點Python但缺乏系統性與目的性的學習。在從事應用工程師階段,因為接觸到一些機器學習的知識,開始比較認真學習Python資料分析。

其實本來留學的初衷是想鑽研機器學習以及資料科學領域,甚至有碩士唸完直接讀phD的想法,但經過一些探索發現自己還是比較喜歡工作而非學術研究,故開始充實後端軟體工程師所需的技能。

留學:

我是2019/20 就讀愛爾蘭的University College Dublin(UCD) MSc Computer Science conversion。 這個program課非常滿,每學期有30學分的課,一學期約有5–6科要進行,一共四個學期歷時16個月。每門課都有理論與practical實作部分,課表排起來真的很像高中生。

UCD MSc CS(conversion) timetable in semester 2.

然而別以為課很多就等於收穫滿滿或是對於求職很有幫助,實際上大量的小作業報告考試都很耗費時間,且對於求職跟日後工作幫助不大。雖然也有教學認真的老師,但基於時間要花在刀口上的想法,這始終不是最有效率的學習方式,至少對我來說是這樣。而且Task一多,一直不斷Context Switch對於大腦也是疲勞且低效率的。此外,如果自己還要安排時間做刷題,上線上課程,做side project等等,對於時間精力的分配也會是一大考驗。當然叫大家繳大筆學費去翹課是一件很奇怪的事,不過在這邊的確看到不少目標明確的人學校課都沒去上,作業求有不求好考試過就好,其餘時間全部拿來刷題與投履歷,不少都在畢業前拿到大廠offer。

我個人經過一學期後的做法是,每一門課當知道如何進行與評分時就要制訂作戰計劃。例如作業系統的課,自己看恐龍書(Operating System Concepts)或找中文的網路課程開兩倍速看,會比上課聽講跟讀投影片學得快且紮實。值得一提的是,用中文素材來學習是兩面刃,好處是你可以用很短的時間獲取大量的知識,不少資源如B站清大開放式課程交大開放式課程等都有不錯的網課,但缺點也很明顯,就是少了練習用英文獲取知識跟用英文思考的機會,畢竟在面試時一些專有名詞的英文以及technical conversation也是重要的一環。這就是個人取捨了。

第一學期到第二學期中上,上課加上做作業大概也沒時間自學跟刷題了,只投了少許intern跟new grad缺但因為刷題嚴重不足,線上測驗(OA)就被刷掉了。直到第二學期中疫情爆發,所有學校課程都變線上進行我才比較認真刷題。這麼晚才開始有部分也是當時還對自己想做什麼不明確,還在資料科學家跟軟體工程師中間猶豫(在這之前投資蠻多時間精力上資料科學跟機器學習相關的線上課程)。所以建議要出國之前先確定目標職位所需的技能並盡早開始刷題和學習演算法及資料結構。我們的program有演算法與資料結構的課,但對於應付Leetcode遠遠不夠,這部分會在刷題的部分詳細討論。

暑假是唯一有時間實習的時候,但無奈自己準備不夠外加疫情爆發,不少實習缺都hiring freeze或是直接把實習缺取消,所以也沒有拿到實習。英國或愛爾蘭的碩士暑假都是寫論文或者做畢業專題。

如果找的工作是一般軟體工程師,會建議不要花過多的時間在畢業專題上,雖然專題可當作一個side project放在CV上,但這樣的做法其實CP值不高,side project部分以轉領域的人來說如果能針對想要職缺所需的技術來做會更有加分效果,這個也會在後面討論。如果專題所用到的技能跟研究領域跟自己以後要從事的職缺高度相關,例如:有人想做Computer Vision Engineer,自己的論文又剛好是相關領域,如果能有期刊發表,那就可投注較多心力。

暑假還是會建議多刷題,並且把履歷準備好以迎戰9月的秋招,因為大量的new grad職缺會在此時開始招募。

Side Project:

對於轉領域的人來說因為缺乏工作或實習經驗,所以side project是充實履歷相當重要的一環。但side project的CP值要高,最好能用到目標職缺所需的技能,例如找java工程師可以用Spring Boot做一個簡易的購物網站或者行事曆讓別人知道你懂網頁後端與資料庫簡單的CRUD,以及什麼是RESTful API。

我自己當時的疑惑是,我知道做side project很有用,但根本沒靈感,完全不知道要做什麼,又怕做出來的東西很沒用,更遑論刻意使用想要練習跟呈現的技術。我的建議是,其實在BilibiliUdemyCoursera都有一些專案導向的課程舉例如:

相關的課程族繁不及備載,加上一些自己的東西很容易完成可以放在履歷上的side project。專案不一定要高大上或能被大家使用,重點是要能呈現自己會了什麼,並能夠在面試時陳述自己為何選用某技術以及實作的邏輯是什麼。當然能做出可以商用的app或者網站更好,或是能貢獻GitHub上的開源專案對履歷有更大的幫助。但考量花費的時間太多以及還有其他東西要準備,個人並不推薦轉專業的人投注大量時間在此。

完成專案之後就可以放在GitHub上並在履歷上簡單陳述用了什麼技術,這些關鍵字相當重要,因為公司篩選履歷很多時候第一層都是先由ATS(Applicant Tracking System)先篩選掉大多數不合格的履歷,系統篩選的標準往往都是用關鍵字,所以做了專案而沒有把所用技術關鍵字放在履歷上是很可惜的。

一些關於ATS篩選履歷的原理,及應對方式可以多加了解。

搭建一個技術部落格也是個不錯的Side Project,且建議買一個自己的網域會比較有識別度。不用擔心自己的文章太淺,從搭建環境、程式語言小技巧、刷題思路筆記、bug排除都是很好的題材,除了可以讓面試官知道你的學習是有系統之外,也能讓夠讓自己複習所學,以後就算忘記也容易找得到這些知識,算是一舉數得。

求職:

由於一開始自己學習的方向都是機器學習跟資料科學為主,主要精熟的語言也是Python,大概是2019暑假才開始認真學Java。根據我研究歐洲軟體工程師的Job Description,Java相關職缺較多,因此若以後端或是一般軟體工程師為目標者投資Java的CP值相當高。當然也有不少C# 跟.net系列或php的軟體工程師缺,但一般要求相關經驗較多。至於前端部分,純前端的缺看起來沒有想像中多,很多都直接找full stack developer。至於Python,若要走ML或DS相關的可以考慮。不然建議一般拿Python拿來增進刷題效率就好…

投遞履歷方面,每年9月秋招會開相當多new grad缺,一定要好好把握,大廠建議找人內推,LinkedIn上找華人或同校校友詢問基本上態度禮貌蠻多人願意幫忙。LinkedIn跟履歷建議越早搞定越好,尤其是LinkedIn可以定期發文按讚分享增加自己檔案觸及率,吸引一些Recruiter來看,雖然以我的經驗幫助並不是很直接,但是可以得到不少徵才消息也能有機會請他們幫看CV。 CV撰寫部分,網路上很多厲害模板,相關文章也很多,這我就不贅述。如果有個人網頁的話也建議把CV放在自己的網頁上。

如同前述,現在很多公司都採用ATS來自動篩選履歷,所以履歷的關鍵字跟你的職缺關係度不大很容易就被系統刷掉了。這方面的戰略有很多文章都有講(關鍵字 how to build ATS friendily CV)。也建議請有經驗的軟體工程師幫你修改。履歷上也建議附上跟所找職缺有關的Side Project,學校專題也可以簡述並包裝一下自己用了哪些技術。

我從2020九月到2021二月我一共投了300多個職缺包含愛爾蘭,荷比盧德,少量英國日本新加坡的缺,其中大概有6–7%的申請有拿到OA或面試,不少人強調內推的重要,但海投的機會還是很多,且海投可以在較少時間投遞較多職缺,自己拿到的很多面試也都是海投來的,所以千萬不可偏廢。我觀察到荷比盧的公司願意幫忙處理工簽的比例相當高,基本上只要薪資門檻有到就會有工簽。大家可以記錄並研究一下自己投哪種或哪個國家的缺收到面試較多。我的方法是,用LinkedIn搜索software engineer用國家或地區過濾職缺比數,再除以該地的總人口數,可以約當為單位人口的軟體工程師的職缺密度,可以根據此資訊往密度高的地方加強投遞。我當時的發現是愛爾蘭senior SDE密度較高,一般entry level雖然大廠多,但總體的密度並不高。

我最後是拿一間荷蘭鹿特丹一間小公司Java Developer的offer。雖然對方表明願意幫忙工簽,但由於敝人已年過30,在荷蘭超過30歲辦理工簽的薪資的薪資門檻高一大截,所以暫時是先用Orientation Year Visa(相關辦理方式請參考此站)。

https://ind.nl/en/Pages/required-amounts-income-requirement.aspx

刷題:

雖然在歐洲不是每間公司都跟美商大廠一樣new grad都考刷題,有些是給你回家作業請你做完以code review方式評估你的能力。之後面試會問你為何要這麼做?你的邏輯是甚麼?跟技術棧背後的原理。

但刷題(刷LeetCode)絕對是個要投入大量時間與精力的部分,小弟在這方面也不算高手,只能給轉領域的一點小小建議以避免重蹈覆轍。

強烈建議有意出國的人在入學前就先找本書例如:劍指offer或是Cracking the Coding Interview開始學習演算法,邊刷同類型的高頻LeetCode題目,一開始以easy或medium為主。hard題除非是非常經典且高頻的題目,不然不宜花過多時間,一方面打擊初學者信心另一方面投資報酬率上也不高,畢竟大部分遇到的題目都不是hard(雖然我面試Amazon有遇過),行有餘力再來鑽研吧。

至於現在LeetCode將近兩千題的題海該如何開始? 我自己的方式是先根據類型刷,例如:現在學習Tree就去找Tree相關的高頻題目練習,確保自己真的了解tree的各種操作(前序、中序、後序、層序)DFS、BFS等該要如何應用與實現。一種資料結構或演算法至少練習10–20題以上,動態規劃這類比較困難的題型可能要練習更多。對於演算法或資料結構不是非常精熟的人(例如我)一開始可能會連two sum都沒辦法輕鬆用最佳解做出。但不用灰心,剛開始建議十分鐘沒有思路就直接看答案了,看完答案暸解思路跟邏輯試著用自己思維把想法在腦袋裡面跑一次或是拿筆先把大概的邏輯畫出來,不要還沒想過就開始寫。接著試著模仿討論區裡面高手的寫法把code寫出來,不是複製貼上是自己邊想,卡住才看。即便會寫,討論區裡面很多乾淨易讀的code也是很適合模仿的。但一些一行文或者特殊解看過了解即可,並不適合在面試中拿來使用,畢竟解釋自己的解法跟答案與面試官交流也是重要的一環。

成功完成一題後務必做筆記,不只是code最好用文字或是圖解把這題的思路記錄下來,一方面方便複習,一方面能讓自己真正的學會解題的邏輯。不然只是在死背解法而已。

這邊提供我當初依據的分類題表:

當常見的標題都刷完之後,強烈建議買Premium來針對要面試的公司找高頻試題練習。不然也可以像我一樣開始從第一題開始補完1–200題。
前1–200都很經典,也可以訓練拿到新題時,該如何抽絲剝繭看他想考你什麼演算法或資料結構。做夠多題之後可以開始準備自己的模板,以方便自己標準化一些同類型題目的解法。例如Union Find(Disjoint Set) 這種資料結構我自己的模板如下:

class UnionFind:
def __init__(self, n):
self._parents = [i for i in range(n+1)]
self._ranks = [ 1 for i in range(n+1)]
def find(self, u):
while u != self._parents[u]
self._parents[u] = self._parents[self._parents[u]]
u = self._parents[u]
return u
def union(self, u, v):
pu, pv = self.find(u), self.find(v)
if pu == pv: return False
if self._ranks[pu] < self._ranks[pv]:
self._parents[pu] = pv
elif self._ranks[pu] > self._ranks[pv]:
self._parents[pv] = pu
else:
self._parents[pv] = pu
self._rank[pu] += 1
return True

刷題重質不重量,當然要刷完各種類型的題目量肯定不能太少。刷過的題目建議常常複習,可以現在腦袋裡面想一次,然後看能不能一次沒有bug完成,如果中間卡住就可以偷看一下之前的筆記。

此外,若一道題目有多種解法,也建議全部都練習一次,例如: 692. Top K Frequent Words

https://patricksudo.com/blogs/LeetCode/0692-Top-K-Frequent-Words.html

這類題目可以用Heap 或者 Quick Select來做,建議兩種方式試一次然後找一個比較熟悉的作為面試時使用的,另外一種可以拿來回答follow-up question。

我最後一共刷了350多題,OA只要不是hard大概都做得出來。

總結:

  1. 個人認為,找工作不要太糾結於地點,歐洲哪邊有缺,只要不是討厭的國家或城市都可以投看看,工簽問題基本上還好,等有面試再來煩惱。
  2. 不要過度糾結在課業與成績上,個人認為GPA的投資報酬率會隨分數越高而邊際效益遞減,在歐洲找工作時會刁難GPA的也不多,不要太差就好,建議還是多把時間投資在刷題上面。
  3. 轉專業的人在愛爾蘭求職務必要把握Ericsson的面試機會,因為他的OA跟onsite題目算是最簡單的也都是老題目,但我掛在final BQ。
  4. 面試的一些技巧我不是高手所以提到的不多,不論是behavioral question還是technical interview這些在一畝三分地裡面都有很多高手提供面經,跟相關技巧。比較麻煩的是要趁早天天登入湊積分。
  5. 其他想到再補充…

--

--

Patrick Su

Software Developer @ NL | Here’s to the ones who dream, Foolish as they may seem