《TO》編按:上周一篇〈Always Be Coding--工程師面試必讀!〉獲得廣大迴響,原文作者  又接著寫了一篇,告訴大家身為前 Google、前 Square 員工的他,在沒有大學文憑的條件下,是如何順利通過 Google 的面試。

自從在 Medium 發表〈ABC: Always Be Coding — How to Land an Engineering Job〉這篇文章後,就有很多人詢問我,如何能在沒有大學學位的條件下獲得 Google 的編程工作?因此,我決定將我個人的經驗描述在這篇文章裡。

這篇文章描述的是關於我自己的歷程,這對其他人而言可能未必會是一條成功之路,但,至少是一條可行之路,正好可以提供給對編程工作有興趣的讀者參考。

如同許多少年,我曾經對自己的未來充滿期待,但,過往的表現卻不亮眼。我一度非常希望能進加州大學洛杉磯分校(UCLA,University of California, Los Angeles) 展開大學生涯,但我的高中學業平均成績 GPA(Grade Point Average)只有 2.45,最後只能到 Purdue 大學的 Calumet 分校唸電腦科學(Computer Science),當時我只能期待可以透過轉學考的方式或其他不同的選擇,以使自己的處境更好。

不曉得你是否有聽說 Google 只延攬常春藤聯盟名校裡 GPA 超過  3.7 的優秀學生?而我這個不具備大學文憑的高中生,憑什麼能進入許多人夢寐以求的企業?

真的只是幸運所帶來的機會嗎?在本篇文章中我將分享個人在爭取 Google 職位前的求職準備,也就是自我能力的養成計劃,以及我個人所保有的信念

  • 信念一:相信自己有能力做到,自然就能成真

唸大學時,我曾在美國印第安納州(Indiana)格里菲斯(Griffith)城市裡的一家當地企業工作,負責架構網站,所領取的薪資是 1 小時 12 美元。

每當我想像自己未來的職涯發展時,就會覺得這份工作並不符合我的理想,但也有可能會更糟。

工作中,我同時參與了多個專案,並選擇埋頭苦幹,全力以赴,在這裡我獲得了良好的評價,公司也從付給我的時薪中節省不少成本與獲得不少利潤(因為請我只付時薪,卻能獲得超過這個成本的價值)。

工作之餘,我利用時間開發遊戲軟體,並主動出擊,說服公司主管給我三個月的時間開發遊戲軟體,這個計畫由公司出資,我負責撰寫程式,軟體則將藉由網路銷售,我還利用試算表(Spreadsheets)和圖表說明自己所開發的遊戲如何運作,以及如何為公司帶來現金流。

經過兩個月的開發,我將遊戲的試玩版發佈到網站上,沒想到一家位於加州的新創公司 CodeFire 發現我的 Demo 版遊戲和他們公司的產品非常相似,於是,他們發了一封警告函(Cease-and-Desist Letter)給我,希望我能終止目前的遊戲軟體開發,而我回覆的是:只要你們雇用我,我就停止開發。沒想他們居然答應了。

最後,我決定提出辭呈,並與公司達成協議,由公司保有遊戲的所有權,而我則轉換到新的公司去。

  • 信念二:多親近專業人士

這一點或許是你所能做的最重要的一件事 -- 試著在你所屬的領域裡尋找願意引導你的生涯導師,而且不要停止學習。

以我自己為例,當我在 Double Helix 服務時,有一位同事 Nathan Hunt,他是我遇過最聰明也是最謙虛的人。記得無論我請教他的問題有多嫩,他都會非常有耐心地引導我,我常問他:如何實踐膠囊型物體(Capsule Cylinder)移動的碰撞偵測?或是,應該怎麼做才能流暢地把一個旋轉矩陣(Rotation Matrix)插入另一個旋轉矩陣中?

是緣份使然吧,在我加入 Google 一個月後,Nathan Hunt 也進 Google 服務,我們又再度成為同事了。

在我的職涯中所遇到的每一位導師都會影響我面對問題 / 看待世界的方式,而這些收穫僅僅只是其中的一小部分。

  • 信念三:彌補學識上的落差

