1. 程式人生 > >百度實習生面試經歷

百度實習生面試經歷

寫下這次面試百度實習生的經歷,即做自己學習面試的總結,也提供給有需要的人一點參考吧。

源起

抓住暑假的尾巴在安順玩耍時,收到一個朋友發給我的百度實習的崗位資訊及要求。當時隨便看了下,是百度地圖的後臺開發方面的,要求C++,演算法,Linux,以及資料庫方面的知識。要求挺高的,其實我是達不到要求的。感覺不好拂了朋友好意,也就讓她給了我聯絡方式,想著隨便問一下,聊聊。一開始以為這應該是學長學姐來學校發的內推訊息。加上那人之後就開始叫學姐。後來才發現,她和我是同一屆的,她是幫她百度的朋友推簡歷的。當我向她厚顏無恥的誇下我基本滿足他們要求,並要到了百度那個哥們兒的聯絡方式後,其實我是很心虛的。

當時諮詢百度的那個哥們兒(為了後文便於敘述,就把他稱為W君吧)時,其實我還是沒真打算要投

簡歷。推辭著說到,“這幾天在外面玩,不方便,手邊也沒準備好的簡歷,可否等過兩天回到長沙再給他發簡歷。“ 其實,我還真是沒有認真準備過簡歷,也還沒投過簡歷。 這W君倒是乾脆,說沒簡歷現在擼一份發過來就是了。於是乎,我就搜了一個簡歷模板,然後填了填就發過去了。

總的來說,基礎和底層知識比較紮實,造過一些小輪子,也瞭解過一些python Web後端和python資料處理方面的東西。有個人部落格(www.qyspaces.com),堅持寫部落格總結學過的知識及自己的思考。並且擅長不斷的學習。因為開學大三,所以還在不斷學習中。學習的重點是資料結構與演算法,以及資料處理,機器學習等。

基礎方面:熟悉計算機原理及體系結構,掌握了常用

資料結構和演算法以及基本的作業系統知識。長期使用Linux系統,會一點shell及Linux C,學過一些UNIX POSIX API。

語言方面:熟悉C++和兩門語言。熟悉STL,閱讀過一點SGI STL原始碼,並且正在嘗試自己實現一個版本。python寫過一點web後端和網路爬蟲。

上面的內容就是我寫在簡歷裡的自我評價了。我把自己的技術棧什麼的一股腦兒都寫進去了。當時擼好這個”簡”歷也就二十來分鐘吧。投完簡歷,第二天就繼續和朋友在安順吃喝玩樂了。一直到三天後,回到長沙,在從火車站去學校的公交車上,W君突然QQ上找我,然後問了我些問題。估計是想大概瞭解下我簡歷的可信度。我記得很清楚的是,問了我一個快排的實現思路的問題。然而我就一個演算法弱雞,當時就愣了。一邊言語交流著,一邊回憶快排的過程。慶幸的是,稍加回憶也就記起了快排的大概過程,然後就balabala說了一通。其實說完我都還不太確定那是不是快排的過程。當時一直是,快排,希爾排序等幾個排序過程傻傻的分不清。然後還問了些其他的什麼很基礎的問題吧。隨後說是,可能過幾天會有一個電話面試。當時聽說有面試,心裡還是有點小激動的呢、畢竟是度廠啊!

一面

接下來的幾天就開始準備面試了。拿著基本以前啃過的書在那裡看。《深入理解計算機系統》,《STL原始碼剖析》,《作業系統概念》,《資料結構》,《C/C++程式碼精粹》等一幫書。因為是為了面試而看書,完全沒有平時看書的輕鬆和愉悅感可言。看一個東西,想的就是要怎麼把它記住,如果問這個我要如何回答之類的。實際上,幾天時間,也就把以前看過的東西大概熟悉了一下,有個印象。比如C++的記憶體管理以及記憶體池這個東西,還有虛擬記憶體的實現原理等,裡面本來就還有很多東西沒懂。所以看得也是囫圇吞棗的。

很慘的是,當時由於電腦壞了。沒法在網上搜搜典型的面試題目,也沒看別人的攻略。還好,以前看部落格的時候,看過不少別人寫的一些面試攻略,所以基本還是瞭解面試的重點大概是哪些內容。所以說嘛,有些東西,你真得先準備著,因為你永遠也想不到在什麼時候它們會派上用場的。那些關於面試心得體會的文章都是去年剛開始接觸技術時看的。當時真也就是當故事看著玩的。沒想到這麼快我就要寫個這樣的故事來給別人看了。

當我傻傻的把《資料結構》又看了一遍,各類資料結構及基本演算法都熟悉了一下,STL的各種設計理念,各種連結,中斷,虛擬儲存器,程序執行緒問題都看了一番。面試時卻是有點傻眼了。記得在面試前,我還專程問了一個做HR的姐姐面試要注意些什麼,然而,在一面二面中並沒什麼卵用。因為,都!是!技!術!面!

