Always Be Coding--工程師面試必讀!
本文作者 @ guitardave24 ”>David Byttow 是一名程序員,曾在 Google 和 Square 等公司工作過。
在正文之前,先讓我們回答幾個簡單的問題:第一,你面試過多少家公司;第二,這些公司中,錄取你的有多少?記下這兩個數字,然後代入下面這個算式中(我自己發明,僅供參考,不具有其他意義):
# x = number of companies interviewed with onsite //問題一的數字 # y = number of offers received //問題二的數字 value = 100 * log(x) * y / x //最終結果
如果你算出的結果 <90,那你真該看看這篇文章了。如果你所得的分數 >120,那你比較強大,不需要這個,但我建議你不妨看看,權當參考。
首先做個自我介紹:我沒有本科文憑。12 年前,那時我 19 歲,隻身從芝加哥去往南加州,所有的財產不過一部車和兜里的 400 美金,還有車裡裝的別的東西。
但是,當時我已經達到專業級的編程水平,而且,揣在兜里的還有一份年薪 40,000 美金的合同。
從那以後,我先後在 Double Helix、Namco Bandai、Google、Obvious 和Square 工作過,同時還收到過諸如 Naughty Dog、Activision、Riot、Games、Blizzard、Pinterest、Goldman Sachs 以及更多這類公司的橄欖枝。把這些經歷代入本文開頭的算式中後,我的得分為 132。
在我的職業生涯中,我面試過超過 500 名程序員,錄取了其中超過 10% 的人。並且,至少有 15 人在圈子裡相當出名,我至今還記得他們。
現在,我給自己幹,想要做點不一樣的東西。
羅列上述經歷的目的在於,我想用我的親身經歷告訴這個行業的職場新人,沒有所謂的面試寶典能讓你百分百簽到自己想要的工作,以 Google 為例,他們的面試流程中到處都是變數。
首先,你的面試官團隊是由隨機抽取的 5-7 名軟件工程師臨時組成,接著,他們會商量著給出一套適當的題目讓你回答,通常有一道題是關於徒手寫代碼的。偶爾會有個別惡趣味的面試官會進行一些刁難,但這些面試官通常都是這個小組中的大牛,並且,面試中是允許你犯個別錯誤的。
但這也不是說面試就是純粹碰運氣,雖然幫助有限,但我還是想給出一些很有用的小技巧,讓你有更充分的準備,減少在面試中的慌亂。
技術方面的技巧
第一:ABC(Always Be Coding)
一力降十惠,說的多不如做的多,所有工作都是這樣,編程也不例外。你寫過的代碼越多,你的能力也就越高。但是,你必須做到有目的的編程,在寫代碼之前做到心中有數,明白自己的短板並且加強訓練,堅持不懈的挑戰自己的極限,努力使自己在各方面都很優秀。
我強烈建議你把自己做過的每個項目——不管是否完成——都整理成作品集,在這裡推薦 GitHub,非常專業的代碼分享社區,你可以把自己的作品集放到這。
第二:精通至少一種多重範式編程語言
精通一門諸如 C++ 這樣的語言能讓你從根本上理解編程,因為這類語言風格多樣,如何寫代碼完全取決於你自己的風格,你能在一種語言裡體會到不同風格的代碼在執行上的差別,同時要達到這樣的水平還需要大量的實戰與練習。而且這類語言通常在各個社區中也是最活躍的板塊,你可以很容易就找到志同道合的朋友來分享經驗。其他也支持多風格編程的語言還有 C#、Java、PHP、Python 及 Ruby。
關於 C++ 的題外話是,有一個跟著名的面試題,許多面試官都喜歡問,是這樣:
希望上帝保佑那些回答 9 或者 10 的人,C++ 之父 Bjarne Stroustrup 估計也只會給自己打到 8 分甚至更低。主要原因是這個語言經過這麼多年無數大能的不懈努力,已經超級複雜,被稱為主流設計語言中最複雜的一款也不為過。
第三:熟悉各種算法的優劣
先看看這份關於各種算法的對比圖,確定都理解了之後,試著把這些算法都用自己的方式寫一遍。這樣你就會對各種算法有更深刻的理解。面試的時候這幾乎是必考題哦。
第四:熟悉所有常用函數
你最好把所有的常用函數都用自己使用的語言寫一遍,不要依賴於現成的函數庫,這樣會加深你對各個函數以及語言本身的理解。試著快速寫出下列函數:向量(動態數組)、鍊錶、堆棧、隊列、哈希映射、集合、優先級隊列等等。
第五:要更務實
臨時抱佛腳早就沒有用了,踏踏實實打好基本功才是王道,花更多的時間去解決各種編程中遇到的問題,這裡推薦多去 TopCoder 看看,那裡有很多不錯的資源。裡邊有各種案例可供學習,試著學習裡邊的思考方式來解決自己遇到的問題。我當初花了整整兩個禮拜在 TopCoder 上,到最後我都能閉著眼一隻手寫出迪科斯徹算法,幾乎能解決所有的圖形問題。
我所做的不過是不斷重複編程。這可能是 Google 最終要我的原因之一吧。
第六:編程是最簡單的
這麼多年的工作經驗使我明白了一條,寫代碼是一個工程師所有工作中最簡單明確的一部分。
我常掛在嘴邊的一句話是:「簡單的就像寫段代碼一樣。」我相信對於一個工程師來講,事前準備和事後維護才是更艱難的工作。比如說,你需要在編程前計劃好你需要寫什麼以及確保寫好的代碼能順利運行。盡量讓面試官知道,你不是一個只懂寫代碼的呆子。
需要注意的是,在別人面前寫代碼可能會略為彆扭,最好提前做些這方面的練習,可以參考下我前任同事 Dan 寫的這篇《Whiteboarding》。
非技術方面的技巧
需要提前說明的是我在這方面並不專業,僅供參考而已。
第一:明白你為什麼選擇這個公司這份工作
不管大公司還是小公司,還是極度飢渴的創業公司,都不會要一個連公司是乾嘛都不知道的人,哪怕這個人技術牛到一塌糊塗也不行。
第二:一定要滿懷激情
程序員是一種沒有固定工作時間的動物,如果你只是想找一份朝九晚五、有固定工資、只在偶爾加加班的工作,你還是別乾這行的好,你一定要愛編程,不管什麼時間什麼地點,只要有需要,就能隨時投入工作。愛一行,乾一行,對於程序員來說尤其如此。
第三:不懂就問
面試的時候如果碰到沒有聽明白的問題,一定不要不懂裝懂,我曾經見過有些面試的人花了老牛鼻子的勁,去解決根本沒問過的問題,這不只是浪費你的時間,也是浪費我的時間。
第四:保持微笑
所有面試寶典上都有這條,但是,不要做太過了,適當的微笑能產生很大的效果。我有時候會在面試完一個人後特別受打擊,但是下一個面試者簡單而真誠的微笑能讓我一下子心情好起來。
我把我所有能想到的都寫在這裡,希望能對大家有所幫助。還是開頭那句話,沒有保證百分百成功的面試寶典,只有不斷的努力,要想干好這份工作,堅持 ABC 吧,少年。
資料來源:TechOrange
在正文之前,先讓我們回答幾個簡單的問題:第一,你面試過多少家公司;第二,這些公司中,錄取你的有多少?記下這兩個數字,然後代入下面這個算式中(我自己發明,僅供參考,不具有其他意義):
# x = number of companies interviewed with onsite //問題一的數字 # y = number of offers received //問題二的數字 value = 100 * log(x) * y / x //最終結果
如果你算出的結果 <90,那你真該看看這篇文章了。如果你所得的分數 >120,那你比較強大,不需要這個,但我建議你不妨看看,權當參考。
首先做個自我介紹:我沒有本科文憑。12 年前,那時我 19 歲,隻身從芝加哥去往南加州,所有的財產不過一部車和兜里的 400 美金,還有車裡裝的別的東西。
但是,當時我已經達到專業級的編程水平,而且,揣在兜里的還有一份年薪 40,000 美金的合同。
從那以後,我先後在 Double Helix、Namco Bandai、Google、Obvious 和Square 工作過,同時還收到過諸如 Naughty Dog、Activision、Riot、Games、Blizzard、Pinterest、Goldman Sachs 以及更多這類公司的橄欖枝。把這些經歷代入本文開頭的算式中後,我的得分為 132。
在我的職業生涯中,我面試過超過 500 名程序員,錄取了其中超過 10% 的人。並且,至少有 15 人在圈子裡相當出名,我至今還記得他們。
現在,我給自己幹,想要做點不一樣的東西。
羅列上述經歷的目的在於,我想用我的親身經歷告訴這個行業的職場新人,沒有所謂的面試寶典能讓你百分百簽到自己想要的工作,以 Google 為例,他們的面試流程中到處都是變數。
首先,你的面試官團隊是由隨機抽取的 5-7 名軟件工程師臨時組成,接著,他們會商量著給出一套適當的題目讓你回答,通常有一道題是關於徒手寫代碼的。偶爾會有個別惡趣味的面試官會進行一些刁難,但這些面試官通常都是這個小組中的大牛,並且,面試中是允許你犯個別錯誤的。
但這也不是說面試就是純粹碰運氣,雖然幫助有限,但我還是想給出一些很有用的小技巧,讓你有更充分的準備,減少在面試中的慌亂。
技術方面的技巧
第一:ABC(Always Be Coding)
一力降十惠,說的多不如做的多,所有工作都是這樣,編程也不例外。你寫過的代碼越多,你的能力也就越高。但是,你必須做到有目的的編程,在寫代碼之前做到心中有數,明白自己的短板並且加強訓練,堅持不懈的挑戰自己的極限,努力使自己在各方面都很優秀。
我強烈建議你把自己做過的每個項目——不管是否完成——都整理成作品集,在這裡推薦 GitHub,非常專業的代碼分享社區,你可以把自己的作品集放到這。
第二:精通至少一種多重範式編程語言
精通一門諸如 C++ 這樣的語言能讓你從根本上理解編程,因為這類語言風格多樣,如何寫代碼完全取決於你自己的風格,你能在一種語言裡體會到不同風格的代碼在執行上的差別,同時要達到這樣的水平還需要大量的實戰與練習。而且這類語言通常在各個社區中也是最活躍的板塊,你可以很容易就找到志同道合的朋友來分享經驗。其他也支持多風格編程的語言還有 C#、Java、PHP、Python 及 Ruby。
關於 C++ 的題外話是,有一個跟著名的面試題,許多面試官都喜歡問,是這樣:
引用「如果把 C++ 分為十個等級,1 為最低,10 為最高,你認為你自己處在哪一級?」
希望上帝保佑那些回答 9 或者 10 的人,C++ 之父 Bjarne Stroustrup 估計也只會給自己打到 8 分甚至更低。主要原因是這個語言經過這麼多年無數大能的不懈努力,已經超級複雜,被稱為主流設計語言中最複雜的一款也不為過。
第三:熟悉各種算法的優劣
先看看這份關於各種算法的對比圖,確定都理解了之後,試著把這些算法都用自己的方式寫一遍。這樣你就會對各種算法有更深刻的理解。面試的時候這幾乎是必考題哦。
第四:熟悉所有常用函數
你最好把所有的常用函數都用自己使用的語言寫一遍,不要依賴於現成的函數庫,這樣會加深你對各個函數以及語言本身的理解。試著快速寫出下列函數:向量(動態數組)、鍊錶、堆棧、隊列、哈希映射、集合、優先級隊列等等。
第五:要更務實
臨時抱佛腳早就沒有用了,踏踏實實打好基本功才是王道,花更多的時間去解決各種編程中遇到的問題,這裡推薦多去 TopCoder 看看,那裡有很多不錯的資源。裡邊有各種案例可供學習,試著學習裡邊的思考方式來解決自己遇到的問題。我當初花了整整兩個禮拜在 TopCoder 上,到最後我都能閉著眼一隻手寫出迪科斯徹算法,幾乎能解決所有的圖形問題。
我所做的不過是不斷重複編程。這可能是 Google 最終要我的原因之一吧。
第六:編程是最簡單的
這麼多年的工作經驗使我明白了一條,寫代碼是一個工程師所有工作中最簡單明確的一部分。
我常掛在嘴邊的一句話是:「簡單的就像寫段代碼一樣。」我相信對於一個工程師來講,事前準備和事後維護才是更艱難的工作。比如說,你需要在編程前計劃好你需要寫什麼以及確保寫好的代碼能順利運行。盡量讓面試官知道,你不是一個只懂寫代碼的呆子。
需要注意的是,在別人面前寫代碼可能會略為彆扭,最好提前做些這方面的練習,可以參考下我前任同事 Dan 寫的這篇《Whiteboarding》。
非技術方面的技巧
需要提前說明的是我在這方面並不專業,僅供參考而已。
第一:明白你為什麼選擇這個公司這份工作
不管大公司還是小公司,還是極度飢渴的創業公司,都不會要一個連公司是乾嘛都不知道的人,哪怕這個人技術牛到一塌糊塗也不行。
第二:一定要滿懷激情
程序員是一種沒有固定工作時間的動物,如果你只是想找一份朝九晚五、有固定工資、只在偶爾加加班的工作,你還是別乾這行的好,你一定要愛編程,不管什麼時間什麼地點,只要有需要,就能隨時投入工作。愛一行,乾一行,對於程序員來說尤其如此。
第三:不懂就問
面試的時候如果碰到沒有聽明白的問題,一定不要不懂裝懂,我曾經見過有些面試的人花了老牛鼻子的勁,去解決根本沒問過的問題,這不只是浪費你的時間,也是浪費我的時間。
第四:保持微笑
所有面試寶典上都有這條,但是,不要做太過了,適當的微笑能產生很大的效果。我有時候會在面試完一個人後特別受打擊,但是下一個面試者簡單而真誠的微笑能讓我一下子心情好起來。
我把我所有能想到的都寫在這裡,希望能對大家有所幫助。還是開頭那句話,沒有保證百分百成功的面試寶典,只有不斷的努力,要想干好這份工作,堅持 ABC 吧,少年。
資料來源:TechOrange