如何得到Google 的工作機會?

問題描述:我想得到的答案大致是:1.你要多強(具體化的描述)才能榮幸加入Google. 2.你為去Google做過什麼努力,或者什麼努力幫助你去Google.
,
Glowin:

Google Interview University – 堅持完成這套學習手冊,你就可以去Google 面試了

原文地址:Google Interview University

原文作者:John Washa

這是?

這是我為了從web 開發者(自學、非計算機科學學位)蛻變至Google 軟件工程師所製定的計劃,其內容歷時數月。

這一長列表是從

Google的指導筆記

中萃取出來並進行擴展。因此,有些事情你必須去了解一下。我在列表的底部添加了一些額外項,用於解決面試中可能會出現的問題。這些額外項大部分是來自於Steve Yegge的“ 

得到在Google工作的機會

 ”。而在Google指導筆記的逐字間,它們有時也會被反映出來。

為何要用到它?

我一直都是遵循該計劃去準備Google 的面試。自1997 年以來,我一直從事於web 程序的構建、服務器的構建及創業型公司的創辦。對於只有著一個經濟學學位,而不是計算機科學學位(CS degree)的我來說,在職業生涯中所取得的都非常成功。然而,我想在Google 工作,並進入大型系統中,真正地去理解計算機系統、算法效率、數據結構性能、低級別編程語言及其工作原理。可一項都不了解的我,怎麼會被Google 所應聘呢?

當我創建該項目時,我從一個堆棧到一個堆都不了解。那時的我,完全不了解Big-O 、樹,或如何去遍歷一個圖。如果非要我去編寫一個排序算法的話,我只能說我所寫的肯定是很糟糕。一直以來,我所用的任何數據結構都是內建於編程語言當中。至於它們在背後是如何運作,對此我一概不清楚。此外,以前的我並不需要對內存進行管理,最多就只是在一個正在執行的進程拋出了“內存不足”的錯誤後,採取一些權變措施。而在我的編程生活中,也甚少使用到多維數組,可關聯數組卻成千上萬。而且,從一開始到現在,我都還未曾自己實現過數據結構。

就是這樣的我,在經過該學習計劃後,已然對被Google 所僱傭充滿信心。這是一個漫長的計劃,以至於花費了我數月的時間。若您早已熟悉大部分的知識,那麼也許能節省大量的時間。

如何使用它

下面所有的東西都只是一個概述。因此,你需要由上而下逐一地去處理它。

在學習過程中,我是使用GitHub 特殊的語法特性markdown flavor 去檢查計劃的進展,包括使用任務列表。

  • <[x] 創建一個新的分支,以使得你可以像這樣去檢查計劃的進展。直接往方括號中填寫一個字符x 即可:[x]

更多關於Github-flavored markdown 的詳情

擁有一名Googler 的心態

把一個(或兩個)印有“ 

future Googler

 ”的圖案打印出來,並用你誓要成功的眼神盯著它。

我得到了工作嗎?

我還沒去應聘。

因為我離完成學習(完成該瘋狂的計劃列表)還需要數天的時間,並打算在下週開始用一整天的時間,以編程的方式去解決問題。當然,這將會持續數週的時間。然後,我才通過使用在二月份所得到的一個介紹資格,去正式應聘Google(沒錯,是二月份時就得到的)。

感谢 JP 的这次介绍。

跟隨著我

目前我仍在該計劃的執行過程中,如果你想跟隨我腳步去學習的話,可以登進我在

GoogleyAsHeck.com

上所寫的博客。

下面是我的聯繫方式:

不要自以為自己足夠聰明

  • Google 的工程師都是才智過人的。但是,就算是工作在Google 的他們,仍然會因為自己不夠聰明而感到一種不安。

  • 天才程序員的神話

關於Google

相關視頻資源

部分視頻只能通過在Coursera、Edx或

http:// 

Lynda.com

class 上註冊登錄才能觀看。這些視頻被稱為網絡公開課程(MOOC)。即便是免費觀看,部分課程可能會由於不在時間段內而無法獲取。因此,你需要多等待幾個月。

很感谢您能帮我把网络公开课程的视频链接转换成公开的视频源,以代替那些在线课程的视频。此外,一些大学的讲座视频也是我所青睐的。

