如何準備谷歌面試並失敗。 兩次

如何準備谷歌面試並失敗。 兩次

文章的標題聽起來像是史詩般的失敗,但實際上一切都不那麼簡單。 總的來說,這個故事的結局非常積極,儘管不是在谷歌。 但這是另一篇文章的主題。 在同一篇文章中,我將討論三件事:我的準備過程是如何進行的,谷歌的面試是如何進行的,以及為什麼在我看來,一切都不像看起來那麼清楚。

這一切是如何開始的

在塞浦路斯的一個寒冷的冬夜,我突然想到,我對經典電腦科學的了解遠非平均水平,需要對此採取一些措施。 順便說一句,如果有人還沒有讀過為什麼塞浦路斯的夜晚如此寒冷,那麼你可以了解一下 這裡。 經過一番思考,決定從學習演算法和資料結構的線上課程開始。 我從我的一位前同事那裡聽說了 Robert Sedgewick 在 Coursera 上的課程。 課程由兩部分組成(第1部分 и 第2部分)。 如果連結突然發生變化,您可以隨時透過 Google 搜尋作者的姓名。 每個部分持續 6 週。 課程是在一周的開始的時候進行的,在這一周中你仍然需要做練習。 課程的第一部分涵蓋基本資料結構、基本排序類型和演算法的複雜性。 第二部分已經更高級了,從圖形開始,到線性規劃和難處理性等內容結束。 經過考慮以上所有內容後,我得出的結論是,這正是我所需要的。 順便說一句,好奇的讀者可能會問,谷歌與它有什麼關係? 事實上,直到這一刻他都與這件事沒有任何關係。 但我需要一個目標,因為在沒有目標的情況下連續 12 週晚上學習有點困難。 獲取新知識的目的是什麼? 當然,他們在實踐中的應用。 在日常生活中這很成問題,但在大公司面試時這就很容易了。 快速谷歌顯示谷歌(請原諒同義反覆)是歐洲(我專門針對歐洲)進行此類採訪的最大公司之一。 也就是說,他們的辦公室位於瑞士蘇黎世。 所以就決定了——學習然後去谷歌面試吧。

為第一種方法做準備

12週很快就過去了,我完成了兩門課。 我對這些課程的印象非常積極,我可以將它們推薦給任何有興趣的人。 我喜歡這些課程的原因如下:

  • 講師英語說得相當清楚
  • 材料結構良好
  • 華麗的演示展示了每個演算法的內部結構
  • 材料的合理選擇
  • 有趣的練習
  • 網站上自動檢查練習,然後產生報告

我的課程工作通常是這樣的。 我聽了1-2天的講座。 然後他們對自己對材料的了解進行了快速測試。 這週剩下的時間裡,我已經多次迭代了這個練習。 在第一次獲得 30-70% 的成績後,後續的成績達到了 97-100%。 該練習通常涉及實現一些演算法,例如 縫雕壓縮包.

完成課程後,我發現許多知識伴隨著許多悲傷。 如果說以前我只是知道我什麼都不知道,現在我開始意識到是我不知道。

由於當時只是五月份,而且我安排了秋季面試,所以我決定繼續學業。 在審查了該職位的要求後,決定並行兩個方向:繼續研究演算法和學習機器學習基礎課程。 對於第一個目標,我決定從課程轉向書籍,並選擇了 Steven Skiena 的鉅作《演算法》。 演算法設計手冊。 雖然不像克努特那樣具有紀念意義,但仍然如此。 為了第二個目標,我回到 Coursera 並報名參加 Andrew Ng 的課程。 機器學習.

又過了三個月,我完成了課程和書。

我們先從書開始吧。 閱讀結果非常有趣,儘管並不容易。 原則上,我會推薦這本書,但不會立即推薦。 總的來說,這本書更深入地介紹了我在課程中學到的知識。 另外,我(從正式的角度來看)發現了啟發式和動態程式設計之類的東西。 當然,我以前用過它們,但我不知道它們叫什麼。 這本書也包含了許多作者生活中的故事(戰爭故事),這在一定程度上淡化了演示的學術性質。 順便說一句,本書的後半部可以省略;它只是描述現有的問題和解決這些問題的方法。 如果在實踐中經常使用它是有用的,否則它會立即忘記。

