開始刷題的契機
我從2020年的三月開始刷題,從Leetcode的記錄來看,那一天是3/15,好像沒有什麼特別的原因,只覺得心裡有一股很強的念頭想換工作,剛好踫上疫情,開啟遠距辦公,少掉了通勤的時間,想說不如把時間挪來準備面試。
來美國念研究所之後,一直以來都知道要刷題準備面試,但是都在發懶,很久以前斷斷續續的試著寫過一些Leetcode上面簡單的題目,寫了幾題覺得難就放棄了,就這樣重複幾個循環,始終都沒有抓到刷題的要領跟精髓。畢業後靠著Return Offer拿到正職的工作,然後靠著人脈換到了新創公司上班,但看著身邊的朋友們都在大公司上班,心裡開始羨慕了起來,也想去大公司體驗看看。
我在研究所時期的實習機會,是我厚著臉皮問我的修課老師,他給我機會的。後來的轉正職,一直到我現在在新創公司的工作,這些機會都不是靠著Coding Interview拿到的,所以一直覺得我好像差了別人什麼,感覺像是,別人的面試都是白板題,我好像憑著我的厚臉皮(?) 運氣(?) 很會講話(?) 才能走到這裡。
現在開始努力,機會來了就能派上用場,才能用力的抓緊它
第一個Offer
決定要開始刷題之後,一邊也開始上Linkedin到處丟履歷。很快的,我收到了一間保險公司的面試邀請,那是一個軟體工程師的職缺。它的Technical Interview是兩個小時,我一個人面對三個資深工程師,沒考刷題,但問的問題包羅萬象,從React、Redux的細節,API,通訊,安全認證到資料庫的選擇,有些問題我自認沒有回答得很好,但是靠著過去累積的一點點經驗,我順利的拿到了Offer。
這是我第一次自己靠著面試拿到的Offer,無疑是一劑強心針,原來我也可以靠著自己拿到職稱是軟體工程師的工作。但因為工作地點在美東的鄉下,與人生規劃不符合, 以及心裡還是覺得,我的刷題之路才剛開始而已,還是想挑戰看看大公司,最後忍痛放棄了Offer。
邊上班,邊刷題,但避免Burnout
在某一篇討論串看過,如何在高壓的新創環境,一邊工作一邊準備面試,答案是,盡量不要花太多時間和精神在工作上。我會在上班時間衝刺的把工作的代辦事項完成,所以我的工作不至於壓縮到我的空閒時間,我便能利用這些時間來刷題。
我想要讓我自己有規律的生活,知道整個準備的過程就像是一場馬拉松,過高強度的衝刺只怕讓自己有休息偷懶的藉口,所以我每天排了運動的時間和耍廢偷懶的時間。雖然很多時候,都會因為工作來不及做完,或者是今天刷題的題目比較難,每天看似輕鬆的行程,執行起來大部分像是在趕火車。
每天早起的第一件事情是刷題,早起好痛苦,但是一大早先把困難的事情做完,就會覺得工作上的瓶頸好像也不是太困難,也不會到了傍晚還得想沒刷題會覺得壓力大。正因為行程看起來不太緊湊,就這樣騙過了我的大腦,喔!看起來還行喔,這個時程表我做得到,我才能持續地準備好幾個月。
我沒有規定自己一天一定要寫多少題目,我知道我的能力並沒有比其他人強,花在一個題目上的時間自然得比別人來得多。但是與其花時間在絞盡腦汁想破頭也想不出來的情況,我選擇參考Leetcode 解答區與討論串、各路高手的解法,理解這些解法的思路,再透過自己的想法,用自己的意思寫出代碼。很多時候,一個題目會有一種以上的解法,我會練習一題多解,訓練自己的解題思維。
No matter where you are in your journey, there is always a finish line.
If you know you are going to get there, why are you worried about where you at today. It’s just amount of time to where you wanna get.
開始面試
我在八月底的時候開始投履歷,打算一天投一至二間。投履歷的過程並不難,但是頗花時間,因為每一間公司要求的資料不同,但大都得填過去的學經歷以及工作經驗,所以只能硬著頭皮慢慢填這些欄位。我申請工作的網站主要透過LinkedIn,很幸運的,在我投履歷之後沒多久,開始有公司聯絡我。
Auth0 是第一間回覆我的公司,當時很開心,因為自己的履歷跟經驗能夠被看見。它是一間網路安全技術公司,爬文中得知他們不太考刷題,我花了大概一個禮拜的時間,複習安全認證方面的技術。我在面試之後的事後省思,我發覺我在行為面試上的回答有進步的空間,遇到問題像是,當你到一個新的環境,或者剛接手一個全新的專案,你會如何讓自己迅速地上手?或者像是,當你必須面對一個同事們都不懂的程式庫,開發這個程式庫的人聯絡不上,但你又必須暸解它,你會怎麼做?後續很多Follow-Up問題頻頻讓我招架不住,很可惜面試之後沒有過到下一關,但我認為它是一個有趣的面試經驗。
在收到Auth0面試邀請的同一天,九月四日,一位臉書的Recruiter在Linkedin上面聯繫我,希望能夠找時間聊聊。在那次的電話中,我們談到了臉書的面試流程以及準備方式,並安排了兩個月後的電話面試,這是我第一次大公司的電話面試,那天與Recruiter談完之後,我懷著既期待又緊張的心情,思考著要怎麼利用接下來兩個月的時間來好好的準備。這時的我,對於電話面試的技巧完全不了解,過去的刷題也只是自己對著螢幕寫題目,之前練習的時候沒有時間限制,但一想到要在面試的時間壓力下,講解算法並盡可能地寫出最佳解法,很多時候,在一個小時內,我一個中間難度的的題目都無法自己想出解答,到底要怎麼一邊寫,同時還得一邊講呢…
面試準備
像是考學測或是考托福,我喜歡有讀書計畫,並照著計畫走,照著計畫走就不容易慌了。兩個月的時間,我預計花兩個禮拜把基礎打好。臉書提供了練習的平台,裡面分了不同的項目(Hashtable, Linked List, Stack, Queue, Tree, Trie, Graph, Vector, Heap, BFS, DFS, MergeSort, QuickSort, Binary Search),除了練習平台上的題目之外,我也到Leetcode上,找到這些項目的高頻題,每一個項目練習五至六題,並且一題多解,讓自己熟悉相似的題型及方法。
我加了許多找工求職的臉書社團,希望能夠找到隊友一起打面試的怪。今年報名了Grace Hopper Celebration (GHC),我在GHC社團認識了一位印度朋友,開始用Google Doc互相練習,一人先做題,一人當面試官,做完題之後再輪流,可惜後來因為時間上無法配合就沒有繼續了。同樣的時間,很開心在另一個臉書社團認識另外的朋友,I-No。
超級感謝I-No在他拿到Offer之後,還陪我做了不下十次的模擬面試。每一次的練習都是一個很好的學習機會,我漸漸地掌握到了整個面試的流程跟技巧,也大概瞭解如何分辨好題型跟壞題型。每一次的練習後,我會把當天的題目相對應的題型「們」複習過,印象中,有一次的練習題,它可以用Dynamic Programming 的解法,I-No也提出了可以用Prefix Sum的方式去思考,那一次的模擬面試後,我便花時間把這兩種類型的相關題目做過一遍,讓自己更印象深刻。每一次的模擬面試不只是當下的一至兩個小時,後續的練習也能把基本功練好。
除了題目上的技巧,面試中要注意的細節,I-No也在模擬面試中指導了我很多,像是一開始的Clarify the Question,如何思考Test Cases,Edge Cases,以及在寫Code的過程中,盡可能用一兩行的comment描述接下來的整個code block,不僅可以讓程式更好讀,也會避免自己在實現程式碼的過程中,忘記原先思考的細節或是重要內容。最後,最重要的當然是要測試自己的程式碼,與其讓面試官指出代碼中的錯誤,自己跑測試發現盲點,更能展現解決問題的能力。
一個禮拜中,沒有與I-No練習的天數,我會自己上Pramp隨機找人練習,Pramp是一個免費練習模擬面試的平台,它會隨機配對,一人當面試官,一人解題,然後在輪流。每一次遇到的隊友都不一樣,每一個人的面試經驗也不同,我認為可以透過看著別人的解題模式,思考哪些點是我應該避免犯錯,又有哪些是我可以學習的。
兩個月前的我,對於電話面試技巧還一竅不通,透過複習基本題型以及不段的模擬面試,在電話面試上,我也有一定的基礎跟信心。
對於題目的類別,我自己相對喜歡Graph類似的題目,有時候可以衍伸出很多不同的變化,像是Hashtable + BFS,或是同一題必須用到BFS+DFS,遇到這類的題型相對開心,透過一些題目的關鍵字,就稍微可以辨別出用怎麼用的算法去解。另外,Tree相關的題目大部分都可以有Recursive和Iterative這兩種解法,我會確保我兩種解法都寫過之後,才算把這一題完成。有些特別的像是Binary Search Tree,它的Iterative解法很有趣,透過練習,其實可以自己慢慢地找出模板,應用到不同的題目上。說到模板,Sliding Window就有一個特定的思維,如果遇到一個Array的題目,常見的解法包含Binary Search,運用Heap,Sliding Window,Two Pointer/Two Pass像是water trap的題型,在思考優化的過程中,我的腦袋也會閃過這一些常見的解法,思考它們的時間及空間複雜度,來判斷這是不是一個最佳解。但是有些題型我到現在還不是非常的熟悉,像是Dynamic Programming,這類型的題目我都會用Recursive思維先起頭,接下來運用Memorization去優化,至於下一步簡化到找出Sub Problem,我到現在還沒有在時間內靠自己解出來。
面試過程及結果
在準備臉書的電話面試期間,微軟的Recruiter看到我在GHC投遞的履歷而連絡上我,當時認為這是一個好的練習機會,假設沒有錄取,至少也可以繼續面試臉書,在此同時,Amazon的Recruiter也透過Linkedin找上我。不巧,十月是我工作上忙碌的時期,手邊的專案在月中要上線,當時每天早上醒來都是一場硬戰,工作上每天都有緊湊的時程要應付,但是面對好不容易拿到的面試邀約,硬著頭皮,盡全力準備一波也才不會讓自己後悔。
我與先生中間還抽空一週回科羅拉多州搬家,每天的行程除了刷題、工作之外,便還是刷題跟工作。真的很感謝我弟和我先生在整個過程中陪我,讓原本容易緊張的我,有了一個強大的定心丸。
時間線
9/2/2020: Facebook Recruiter Reached.
9/4/2020: First Chat with Facebook Recruiter.
9/15/2020: Microsoft Recruiter Reached.
9/18/2020: First Chat with Microsoft Recruiter.
10/1/2020: Complete Microsoft OA. Get the result a few hours later. Schedule Onsite.
10/22/2020: Amazon Recruiter reached.
10/26/2020: First Chat with Amazon Recruiter. She sent out the OA.
10/29/2020: Microsoft Virtual Onsite.
10/30/2020: Complete Amazon OA. Get the result a few hours later. Schedule Onsite.
11/4/2020: Facebook Phone Interview.
11/11/2020: Get Microsoft Onsite Interview Result. Move to Team Match.
11/12/2020: Get Facebook Phone Interview Result. Schedule onsite.
11/16/2020 and 11/17/2020: Amazon Virtual Onsite
11/23/2020: Get Amazon Reject.
12/3/2020: Sign Microsoft Offer.
12/4/2020 FB Virtual Onsite Canceled (due to visa issue)
去年的同一個時候,我做了Amazon的OA,當時的我沒有刷題也沒有準備,一個題目也沒寫出來,想當然是沒有進到下一關的面試。今年的我能夠拿到三間公司的Onsite面試,看到過去一年的進步,其實已經心滿意足了。雖然被Amazon拒絕,臉書後來通知因為簽證的關係沒辦法繼續面試,但可以拿到微軟的Offer,很開心自己終於靠著努力,成功的從EE轉到CS了啊!
拿到Offer之後,我開始研究怎麼向公司談薪資。Levels.fyi 是一個很好的網站,可以了解不同級別的薪資,知道自己的有多少空間可以談判。我一開始很擔心,會不會自己的要求太多,會不會因為自己的貪心而被取消了Offer,冷靜下來之後才發現自己的擔心是多餘的,很多時候,這些要求並不會影響已經決定要給你的Offer,相反的,對我們來說,多問幾個問題,多聊幾句話,可以讓自己的薪資增加好幾千塊美金,為什麼不開口詢問呢?最壞的結果,也只是沒有拿到心中的那個數字而已。
希望接下來的我,能夠順利地提離職。很感謝在2020年,我有這樣的好運氣,在未來的2021年,期許自己在面對困難的時候,能夠有一樣的勇氣去面對它,堅持住,並克服它。
Be patient and persistent.