面試過程& 通用的面試準備

為你的面試選擇一種語言

在這,我就以下話題寫一篇短文—— 

重點:為在Google的面試選擇一種語言

在大多數公司的面試當中,你可以在編程這一環節,使用一種自己用起來較為舒適的語言去完成編程。但在Google,你只有三種固定的選擇:

  • C++

  • Java

  • Python

有時你也可以使用下面兩種,但需要事先查閱說明。因為,說明中會有警告:

  • JavaScript

  • Ruby

你需要對你所選擇的語言感到非常舒適且足夠了解。

更多關於語言選擇的閱讀:

在此查看相關語言的資源

由於,我正在學習C、C++ 和Python。因此,在下面你會看到部分關於它們的學習資料。相關書籍請看文章的底部。

在你開始之前

該列表已經持續更新了很長的一段時間,所以,我們的確很容易會對其失去控制。

這裡列出了一些我所犯過的錯誤,希望您不要重滔覆轍。

1. 你不可能把所有的東西都記住

就算我查看了數小時的視頻,並記錄了大量的筆記。幾個月後的我,仍然會忘卻其中大部分的東西。所以,我翻閱了我的筆記,並將可回顧的東西製作成抽認卡(flashcard)(請往下看)

2. 使用抽認卡

為了解決善忘的問題,我製作了一些關於抽認卡的頁面,用於添加兩種抽認卡:正常的及帶有代碼的。每種卡都會有不同的格式設計。

而且,我還以移動設備為先去設計這些網頁,以使得在任何地方的我,都能通過我的手機及平板去回顧知識。

你也可以免費製作屬於你自己的抽認卡網站:

  • 抽認卡頁面的代碼倉庫

  • 我的抽認卡數據庫

    :有一點需要記住的是,我做事有點過頭,以至於把卡片都覆蓋到所有的東西上。從彙編語言和Python的細枝末節,乃至到機器學習和統計都被覆蓋到卡片上。而這種做法,對於Google的要求來說,卻是多餘。

在抽認卡上做筆記:

若你第一次發現你知道問題的答案時,先不要急著把其標註成“已懂”。你需要做的,是去查看一下是否有同樣的抽認卡,並在你真正懂得如何解決問題之前,多問自己幾次。重複地問答可幫助您深刻記住該知識點。

3. 回顧,回顧,回顧

我留有一組ASCII 碼表、OSI 堆棧、Big-O 記號及更多的小抄紙,以便在空餘的時候可以學習。

每編程半個小時就要休息一下,並去回顧你的抽認卡。

4. 專注

在學習的過程中,往往會有許多令人分心的事佔據著我們寶貴的時間。因此,專注和集中註意力是非常困難的。

你所看不到的

由於,這個巨大的列表一開始是作為我個人從Google 面試指導筆記所形成的一個事件處理列表。因此,有一些我熟悉且普遍的技術在此都未被談及到:

  • SQL

  • Javascript

  • HTML、CSS 和其他前端技術

日常計劃

部分問題可能會花費一天的時間去學習,而部分則會花費多天。當然,有些學習並不需要我們懂得如何實現。

因此,每一天我都會在下面所列出的列表中選擇一項,並查看相關的視頻。然後,使用以下的一種語言去實現:

C —— 使用结构体和函数,该函数会接受一个结构体指针 * 及其他数据作为参数。
C++ —— 不使用内建的数据类型。
C++ —— 使用内建的数据类型,如使用 STL 的 std::list 来作为链表。
Python ——  使用内建的数据类型(为了持续练习 Python),并编写一些测试去保证自己代码的正确性。有时,只需要使用断言函数 assert() 即可。
此外,你也可以使用 Java 或其他语言。以上只是我的个人偏好而已。

為何要在這些語言上分別實現一次?

因为可以练习,练习,练习,直至我厌倦它,并完美地实现出来。(若有部分边缘条件没想到时,我会用书写的形式记录下来并去记忆)
因为可以在纯原生的条件下工作(不需垃圾回收机制的帮助下,分配/释放内存(除了 Python))
因为可以利用上内建的数据类型,以使得我拥有在现实中使用内建工具的经验(在生产环境中,我不会去实现自己的链表)