我對這門課程非常滿意。 作者很清楚他的知識,而且說話很有趣。 再加上我在大學時記得的相當多的內容,即線性代數和神經網路的基礎知識,所以我沒有遇到任何特別的困難。 課程的結構非常標準。 課程分為幾週。 每週都有講座和簡短的測驗。 講座結束後,你會收到一份作業,你需要做、提交,系統會自動檢查。 簡而言之,課程中教授的內容如下:
- 成本函數
- 線性迴歸
- 梯度下降
- 特徵縮放
- 正規方程
- 邏輯迴歸
— 多類分類(一對一)
- 神經網絡
- 反向傳播
- 正規化
- 偏差/方差
— 學習曲線
— 錯誤指標(精確率、召回率、F1)
— 支援向量機(大邊距分類)
— K 均值
—主成分分析
- 異常檢測
— 協同過濾(推薦系統)
— 隨機、小批量、批量梯度下降
- 線上學習
- 地圖縮小
- 天花板分析
完成課程後,對所有這些主題都有了了解。 兩年過去了,幾乎所有的事情都自然而然地被遺忘了。 我將其推薦給那些不熟悉機器學習並希望充分了解基本知識以繼續前進的人。

第一次運行

已經九月了,是時候考慮面試了。 由於透過該網站申請是相當災難性的,所以我開始尋找在Google工作的朋友。 選擇落到了 資料組件,因為他是我唯一直接認識的人(即使不是個人認識)。 他同意轉發我的履歷,很快我就收到了招募人員的一封信,提議在他的日曆上為第一次談話預留一個時間段。幾天后,我就接到了電話。 我們嘗試透過環聊進行溝通,但品質很差,所以我們改用電話。 首先,我們快速討論了標準的製定方式、原因和原因,然後繼續進行技術篩選。 它由十幾個問題組成,其精神是“插入哈希映射有什麼困難”,“你知道什麼平衡樹”。 如果你對這些東西有基本的了解的話,這並不難。 篩選很順利,根據結果,他們決定組織一週內的第一次訪談。

採訪也是透過環聊進行的。 首先他們談論了我大約 5 分鐘,然後開始討論問題。 問題出在圖表。 我很快意識到需要做什麼,但我選擇了錯誤的演算法。 當我開始編寫程式碼時,我意識到了這一點並切換到了另一個選項,我完成了該選項。 面試官問了幾個關於演算法複雜程度的問題,並詢問是否可以做得更快。 我不知何故變得遲鈍,做不到。 這時,時間到了,我們告別了。 然後,大約 10 分鐘後,我突然意識到,在這個特定問題中,我可以使用廣度優先搜尋來代替我使用的 Dijkstra 演算法,而且速度會更快。 過了一段時間,招募人員打來電話,說面試整體很順利,應該再辦一次面試。 我們同意再過一周。

這次事情變得更糟了。 如果說第一次面試官還算友善、善於交際,那麼這次他就有些陰沉了。 我無法立即解決問題,儘管我提出的想法原則上可以解決問題。 最終,經過面試官的多次提示,我找到了解決方案。 這次結果又是廣度優先搜索,只是從幾個點出發。 我編寫了解決方案,按時滿足了他們的要求,但忘記了邊緣情況。 過了一段時間,招募人員打電話說,這次面試官不高興,因為在他看來我需要太多提示(3或4條),而且我一邊寫一邊不斷地改代碼。 根據兩次面試的結果,我決定不再繼續,如果我願意的話,可以將下一次面試推遲一年。 這就是我們說再見的原因。

從這個故事我得出了幾個結論:

  • 理論很好,但你需要快速掌握它
  • 沒有實踐的理論是沒有幫助的。 我們需要解決問題並使編碼自動化。
  • 很大程度取決於面試官。 對此我們無能為力。

準備第二次運行

