為了準備 Google 軟件工程師的面試,我花了數以千計個小時讀書、寫代碼、觀看計算機科學相關的講座。
這個計劃是怎么產生的呢?
我中學時期就開始編程,但是大學卻選了經濟學。這是因為我擔心畢業時會有太多程序員找工作。現在想想我錯大發了。
后來為了稱為一個程序員我加入了軍隊,但是招聘人員卻把我送到了軍事情報處,于是我花了一年學習漢語,又在韓國服役了兩年。
在退役前我試著重新拿起鍵盤,卻發現物是人非,區別太大了。我從初中到高中一直使用的是 BASIC。但是回歸后使用的是 C++,這兩者間差別太大了,一時間我無法適應。
但是我很喜歡做網站,那會兒使用的還是 WordPress。我不懂怎么從零開始搭建一個網站。
在退役后,我決定在韓國再留一年,教英語。同時不忘初心,晚上、周末都用來學習 Web 開發,用的是 Perl, HTML, CSS (這在那會兒是個新生物), JavaScript 和 SQL。
在經過一年高強度的學習后,我得到一份在西雅圖編程的工作,從此以后我就待在西雅圖了。
從此以后我做了 15 年 Web 開發者。我創辦了三家公司,其中兩家至今還在盈利。這些年我在大公司、小公司都待過,見證、助力過創業公司的啟動和成長,也招募、管理過團隊,也當過產品經理,設計師,市場人員和 CEO。
在這個過程中我收獲了很多,也算是比較成功。但是還差得很多。
職業方向的改變
還記得我錯選經濟學,沒拿到計算機學位那部分嗎?最終有所改變。
工作幾年后,我覺得我已經大成了,去哪家公司都妥妥的,畢竟我是一位“全棧工程師”。
然而在 2013 年找工作時,我意識到自己原來差的這么多。
過去那些年我花了太多時間追尋金錢,甚至空余時間也在運營公司,這讓我的技術止步不前。我的技術棧有些跟不上時代了。
過去那些年我的技術一直是夠用就行了。雖然技術面比較廣,卻沒有任何一個方向稱得上專家。
別會錯意了,我想找到工作還是沒問題的,只不過不是我想要去的技術或者領域。我還是可以被一些技術棧不是很新的公司聘用的,給的待遇也不差,但是我對那樣的前景無法感到興奮。
我的這種“差得很多”的自我認識在去年一次找工作時達到了極點。我對一家風投投資的本地創業公司工作很感興趣。但是由于我沒有計算機學位,不具備這個學位掌握的技術和知識,導致我最終沒有機會。
那時我一直在我公司中全職工作。
在 2016 年初,我覺得是時候做出改變了,從 Web 開發者到軟件工程師。為了在幾個月內掌握計算機學位學習的知識,我需要刻苦學習和練習,雖然長路漫漫,但我相信,一旦成功,我就會進入一段新的職業生涯。
有人可能覺得 Web 開發者和軟件工程師沒什么區別。它們都需要編程和技術,但是軟件工程需要更多知識,比如數據結構和算法,編譯型語言,對內存的關注,理解不同的代碼和架構對運行機器的影響。
大公司招聘軟件工程師時,期望候選人掌握這些知識。
我向在 Google 工作的一位朋友咨詢了關于在 Google 工作的問題,也讀過《How Google Works》,對 Google 有了一定的了解。
偶然一次機會,還得到一份 Google 面試候選人的指導筆記,這成為我學習計劃的基礎。
Google 是一個非常棒的公司,在意識到這一點之前,它就已經是我的目標。
為什么我的目標是 Google
目標設到月球,即使失敗,也能落到眾星之間。
Google 的門檻非常高,他們只想招聘最棒的人才,所以我把目標設定的高一點,即使最后沒去成 Google,去別的公司應該也沒什么問題。
而且,隨著對 Google 的了解越深,我對它的渴望就越發強烈。
Google 有很好的“招培育留”氛圍。簡單地說,Google 選用聰明、有創造力的人,然后把他們照顧得很好。Google 獎勵能創造價值的人,鼓勵大膽創新,給員工自由,讓他們為用戶做出好的決定。
Google 的招聘流程經過多年調整,招聘以聰明、激情為準。腦力測驗早就不用了,候選者的編程能力,技術知識,是否“夠谷歌”(這個詞蘊含的內容太多了…)。
Google 的管理也很不一般。他們的管理非常寬松,相信工程師可以做正確的決定。對雇員的信任使得 Google 的管理角色不同于平常公司。此外,管理層不能單方面決定雇傭、開除或者提拔一個員工,大多數重要的決策都需要由委員會投票決定,這樣可以降低風險。
Google 的人力資源部一直在進步,他們根據數據和員工反饋來提升評估系統,這個系統包括招聘、提升、獎勵等內容。
我的天,Google 的優點太多了。我曾去過一次 Google 的辦公室,我本來的期望就很高,結果發現那兒的情景比我想象的還要好!
關于谷歌面試學院
還記得那份告訴我該學習什么的面試指導筆記么?雖然上面的內容我很多都不懂,但至少它讓我有了目標。
我把筆記上的題目變成提綱,然后通過觀看麻省理工學院和加州大學伯克利分校在 YouTube 上的講座來一一學習。每個鏈接上可能有多個學習內容,很多視頻基本都會引出下一個視頻,就這樣我不停地學習,學習提綱逐漸豐富。
由于之前我的寫的商業、工作代碼都是保密的,我的 Github 基本是空空的,看起來像根本沒有在敲代碼一樣,于是我把這份學習提綱上傳了上去。我需要創建一個作品,開始我叫它“Project 9894”,是因為 Google 創建于 1998 年 9 月 4 號。后來我把它改名為“谷歌面試學院”。
在學習的過程中,我把自己發現的話題都一一添加上去。
過去我總覺得“知識夠用就行了”。這么多年職業生涯中我根本不清楚 CPU 怎么處理一段程序,內存如何工作,或者其他的知識,我很佩服自己這么多年是怎么過來的。
我的 Github 小項目漸漸開始得到一些關注,我甚至寫了篇文章慶祝項目得到 20 個 star。
有天早晨我發現我的項目有 120 個 star 了!某個業內知名人士前一晚上在推特上分享了我的項目,讓我的項目收到很多關注,甚至進入了 Github 當日流行榜。好幾天我都是 Github 流行榜的第一名哈哈。
許多善良的人主動鼓勵、感激我,這讓我發現原來有數以千計的人跟我一樣,不僅想去 Google 工作,也想成為一名軟件工程師,我列出的學習內容正是他們需要學習的方向。
到目前為止它有超過 21000 個 star 了,難以置信。
如果我無法 Google 工作怎么辦
只要不是天塌下來,都沒關系。
為了成為 Google 的軟件工程師,我投入了大量的時間和精力,即使我不幸失敗了,我學到的知識和能力也足以讓我去任何其他公司任職。
不論結局如何,起碼我會成為一名入門級別的軟件工程師。我不認為我有 15 年的軟件工程師經驗,因為我過去的確不具備這個能力,我和剛畢業的計算機學生一樣還只是新手。
這對于我來說是一段新的旅程,才剛剛開始,即使我會犯很多錯,也毫不畏懼,因為我有學習新內容的熱情,我要學習所有需要的知識,成為團隊中優秀的一部分。
叮囑:別像我一樣學過多東西
我花了八個月時間準備面試,但事實上我可以縮短很多時間。跟做其他復雜的事情一樣,一開始都需要試錯、走彎路,總有一些事我想回去重做。
我學習了很多我不需要的內容,有些是因為我覺得面試需要,有些是我覺得工作里會用到。我不想成為團隊中的負擔。但事實證明我操心太多了,很多內容都沒必要學習。
我花了三周閱讀一本 1000 頁左右的講 C++ 的書,那么多內容我沒記得多少,但是起碼對 C++ 了解多了一點。本來我以為會用到 C,C++,或者 Java,結果我面試中準備用的是 Python。記住這個教訓:別猜,去問!去查!
到后來才發現,我只需要讀三四本書就夠了,我讀的太多了。
我歸納了一本重復查看的算法總結,里面記錄了很多我不希望在面試中遇到的問題。這其實是無用功,你不必這么做。
我花了很多時間看視頻,然而本應該少看一些的,應該隨著時間慢慢增加內容。
我應該盡早停止看書,換成看視頻,早點開始編程驗證、解決問題。早點開始動手實踐我所學的。
隔一段時間重顧知識是記憶的關鍵方法。不要一次性學完一項知識就不管了,這樣你無法真正的掌握。隔一段時間回顧一下,每次重復,你都會加深自己的理解,次數多了,你就會理解每個細節,成為真正的專家。
為了幫助回顧知識,我做了個手機上用的知識點抽記卡,里面有 1792 份知識,現在想想內容有些過于多了。一有時間我就回顧上面的知識點,比如圣誕節購物、排隊等公交時。當抽記卡上的問題我能正確地回答時,就標記為“理解了”,否則從抽記卡上看明白答案,等待下次回答問題正確了再標記。
我內心的恐懼讓我學習了太多不需要的知識,比如“要是他們考我紅黑樹相關的知識怎么辦”。
但是我不想面向面試學習,我想要為了在 Google 工作、解決重量級問題而學習。這就意味學習算法還是有用的,它們可以提升計算機的時間和空間效率。
或許我永遠用不到 Ford-Fulkerson 算法(一類計算網絡流的最大流的貪心算法),但學習后我起碼知道如果有類似的問題出現,該怎么解決。
總結
現在我了解了計算機的歷史,編程中最偉大的部分–數據結構與算法,還有計算機系統底層是如何工作的。
在開始準備谷歌面試之前,我總希望可以跳過所有準備階段,直接應聘,然后去學習工作中用到的語言和工具就好了。
但是在這個過程中,我意識到這些知識是多么重要,雖然它們可能在日常開發中應用不到,但是我相信我的付出會給自己帶來內在的提升。
我馬上就提交申請了,為了這件事我幾乎準備了一年(一月份開始,但直到四月,我才能夠保證全職學習)。
我覺得我已經準備的差不多了,是時候提交申請,對我這段時間的學習進行一次檢驗了。
這將是我人生的一次飛躍。我看到前方有一個光明的未來。
謝謝你花時間讀我的故事。
-
谷歌
+關注
關注
27文章
6209瀏覽量
106196 -
軟件工程師
+關注
關注
8文章
218瀏覽量
21179
發布評論請先 登錄
相關推薦

【面試題】人工智能工程師高頻面試題匯總:機器學習深化篇(題目+答案)

【面試題】人工智能工程師高頻面試題匯總:Transformer篇(題目+答案)

人工智能工程師高頻面試題匯總——機器學習篇

特斯拉招募軟件工程師強化無人駕駛與機器人遠程操作


索尼誠邀軟件工程師參與PS免費手游平臺設計


為何國外工程師偏愛使用for(;;)來實現MCU死循環?


評論