作者@anmour
發布在一畝三分地 北美求職板塊
歡迎大家點擊左下角「閱讀原文」到原帖與作者交流討論哦!
背景樓主之前在一家大概30個人左右的start-up做ML Engineer,去年9月的左右,在linkedin上收到狗家recruiter的郵件,問有沒有興趣跳槽。由於狗家和臉家一直是樓主的dream company,再加上想去大廠見見世面,於是動了跳槽的念頭。
準備面試的方向是ML和SDE,因為之前做的工作跟ML有關,再加上幫公司面試了不少candidate,所以主攻方向是非常薄弱的coding。從2019年9月到2020年3月,6個月的時間,一共刷了800道題,大部分常考題大概平均每道題刷了5遍左右。
前期準備:樓主在本科的時候學過algorithm and data structures,但是年代久遠了有點生疏了,在開始刷題之前正巧在coursera上學了一遍Tim Roughgarden的algorithms specialization。個人感覺介紹了一些高級的數據結構對之後的刷題還是有所幫助的,比如說Union Find,當時是第一次聽說這個數據結構。
攻堅階段不得不承認,刷題真的是很痛苦的一件事,特別是剛開始的階段。作為非CS科班出身編程基礎極其薄弱的菜雞來說,個人秉承的核心思想就是反覆的刷,讀書百遍其義自見,簡單粗暴。樓主其實刷題的時間也不多,因為白天要上班,所以基本就利用每天下班的時間和周末。期間還出去浪了幾次,在候機的時候還抓住邊角時間刷了幾道😂
核心思路:大量的刷題和反覆的刷題。個人感覺,刷題就跟高考數學差不多,就是通過不斷的練習,掌握解題的思路和技巧,沒有捷徑可言,而且要做到每道題至少刷3遍,最後做到一看到題馬上想到最優解。
刷題經驗:•第一輪:按照Leetcode的tag分類,然後按照頻率排序,優先做高頻題,不管難度,如果是近兩年都沒有出現過或者近兩年面過的公司不是FANNG則直接跳過。第一遍刷題,如果十分鐘以內想不出來,那麼直接看答案或者網上別人的解法,同時在Leetcode上用筆記記錄思路,然後理解答案的想法,記住要背容易記憶和理解的最優解法。第一遍不會做不用灰心,因為這一遍的目的是背答案,答案背多了自然能從題中找到規律。最後用一個list記錄這一輪第一次沒有做出來的題。•第二輪:重複第一遍的過程,還是按照tag分類和頻率排序,並且還是只考慮十分鐘,如果第一輪看答案才做出來的題目,這一輪沒有看答案就做出來了,說明你已經背下了答案,把它從第一輪的list挪到一個新的list。我們的目的是如果連續兩輪完全沒有看任何提示就做出來了,那麼表示這道題你就掌握了。•第三輪:重複第二輪,再按照tag分類和頻率排序,這一輪我們考慮二十分鐘,依舊秉承一個原則:連續兩輪完全沒有看任何提示做出來的題目,代表你已經掌握了,哪怕是已經把答案背下來了。到第三輪的時候,你應該會有2個list,一個list是做了三遍還是沒有任何思路的題(也就是對於自己而言比較難理解的題),還有一個list是第一次沒做出來但第二次沒有看任何提示做出來的題(也就是對自己而言還沒有完全掌握的題)。•第四輪:根據自己創建的list,只給自己五分鐘的考慮時間,過一遍前三輪創建的兩個list,清空那些連續兩輪都做出來的題,然後把那些之前沒思路的題但這一輪做出來的題移動到另一個list。如果你堅持下來,那麼到這個時候,你應該已經刷了5-600道題了,然後實際完全掌握的肯定有50%以上,大概300道題。•第五輪:根據自己面試的公司,刷近一年該公司面過的題,按照頻率排序。如果時間允許,把所有出現的題都做一遍,保證看到原題立馬想到最優解。
Q:關於遇到不會做的問題怎麼辦?
A:樓主的經驗是立即看答案,比較重要的是怎麼看答案。樓主一般很少看leetcode自帶的答案,因為感覺很多時候感覺解釋的不清楚,所以樓主一般是google,有幾個博主(在此就不打廣告了)的解題思路樓主很喜歡,很清楚。一般會對比幾個不同的解法,掌握對自己而言最容易理解的解法。看答案的時候,一定要把解題思路和實現細節思考清楚,並且做好筆記,比如說這道題的trick在哪裡,用什麼樣的數據結構。有一些複雜的解題思路樓主會看Youtube視頻,還有一些不好找的樓主就參考leetcode discuss裡的解法,選最容易理解的。所以,個人認為,看答案的過程同樣重要,通過對比理解不同人的解題思路,樓主也漸漸從中得到了一些啟發,刷到後面遇到沒見過的題也基本開始有了自己的解題思路。所以,個人的建議是,遇到不會的題目,不要怕看答案,但看答案的時候,一定要理解透徹,並死記硬背。一遍記不住就兩遍,兩遍記不住就三遍。
面試階段•黑車:recruiter聯繫的,ATG的SDE,也是最先面的(19年12月),一面慘不忍睹,刷題網原題,medium難度,但是卡了好久導致都沒時間回答follow-up,面完還被面試官呵呵了一下,果不其然秒拒,收到recruiter好人卡一張。•狗家:狗家是recruiter聯繫我的,職位是SDE,但偏ML。經歷了黑車的慘敗以後,樓主痛定思痛,蒙頭刷題,把狗家電面推到了20年1月。一面小哥特別nice,有驚無險進入onsite。樓主很慫的推到了3月份,於是3月中的onsite,4輪coding+1輪BQ,一道ML的題沒問也是醉了。有一輪面的很差,但有驚無險,最後送hc,hc也順利通過,team match也迅速通過。感覺樓主幸運在疫情大爆發前拿到了offer,所以沒有受到hiring slow down的影響。•亞麻:recruiter聯繫的,AS II,在蝦圖。一面主要是ML+coding,coding特別簡單,原本應該是三十分鐘的五分鐘就做完了😂,然後小哥開始狂問BQ😂。電面完一周很快通知onsite,樓主安排在了狗家onsite之後,所以就改成了VO,3輪ML + 1輪coding + 1輪純BQ。亞麻最難的應該就是BQ了,每輪都有,多準備好例子就好了。coding的話面完狗家以後覺得完全是小兒科😂。ML的話樓主要複習了一下基本ML的教科書,看了幾遍Andrew Ng CS229的講義。最後基本主要是問了樓主做過的project,所以難度也不大。•LinkedIn,找同學refer的,推了senior MLE的職位,電面又是慘不忍睹,面試官出的coding是跟統計有關的,不按套路出牌,完全沒做出來,面完果不其然被秒拒,收到recruiter好人卡一張。•臉家:找同學refer的,兩三天後收到recruiter郵件說我的簡歷跟內推的職位不match,於是跟recruiter聊了聊,最後說是會幫我留意職位,再聯繫我。後來貌似幫我群發了簡歷,但最後也沒收到面試,所以註定跟臉家無緣了😂
總結•最後拿到了狗家SDE L4和亞麻AS II的offer,因為狗家match了跟ML非常相關的組,所以不算是純碼,權衡了很久以後,決定接了狗家的offer,忍痛拒了亞麻。•樓主因為是一心想去大廠做ML相關的,所以基本只考慮了FLAG,也沒怎麼投其他公司,所以大量的時間都花在了刷題上。
最後祝大家在疫情期間都心想事成,注意安全。