因為我沒有受過資訊科學的專業訓練,所以很清楚自己缺乏許多的基礎知識,例如,我在實作物理引擎(Physics Engine)的應用時,就無法利用動態規劃(Dynamic Programming)來達到最佳化的目的。為了彌補這些落差,我盡最大的努力去學習曾經讀過與聽過的任何與資料結構 (Data Structure)和演算法(Algorithm)相關的內容。

若你想朝編程領域發展,那麼建議你應該持續強化下列幾點:

1. 至少專精 C/C++/Objective-C/Java/PHP/Python/Ruby 其中一項,以及精通 Scala/Haskell/Lisp。

2. 學習資料結構(Data Structure)。因為它不只關係到資料的儲存,同時也必須考慮到它與演算法之間的關係和計算,以達到加快程式執行步驟和減少磁碟耗用的目標。

3. 學習解決編程中所遭遇的問題。同時學習思考時間與空間的複雜度,並問問自己能否透過降低空間使用率來提升時間效率。

4. 把自己開發過的專案整理出來,無論是已完成的或未完成的(比如 Programming Frameworks、行動 App、網路 App、小遊戲等)。量化成果可以向雇主們顯示你發揮了什麼影響,並使這些成果展現出它的意義。

  • 信念四:建立自信

離開印地安納州 6 年後,我也完成了 6 個跨平台的遊戲,對於工作的部份開始覺得倦怠,認為應該嘗試新的挑戰了。於是我對 Google 遞了履歷表,心中想著如果被錄取了,就能成為 Google 工程師了;然而,我從未收到任何來自 Google 的回應,但對於這一點我並不覺得意外。

一年後,我再次向 Google 投了履歷,這一次,我把履歷表上「教育程度」的資訊特意移除了。

諷刺的是,這次我接到一位招募人員的來電,並安排了一場技術性問題應答的電話篩選面試(Technical Phone-Screen Interview)。我問對方是否可以約在兩個星期之後,對方同意了。

因為我需要一段時間來準備即將來臨的面試。我利用這段時間,努力地把能吸收的演算法和資料結構都塞進腦子裡。我每天演練編程 12 – 14 個小時,並做了許多的題目。

在這過程中,我漸漸克服緊張,轉而產生自信與興奮。充份的準備也使得面試的過程十分地順利。

接著跟各位讀者分享我在面試時所遇過的幾個問題:

1. 給一組二維空間(2-dimensional points),並計算 / 搜尋出 Skyline。

我利用 Max Heap 解決了這個問題。當然解決問題的方法有很多種, 你還可以參考另一個解法

2. 設計 Microsoft Paint(繪圖元件)。

這是我覺得最有趣的問題了,我從畫介面(Interfaces)和類別圖(Class Diagram)開始,並提到了 Paint Bucket 工具,而面試我的人要我把它實踐出來。幸運的是,多虧了 TopCoder 這個提供線上程式競賽的網站,讓我能輕而易舉地透過迭代(Iteration)和廣度優先搜尋法(Breadth-First Traversal)來實踐這個題目。

3. 說明你在軟體開發部份的強項。

這是一個開放性的面試題,我提到了測試的幾種類型以及他們的重要性,像是單元測試(Unit Testing)、整合測試(Integration Testing)、驗收測試(Acceptance Testing)等。

我還提到了編碼的一致性對維護程式的重要性等等,而這些相關的知識你可以參考像是《Code Complete》和《Effective Java》等這類的書籍。

我非常地享受每一次面試的過程,和解決招募人員與主管所提問的問題。如果我沒有認真地做面試前的準備,結果一定大不相同。面試之後,我感覺非常好,但我聽說即使招募委員會同意給聘書,Larry 仍有否決權。我很擔心萬一他看到我的教育程度之後,就不會給我機會了。

不過,我的擔心顯然是多餘的,因為有一天我在 Santa Clara 享用壽司當午餐時,接到了 Google  通知我被錄取的來電,從此以後,我很確定自己不會再像幾年前一樣一心想回大學唸書了。

中國的智慧經典之一《孫子兵法》中提到:勝兵先勝而後求戰,敗兵先戰而後求勝。

意思是說:打勝仗的軍隊,會先創造出取勝的條件,才與敵人交戰;而常打敗仗的軍隊,總是在開始打仗後,才期待於戰爭之中獲得勝利。

這跟求職的過程是一樣的,你認為呢?

(資料來源:medium;圖片來源:Ariaski, CC Licensed)