想了想,我決定一年後再試。 並稍微修改了目標。 如果說以前主要目標是學習,Google的面試就像一根遙遠的紅蘿蔔,那麼現在透過面試就是目標,學習就是手段。
於是,制定了一個新的計劃,其中包括以下幾點:

  • 透過閱讀書籍和文章繼續學習理論。
  • 解決500-1000件的演算法問題。
  • 透過觀看影片繼續學習理論。
  • 透過課程繼續學習理論。
  • 研究其他人在 Google 面試的經驗。

我在一年內完成了這個計劃。 接下來我將描述我針對每一點具體做了什麼。

書籍和文章

我甚至不記得我讀過多少篇文章;我讀過俄語和英語的文章。 可能是最有用的網站 ❗️❗️。 在這裡您可以找到大量有趣演算法的描述以及程式碼範例。

我讀了5 本書:《演算法》第4 版(Sedgewick、Wayne)、《演算法導論》第3 版(Cormen、Leiserson、Rivest、Stein)、《破解程式設計面試》第4 版(Gayle Laakmann)、《程式設計面試揭秘》第2 版(Mongan、Suojanen) ,Giguere),程式設計訪談的要素(Aziz、Lee、Prakash)。 它們可以分為 2 類。 第一個包括塞奇威克和科曼的書。 這是一個理論。 剩下的就是面試的準備。 塞奇威克在書中講述了與他的課程相同的事情。 只是書面形式。 如果您已經學習了該課程,那麼仔細閱讀它並沒有多大意義,但無論如何還是值得略讀的。 如果您還沒有觀看過該課程,那麼閱讀它是有意義的。 科門對我來說太無聊了。 說實話,我很難掌握它。 我剛把它從那裡拿出來 大師理論,以及幾種很少使用的資料結構(斐波那契堆、van Emde Boas 樹、基數堆)。

為了準備面試,至少值得閱讀一本書。 它們都是基於大致相同的原理而建構的。 他們描述了大型科技公司的面試過程,給出了電腦科學的基本知識、這些基本知識的問題、問題的解決方案以及解決方案的分析。 在以上三項中,我可能會推薦《破解編碼面試》作為主要內容,其餘的都是可選的。

演算法問題

這可能是準備過程中最有趣的一點。 當然,你也可以傻傻地坐下來解決問題。 有許多不同的網站可以提供此服務。 我主要用了三個: Hackerrank, CodeChef и 力碼。 在 CodeChef 上,問題按難度劃分,但不按主題劃分。 按複雜性和主題劃分的駭客排名。

但我很快就發現,還有一種更有趣的方法。 這些都是競賽(程式設計挑戰或程式設計競賽)。 所有三個站點都提供它們。 確實,LeetCode 存在一個問題——不方便的時區。 這就是為什麼我沒有參與這個網站。 Hackerrank和CodeChef提供了相當多的不同競賽,持續時間從1小時到10天不等。 不同的格式有不同的規則,但我們可以討論很久。 競爭之所以有好處的主要原因是在學習過程中引入了競爭(又是同義反覆)元素。

我總共參加了 Hackerrank 的 37 場比賽。 其中,32 個是評級的,5 個要么是贊助的(我什至在其中一個中收到了 25 美元),要么是為了好玩。 在排名中,我有10次進入前4%,11次進入前12%,5次進入前25%。 最好的成績是27小時1459/3和一週22/9721。

當 Hackerrank 開始減少舉辦比賽的頻率時,我轉向了 CodeChef。 我總共參加了5場比賽。 在十天的比賽中,最好成績是426/5019。

總的來說,在比賽中,就這樣,我解決了1000多個問題,這些問題都符合計畫。 不幸的是,現在沒有空閒時間來繼續競爭活動,就像沒有可以取消非空閒時間的目標一樣。 但這很有趣。 我建議對此感興趣的人找到志同道合的人。 一起或在一個小組中,這會更有趣。 我和朋友玩得很開心,所以也許進展順利。

觀看影片

