2014年12月26日 星期五

沒有大學學歷卻能進入Google的四個步驟

前言: 作者是寫 Always Be Coding 這篇文章的同一個人,第一次翻譯請多多包涵。原文請參考Four Steps to Google Without a Degree


自從我寫了
ABC: Always Be Coding - How to Land an Engineering Job
之後,許多人問我:”你沒有大學學歷是怎麼進Google工作的?“。以下是我的故事,但請記住每個人的狀況可能會些不同。
一直以來我都超想要進UCLA唸書,但是我高中的GPA實在太囧了(2.45),而且我自己那時候也還沒有搞清楚我想念什麼。不過後來在普渡大學的分校唸書時我有修一些computer science的課,希望有朝一日能夠轉行當工程師。大約兩個學期後,我得到了一個很不錯的的offer,開啟了我接下來的旅程。

第一個步驟:沒那個本事之前,就先假裝自己有那個本事吧!(Fake it till you make it)

我大學的時後有在Indiana一家小公司打工寫網站(12鎂/小時),這份工作雖然不算太糟,但是也不是我夢想中的工作。不過我還是認命(也很認真)的完成了了幾個專案,算是一個CP值很高的員工。同時我在我剩下的一點點空閒時間開發一個遊戲,所以我決定跟老闆商量,請他給我三個月的時間來完成這個遊戲並放到他網站上賣。我做了精美的簡報來說服他們這個 shareware model 是怎麼運作然後要如何賺錢,最後老闆同意花錢請我來做這個專案。大概是我投影片做得很美吧...大約兩個月後,Demo版本上線了,一間加州的新創公司CodeFire發現我正在跟他們做一樣的遊戲(類似SubSpace但是是3D的)後寫信給我叫我別再做了否則要告我,我回他們說"想要我停,除非你們雇用我"。結果我就拿到Offer了!在三個禮拜的交接之後,我就打包去加州了。


第二個步驟:跟高手當好朋友(Befrined a master)

這大概是最重要的一個步驟了,公司裡誰最厲害就找他當你師父吧,千萬不要停止學習。我在Double Helix 工作的時候我師父Nathan Hunt大概是我看過少數幾個又聰明又謙虛的人。就算我問他一些很基本的問題,他總是很有耐心的回答我。我那時候應該跑去他辦公室問過幾千個問題吧,例如"要怎麼一個旋轉矩陣插入另外一個?","要怎麼寫一個圓柱體的碰撞偵測?"。幾年後他也加入了Google(比我晚了一個月)。我的每一位師父都改變了一些我解決問題,觀察問題很重要的方法。


第三個步驟:填補你不足的地方(Fill in the gaps)

因為我不是CS科系畢業的,我知道我有很多基礎知識上的不足。例如我知道要怎麼寫一個物理引擎但是我不知道怎麼解決DP(dynamic programming)的問題。為了填補這些缺空,我幾乎把所有我聽過的的資料結構/演算法都實際的實作一遍。其實需要的資訊書上或網路上都有,但是實作之後透過觀察來了解為什麼要如此設計跟看出還是有一段差距。長時間來說,要做培養下面這些能力
  1. 在C, C++, Objective-C, Java, PHP, Python 或 Ruby中至少成為其中一項的高手,然後熟悉另外一兩個語言,另外對於Scala, Haskell 或 Lisp也可以瞭解一下。
  2. 學習資料結構,最好要親自實作,然後了解其中時間複雜度。
  3. 學習解決程式問題,熟讀Top Coder 的演算法教學,然後練習SRM的題目
  4. 建立你自己做(過)完的專案集(寫過的framework, 誒批批,小遊戲...等

第四個步驟:建立你的自信心!(Find confidence)

離開印第安納州後六年,我已經完成了六個不同平台的遊戲,一樣的工作對我來說已經沒有挑戰性了,因此我投履歷給Google,心裡想說如果我上了,我就是一個"真正"的工程師了!(因為我一直沒有大學CS的文憑),但不意外的Google並沒有回應我...一年後我又再次寄出了履歷,但這一次我直接把"學歷"的部分拿掉了!諷刺的是,我接到了人資打來的電話,我們約了兩個禮拜後的電話-螢幕面試。在這兩個禮拜我拼命的死背所有演算法/資料結構,不斷的練習,直到我的所有對於Google面試的恐懼變成了自信與興奮。當時的每一個面試題目到現在我都記憶猶新。面試官都是很健談的人,我相信他們一定也感受到了我的熱情!其中有幾個題目是:1) 給你一堆二維的座標,請算出天際線(請參考skyline problem)這題滿簡單的,我用max heap解決了這個問題,這題其實有很多解法2) 請你設計一個"小畫家"的程式這題是目前我看過最有趣的題目,一開始我畫了一些interface,還有class diagram 接著我也提到了填滿顏色的功能,面試官就要我實作這個功能,剛好因為我有在TopCoder上練習,所以我閉著眼睛也可以把BFS寫出來。3) 說說看你有什麼寫程式的好習慣?這是一個沒有標準答案的問題,我回答了一些關於不同的測試類型分別是用在什麼情況(Unit/Integration/Acceptance),我也聊了一些關於程式碼一致性與維護性...可以參考Code Complete 或是 Effective Java.

我很享受每一場面試解決問題的過程,如果我沒有做好前述的準備,我想結果應該會非常的不同。面試結束後我感覺滿有希望的,但聽說就算面試官同意錄取我Larry Page他會還是會自己審查我的資料,我心裡面滿擔心他會不滿意我的學歷。但事實證明我的擔心並沒有成真,有一天當我在吃壽司的時候接到了錄取的電話,然後我就開心的接受了Offer,從這一刻起我知道,我再也不需要那張我缺少的文憑了!

一個成功打勝仗的戰士會先贏了戰爭才走上戰場,
一個戰敗的戰士則是上了戰場才想辦法要打贏

在Google這間不可思議的公司學習成長了五年之後,我離開了Google













2014年1月10日 星期五

Do what you like -- Rails年終聚會有感而發


一向崇拜programmer們open source的概念,樂於分享的氣氛是在其他產業少見的,也因為這樣開始對coding感到好奇,由codecedemy開始,到去年參加第2屆railsgirls活動。

汗顏的是自railsgirls活動後,就再也沒有參加過rails相關活動,在主辦人慕凡熱情友善的邀請下,鼓起勇氣參加了今天的年終聚會,遇到了許多有趣的人,看著大家因為相同興趣而聚在一起,喜歡coding到下班後還是貢獻時間、精力在這個社群上,這就是Do what you like的強大驅動力吧!


巧的是在今晚的聚會上遇到PicCollage的創辦人John,去年在台大曾經聽過他的分享,今晚有幸直接跟他對談,感到非常開心!John給了我一些non-technical背景的人進入新創團隊的建議,我想這是很受用的,也在這裡分享給大家:

對初期的Start-ups而言,“技術”及“使用者回饋”是同等重要的!除了把產品實現的工程師人才外,能夠搜集、分析使用者回饋,爲產品找到使用者及市場或是可以點出產品未來發展方向、建議的人才同樣重要!

今晚還與許多人聊天,獲益良多,謝謝大家的熱情分享及友善!簡單記錄如下:


  • 走出舒適圈,與不同圈子的人聊天,可激發自身想法
  • 全球化時代,人才世界各地流動
  • Do what you like,那種能量比吃禁藥還猛!
技術提供:Blogger.