(文長警告)
上一篇提到 2019 年底聯繫上 HR 開始全職刷題六個月,
到了 2020 年中面試完收到拒絕信,灰心了好一陣子。
但也沒辦法,還是只能乖乖回去公司上班。
這次回公司上班其實也獲得一個不錯的契機,
因為加入了有兩個印度人在內的 scrum team,
所以每天都得使用英文討論進度,英文聽說能力大幅提升,
發現自己竟然可以聽懂印度腔英文時真的有點驚喜 lol
在工作閒暇之餘,自己一直保持著一天寫個一兩題的習慣,
大概到 2020 9月開始,Leetcode 開始出現 30 days challenge,
用意是希望你能夠每天完成它指定的題目,完成會有獎勵。
也是從這個契機開始,找一些朋友組了一個解題讀書會。
這個讀書會其實後來對我的表達訓練幫助非常大,
我們的跑法是這樣:
1. 先看當天題目難度設定時間:
easy 10 分鐘,medium 20 分鐘, hard 30 分鐘
開始計時之後才開始看題目。
2. 只能按 submit,不準按 run code。
3. 在時間內 AC 的人留言自己作法的時/空複雜度,跟 WA 次數。
4. 時間到直接停手,沒 AC 的人輪流說自己的想法,
再換有 AC 的人照著複雜度跟 WA 次數排序,較差的人開始分享自己的 code,
要徹頭徹尾的說出自己的策略,code 每一行的用途,跟有沒有機會再改善。
5. 最後來看解答跟討論區,討論區主要看 lee215 跟 StefanPochmann 兩位神仙,
不過這兩位大神的 code 有時候會太過簡化,
不建議面試時把 code 寫的跟他們一樣,
但他們的邏輯跟作法非常值得讓人學習,而且語言特性用得淋漓盡致。
另外也推 DBabichev 和 awice,他們的 code 說明會比較詳盡,
看起來會比較容易消化,滿建議有看到這些人的文章都可以打開看看。
我們一開始原本只打算把這個 30 days challenge 寫完就好,
結果 Leetcode 官方後來直接把這個變成 monthly challenge event,
一直到現在都還有,所以讀書會就一直跑到現在都還在跑 XD
也差不多這個時間點開始,每週準時參加 Leetcode weekly contest。
之後也有參加 Codeforces, KickStart, CodeJam,
之中 CF 的定位比較偏向競技用途,覺得對於學習觀念的成效有限,漸漸就沒再參加。
變成每週 LC weekly/bi-weekly,每月 KS,報名 2021 CodeJam,這樣的模式。
但其實 KS 跟 CodeJam 題目有點太閱讀測驗,但畢竟是 Google 辦的就加減參加。
參加 contest 主要用途是為了訓練抗壓性跟時間掌握能力,
讓你臨場感受在有限的時間內完成給你的 coding 任務,
也是一個量化自己成長幅度的方式。
LC contest 要在一個半小時內寫完 1e2m1h,
一開始我通常只能寫完 1e1m,會在寫第二個 medium 題目超時。
而到面試前,已經幾乎可以 easy 從看題目到 AC 穩定在 5 分鐘內完成。
1e2m 幾乎穩定可以在 40 分鐘內完成,剩下的 hard 就隨緣慢慢寫。
時間到之後我會把自己的解法 po 在討論區上,
順便可以寫下自己的策略跟估計時/空複雜度。
這一步真的滿重要的,有時候你以為寫了一個很厲害的解法,
結果 most votes 的解法硬是比你強一個等級(通常都是 lee215 的解 lol)
而且有時候看到自己的解法是 most votes 第一名時真的會很有成就感。
大概過這著這樣的平日上班開讀書會,假日打比賽的生活一段時間後,
就決定 2021 年初開始再來請一次六個月的育嬰留停好好準備。
有人可能會問是哪家公司這麼好可以一直請,
其實法規規定一個新生兒在三歲前,總計可以請兩年的留停,
但只有前六個月有勞保局補助,剩下的就真的是吃老本在撐了。
(如果真的想知道是哪間公司,是一間曾經差點買下 Google 的老牌網路公司 XD)
其實這次請留停前也有跟主管和大老闆說清楚,這次留停應該是不會再復職了。
以一個破釜沈舟的心態來抓住未來可能的機會。
這次因為已經累積超過 600 題,而且上次面試發現自己有些觀念掌握的不太好,
所以改以主題式複習方式,把所有寫過的題目分類,
用一個 Notion page 筆記下來,把自己的解法都整理貼上去,
同一個主題的內容與解題手段都弄通弄熟後,才往下一個主題前進。
這邊要再強調一次,千萬不要執著於累積的題數,
刷題只是為了幫助你掌握觀念,掌握觀念與解題手段才應該是真正的目標。
很推薦 Leetcode 的 learning cards: https://leetcode.com/explore/learn/
如果是從頭準備起可以從這邊下手,
搭配 Cracking The Coding Interview 應該可以掌握七成的內容。
剩下三成內容可能就要靠自己歸納統整出來,像是 DSU 跟 BIT 就要靠自己去了解。
另外關於 system design,其實我沒有額外分配太多時間在上面,
一個原因是因為網路上搜集到的消息是 system design 主要是拿來分辨 L4/L5 的指標,
L5 以上(含 L5)是一定會問,但如果是面 L4 以下(含L4),
比較會問到的是 OO design 或是 system design related 的問題。
而且我也有問了幾個挑戰成功 L4 的朋友,
有些是完全沒被考到 sd,有些是 sd 答很差但最後還是 qualified。
所以我最後有點賭的只從這裡面挑一些內容配飯加減看:
- https://github.com/checkcheckzz/system-design-interview
- https://github.com/donnemartin/system-design-primer
- https://www.interviewbit.com/courses/system-design/
就這樣一直準備到大約 2021 二月左右,收到了「Hello from Google」為標題的來信,
約了簡單的 chat 後就直接說可以再幫我安排 phone interview,
這次投的缺是 General Software Engineer,
心裡想著這應該是近期我自己設定的最後一次機會了。
(其實我有問過 HR,現在似乎?沒有三振條款,
但會希望你每次的 feedback 都比上一次更強,不然可能會拉長 cd 時間)
於是很保守的約了五月再開始整個流程,也給自己更多的時間消化吸收整理的內容。
然後大約在四月中左右,開始請朋友幫忙 mock interview,
個人認為 mock interview 絕對是鄰近面試前最需要做的一件事。
我的做法是把朋友真的當主考官,跟他約時間開 google meet 跟 doc,
開始後不嘻嘻哈哈,真的讓自己親臨現場。
他會從 Leetcoce 中隨機選 Google tagged 1e1m 共兩題,
然後請他把 constraints 跟一些他認為我應該要問他的題目敘述拿掉,
在「最多只給一個必要的 test case」的情況下把題目貼在 gdoc 上給我,
然後我該做的事情就是:
1. 詢問可能的 constraints 與某些 edge cases
2. 列出至少三種不同類型的 test cases
3. 先「說」出自己直覺的暴力解,再想想看可以從哪個觀念解,think aloud
4. 確定得到可以寫 code 的訊號後開始動手寫
5. 盡量對自己每一個打下的字元都充分考慮,不修修改改
6. 邊 code 邊說這樣寫的用意
7. dry run 自己列的 test cases
8. 給他明確的「已完成」訊號
9. 以上儘量掌握在 easy 10 分鐘和 medium 20 分鐘的限制內
這其實也是真正面試時最重要的流程,大量 mock interview 可以讓自己越做越好。
我跟我朋友那時間每天都會進行一場這樣的 mock,
超級感謝他,也有說好以後他有需要我也會陪著他這樣做 QQ
於是終於到了 phone interview 的那天,是中文對談的場次。
遇到一個很棒的面試官,跟他溝通都很輕鬆,真的像是在跟同事一起寫 code 一樣。
一開始先來一題 easy,是某個知名演算法的子題,
直接列 test cases 後口述做法後立刻寫完 code,
他還問我說是不是常在打比賽 XD
第二題是一題 medium 偏 hard,聽完題目後列了 test cases,
口述了心中想到的方法後,直接被告知那我們來解第三題好了,他相信我寫得出來 XD
第三題是一題 hard,一樣列 test cases 後給直觀解,
然後再進一步思考要怎麼做更好,這題我想了比較久一點,
幸好最後有想到之前在某個 hard 的題目中有用過的手法,順利解開。
然後時間也差不多,閒聊了一下就這樣愉快的結束。
這一場我自己給的評價是 positive,
果然幾天後就收到進入 onsite 的通知。
這次的 onsite 安排了四場 ds/algo 跟一場 G&L,
沒有 sd 的場次,因為 HR 說我去年有表示想換,所以今年就換了。
一樣分成兩天,一天三場 ds/algo,另一天一場 ds/algo 和一場 G&L。
onsite 第一場是全英文對談,
這場一樣以一個 easy 暖身開場,
一樣秒解後,面試官還問: "Are you sure about your solution?"
很緊張地再 dry run 兩次都沒問題,
結果他笑著說: "Just want to check you have enough confidence with your code."
然後表示這確實是最佳解,也沒有可以再最佳化的地方了,做得好。
然後就進到下一題 lol
第二題他一開始有說這會是一個題組,有點難把這個題目歸類難度,
是個比較偏向 open-ended question 的問題。
大致上就是寫個他要求的東西,他會再問些進一步的問題,
你再思考改善方式這樣。
這個題組其實不太像是傳統的 ds/algo 問題,
個人是把它歸類為 L4 以下可能會面對到的 sd related 問題吧。
時間差不多時也就稍微閒聊一下,他還說如果我有機會進去遇到他可以跟他說聲嗨 XD
也是滿愉快的結束這一場,個人自我評價是 positive。
onsite 第二場也是全英文對談,是個撲克臉面試官,
一樣的 easy warm up 秒解,追問了一個 medium 等級的 follow-up
一樣的照流程寫完 code 後,再被問了一個不同的 medium 題目,
這個 medium 我給了兩種方向的解法,分別會對 time/space 有 trade off,
沒有寫 code 就結束這回合,因為是撲克臉所以也感覺不出 feedback,
但是因為最後一題在思考解法時中間有點差錯,是被引導糾正回來的,
所以自己給的評價是 neutral。
onsite 第三場是中文對談,是個口氣稍微嚴厲點的面試官,
只被問了一題,原本以為一樣是 warm up,結果提出解法後的正確性證明直接卡關,
被面試官直接說:「沒法證明正確性之前建議不要這麼做。」
只好退回來以直觀想法重新開始。
後來實在想不到直觀想法以外的解法,卡了一陣子面試官就主動給 hint,
好在拿到 hint 後很快的給了一個解法,面試官再在這個解法上問了一些優化方向,
就結束了這場面試。
想說慘了完蛋,跟前面兩場的手感完全不一樣,自己給了評價是 negative。
事後去網路上找有沒有類似這題的題目,結果原來 Leetcode 有一模一樣的題目,
難度等級是標為 hard。
onsite 第四場也是中文對談,是個笑笑撲克臉的面試官,
笑笑撲克臉的意思就是他從頭到尾都是笑臉,但是會笑得讓你有點緊張。
這次一開始就一樣是 easy warm up 秒解,被面試官問說是不是有在當助教 XD
然後他說原本他打算再問兩題,看這樣我直接回答第二題就好。
結果這題我一下子就看出是什麼類型的題目,但子結構一直抓不準卡超久。
一開始他說沒關係別緊張時間還很多,試了一陣子後我還懷疑我自己是不是走錯方向。
於是他就給了 hint 說方向是對的,要我繼續,
好在他給完 hint 後沒多就終於抓到關鍵點提出解法,
寫下 code 花了點時間處理 edge case,整個完成時超時大概五分鐘。
滿感謝這位面試官願意多給我這五分鐘,讓我最後能寫完完整的 code。
這場自我評價 neutral。
接著最後一場是 G&L,這場對 Google 來說好像是一個門檻值,
feedback 只有 pass/no pass,似乎不會拿來打分數,
所以我大概用 STAR pattern,參考這裡:https://zhuanlan.zhihu.com/p/40915843
歸納了幾個方向的回答就上場了。
這一場題目大概分為「你以前的經驗」與「假設性問題」,
只要照著 STAR pattern 應該都算滿好回答的。
至此終於完成所有 onsite interviews,
隔了一個禮拜 HR 週三告知會送 HC,然後很罩的幫我塞進週五的 HC session,
當天下午就知道過 HC 了,當下真的抱著老婆小孩一起歡呼 QQ
接著就是 team match,跟談薪水,team match 之前我有在板上發問,
一些前輩給的建議滿好的我就不再多說了。
薪水其實我沒什麼談,只能說有些 Youtuber 真的滿厲害的 XD
現在就是等著收到正式 offer letter 到來的那天。
回首過去的兩年半真的是一場奇妙旅程,
請了兩次六個月的育嬰留停在前公司應該也是前無古人吧!
好在最後的結果是不錯的,才能以一個倖存者的角度分享這些事蹟,
希望我的例子也能給一些還沒上岸的板友加油打氣,
big G 失敗好幾次真的是正常的,尤其在努力了之後卻沒有好結果的當下真的會很沮喪,
但只要持之以恆,總有一天可以看到那出口的光芒 :)
最後想再分享的是,
面試前我自己有許願,如果上了之後要來分享我寫過題目的所有解答,
目前正在慢慢施工中,再請期待~
最後的最後,雖然文中一直強調刷題的題數不是重點,
但還是任性地想曬一下最後完成的題數,證明我的努力。
https://imgur.com/a/foiHUlO
Cheers!
--