讀完斯基納的書後,我對他所做的事情產生了興趣。 和塞奇威克一樣,他也是大學教授。 在這方面,他的課程影片可以在網路上找到。 我決定回顧課程 COMP300E - 程式設計挑戰 - 2009 香港科技大學。 我不能說我非常喜歡它。 首先,視頻品質不是很好。 其次,我並沒有嘗試自己解決課程中討論的問題。 所以參與度不是很高。
另外,在解決問題、試圖找到正確的演算法時,我看到了 Tushar Roy 的影片。 他曾在亞馬遜工作,現在在蘋果工作。 後來我自己發現,他已經 YouTube 上的,他在其中發布了對各種演算法的分析。 截至撰寫本文時,該頻道包含 103 個影片。 我必須說他的分析做得非常好。 我試著看其他作者的作品,但不知何故沒有效果。 所以我絕對推薦這個頻道觀看。

參加課程

我在這裡並沒有做什麼特別的事情。 觀看了 Google 的 Android 開發者納米學位的影片並參加了 ITMO 的課程 如何贏得程式設計比賽:冠軍的秘密。 納米學位相當不錯,雖然我自然沒有從中學到任何新東西。 ITMO 的課程在理論方面有點偏頗,但問題很有趣。 我不建議從它開始,但原則上這是值得的。

學習其他人的經驗

當然,很多人試圖進入谷歌。 有些人得到了,有些人沒有。 有些人寫了有關此的文章。 我可能會提到的有趣的事情 這個 и 這個。 在第一種情況下,這個人為自己準備了一份清單,列出了他需要學習什麼才能成為軟體工程師並進入谷歌。 它最終進入了亞馬遜,但這不再那麼重要了。 第二本手冊由 Google 工程師 Larisa Agarkova 編寫(拉爾)。 除了本文檔之外,您還可以閱讀 她的博客.

閱讀 Glassdoor 上的訪談評論是有意義的。 它們都或多或少相似,但您可以獲得一些有用的信息。

我不會提供其他小文章的連結;你可以在 Google 上輕鬆找到它們。

第二次運行

現在一年過去了。 事實證明,學習方面非常緊張。 但我以更深入的理論知識和實踐技能迎接了新的秋天。 距離年底還剩幾週時間,我需要做準備,突然一封來自谷歌招聘人員的信被投進郵件中,他在信中問我是否仍然有在谷歌工作的願望,是否願意在谷歌工作。我介意和他說話。 我自然不介意。 我們同意一周後打電話。 他們還要求我提供一份更新後的簡歷,我在簡歷中添加了我這一年的工作和總體情況的簡要描述。

經過終生的溝通,我們決定一週後進行環聊面試,就像去年一樣。 一週過去了,到了面試的時間,但面試官卻沒有出現。 十分鐘過去了,我已經開始緊張了,突然有人插話了。 不久之後,我的面試官因故未能出現,我們緊急尋找替代者。 該人在設置計算機和進行採訪方面都有些準備不足。 但後來一切都很順利。 我很快就解決了這個問題,描述了哪裡可能存在陷阱,以及如何規避它們。 我們討論了問題的幾個不同版本以及演算法的複雜性。 然後我們又聊了10分鐘,工程師告訴我們他在慕尼黑工作的印象(他們顯然沒有在蘇黎世找到緊急的替代者),然後我們就分手了。

當天,招募人員聯絡了我,說面試很順利,準備邀請我去辦公室面試。 第二天,我們透過環聊打電話討論了細節。 由於我需要申請簽證,我們決定在一個月內安排面試。

當我準備文件的時候,我同時與招募人員討論了即將到來的面試。 Google 的標準面試包括 4 次演算法面試和 XNUMX 次系統設計面試。 但是,由於我正在申請 Android 開發人員的工作,所以我被告知面試的一部分將是針對 Android 的。 我無法從招募人員那裡得知具體內容和具體內容。 據我了解,這是最近才推出的,他本人也不是很清楚。 我還報名了兩個訓練課程:如何透過演算法面試和如何通過系統設計面試。 這些會議的用處一般。 在那裡,也沒有人能告訴我他們向 Android 開發者詢問了什麼。 因此,我這個月的準備工作主要有以下幾點:

  • 買一塊標記板,憑記憶在上面寫下 2-3 打最受歡迎的演算法。 每天3-5塊。 總共,每個都被寫了好幾遍。
  • 刷新你對Android上日常不使用的各種資訊的記憶
  • 觀看一些有關大規模和類似內容的視頻

