Published on

轉職前端工程師的海外求職 (德荷英日新) 心得 I — coding bootcamp 之後的能力養成篇

目錄

嗨,相信你會點入這篇文章,可能是因為你看到 coding bootcamp 的標題,也可能是有海外求職的打算。在往下讀之前請先讓我介紹自己,以及說說這系列心得會談先什麼。假如你有覺得符合你的需求再往下讀,可能比較不會浪費時間 (因為文章會有點長 XD)。

先說說我的背景,我是個平凡的台灣人,人生前 24 年沒碰過程式,兩年前開始透過線上課程 (YouTube & Udemy) 自學程式。去年報名了線上 Alpha Camp 的實戰課程 (Alpha Camp 是一個線上 coding bootcamp,詳見此),後來轉職軟體業,目前是有約一年多開發經驗的前端工程師。

前陣子因為家庭規劃要搬去歐洲,所以我也順著找了在歐洲的軟體工程師工作,最後有順利拿到一些工作機會。由於過去在網路社群中 (Medium 與 PTT 等地方),獲得很多前人分享的寶貴經驗,因此希望透過接下來兩篇文章回饋社群。第一篇心得 (也就是這篇) 會是談 coding bootcamp 後的能力養成。主要是網路上比較多分享從非本科轉成工程師,但比較少分享轉職成功後的持續養成 (我的個人經驗來說,轉職後反而才是挑戰的開始),所以希望這段經驗能協助那些剛順利轉職的人。

假如你比較想直接了解找海外工作的過程,可以直接跳過這篇。在第二篇《轉職前端工程師的海外求職 (德荷英日新) 心得 II — 找工作與面試篇》我會分享我獲得各國面試機會的過程,以及線上面試各國前端軟體工程師的實際經驗 (包含被問到的問題)。

直球對決冒牌者症候群

如上面提到,轉職後才是挑戰的開始。假如你有讀過我先前寫的 《A Philosophy of Software Design》心得 I — 寫出複雜度低的軟體,你大概已經知道,我在剛轉行時剛發的幾次 PR (pull request) 被狠狠地在 code review 時給了數不清的評論 (有如一張充滿紅字的考卷 orz…)。

當時最直接的想法是很挫折,但也很清楚意識到自己的不足。為了有效對抗這種負面感覺,我決定直球對決,開始用下班跟週末補上不足的部分,包含開始讀設計模式、開始補一些電腦科學的知識。會選擇直球,是因為我知道以自己的個性,這些不補起來,我會一直陷在這種負面狀態中。唯有讓自己足夠扎實,才能擺脫這種狀態。

免費的開放式線上課程

我個人看了三所不同大學的基礎電腦科學課程,分別是哈佛的 CS50、史丹佛的 CS106A、柏克萊的 CS61B。這三門 YouTube 上搜尋都可以輕易找到。網上還有很多人也推例如 MIT 的 6.0001 以及柏克萊的 CS61A ,但那兩門相對更基礎,會更適合轉職前看。此外,我選擇上面說的那三門,主要是授課教授的風格,這三門課教授的風格各異,但都是我很喜歡的。

雖然這三門課重疊的內容可能有七八成,但因為不同教授講解,有時切入的角度不同,或者解釋的方式不同。即使是聽過的概念,都能夠更強化理解,或是有更深層與延深的理解。因為教授講得都很生動,我基本上當追劇在看,利用通勤搭捷運的時間 (去年台灣還沒有疫情在家工作時)、中午吃飯的時間來追。很推薦同樣是剛轉職的人,透過這些基礎課程來補足,幫助很大!

覺得受用無窮的書與文章

  • 《Head First Design Patterns》這本真的深入淺出講設計模式,非常新人友善
  • 《A Philosophy of Software Design》這本讀完程式設計功力瞬間大增
  • 《JavaScript: The Good Parts》JSON 格式發明者寫的,讓人對 JS 理解加深很多
  • 《追求神乎其技的程式設計之道》很熱血的連載,讀完對如何精進程式功力有很大啟發

對前端工程 (React 開發者) 很有幫助的內容

雖然不一定適用每個人,但我個人很認同 CS50 與 CS106A 課程中都有提到的概念,就是電腦科學的思維與程式設計的思維,有非常多部分是跨語言的。我自己在打底的過程中,有些內容是用不同語言學,核心概念本身有學到外,也多打開一些窗。舉例來說,因為 CS106A 與 CS61B 兩門課都是用 Java 教,所以公司的新產品決定用 TypeScript 寫時,對於開始寫型別這點,幾乎沒有太多要適應的地方 (雖然還是很常被一些 React 搭配 TS 時讓人困惑的地方絆倒很多次就是了…)。

刷題補上不足

在上班被狂電,下班瘋狂惡補後,才總算有點覺得穩下腳步的感覺。在穩下來後,我決定面對一個過去一直逃避的點 — 資料結構與演算法 (data structure & algorithms)。由於過去工作上其實沒有真的用到太多演算法的東西,只有在轉職前曾經練習過 LeetCode 題目,但也只做了三十題左右;簡言之就是在這方面我的底子非常薄弱。

跟先前經歷冒牌者症候群一樣,我知道要克服這種狀態,最有效的方式就是多學習、多練習,直到我真的把不足的地方補起來。因此我就開始了為期四個月的每天刷題時期。除了 LeetCode 之外,我有額外用了一些付費資源。到實際面試之前,我完成了以下的練習

  • 《Cracking the Coding Interview 6th Edition》 — 189 題
  • AlgoExpert — E25 / M55 / H46,總計 126 題
  • LeetCode — E50 / M60 / H2,總計 112 題

《Cracking the Coding Interview》是很多人推的一本書,從觀念到實作題目,都有很完整的講解,因為裡面的題目比較簡單,假如跟我一樣演算法題目的基礎薄弱,從這本書開始,是個不錯的選擇。讀完這本後就可以進到刷題實作的平台 (例如 LeetCode)。

除了買書外,我有額外買一個叫 AlgoExpert 的課程。會買主要是先前有訂閱裡面講課老師的 YouTube 頻道 (有興趣的人可以在 YouTube 上搜尋 Clément Mihailescu,講師之前在 Google 與 Facebook 當過軟體工程師),加上看了它免費試看影片後,覺得教的還不錯,因此決定買來看。課程約是三千多元台幣。我個人覺得花這三千台幣左右的費用,前期還算值得,但後期就覺得還好了。

前期覺得值得,主要是因為我底子不足的關係,所以觀念講解對我特別有幫助。但後期覺得不那麼值得,主要是發現還是有蠻多好的 YouTube 頻道,基本上可以取代 AlgoExpert。其中我個人最推一個叫 NeetCode 的 YouTube 頻道。我在該頻道不到五千訂閱時就訂閱,寫這篇文時它已經超過三萬訂閱。但我覺得好頻道值得更多訂閱,所以特別推廣一下,一人一訂閱支持免費的好頻道 XD

在看完 AlgoExpert E/M/H 共 126 題的講解影片後,發現 NeetCode 完全可以取代 AlgoExpert。這不是說 AlgoExpert 不好,畢竟當初我會買也是因為有很清楚的概念講解,同時通常會提供多個解,包含最佳解,以及有題目分類。只是這些 NeetCode 也是全都有做到。

舉例來說,當初看到 AlgoExpert 這題很常在 Phone Interview 被問的費氏數列 (Fibonacci Number) 問題。相信多數人都知道,這題最直觀的解法是用遞迴 (recursion),但是時間與空間複雜度都很差;假如用記憶化 (memoization) 的方式解可以大幅優化時間複雜度;而用動態規劃 (dynamic programming) 方式則可以再進一步優化空間複雜度。對於剛踏入刷題領域的我來說,看到這樣逐步優化的解法,覺得真的很有幫助,大開眼界。

不過,後來看到 NeetCode 有完全一樣的優化講解。LeetCode 的 70. Climbing Stairs 是完全一樣概念的題目,而 NeetCode 也是很清楚地講了三種不同的解法。多看幾個 NeetCode 的教學影片後,就越來越覺得當初花錢買 AlgoExpert 的自己很盤……。

另外,AlgoExpert 宣稱有個好處是有幫忙做選題,所以可以省去選題的時間。不過其實網路上找一下,就可以看到像是 Blind Curated 75 這類別人已經幫忙選好的 (NeetCode 有個播放清單專講這些題目 XD),而 AlgoExpert 選的題目跟那些其實沒差太多。所以是後回頭看,我覺得底子夠扎實的人,純粹練習題目來說,不太需要 AlgoExpert,有 LeetCode 就很夠了。跟我一樣底子不扎實的,看 NeetCode 就很夠。我沒有要黑 AlgoExpert 的意思,如上面提到,我覺得它的內容做得很好。這邊純粹想說,假如你不想跟我一樣後來覺得自己很盤,就直接看 NeetCode 吧~

實際開始刷題後,我大概花三週讀完 《Cracking the Coding Interview》的 189 題,基本上中餐讀、下班讀、週末全天讀。接著花六週看了 126 題 AlgoExpert 題目,並且每題實作。剩下的時間都花在 LeetCode 上。因為 AlgoExpert 蠻多題目都是從 LeetCode 上匯集來的,所以遇到一樣的題目,就解比較快。

在實際做 LeetCode 時,我是參考「半路出家軟體工程師在矽谷」大大在他的部落格寫的一篇文,標題是《聽說你最近在刷題- 軟體工程師的面試一定會遇到的資料結構及演算法關卡》。在參考別人解法時,我多半是點擊 Most Votes 來看。即使最多人投的解法用的語言不是我用的,但思路上通常能給很大的啟發。我會吸收並消化後,試著用 JavaScript 再寫一次。

心態調適