因為電話面試嘛,一開始有點聽不太清。然後他讓我做個簡單的自我介紹。我balabala的說了3,4分鐘吧,哪個學校的,什麼專業的,技術棧是怎樣的,以及怎樣發展的之類。其實這些資訊,簡歷裡基本都有。自我介紹只是給你一個適應過程,讓你進入面試的場景中來。然後開始問問題了。

先是問了一個關於TCP協議如何保證資訊可靠性的。我大概說了下三次握手四次斷開以及重複發包等過程,然後說這個方面不是很熟悉,大概知道一些。還問了寫關於網路訪問的整個過程的問題,從瀏覽器輸入地址到瀏覽器收到伺服器的傳回來的資訊中間的整個過程。這個問題也沒什麼難度。

然後開始挖一些有深度的問題了。問我虛擬記憶體的實現機制以及C裡面的動態記憶體分配後面的實現原理。這個問題因為涉及到的知識點太多,而且我自己也還沒能把其中一些過程理清。兩人你來我去,每問一個問題,都要解釋一番,而我回答時,有時也得舉個例子什麼的。當時,我說C的動態記憶體分配器,用malloc來管理,其實現層面用了技巧性的帶head和footer的自由連結串列這個東西。因為我說得不清楚,反覆說了幾遍,他才懂了我說的意思了。

然後問了我一個問爛了的程序與執行緒的區別。作業系統我別的還沒看過,就看過程序執行緒的知識。。簡直感人啊。後來二面中又問了這個問題。不過還問了程序間(IPC)通訊的實現機制以及執行緒間資源共享的方式。他要是問我檔案系統什麼的我就不知道了。。不過目測他也不太熟悉。之後,問我平時是不是都用Linux。然後問了些Linux下的常規命令。什麼grep,top,ps,之類的。學了很多的POSIX API倒是一個都沒問我,只跟我我提了一下多執行緒程式的問題。當時腦子抽了說不太熟悉。。其實就是pthread庫的問題啊。。

在這之後,又問了幾個C++的問題。無外乎虛擬函式,多型這些東西的原理以及應用場景。最後,是的就是最後。問了我兩個演算法問題。一個是如何線上性時間複雜度裡找到一個字串中不含重複字元的最大子串。因為完全沒有做這個方面的準備,完全傻眼了。。只得一邊與面試官溝通,一邊想,同時在草稿本上寫寫思路。想了挺長時間,沒能給出一個可行的方案。最後給出了一個用雙指標線性掃描比較的辦法,不過時間複雜度貌似是NlogN的。現在想來,這個問題So easy啊!一個hash法直接就解決了。然後又問了一個,如何檢測一個連結串列是否有環的問題。。想了好久,又跪了。。後來看面試筆試寶典發現,兩個問題都是問爛了問題。連結串列環一個快慢指標就解決了。。

兩個演算法題掛了都是因為沒好好準備這方面啊,當時如果稍微用幾個小時刷刷這些題目,那就完全沒問題了。以前一直覺得考前準備是沒用的,這次算是更正了我的看法。面試前抱佛腳真是太有用了。網上不是流傳,刷完leetcode後,將題背下就可以進Google了嗎。。

其實面完後我是完全沒底的,雖然基礎問題回答得不錯。但是演算法問題回答成這樣,他們很有可能會認為我一點也不懂演算法,然後把我刷掉了。。據說有個哥們兒面試時什麼問題都答不上來,但就這個連結串列檢測環的問題答上了。還好的是,後來W君告訴我,讓我過了一面,而且是剛好擦著過。應該是看我基礎不錯,想給我一次機會吧。讓我準備準備下週的二面。又是沒有具體的時間,不過這次我倒希望時間長一點,可以好好刷刷面試題目。

二面

因為一面中發現演算法太渣,並且爛大街的演算法題都答不上來。突然開竅了,去買了本《程式設計師面試筆試寶典》開始刷。那幾天的艱苦奮鬥啊,把各種常見題目中的連結串列問題,陣列問題,字串問題,一共50多道,兩天的時間,全部刷了一遍。刷到後面真實快吐了。但是也感覺心裡有底了,覺得這種常規問題隨便他問我都OK了。

面試當天的上午,他們打了個電話跟我約定下午兩點面試。然後順便問了問我C++是不是比較熟啊。然後我不知天高地厚的答了一句還行。。之後,W君告訴我,給我分了一個T6的CPP大神面試我。。然後,下午的面試果然不出我所料,80%的問題都是關於C++的。