正如我已經說過的,同時我正在準備旅行的文件。 首先,他們要求我提供製作邀請函的資訊。 然後我花了很長時間試圖找出塞浦路斯誰簽發瑞士簽證,因為瑞士大使館不處理這個問題。 事實證明,奧地利領事館正在這樣做。 我打電話預約了。 他們要了一堆文件,但沒有什麼特別有趣的。 照片、護照、居留證、一堆不同的證書,當然還有邀請函。 同時,信還沒有到達。 最後,我採用了常規列印輸出,效果非常好。 三天後,這封信到達了,塞浦路斯聯邦快遞找不到我的地址,我只好自己去拿。 同時,我收到了來自同一個聯邦快遞的包裹,他們也無法將其交付給我,因為他們找不到地址,並且自 3 月以來(5 個月,卡爾)就一直躺在那裡。 因為我不知道,所以我自然不會認為他們有。 我按時收到了簽證,之後他們為我預訂了酒店並為我提供了航班選擇。 我調整了選項以使其更方便。 不再有直飛航班,所以我最終經雅典飛往那裡,然後經維也納返回。

辦完所有旅行手續後,又過了幾天,我真的飛到蘇黎世了。 順利到達那裡。 從機場到市區我搭火車——又快又方便。 在城裡逛了一圈後,我找到了一家旅館併入住了。 由於訂的飯店是不含餐的,所以就在隔壁吃了晚餐就睡覺了,因為是早上的航班,已經想睡覺了。 第二天,我在飯店吃了早餐(需要額外付費),然後去了 Google 辦公室。 谷歌在蘇黎世設有多個辦事處。 我的採訪不在中心。 總的來說,這個辦公室看起來很普通,所以我沒有機會看到「普通」谷歌辦公室的所有優點。 我向管理員登記並坐下來等待。 過了一會兒,招募人員出來告訴我當天的計劃,然後他帶我去了面試的房間。 實際上,計劃包括 3 次面試、午餐和另外 2 次面試。

面試第一名

第一次面試是針對Android的。 而且它與演算法完全無關。 不過,令人驚訝。 好吧,這種方式比較常見。 我們被要求製作一個特定的 UI 元件。 首先我們討論了什麼以及如何進行。 他提出使用 RxJava 制定解決方案,描述了他具體要做什麼以及為什麼。 他們說這當然很好,但是我們還是用Android框架來做吧。 同時我們將在板上編寫程式碼。 而且不僅僅是一個組件,而是使用該組件的整個 Activity。 這是我還沒準備好的。 在板上編寫30-50 行演算法是一回事,而編寫大量Android 程式碼又是另一回事,即使帶有縮寫和註釋,本著「好吧,我不會寫那個,因為它已經很明顯了”的精神。 結果是 3 塊木板的某種油醋汁。 那些。 我解決了這個問題,但它看起來很愚蠢。

採訪二號

這次的訪談是關於演算法的。 而且還有兩個面試官。 一個是真正的面試官,第二個是年輕的學徒(影子麵試官)。 有必要提出一種具有某些屬性的資料結構。 首先,我們像往常一樣討論這個問題。 我問了不同的問題,面試官回答了。 一段時間後,他們被要求在黑板上寫下所發明結構的幾種方法。 這次我或多或少是成功的,儘管有一些小錯誤,但我在面試官的提示下改正了。

訪談三

這次的系統設計,突然變成Android了。 有必要開發具有某些功能的應用程式。 我們討論了應用程式、伺服器和通訊協定的要求。 接下來,我開始描述建置應用程式時將使用哪些元件或函式庫。 然後,當提到 Job Scheduler 時,出現了一些混亂。 關鍵是我從未在實踐中使用過它,因為在它發佈時我剛剛切換到支援沒有任務可供使用的應用程式。 開發後續產品時也發生了同樣的情況。 就是理論上我知道這個東西是什麼,什麼時候用,怎麼用,但是沒有使用經驗。 而且面試官似乎不太喜歡這個。 然後他們讓我寫一些程式碼。 是的,在開發應用程式時,您立即需要編寫程式碼。 再次在板上編寫 Android 程式碼。 結果又嚇人了。

