去年嘗試了轉職,有幸被LinkedIn接受,想分享一些轉職成矽谷軟體工程師的心得。軟體工程師很多種,面試的方式也很不一樣,這邊以矽谷大公司軟體工程師為主來分享準備方向。

先講講我的背景:EE出身,BS/MS都是EE,無線通訊為主。2011年在UCLA做研究/TA時較常接觸程式設計(C語言),2013年初接下第一份軟體工程師工作,還是寫跟無線通訊硬體高度相關的軟體為主(Embedded Linux Driver),2017年嘗試轉職,2018年正式加入LinkedIn

轉職軟體工程師是個既簡單又困難的過程。簡單的點在於很多大公司有所謂General Hire的制度,可以不太重視背景而著重於面試表現,畢竟大家也知道resume很厲害的人不見得真的會寫程式XD 他們會用面試問題去評估一個人的能力,然後assume進來後很多東西可以再學,而不是期望應徵者直接有這些知識。當然相對的,也代表resume可能只能帶你到拿到面試這關,面試就不會只是聊天而是實打實的白板上寫程式。另一方面,軟體面試準備的資源非常的多,所以不怕找不到想學的東西,但是相對的,也表示你的對手們也有一樣多的資源,競爭只會越來越劇烈XD

既然是雜談,有些東西就不講太詳細XD 文章會比較偏重概念而非實際的內容。

  1. 每個人狀況不同。在CS界的人多,準備的建議也會很多。像是準備面試用的刷題網站leetcode到底該刷幾題,要不要買付費會員,這些都是看個人,會隨著資質(?)、背景、使用的程式語言等等都會有所不同。不要執著於某個經驗分享,因為不見得可以適用於你(除非是像面試前記得要洗澡不要全身臭這種基本的XD)。
  2. 承上,準備的策略可以考慮使用倒推的方式,亦即稍微了解面試實際上會發生什麼事情,希望自己可以達到什麼狀態,再倒推回來針對自己不足的訓練。例如onsite的coding關可能是一場45min,希望可以在白板上寫完兩題leetcode medium的題(舉例而已,畢竟過與不過有多其他原因),那就可以倒推回來自己需要刷多少leetcode才可以穩定達到這個狀態,以及要花多少時間練習寫白板(或手寫)、用英文講解想法和討論時間空間複雜度。了解面試實際狀況的方法很多,可以自己去面面看、聽別人的分享、甚至問HR有哪些場次,都是不錯的方法。
  3. 如果真的目標是純軟體公司,因為有general hire的制度,一步轉職是可能的。我個人會建議除非因為沒有程式經驗拿不到面試,最好是直接準備大公司的general hire,不要花太多時間待在一份做”跟硬體高度相關的軟體”的工作(或者直接嘗試TripleByte)。思維有很多的差別,而且隨著職級越來越高轉職只會更不容易,畢竟直接空降不同領域的主管絕對不容易,而當到主管怎麼會想接一份entry level的軟體工作呢?另外還有準備資源的不斷增加,也表示應徵者的競爭越來越劇烈。舉例來說,leetcode 2014年總共就100多題,也就是你的對手了不起刷了100多題,現在它有800+題了….
  4. 刷題目盡量by topic而不是題號。例如今天都是刷array明天都是刷tree之類的。除了會對一個主題比較了解,也比較容易歸納同主題不同題目的關聯性,更讓之後面試時遇到沒看過得題目時更容易有思路。
  5. 投履歷還是建議靠內推,沒有直接認識的人盡量麻煩朋友介紹,履歷曝光率實在差很多。
  6. 系統設計是當初我比較掙扎的,主要是因為沒有實際經驗(很多設計題都是考distributed system,問怎麼處理巨量user的狀況,這點公司規模不夠大真的很難碰到)。這個題目網路上的資源也是相當多,所以自學是可行的,不過還是建議跟有經驗的朋友聊聊,畢竟這個題目相對interactive,和面試官會有大量交流,如果只是讀課程內容而沒有跟真人演練過上場的表現可能會比較差。另外系統設計相對沒有太明確的套路,無法像leetcode這樣刷,因此適時跟比較資深的人聊聊也會有幫助了解哪些重要、哪些不重要、哪些可以提哪些不要提,甚至怎麼避免被面試官鑽到自己的缺點XD
  7. 要尋找最適合自己的學習方式。不管是帶職或者辭職準備,讀書這種事情絕對會有倦怠期。如果覺得讀不下書或刷不下題,可以找找一些教學影片看看平衡一下心情。這個時代資源非常的多,這個人講的聽不懂就看看有沒有其他人的XD 辭職與否很看個人,帶職時間相對比較少而且面試還要一直偷偷請假,但另一方面面試沒上時會感謝自己還有一份工作。帶職準備要有自覺可能會佔掉上班和睡眠時間以外的其他時間,也需要不斷逼自己不要偷懶,或者把看一些系統設計教學影片當作偷懶XD

先寫到這邊,有想轉職CS的歡迎問我細節或是準備資料