想去Google做AI?先看完這套面試指南
作者 | 阿司匹林
憑藉強大的技術實力和良好的工作氛圍,Google 對求職者一直有著強大吸引力。
雖然 Google 在幾年前就已經退出了中國大陸市場,但是在北京、上海等國內城市依然保留著辦公地點,而且一直在對外發布招聘需求。特別是去年底,Google 宣布在北京成立 AI 中心,更是為中國的 AI 人才提供了又一個好去處。
為此,我們整理一份 Google 面試指南,並搜集了 20 道 Google AI 的面試問題,希望對感興趣的讀者能有所助益。
當然,如果你想申請國外的 Google 崗位,這份資料也同樣適用。
▌Google 面試方式
首先,Google 為求職者提供兩種面試方式,一種是電話面試或者通過 Google Hangout 進行面試,一種是現場面試,面試方式視情況而定。
電話面試
在電話面試或者 Google Hangout 面試中,面試官將會是你潛在的同事或者經理。
如果你面試的是軟體工程崗位,那麼面試時間將持續 30~60 分鐘。在回答編程問題時,你需要一邊在 Google Doc 裡面寫代碼,一邊告訴面試官你的思考過程。我們建議你使用免提耳機或者揚聲器,以便騰出手來打字。
電話面試的內容包含數據結構和演算法,你需要做好準備,用你最擅長的語言編寫 20~30 行代碼。
面試官會提一個開放式的問題,你可以讓面試官將問題解釋清楚。
你需要用演算法來解釋它。
用代碼來實現演算法(提示:不要擔心不夠完美,因為時間有限。先將你想到的寫下來,然後再完善,確保考慮到了 corner case 和 edge case)。
優化代碼,用案例來測試代碼,然後找出所有的 bug。
如果你申請的是其他職位,那麼電話面試時間大約為 30~45 分鐘。
面采
面試官通常有 4 位,包括潛在的同事以及一些跨職能的員工,每位面試官擁有 30~45 分鐘的時間。作為求職者,你有機會表現你在以下四個不同領域的優勢:
一般認知能力:我們會問一些開放式的問題來了解你是如何處理和解決問題的。這些問題沒有固定的正確答案,我們更看重解釋思考過程的能力以及使用數據來指導決策的能力。
領導力:說明你是如何使用自己的溝通和決策技巧來調動他人的。比如,你是如何在某個組織中晉陞到領導職位的?或者在不是正式領導的情況下,你是如何幫助團隊取得成功的?
與職位相關的知識:我們感興趣的是,你如何將你的個人優勢與經驗相結合,從而發揮影響力的。我們關注的不僅僅是你現在能做些什麼,而是你未來在不同崗位上的發展潛力。
「谷歌范兒」(Googleyness):你在單獨工作或者團隊協作時的工作方式?你是如何幫助他人的?你是如何駕馭不確定性情況的?又如何走出舒適區,讓自己成長的?
對於軟體工程師候選人,我們希望了解你的編程技能和技術領域專業知識,包括編程工具、編程語言、以及數據結構和演算法基本知識。在面試過程中免不了會有一些討論,因為我們喜歡互相推動,學習不同的方法。因此,請你做好要深入討論你提出的解決方案的準備。打破自己的邊界,找到最優答案。
Google 的技術面采歷來用的是白板,但為了節省時間,同時提供更加真實的編程環境,我們已經開始在一些站點提供 Chromebook,用於編程面試。這些電腦上安裝了一個面試程序,你可以選擇自己偏好的語言。
在整個面試過程中,你可以隨時讓面試官作出解釋,確保自己完全理解面試官的問題。此外,你也可以「採訪」我們,問一些與工作、團隊、文化等相關的問題,幫助你決定這份工作是否適合自己。
▌Google 軟體工程和技術職位面試
如果你選擇的是軟體工程相關的崗位,在面試前你最好先掌握以下幾個方面的知識:
編程實踐:你可以在 CodeLab、Quora、Stack Overflow 等網站上找到一些編程示例。Cracking the Coding Interview 這本書也是一個不錯的資源。在某些站點,你可以選擇在 Chromebook 或者白板上編程(提前詢問招聘人員,這樣你可以先行練習)。一定要測試代碼,確保代碼易於閱讀,而且沒有 bug。不用過分關注細微的句法錯誤,比如在給定方法(start, end or start, length)時應該使用哪種 substring,選擇一個,告訴你的面試官即可。
編程:你應該熟練掌握至少一門編程語言,最好是 C++、Java、Python、Go 或者 C。你需要知道 API,面向對象的設計和編程,如何測試代碼,以及 corner case 和 edge case。注意,我們關注的是你對概念的理解而不是記憶。
演算法:同時用自下而上的演算法和自上而下的演算法來處理問題。你需要了解演算法的複雜性以及如何改進演算法。Google 里常用的包括排序演算法(加上搜索和二分法檢索)、分治演算法、動態編程/記憶、貪心演算法、遞歸演算法、鏈接到特定數據結構的演算法。了解大 O 符號(Big O notation,比如運行時),並做好討論 Dijkstra 和 A* 等複雜演算法的準備。我們建議你在寫代碼之前討論或概述你所想到的演算法。
排序:熟悉常用的排序函數以及了解它們對哪些輸入數據有效。從運行時(runtime)和內存佔用的角度思考效率問題。例如,在特殊情況下,插入排序(insertion-sort)或基數排序(radix-sort )比一般的快速排序/合併排序/堆排序(QuickSort/MergeSort/HeapSort)答案好得多。
數據結構:你應該研究儘可能多的數據結構。最常用的數據結構有數組、鏈表、堆棧、隊列、哈希集、哈希映射、哈希表、字典、樹和二叉樹、堆和圖( arrays, linked lists, stacks, queues, hash-sets, hash-maps, hash-tables, dictionary, trees and binary trees, heaps and graphs)。你需要徹底了解數據結構,以及不同演算法對不同數據結構的偏好。
數學:有些面試官會問一些基本的離散數學問題,因為我們經常碰到各種計算問題、概率問題、以及其他的 Discrete Math 101 問題。面試前,你可以花時間複習下(或者自學)基本概率論和組合數學的基本知識。你需要熟悉 n-choose-k 等同類型的問題。
圖演算法:考慮一個問題是否可以應用圖演算法,如距離,搜索,連接,循環檢測等(distance, search, connectivity, cycle-detection)。熟悉三種基本方法——對象和指針,矩陣和鄰接表——的利弊。了解基本的圖遍歷演算法、廣度優先搜索和深度優先搜索,以及它們的計算複雜性、優缺點、實現方法。
遞歸:許多編碼問題都涉及遞歸思考,而且可能還要對遞歸解決方案進行編碼。針對那些能夠用迭代解決的問題,你需要找到更簡練、更優雅的遞歸方法。
▌Google AI 職位面試
如果你應聘的是 AI 相關的職位,那麼你最好先對 Google 的 AI 有一個全面的了解。
首先,Google AI 文章數量最多的三個領域為:
機器智能:
https://research.google.com/pubs/MachineIntelligence.html
機器感知:
https://research.google.com/pubs/MachinePerception.html
自然語言處理:
https://research.google.com/pubs/NaturalLanguageProcessing.html
其次,下面的內容需要你重點閱讀:
TensorFlow:一個大規模機器學習系統
https://arxiv.org/pdf/1605.08695v2.pdf
Google 使用的 AI 工具
https://ai.google/tools/
非官方的 Google 數據科學博客
在對 Google AI 有了比較全面的了解後,你就可以看一下這份由眾多求職者分享的 Google AI 相關的面試問題了。
1/x 的導數是什麼?
繪製 log(x+10) 函數的曲線。
如何設計一個針對客戶滿意度的調查?
投擲一枚硬幣 10 次,8 次正面和 2 次反面。如何分析擲硬幣的公平性?什麼是 p-value?
你有 10 枚硬幣,每枚硬幣擲 10 次(共 100 次),並觀察結果,你會修改演算法來測試硬擲硬幣是否公平嗎?
解釋一個非正態分布以及如何應用它?
為什麼要使用特徵選擇?如果兩個預測因子高度相關,那麼對邏輯回歸中的係數有什麼影響? 係數的置信區間是多少?
K-Means 演算法和高斯混合模型:K-Means 演算法和 EM 演算法之間有什麼區別?
高斯混合模型適用於什麼情況?(正態分布)
如果標籤在聚類項目中是已知的,那麼如何評估模型的性能?
對一個 Google 應用程序做了更改之後,如何測試某個指標是提高了還是降低了?
描述數據分析的過程。
為什麼不使用邏輯回歸演算法?為什麼選擇 GBM 演算法?
推導 GMM 方程?
如何衡量用戶對視頻的喜好程度?
模擬一個二元正態分布?
推導一個分布的方差?
每年有多少人申請 Google 賬戶?
如何構建中位數的估計量?
如果回歸模型中的兩個係數估計值都具有統計顯著性,那麼你是否認為兩者的測試依然重要?
最後,歡迎大家在評論區分享自己的答案以及面試經驗。
參考資料:https://careers.google.com
TAG:嵌入式資訊精選 |