午餐

本來應該有另一個人來的,但他沒有來。 谷歌也會犯錯。 結果,我和前一位面試官,她的同事一起去吃午飯,過了一會兒,下一位面試官也加入了。 午餐相當不錯。 同樣,由於這不是蘇黎世的主要辦公室,餐廳看起來很普通,但非常漂亮。

訪談四

最後是最純粹的演算法。 我很快就有效地解決了第一個問題,雖然我錯過了一個邊緣情況,但在面試官的提示下(他給出了這個非常邊緣的情況)我發現了問題並糾正了它。 當然,我必須在板上寫程式碼。 然後又給了類似的任務,但難度更高。 為此,我找到了幾個非最佳解決方案,幾乎找到了最佳解決方案,5-10 分鐘不足以完成這個想法。 好吧,我沒有時間為其編寫程式碼。

採訪五號

又是Android面試。 我想知道為什麼我一整年都在研究演算法?
起初有幾個簡單的問題。 然後面試官在黑板上寫程式碼,要求找出其中的問題。 找到它,解釋它,修復它。 討論過。 然後一些意想不到的問題開始出現,“方法Y在類別X中做什麼”,“方法Y內部是什麼”,“類別Z做什麼”。 當然,我回答了一些,但後來我說我最近工作中沒有遇到過這種情況,自然不記得詳細是誰在做什麼、怎麼做。 之後面試官就問我現在在做什麼。 問題都是圍繞著這個話題進行的。 我已經在這裡回答得更好了。

最後一次採訪結束後,他們拿走了我的通行證,祝我好運,然後送我上路。 我在城裡走了一會兒,吃了晚飯,然後去了酒店,然後就在那裡睡覺了,因為航班又是一大早。 第二天我安全抵達塞普勒斯。 應招募人員的要求,我寫了面試回饋,並在一項特殊服務中填寫了表格,以退還所花的錢。 在所有費用中,Google 僅直接支付門票費用。 飯店、餐飲和交通費用由候選人支付。 然後我們填寫表格,附上收據並發送給專門的辦公室。 他們處理此問題並將資金相當快速地轉入帳戶。

處理面試結果花了一周半的時間。 之後我被告知我「有點低於標準」。 也就是說,我有點不足。 更具體地說,有 2 次面試進行得很順利,2 次面試不太順利,系統設計也不太順利。 現在,如果至少有3個順利的話,我們就可以參加比賽,否則就沒有機會了。 他們提出再過一年再來。

當然,一開始我很沮喪,因為準備工作花了很多功夫,到面試時我已經在考慮離開塞浦路斯了。 加入谷歌並搬到瑞士似乎是一個不錯的選擇。

結論

我們來到本文的最後部分。 是的,我兩次谷歌面試都失敗了。 這是可悲的。 在那裡工作可能會很有趣。 但是,你可以從另一個角度來看這個問題。

  • 在一年半的時間裡,我學到了大量與軟體開發相關的知識。
  • 我參加程式比賽很開心。
  • 我去了蘇黎世幾天。 我什麼時候再去那裡?
  • 我在世界上最大的 IT 公司之一獲得了一次有趣的面試經驗。

所以,這一年半的時間裡發生的一切,都可以簡單地認為是訓練,或是訓練。 而這次培訓的成果也已讓人感受到。 我離開塞浦路斯的想法成熟了(由於一些家庭狀況),我成功通過了另一家知名公司的幾次面試,並在8個月後搬家。 但這是一個完全不同的故事。 不過,我認為我仍然應該感謝谷歌,感謝我自己工作的一年半,以及在蘇黎世度過的有趣的兩天。

最後我還能說什麼? 如果您從事 IT 工作,請為 Google(亞馬遜、微軟、蘋果等)的面試做好準備。 也許有一天你會去那裡到達那裡。 即使你不願意,相信我,這樣的準備也不會讓你變得更糟。 當你意識到你可以(即使只是運氣好)獲得這些公司之一的面試機會時,比你開始準備之前有更多的道路向你敞開。 一路上你所需要的只是目標、毅力和時間。 祝你成功 :)

來源: www.habr.com

添加評論