就算我沒有時間去每一項都這麼做,但我也會盡我所能的。

在這裡,你可以查看到我的代碼:

你不需要記住每一個算法的內部原理。

在一個白板上寫代碼,而不要直接在計算機上編寫。在測試完部分簡單的輸入後,到計算機上再測試一遍。

必備知識

算法複雜度/ Big-O / 漸進分析法

數據結構

更多的知識

樹(Trees)

排序(Sorting)

圖(Graphs)

圖論能解決計算機科學裡的很多問題,所以這一節會比較長,像樹和排序的部分一樣。

可以從Skiena 的書(參考下面的書推薦小節)和麵試書籍中學習更多關於圖的實踐。

更多知識

終面

这一部分有一些短视频,你可以快速的观看和复习大多数重要概念。
这对经常性的巩固很有帮助。

綜述:

  • <[ ] 2-3 分鐘的短視頻系列(23 個)

  • <[ ] 2-5 分鐘的短視頻系列- Michael Sambol (18 個):

排序:

書籍

Google Coaching 裡提到的

閱讀並做練習:

  • <[ ] 算法設計手冊(Skiena)

    • 書(Kindle 上可以租到):

    •  是一個資源豐富且性價比很高的在線書店.

    • 答案:

    • 勘誤表

      read and do exercises from the books below. Then move to coding challenges (further down below) 

      一旦你理解了每日計劃裡的所有內容,就去讀上面所列的書並完成練習,然後開始讀下面所列的書並做練習,之後就可以開始實戰寫代碼了(本文再往後的部分)

首先閱讀:

然後閱讀(這本獲得了很多推薦, 但是不在Google coaching 的文檔裡):

附加書單

這些沒有被Google 推薦閱讀,不過我因為需要這些背景知識所以也把它們列在了這裡。

如果你有時間

編碼練習和挑戰

一旦你學會了理論基礎,就應該把它們拿出來練練。

盡量堅持每天做編碼練習,越多越好。

編程問題預備:

編碼練習平台:

當你臨近面試時

你的簡歷

當面試來臨的時候

随着下面列举的问题思考下你可能会遇到的 20 个面试问题
每个问题准备 2-3 种回答
准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事
  • 你為什麼想得到這份工作?

  • 你解決過的最有難度的問題是什麼?

  • 面對過的最大挑戰是什麼?

  • 見過的最好或者最壞的設計是怎麼樣的?

  • 對某項Google 產品提出改進建議。

  • 你作為一個個體同時也是團隊的一員,如何達到最好的工作狀態?

  • 你的什麼技能或者經驗是你的角色中不可或缺的?為什麼?

  • 你在某份工作或某個項目中最享受的是什麼?

  • 你在某份工作或某個項目中面臨過的最大挑戰是什麼?

  • 你在某份工作或某個項目中遇到過的最蛋疼的Bug 是什麼樣的?

  • 你在某份工作或某個項目中學到了什麼?

  • 你在某份工作或某個項目中哪些地方還可以做的更好?

問面試官的問題

我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
  • 團隊多大規模?

  • 開發週期是怎樣的? 會使用瀑布流/極限編程/敏捷開發麼?

  • 經常會為deadline 加班麼? 或者是有彈性的?

  • 團隊裡怎麼做技術選型?

  • 每周平均開多少次會?

  • 你覺得工作環境有助於員工集中精力嗎?

  • 目前正在做什麼工作?

  • 喜歡這些事情嗎?

  • 工作期限是怎麼樣的?

當你獲得了夢想的職位

我還能說些什麼呢,恭喜你!

堅持繼續學習。

得到這份工作只是一個開始。

*****************************************************************************************************
*****************************************************************************************************

Everything below this point is optional. These are my recommendations, not Google's. 
By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for 
any software engineering job.

*****************************************************************************************************
*****************************************************************************************************

Additional Learning

一些主題的額外內容

我为前面提到的某些主题增加了一些额外的内容,之所以没有直接添加到前面,是因为这样很容易导致某个主题内容过多。毕竟你想在本世纪找到一份工作,对吧?

視頻系列

坐下來享受一下吧。”netflix and skill” 😛

計算機科學課程

發表迴響