上來簡單的自我介紹之後,讓我先說說C++中的那些關鍵字,以及注意點。我依次說了,const和static在全域性作用域內是什麼性質,在類裡面,修飾屬性和方法又是如何的; struct與class的區別;vitual虛擬函式關鍵詞。他問到我一個靜態資料成員是否只能由靜態成員函式訪問。這個知識點其實我已經忘了,因為平時程式碼寫得少,很少涉及這些知識點。不過,我按自己的理解推論了一番,然後按照我的理解說,既然靜態資料成員是類的成員,不能通過物件this指標指向來訪問,那麼要用函式操作它,應該也只能用靜態成員函式來操作它。靜態成員函式的地位是類的成員,和靜態資料成員一樣。然後給了肯定的回答。以前看別人在面經裡寫,有時面試官問你一個問題,可能不是要看你能不能記住這個知識點,可能是要看你如何去分析一個問題。這次的切身體會確實是如此。所以,遇到自己忘了或者不懂的問題,不要急於給出肯定或否定的答案,按照自己的理解,分析一番,可能會更有效。

發現C++翻來覆去,能問的就是那些問題了。然後又開始問虛擬函式,多型,面向物件和泛型了。不過他問我泛型的優點,我說了一通,然後問我缺點。。我還真沒想到。只說是這個是編譯時特性,只是覺得會把編譯器的設計變得更復雜,其他確定沒發現。。。因為真不知道啊。

聽說STL比較熟,又讓我講STL,看原始碼時哪些地方對我啟發最大。我說到了容器作為資料結構,函式物件作為演算法的獨立泛型設計,然後通過迭代器這種智慧指標將它們耦合起來。這種低耦合高複用的思想在很多地方都用到了,比如Web中的MVC等。然後問我關於容器的底層實現等,紅黑樹的平衡方法。還有,又是記憶體管理,STL的記憶體分配器及其設計。關於STL基本把能問的都問到了。STL我也是假期才看的,真可謂是現學現賣的。

之後,又問了程序執行緒的問題。。問了一個判斷二叉樹對稱的問題,以及一個腦筋急轉彎!題目是,有8個杯子,5個正著放,3個倒著放,每次翻動2個,問幾次可以把他們全部翻過來。。想了好久,我說翻不過來。。不過,我可以明顯感受到面試快到尾聲了,這是挺放鬆的。

後面還問了些關於連結的問題吧,反正正好都是上學期看過的,問題都不大。然後還問了我new/delete, 和 malloc/free的區別之類的。最讓我不爽的是,我刷了那麼多陣列連結串列字串相關的演算法題,他一個都沒問我啊。。

對了,還問過我做過些什麼東西。一面也問過。這點我真的是比較虧,沒什麼工程經驗,又沒什麼拿得出手的輪子。只有說說以前寫的命令列的貪吃蛇,霍夫曼編碼的壓縮解壓器,string類的實現,以及部落格後臺實現。最多也就幾百行程式碼的東西,真的是自己都不好意思說,但是不說這些又沒有其他東西可以說,只有厚顏無恥的說這些東西。我說這些時,他都沒深入問一下,明顯是覺得這些東西沒什麼技術含量。

三面

面完二面問什麼時候出結果,告訴我說放假回來。還說如果過了還有三面。當時我整個人都快崩了啊。。一開始說好的只有兩面,現在過了一二又告訴我還有三面。我在想過了三面是不是還有四面啊。在抗戰假放完回來,就通知了接下來的三面。本來通知的三面是在兩天後,我還打算準備準備的,結果那天下午被突襲了。。當時我還在上課,電話打過來,說是百度的,然後就開始問我問題了。。技術問得不多,主要是工作時間什麼的。基本上都以為沒什麼問題了,朋友也都說,三面就是走走過場,二面過了一般就沒問題了。當時都在想象實習生活會是如何的了。

哎。。估計是因為沒有表現出足夠高的熱情吧,然後表現又不夠機智。最終,三面給了我一個 waiting的結果,備胎待遇啊。聽說結果後,鬱悶了兩天。這麼半個月,就在準備面試,面試,等待結果,幻想未來中度過,像是一場夢一樣啊!W君也說,說的是waiting,不是fail,還是有機會,還有,你才大二,還有機會之類。

最後

過了那兩天後,做的百度夢也醒了。寫下了新的學習計劃:

演算法 造輪子 機器學習/資料處理 數學建模美賽

這次面試,最大的收穫, 一是得到了肯定,知道自己選擇的學習方向沒錯,是一個值得深挖的方向。這真的太重要了,之前我什麼都學,哪裡都知道一點,卻什麼都不精。 二是,發現了自己演算法和工程方面的不足,可以在之後的一年中去補上來。

然後就開始刷《演算法導論》了。。兼職也找到了,也不愁沒錢花了。我還有一年的,完全自主的學習時間嘛。現在學的這些東西,是一年時間,一路磕磕碰碰走過來的,走了好多彎路才找到方向。而接下來的一年,我相信我可以做得更好!以前覺得BAT只能想想,FLAG太過遙遠,現在看來BAT努力努力就可以夠得著了,FLAG也不是那麼遙不可及嘛!