Wilson Wen 堅持編程

堅持編程

 

如何找到一份工程師工作。

說實話,你是一位優秀的工程師候選人嗎?你怎麼評價自己?你面試過多少家公司?你拿到offer的比率是多少?試一下用以下的公式來計算。

x = number of companies interviewed with onsite
y = number of offers received

value = 100 * log(x) * y / x

如果你的計算結果小於90,請仔細閱讀這篇文章;如果大於120,那你並不需要這篇文章。

我是誰?

我沒有高中學歷。我19歲從芝加哥前往南加州開始編程。我把所有東西裝進了我的轎車裏,身上只有400美金和一個offer,4萬美金年薪的高級程序員。那是在12年前,當然又是另外一個故事了。

從那以後,我曾在 Double Helix, Namco Bandai, Google,Obvious and Square等公司工作過。也收到過來自Naughty Dog,Activision,Riot Games,Blizzard,Pinterest,Goldman Sachs等公司的offer。正由於此,用前面提到的公司算出我的得分是132。

我至少面試過500位工程師求職者,他們之中大概10%會收到offer,3%我認爲是”rockstar”求職者,他們留給我的印象尤爲深刻。

我想告訴你,絕對沒有萬無一失的方法保證你被錄用。因爲這裏面存在太多的不確定因素,特別是像Google這樣的公司,你將會面對5-7個隨機挑選出來的工程師,他們會選擇一套他們認爲合適的問題來進行面試,通常會包括“白板編碼”。但是有一些工程師是很差勁的面試官,他們會問一些不公平的問題並作出武斷的判斷。但是沒關係,這對我們來說正好,因爲求職者通常會允許搞砸多輪面試中的其中一輪。

我可以做的就是告訴你怎樣做好充分的準備,下面是我提供的一些建議:

技術建議:

1 堅持編程:

很簡單,程序寫得越多,你的收穫越多。通過編程,你不斷的練習。不過,最好的練習是有目標的練習。在腦海裏有一個目標,開拓新的領域,和挑戰自我。經過一段時間後,你需要給你完成的和未完成的項目建立一個主頁。Github是一個非常好的用來建立項目主頁的地方。

2 掌握至少一門編程語言

掌握一門編程語言會讓你擁有敏銳的洞察力。爲此,你必須編寫大量的代碼,閱讀大量的代碼,同時要學習代碼裏的最佳實踐。理論上,一門語言會有一個很活躍的社區,和大量的產品代碼提供學習。可選的編程語言包括C#、C++、java、PHP、Python和Ruby。

在C++面試裏,有一個經常被問到的問題:“你給自己的C++知識打多少分,從1分到10分?”。我非常厭惡這樣的問題。願上帝幫助那些給自己打了9-10分的人,因爲他們很快會露出馬腳。Bjourne Stroustrap給自己打了8分或者更少。這門語言真的太複雜,太豐富,而且隨着時間的過去,演進了太多次。離題了:)。

3 理解複雜度

閱讀這篇文章( Read this cheat sheet)。明確自己清楚複雜度的含義。然後實現一些常用的算法,比如Dijkstra’s, Floyd-Warshall, Traveling Salesman, A*, bloom filter, breadth-first iterative search, binary search, k-way merge, bubble/selection/insertion sort, in-place quick sort, bucket/radix sort, closest pair 等。再次重複,堅持編程!

4 重複發明輪子

你應該使用你常用的語言來實現一些常用的數據結構。不要依賴於庫。實現以下的數據結構併爲其編寫測試用例:vector (dynamic array), linked list, stack, queue, circular queue, hash map, set, priority queue, binary search tree等。你應該能夠很快的編寫完成。

5 解決問題

不要在google上這樣搜索 like this。這都是一些基礎的編程概念。你要做的是,至少花費40小時編寫解決各種問題的代碼。其中最好的資源是TopCoder(Read this),然後嘗試去解決更多的問題。挑一些問題來測試你實現recursive, pattern-matching, greedy, dynamic programming, and graph problems的能力。瀏覽一下這些歸檔的問題(archived problems)。

這或許是我被Google聘請的首要原因,我有2個星期的時間沉迷在Topcode裏。在那以後,我可以在閉上眼睛綁起一條手臂的情況下,編好Dijkstra算法。我可以解決幾乎所有的和圖相關的問題。這都是在重複解答問題的步驟而已。Eric Schmidt說過“重複並不會使得祈禱沒有意義”。

6 使編程簡單

至少,使其看起來更加簡單。隨着時間的過去,我瞭解到,編程是工程師工作中最直接和最簡單的部分。我常常用一個詞組“a simple matter of programming”,因爲我相信更復雜的部分是在編程之前和之後。例如,設計好你所要編寫的代碼和確保你編寫的代碼能夠發佈。讓你的面試官瞭解你清楚的知道,編程只是到達目的的一種手段。

注意,在別人面前編碼可能會讓你感到害怕。自己找方法去練習白板編程和結對編程。Google基本上都是白板編程,而Square都是結對編程。我的朋友和同時Dan寫了一篇關於這個的文章(Read this)。

其他建議:

在這裏,我不能自稱專家。事實上,有些人會說我甚至不善於和別人相處。但是我還是應該說一些非技術的建議,其中有一些還是非常明顯的。

1 知道爲什麼你在那裏

如果你在面試一家公司的時候,完全不明白爲什麼他們在這,他們是誰,他們在做什麼,那麼請不要去面試。

2 激情

如果你不在意,那麼其他人也不會。對某些事情充滿激情。可能是編程,或者別的。你會熱衷於利用業餘時間編寫一個編譯器嗎?你會自己動手製造一個遙控直升機嗎?只要你有激情,都沒關係,你會使其變得有趣。

3 不要做任何假設

如果不確定,就詢問。如果他們問了你一個問題,你不是100%的肯定問題是什麼,那麼請他們再問一次。我見過許許多多的求職者從不詢問任何問題,結果浪費大量時間解答了錯的問題。

4 微笑

興奮,開心和積極。但不要過度。正如我前面提到的,人們會作出快速的判斷。確保你留給別人的第一印象是好的。微笑是能夠傳染的,我常常帶着糟糕的心情走進面試的房間,但是求職者一個合適的微笑會讓我快速的恢復過來。

正如我之前所說,沒有銀彈能夠讓你被僱傭。但是,作爲一個工程師,你能盡你最大努力做的是 ABC: Always Be Coding. – 堅持編程。

[英文原文:ABC: Always Be Coding]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章