筆者座標上海,作技術開發,以前有幾個月的時間,基本上都是在面試中度過的。我求職的職位是 Linux 服務器開發,最傾向的職位是服務器開發主程或技術經理。在那幾個月的求職過程當中,我面試了 30+ 家公司,包括騰訊、百度、阿里的螞蟻金服和國際支付寶部門、餓了麼、愛奇藝、360、攜程網、京東、華爲、bilibili 與 UCLOUD 等。在這個過程當中,思考了一些面試相關的問題,總結出這篇文章,但願給讀者一些啓發。面試
總結下來,技術面試大體有三種情形,下邊一一來說講。算法
IT 公司通常都會考察數據結構和算法能力,其中以百度與愛奇藝等爲表明,面試官通常是先簡單地瞭解你以前的工做經歷和項目經驗,而後就直接出算法和數據結構的題目,具體涉及到如下內容:數據庫
鏈表和實現基礎函數的關鍵點通常在於考察你的代碼風格、對邊界條件的處理,好比判斷指針是否爲空,千萬不要故意不考慮這種情形,即便你知道也不行,只要你不寫,通常面試官就認爲你的思路不周詳,容錯率低;再好比,單鏈表的倒轉,最後的返回值確定是倒轉後的鏈表頭結點,這樣才能引用一個鏈表,這些都是面試官想考慮的重點。服務器
這一種以餓了麼、bilibli、喜馬拉雅、360 與攜程等爲表明,主要兼顧算法與數據結構,但重點放在其它開發技術,好比操做系統原理、網絡協議細節與具體的開發庫源碼等內容。網絡
基礎的 C++ 問題數據結構
以 C++ 語言爲例,這一類常見的問題有:架構
另外,若是你應聘的職位使用 C++ 開發,不少公司會問你一些 C++ 11 的東西,或者問 boost 庫,基本上都同樣。這個你用過就用過,沒有用過就說沒用過不要裝 X,常見的 C++ 11 須要掌握的一些技術庫我也列舉一下吧:併發
網絡通訊問題框架
考察對網絡協議的理解和掌握程序,好比 TCP/IP 協議棧的層級關係,三次握手和四次揮手的細節,注意我說的是細節,好比 CLOSE_WAIT 和 TIME_WAIT 狀態。bilibili 問了這樣一個問題,你能夠感覺一下:異步
A 與 B 創建了正常鏈接後,從未相互發過數據,這個時候 B 忽然機器重啓,問 A 此時處於 TCP 什麼狀態?如何消除服務器程序中的這個狀態?
再羅列其它一些常見問題:
總之,網絡通訊問題能搞得多清楚就搞多清楚,最起碼把 TCP 應用層各類 socket API 的用法細節搞清楚。
操做系統原理
上海黃金交易所和喜馬拉雅聽書都問了 Linux 下 elf 文件的節結構,映射到進程地址空間後,分別對應哪些段。相關的問題還有全局變量、靜態存儲在進程地址空間的哪裏。餓了麼二面問了操做系統的保護模式實模式、中斷向量表、Linux 下的 CAS。Linux 系統下可能還會問什麼是 daemon 進程,如何產生 daemo 進程,什麼是殭屍進程,殭屍進程如何產生和消除。
堆和棧的區別,棧的結構、棧的細節一點要搞得特別清楚,由於一些對技術要求比較高的公司會問得比較深刻,例如京東的一面是讓我先寫一個從 1 加到 100 的求和函數,而後讓我寫出這個函數的彙編代碼,Java 開發的同窗可能會讓你試着去寫一點 JVM 的指令。若是你對棧的結構,如函數參數入棧順序、函數局部變量在棧中的佈局、棧幀指針和棧頂指針位置不熟悉的話,這題目就沒法答對了。
棧的問題,可能會以常見的函數調用方式來提問,常見的有 __cdecl、__stdcall、__thiscall、__fastcall 的區別,好比像 printf 這樣具備不定參數的函數爲何不能使用 __stdcall。
此外還有進程和線程的聯繫與區別,問得最多的就是線程之間的一些同步技術,如互斥體、信號量、條件變量等,Windows 上還有事件、臨界區等,這類問題還能夠引伸爲何是死鎖、如何避免死鎖。這些東西你必須熟悉到具體的 API 函數使用的層面上來。這是實際開發工做中編碼最經常使用的東西,若是你連這個都不能熟練使用,那麼你多半不是一個合格的開發者。
進程之間通訊的經常使用技術也須要掌握,Linux 經常使用的通訊方式有共享內存、匿名和具名管道、socket、消息隊列等等,管道和 socket 是兩個必須深刻掌握的考察點。
使用過的開源技術
考察使用過的開源技術,好比 Redis 與 MySQL 等項目。開源技術的使用通常不作硬性要求,可是這裏必須強調一下 Redis,熟練使用 Redis 甚至研究過 Redis 源碼,如今通常是對作後臺開發的技術硬性要求。
基於 Redis 的面試題既能夠聊算法與數據結構,也能夠聊網絡框架等東西。我面試的公司中基本上百分之九十以上都問到了 Redis,只是深淺不一而已,好比喜馬拉雅問了 Redis 的數據存儲結構、rehash,bilibili 問了 Redis 的事務與集羣。
只問一些作過的業務或者項目經驗,這類公司他們招人其實對技術要求不高,除非是資深及主管級開發。只要你過往的項目與當前應聘職位匹配,能夠過來直接上手幹活就能夠了,固然薪資也就不會給不少。好比遊戲公司會關心你是否有某某類型的遊戲開發經驗、股票類公司會關心你是否有過證券或者交易系統的開發經驗等。
業務開發哪裏都能找到,真正重視技術的公司,應該是廣大作技術尤爲是初中級開發的朋友更爲關注的。
面試過程當中,其實還會發現一些不靠譜的公司,我遇到的大體有四類:
裝 X 忽悠型公司
面試過程冗長繁瑣,我面試的有一家公司就是這個樣子,先是一輪長長的電話面試,而後是五輪技術面試,前三輪是刷 leetcode 上的原題,而後後幾輪面試官從基本的操做系統中斷、GDT、LDT、分表分頁機制問到上層高併發海量數據的架構。從外太空聊到內子宮,最後問具體職位作什麼時,要麼遮遮掩掩要麼原型畢露,或者討論薪資時,要麼面露難色要麼各類畫餅,可是實際就給不了多少薪水的。
佛性公司
全程面試官面帶微笑,問的問題你回答以後面試官也表示很贊同,但最後你就是沒經過。我猜想要麼公司不是很缺人,想觀望一下是否有合適的人才,要麼招聘信息上開的薪資給不到。
老奶奶裹腳布型公司
其特色是面試週期長,每每第一輪面試通知你過了,讓你回去等上十天半個月後,給你打電話通知你來第二輪面試。面試要求穿正裝,帶好各類證件,面試前必須先查驗你的身份證、學歷證學位證,甚至是四六級考試證等等,麻煩至極。即便你一路過關斬將過了終面,薪資也給不了多少。你們都是要養家餬口的,都是忙着找工做,誰有時間和你耗上十天半個月呢?
不尊重人的公司
我這裏說的不尊重人,不是指的是面試過程當中對你人身攻擊,而是不根據你的工做年限和經驗隨意安排面試官。舉個例子,好比你工做十年,你去面試一個技術總監的職位,對方公司安排一個工做不滿兩年的部門職員做爲面試官,這個面試官若是是走過場能夠理解,可是非要和你糾結一個如二進制位移、現代編譯器要不要在子類析構函數前加 virtual 關鍵字這些技術細節就不必了。還有一類就是故意問一些刁鑽的問題,或者全場都心不在焉、玩手機、漫不經心的面試官,好比問你 TCP 協議頭有多少個字段,每一個字段是幹啥的。遇到這一類面試官個人經驗就是要麼婉拒,要麼直接懟回去。
除了技術上的東西,面試中還有其它方面須要思考,這些東西有時候可能比你直接面試經過一家公司還重要,由於其中有一些是關係到你整個職業發展的:
第一,若是你的工做年限不長,尤爲是渴望在技術方面有必定的造詣,那麼你首先考慮的應該是新的單位是否有利於你技術上的成長,而不是把眼光放在三五千的工資差距上。另外一方面,若是想轉行的同窗,好比從客戶端轉服務器,從 C++ 轉 Java,那麼不要由於薪資忽然變低而拒絕這種陣痛,要把目光放長遠一點。
第二,一些公司雖然招聘信息上寫了最多能給到多少多少,但實際上即便你全程面試下來都很完美,可能最終也會由於在招聘信息範圍內提出的薪資要求「過高」而不被錄取。
第三,一些根本不想去的公司,若是你有時間的話,去面試積累下經驗也不是什麼壞事。
第四,面試的時候,同時也是你在考察面試官,通常面試官問你的問題,你能回答出來的在百分之八十左右,這樣的公司能夠考慮去入職,你進去的話可能纔會在技術上有一些提高。若是你全場秒殺面試官的題目,那麼一旦你入職,你的技術天花板可能也就在那裏了。
第五,面試的時候聊清楚你未來的職位內容,避免進去客串一些不想作的工做。
第六,遇到不會的面試題,不要直接就否認本身,能夠嘗試着去和麪試官溝通一下,或者要求給點提示或者思路。
第七,不要輕視筆試中的一些數學智力題目,認真做答,試問算法不也是數學智力題嗎?
第八,自信一點,每一個人的經歷和經驗都是獨一無二的,面試的時候,一些特定領域的問題,回答不出來也不要太在乎。
上邊這些就是我通過與 30+ 家公司過招,引起的關於面試的思考,但願對閱讀的朋友有所幫助。
由於我的經驗能力有限,並且限於篇幅,不少地方也不便詳細展開,讀者若是有什麼想法或者指教,歡迎交流探討。
張小方,資深開發工程師,目前在某大型旅遊互聯網公司任技術專家,專一於高性能服務器的研究與開發。
本文系做者投稿文章,歡迎投稿。投稿要求見:
https://my.oschina.net/editorial-story/blog/1814725
可參考已發佈文章: