文章同步發在Medium
This article is written in Mandarin. If there are sufficient requests of adding English version, I'll post another article.
2021 Summer Internship 求職終於告一個段落,很幸運也很期待能加入Facebook。非常感謝一路上幫助我的所有人。
前言
前往德國一年後,很幸運的能在轉領域後不久就找到軟體工程師的實習(Software Engineer Intern)。這不只是靠履歷以及刷題,更大多是靠運氣以及其他人的幫忙。收到FB offer後,正式宣告過去這幾個月瘋狂的生活告一個段落,很慶幸能成為Facebook的一員。非常感謝朋友以及家人的扶持,更由衷感謝完全不認識我卻幫我內推的 @Dalia,明年倫敦見了。
一路上看過無數的文章或是影片分享,覺得都是我能走到現在的養分,因此決定記下找工心得,除了給後人參考外也順便給未來的自己回味。本文將紀錄我轉碼後的心路歷程,包含打CS底、刷題心得、FB 面試流程等一些我自己的想法。歡迎不吝給予建議,謝謝!
心路歷程
2019 年五月收到TUM CSE 的offer後,從材料背景轉到CS的我才驚覺好像沒有回頭路了。還記得一開始的想法是:先試看看自己適不適合CS這條路,如果不喜歡的話還能回來舒適圈繼續搞材料模擬,當時的我還沒有破釜沈舟的決心,直到跟 @Alex 聊天後,他叫我就選好一條路好好走,這樣才走得好。此外,受到同樣也轉碼成功的 @jimmy 啟發,他丟下一堆材料領域的書卷獎,等於捨棄各大名校的機會(看了這篇ICML paper就知道,強者在哪個領域都能發光發熱),轉領域的我丟下的包袱跟別人比起來根本不算什麼。
換到一個全新的領域後,發現履歷上的東西根本要全部打掉重練...
我的目標是FAANG (Facebook, Amazon, Apple, Netflix, Google) 或是一些獨角獸的Software Engineer職位,查了查發現這些公司New Grad大部分都是實習後轉正職的,便決定以進這些公司的實習為目標。履歷上軟體相關經歷空空如也的我,決定延半年畢業,使我2021暑假還能保有學生身份(才能當實習生),原本很怕延了畢卻沒找到實習,但沒試過我想以後一定會後悔吧。
PS. 查了查發現大公司如Google, Facebook的intern錄取率為2%左右,而return offer rate可以期待在50%上下,而Full Time錄取率則低於0.5%。雖然這數字的來源沒有明確根據,但兩個數字之間比較起來應該還是有意義的。以機率的角度來看實習轉正應該還是一條容易一點的路XD
歐洲不像美國一樣有那麼多軟體公司,而美國公司在歐洲的總部也通常不在德國(大部分是在倫敦或都柏林),所以我一開始的希望是位在德國(至少我能合法工作且公司不需要另外幫我辦簽證)的Amazon或是Microsoft等公司、以及在英國或愛爾蘭且願意幫實習生辦簽證的大公司。後來發現位於德國的公司我收到一堆無聲卡,然後發現這些在英國或愛爾蘭的公司們(Spotify, Twitter, Stripe, Salesforce, Pinterest, Verizon等)大都不願意幫實習生處理簽證問題。<- 其實也挺合理的,他們有當地人、在當地讀書的外國人以及全歐盟的人可以挑(不確定英國脫歐後有沒有影響),怎麼看我這個不在當地唸書的非歐盟人都是排在最後的XD
所以我覺得我真的是蠻幸運的,能被一家好公司給撈上岸!
時間規劃
我的規劃如下:
2019 六~九月:出國前在台灣先做了一份ML相關的實習
2019 十~十二月:碩班開學,加強演算法相關知識,閒暇時做side project,投履歷找德國當地工作(此時很慶幸在台灣時有先累積一些經驗,面試時公司有興趣的都是過往的實戰經驗)
2020 二~三月:扎實的上了一遍資料結構(發現以刷題來說資料結構比演算法更重要一些)
2020 四~七月:開始刷題以及做Working student,履歷上的project很多都是這學期的課的作業包裝一下放到履歷上的
2020 八~十月:每天生活就是睡覺、吃飯、刷題以及一週兩天的working student,同時上作業系統(前一學期才剛越級打怪上完平行程式,這時上OS真的有身心舒暢、豁然開朗的感覺)
You can't connect the dots looking forward; you can only connect them looking backward. So you have to trust that the dots will somehow connect in your future.
Steve Jobs 1955-2011
其實當初我往前看也是覺得很徬徨,現在回頭看才覺得過去做的這些似乎都蠻合理也蠻連貫的,所以就算沒找到實習,我也告訴自己這些我做的準備以及所培養的能力未來在找Full Time時也會用到!
關於刷題
關於刷題的方法我是採取先DFS (Depth First Search) 再BFS (Breadth First Search) 的方式,先按照tag一個一個刷,將該tag 題號400之前的easy、medium全部刷完(跳過一些like/dislike比例太差的),這時我刷了Tree、Graph、Binary Search、Linked List以及Backtracking,因為這些主題都比較獨立,思路也比較固定,先把這些知識鞏固好後未來遇到變化題才比較有個方向。直到8月時開始刷top 100 like questions,這時刷得很慢(主要是因為DP...)因為這100題都是經典題,裡面包含了很多的知識點,每一題都徹頭徹尾搞懂的話,真的對之後有很大的幫助。
我一開始刷題時是看到題目就直接開始coding,後來發現這不是好的習慣,會讓面試官覺得你是個很unstructured的人,後來我改成遇到題目先用ipad做筆記,甚至在ipad寫下psuedo code,直到開始練習mock interview時才發現因為疫情關係我根本不會有機會遇到白板題,所有的面試都會是在online editor上進行,才開始使用打字的方式做筆記,一開始也是蠻不習慣的,因為相較於用手寫,打字時比較難visually呈現一些概念。總之就是盡可能讓平時練習時跟實戰越接近越好。
還記得八九月刷到走火入魔的時候,連睡覺都會夢到,被我夢到的資料結構有hash map跟tree,結果這兩個資料結構面試時都有遇到,真的是蠻巧的XD
到終面前一天總共刷了225題,但是看過的題目應該有300-400題,有些題目看了看懂思路之後就沒implement出來了,尤其在FB終面前在一畝看了很多FB的高頻題,想說至少讓自己在遇到題目時有個思考方向就好。
很巧的是,終面當天早上連續收到Intel、TeamViewer以及Stripe的拒信,更讓我覺得面試得來不易,下定決心一定要拿下當天的機會。
現在回頭看真的覺得蠻辛苦的,犧牲了很多旅遊、或是跟朋友hang out的機會,但真的覺得自己成長了很多,不管是problem solving、coding或是communication的能力,也覺得自己CS的基礎因此扎實了不少,應該能讓未來走得更長更遠吧,還是很慶幸能有這樣的結果!
Facebook Interview Process & TimeLine
9/14 submit referral
9/21 Hello from FB
9/29 reply back
10/13 phone interview(我是選視訊) (bluejeans + coderpad)
10/27 virtual onsite (bluejeans + coderpad)
10/30 offer
9/21 收到FB recruiter的信之後,驚覺面試已到必須趕快練習mock interview,也很謝謝@Brian 一開始陪我練了幾次,拖了一個禮拜後回了信,信中除了問available time slots之外還有一些基本問題像是Why do you want to work for FB? What's your area of interest? Explain a project of you等等。
Technical interview一般都是40-45分鐘然後通常要解出兩題最佳解,但根據題目難度以及面的職位也會有所不同,其實題目都是一樣的只是不同職位的hiring bar不一樣。面試中最重要的就是持續溝通,讓interviewer知道為什麼你要採取此方法、你打算怎麼達成、此方法的 complexity是如何、不同方法間的tradeoff等等,就算卡住了也要讓面試官知道你卡在哪,他才能幫你!把面試想像成跟同學或朋友一起在解題的過程,而不是對方單一的在拿放大鏡檢視自己。
Behavioral Interview 我是覺得相較於coding重要性低很多,但也不代表能放掉XD
我是使用Cracking the Coding Interview裡面所建議的表格,表格columns為履歷中所做過的projects,rows為該project的challenges, mistakes, leadership, conflicts等等,有這樣的整理基本上遇到任何問題都能迎刃而解。
然後要切記所挑選的example要記得盡可能地貼近該公司的core value,像Facebook的話就是Be bold, Focus on Impact, Be open, Move Fast以及Build Social Value,而亞馬遜則是14 leadership principles。
全部面下來感覺FB最看重的就是解題能力(CS fundamentals)、code fast、communication以及是不是culture fit。
整個十月我幾乎每天都安排兩個mock interviews on Pramp,練到終面前一天甚至把上面的題庫刷完了XD
除了LeetCode之外我最推薦的就是pramp了,雖然FB是我的第一個Technical Interview但因為我在上面練了很多,所以面試時覺得從容很多。
在pramp上真的學到很多,在時間壓力下的解題能力、一邊寫code一邊闡述自己想法的能力等等,真的跟自己閉門造車刷題差很多。此外,也能體驗當interviewer的角色,站在另一個角度看事情,學習別人做得好與不好的地方,同時反思自己哪裡能更進步。雖然pramp上面的題目偏簡單,但它主要是拿來練習一邊寫code一邊溝通的能力。
Pramp上還有一些意料之外的收穫像是認識來自世界各地的朋友,大家一起為了共同的目標而努力,正向的力量在彼此之間循環的感覺真的很好,也多少緩解了一些當時的壓力及苦悶。
現在應該會先從LeetCode以及Pramp登出一陣子,改培養其他Software Engineering相關的技能,以拿到return offer為主要目標。可能等明年暑假再回鍋開始刷題,同時多多培養connection。
One of my favourite YouTuber Clément 說他當初能在六個月內從開始寫code到進Google有四大因素 : Luck, Volume, Desire and Genetics.
而其中最重要的就是Desire。如果對於目標的渴望(Desire)越強,你就願意放更多時間以及心力(Volume)進去,甚至能影響運氣(luck)(他舉的例子就是他當初密了七個Google的recruiter,相較於只密了一個recruitor的人他的履歷被看到的機率就高出了不少)。
期許自己也希望大家都能儘早找到Desire並向目標前進!
倫敦是Facebook在美國以外最大的Engineering Office,可以看這影片,很期待加入:))
現在好像還在持續擴招,負責的範圍有Integrity(最大宗)、Machine learning、Infrastructure以及Facebook旗下的VR Oculus等。大概on-board前一個月會有team-match,希望能做到有趣的project。
My Linkedin : https://www.linkedin.com/in/tzu-chien-chang/
Feel free to reach out and connect :)