大家都知道想申請海外軟體工程師的工作,資料結構與演算法題目是必須練扎實的。但是為什麼真正能做到的人還是有限呢? 我認為最關鍵的原因,還是因為這個過程並不容易。以我自己來說,我原本待的公司也是很棒的公司,所以有時候卡住、累了的時候,腦中就跑出「還是就算了」這種想要求安逸的想法。

身為平凡人,能否在這漫長的修煉過程支撐下去,我覺得反倒是決勝的關鍵。因此最後這個段落想要分享一些我能夠在四個月,每個下班與週末持續做刷題的一些小撇步。可能不一定適用每個人,但假如你也有一度想說算了的話,或許可以參考這些作法。

(I) 有清楚的動力 身為平凡人,我覺得我能在漫長自我精進持續的關鍵原因,是因為有很清楚的動力。之所以興起去歐洲工作的想法,是因為今年五月台灣疫情關係開始在家工作時,我跟另一半實在沒事做,每天看各種 YouTube 頻道,其中包含旅歐工程師的 YouTube 頻道。不看還好,一看則一發不可收拾,例如這個在荷蘭的工程師 HoiAle,或這個在德國的工程師 Stanley 的太太 Weiwei ,看到它們工作與生活都享受,就覺得好想也這樣。

當想到未來能夠早上先去滑個小船,下午再繼續寫程式,動力就馬上起來,然後又能多刷三題。假如覺得累的時候,再看一下能請兩週假租一台露營車去德奧玩一圈,動力又起來,然後又能多刷五題 XDD 總之有清楚的動力,堅持就相對不困難。

(II) 轉換思維享受過程 在剛入行半年時,不論是上 CS 的線上課程,或是讀軟體設計、JavaScript、React 的內容,因為讀的東西在工作上可以立即用到。但是資料結構跟演算法的題目練習,說實話非常少出現在實際工作中。因此自然會覺得「到底為什麼要做這件事?」或是「假如只是為了面試,花時間在這上面浪費掉的人生,真的值得嗎?」等等的聲音。

不過我後來發現換個角度,把演算法當成藝術來欣賞,會有截然不同的感受。 舉例來說,我為了模擬在時間壓力下解題目,後期開始打 LeetCode Weekly Contest。印象很深刻的是 LeetCode 1980 題 Find Unique Binary String,我那時用 backtracking 的方式解出來,還覺得自己解得不錯。結果後來看討論區有人用 Cantor’s diagnolization 的方式解,當下覺得驚為天人,竟然可以有這麼聰明的方式,在螢幕面前讚嘆了好一番。這種欣賞的角度,讓解題目不再枯燥,而是真的覺得很享受~

(III) 放寬心但保持成長思維 很多時候,最佳解就是不那麼容易被想出來。舉例來說 LeetCode 287 題 Find the Duplicate Number。一開始看到這題很自然想到,可以先排序然後透過迴圈來判斷是否重複;又或是建立一個 hash map,然後一樣搭配簡單的迴圈,來解決這問題。但偏偏題目中有說,不能更動原始陣列 (換句話說不能排序),同時只能用空間複雜度 O(1) 的方式來解 (換句話說不能用 hash map)。

然後我的腦袋在掙扎了半小時後,就宣告放棄。這時去看討論區別人的解法,看到某篇 Most Votes 討論區中有人分享了這篇,某個史丹佛大大寫的文章 。文章開頭提到,這題要用 O(n) 的方式來解,連史丹佛的演算法大師 Don Knuth 都花了 24 小時才解出來。看到這段我就放寬心了,畢竟連演算法界的大師都要花這麼多時間,我在半小時內想不出來,就別那麼苛責自己了! 當然半小時內想不出來,不代表我要就此放棄。把這篇文章讀懂,再把文章中提到的 Floyd’s cycle detection algorithm 搞懂,最後即使我不是原創想到這個解法,但未來遇到類似的問題,我也變得有能力解出來。

上面提到的 NeetCode 有講解這題,講得很清楚,推薦有興趣的人可以看看

(IV) 適當休息與調節 因為能力培養是長期的馬拉松,而不是短跑;因此,適當的休息與調節很重要。我自己的方法是看韓劇,感謝在我申請海外工作的期間,有《機智醫生生活》以及《海岸村恰恰恰》這兩部好劇 (雖然金宣虎黑掉,但劇真的很好看)。每週看一兩集韓劇是我犒賞自己的方式,看得時候就好好放鬆,看完後就覺得又活過來了~。

當然你可能有不同的調節方式,但切記在每天高強度自我鍛鍊的同時,務必要有調節。如果去咖啡店、去爬山、去找朋友聊天等等不同方式,能讓你好好充電,那就別吝嗇每週撥出一點時間來做這些事呀。

下一步:申請與面試

當把底逐步打起來後,下一步就是實際申請海外工作,以及實際面試了。我將在下一篇《轉職前端工程師的海外求職 (德荷英日新) 心得 II — 找工作與面試篇》分享我從開始申請到實際面試的心得,有興趣的人可以接這看下去。