技術面試更注重項目經驗仍是操做系統、數據結構等基礎知識?

說下個人面試經驗吧,都是親身經歷,不喜勿噴:java

我2017年12月份從上一家公司離職,一直到2018年3月份,基本上都在面試中度過來的。mysql

先交代下背景:座標上海,作技術開發,我本人求職的職位是linux服務器開發,最傾向的職位是服務器開發主程或技術經理。我本人也是上幾家公司的面試官,由於接下來幾年面臨着成家養小孩,技術上也到了瓶頸期,雖然拿了很多offer,可是想綜合比對一下再作決定。因而投遞了不少家公司。我前後去了以下一些公司:騰訊、百度、阿里的螞蟻金服和國際支付寶部門(兩個部門,兩次面試)、餓了麼、愛奇藝、360、攜程網、京東、華爲、bilibili、上海黃金交易所、東方財富網、zilliz、掌門集團(作無線萬能鑰匙的那一家)、喜馬拉雅聽書、UCLOUD、峯果網絡、華爾街見聞、萬得財經、匯正財經、逗屋網絡、朝陽永續,還有數家小規模的公司或創業公司吧。linux

爲了不引發沒必要要的糾紛,下面我就不說具體的公司名稱了。技術面試的細節我儘可能寫的詳細一點,但願對你們有參考價值,技術面試大體有三種情形:面試

1、以百度、愛奇藝等爲表明的

以數據結構和算法爲主。首先是簡單地瞭解下你以前的工做經歷和項目經驗,而後就是算法和數據結構題目,具體涉及到如下內容:redis

1. 快速排序(包括算法步驟、平均算法複雜度、最好和最壞的情形),有人說校招要把算法寫出來,我是社招,因此描述一下算法過程便可。算法

2. 寫二分查找算法,這個儘管是社招,可是通常也不難,因此要求面試者寫出來。可是不少公司,好比不會直接讓你寫算法,而是結合一個具體場景來提問,而後讓你本身聯想到二分查找,好比求一個數的平方根。sql

3. 鏈表,常見的面試題有寫一個鏈表中刪除一個節點的算法、單鏈表倒轉、兩個鏈表找相交的部分,這個通常必須得徹底無誤的狀況下寫出來;數據庫

4. 本身實現一些基礎的函數,例如strcpy / memcpy / memmov / atoi,一樣的道理,這些必須徹底無誤且高效地寫出來,好比你的實現中有動態分配堆內存,那麼這道題目就算答錯。windows

第3點和第4點的關鍵點通常在於考察你的代碼風格、對邊界條件的處理,好比判斷指針是否爲空,千萬不要故意不考慮這種情形,即便你知道也不行,只要你不寫,通常面試官就認爲你的思路不周詳,容錯率低;再好比,單鏈表的倒轉,最後的返回值確定是倒轉後的鏈表頭結點,這樣才能引用一個鏈表,這些都是面試官想考慮的重點。服務器

5. 哈希表,對哈希表的細節要求很高,好比哈希表的衝突檢測、哈希函數經常使用實現、算法複雜度;好比百度二面就讓我寫一個哈希表插入元素算法,元素類型是任意類型。

6. AVL樹和B樹的概念、細節,好比會問mysql數據庫的索引的實現原理,基本上就等於問你B樹了。

7. 紅黑樹,這個基本上必問的一個數據結構,包括紅黑樹的概念、平均算法複雜度、最好最壞狀況下的算法複雜度、左右旋轉、顏色變換。面試官常見的算法套路有:你熟悉C++的stl嗎?你說熟悉,ok,stl的map用過吧?用過,ok,那map是如何實現的?紅黑樹,ok,那什麼是紅黑樹?這樣提問,紅黑樹就開始了。Java的也相似。

2、以餓了麼、bilibli、喜馬拉雅、360、攜程等爲表明的

兼顧算法數據結構和其餘開發技術,算法和數據結構部分上文提過了,下面提一下其餘技術,大體包括如下東西:

1. 以C++語言爲例(不是C++開發的朋友能夠跳過這一點),第一類是基礎的C++問題,常見的有C++的繼承體系中virtual關鍵字的做用(如繼承關係中析構函數爲何要申明成virtual函數,若是不申明爲virtual會有什麼影響)、

在涉及到父子類時構造與析構函數的執行順序、多重繼承時類的成員列表在地址空間的排列;static關鍵字的做用,static_cast / reinterpret_cast / dynamic_cast等幾個轉換符的使用場景;問的最多的就是虛表的佈局,尤爲是菱形繼承(B和C繼承A,D繼承B和C)時每一個對象的空間結構分佈,好比問D有幾份虛表,D中B和C的成員空間排布。

另外,若是你應聘的職位使用C++開發,不少公司會問你一些C++11的東西(或者問boost庫,基本上都同樣),這個你用過就用過,沒有用過就說沒用過不要裝X,常見的C++11須要掌握的一些技術庫我也列舉一下吧(JAVA及其餘語言的讀者能夠忽略):

auto關鍵字、for-each循環、右值及移動構造函數 + std::forward + std::move + stl容器新增的emplace_back()方法、std::thread庫、std::chrono庫、智能指針系列(std::shared_ptr/std::unique_ptr/std::weak_ptr)(智能

指針的實現原理必定要知道,最好是本身實現過)、線程庫std::thread+線程同步技術庫std::mutex/std::condition_variable/std::lock_guard等、lamda表達式(JAVA中如今也經常考察lamda表達式的做用)、std::bind/std::function庫、

其餘的就是一些關鍵字的用法(override、final、delete),還有就是一些細節如能夠像JAVA同樣在類成員變量定義處給出初始化值。

2. 網絡通訊問題,好比協議棧的層級關係,三次握手和四次揮手的【細節】,注意我說的是細節,好比CLOSE_WAIT和TIME_WAIT狀態(bilibili問了這樣一個問題,你能夠感覺一下:A與B創建了正常鏈接後,從未相互發過數據,這個時候B忽然機器重啓,問A此時的tcp狀態處於什麼狀態?如何消除服務器程序中的這個狀態?

萬得問過流量擁塞和控制機制、騰訊問過tcp和ip包頭常見有哪些字段),東方財富網問了阻塞和非阻塞socket在send、recv函數上的行爲表現,異步connect函數的寫法,select函數的用法,epoll與select的區別,

基本上只要問到epoll,必問epoll的水平模式和邊緣模式的區別;一些socket選項的用法,nagle / keepalive / linger等選項的區別;tcp / udp的區別和適用場景;

通訊協議如何設計避免粘包;http協議的get和post方法的區別(問的比較深的會讓你畫出http協議的格式,參照這篇文章中關於http協議格式的講解:blog.csdn.net/analogous_l…

windows用戶可能會問到完成端口模型(IOCP),網絡通訊方面的問題,我專門開了一個知乎live系統地總結

了一下,有興趣的朋友能夠看這裏:www.zhihu.com/lives/92211… 和 這裏:www.zhihu.com/lives/90211…

總之,網絡通訊問題能搞的多清楚就能夠搞的多清楚,最起碼把tcp應用層的各類socket API的用法細節搞清楚。

3. 操做系統原理性的東西

好比上海黃金交易所、喜馬拉雅聽書問了linux下elf文件的節結構,映射到進程地址空間後,分別對應哪些段,相關的問題還有,全局變量、靜態存儲在進程地址空間的哪裏;堆和棧的區別,棧的結構,棧的細節一點要搞的特別清楚,由於一些對技術要求比較高的公司會問的比較深刻,例如京東的一面是讓我先寫一個從1加到100的求和函數,而後讓我寫出這個函數的彙編代碼(JAVA開發的同窗可能會讓你試着去寫一點JVM的指令),若是你對棧的結構(如函數參數入棧順序、函數局部變量在棧中的佈局、棧幀指針和棧頂指針位置)不熟悉的話,這題目就沒法答對了;棧的問題,可能會以常見的函數調用方式來提問,常見的函數調用有以下__cdecl/__stdcall/__thiscall/__fastcall的區別,好比像printf這樣具備不定參數的函數爲何不能使用__stdcall;

餓了麼二面問了操做系統的保護模式實模式,中斷向量表,linux下的CAS。

還有就是進程和線程的聯繫與區別,問的最多的就是線程之間的一些同步技術,如互斥體、信號量、條件變量等(Windows上還有事件、臨界區等),這些東西你必須熟悉到具體的API函數使用的層面上來,從另一個角度來講,這是我們實際工做中編碼最經常使用的東西,若是你連這個都不能熟練使用,那麼你確定不是一個合格的開發者;這類問題還能夠引伸爲何是死鎖、如何避免死鎖;進程之間通訊的經常使用技術也須要掌握,經常使用的通訊方式(linux下)有共享內存、匿名和具名管道、socket、消息隊列等等,管道和socket是兩個必須深刻掌握的考察點(與上面網絡通訊有點重複);

linux系統下可能還會問什麼是daemon進程,如何產生daemo進程,什麼是殭屍進程,殭屍進程如何產生和消除(bilibili問過)。

4. 第四類就是一個使用過的開源技術,好比表明nosql技術的的redis;網絡庫libevent等等;數據庫如mysql的一些東西。這個通常不作硬性要求,可是這裏必須強調的就是redis,熟練使用redis甚至研究過redis源碼,如今通常是對作後臺開發的技術硬性要求或者說不可缺乏的部分,

基於redis的面試題既能夠聊算法與數據結構,也能夠聊網絡框架等等一類東西。我面試的公司中基本上百分之九十以上都問到了redis,只是深淺不一而已,好比喜馬拉雅問了redis的數據存儲結構、rehash;bilibili問了redis的事務與集羣。

關於JAVA的,阿里的螞蟻金服問了以下一些問題(我儘可能列舉下我能想起來的):java.lang.Object有哪些經常使用的方法,改寫一個類的toString方法須要注意哪些問題,hashCode方法如使用,==與equals的區別,線程建立的幾種方法,各自的使用場景,hashmap、hashtable的數據結構實現,java線程同步有哪些方法、各自的優缺點,jvm的結構,java代碼優化等等。

3、只問一些作過的業務或者項目經驗

這類公司他們招人其實對技術要求不高(資深及主管級開發除外),只要你過往的項目與當前應聘職位匹配,能夠過來直接上手幹活就能夠了,

固然薪資也就不會給不少。好比遊戲公司會關心你是否有某某類型的遊戲開發經驗、股票類公司會關心你是否有過證券或者交易系統的開發經驗等。個人經驗就是這類公司,能去的話能夠去,不能去的話就當積累面試經驗。

業務開發哪裏都能找到,真正的重視技術的公司,應該是廣大作技術尤爲是初中級開發的朋友應該值得關心的事情。

4、不靠譜型公司

我遇到的大體有四類:

第一類:裝X忽悠型

面試過程冗長繁瑣,好比號稱每一百份簡歷中才發一個面試邀請,號稱每個面試者發一個offer,號稱硅谷風格,我面試的有一家公司就是這個樣子,先是一輪長長的電話面試,而後是五輪技術面試,前三輪是刷leetcode上原題,而後後幾輪面試,面試官從基本的操做系統的

中斷、GDT、LDT、分表分頁機制問到上層高併發海量數據的架構,說的很差聽,真是從外太空聊到內子宮,最後問具體職位作什麼時,要麼遮遮掩掩要麼原形畢露;或者討論薪資時,要麼面露難色要麼各類畫餅,可是實際就給不了多少薪水的。

第二類:佛性公司

面試下來,全程面試官面帶微笑,問你的問題你回答的面試官也很贊同,但最後你就沒經過,我猜想要麼公司不是很缺人,想觀望一下是否有合適的人才;要麼招聘信息上開的薪資給不到。

第三類:老奶奶裹腳布型公司

其特色是面試週期長,每每第一輪面試通知你過了,讓你回去等上十天半個月後,給你打電話通知你來第二輪面試,面試要求穿正裝,帶好各類證件,面試前必須先查驗你的身份證、學歷證學位證,甚至是四六級考試證等等,麻煩至極,即便你一路過關斬將過了終面,薪資也給不了多少。

你們都是要養家餬口的,都是忙着找工做,誰有時間和你耗上十天半個月呢?

第四類:不尊重人類型公司

我這裏說的不尊重人,不是指的是面試過程當中對你人身攻擊,而是不根據你的工做年限和經驗隨意安排面試官,舉個例子,好比你工做十年,你去面試一個技術總監的職位,對方公司安排一個工做不滿兩年的部門職員做爲面試官,這個面試官若是是走過場能夠理解,可是非要和你糾結一個如二進制位移、現代編譯器要不要在子類析構函數前加virtual關鍵字這些技術細節就不必了。還有一類就是故意問一些刁鑽的問題,或者全場都心不在焉、玩手機、漫不經心的面試官,好比問你tcp協議頭有多少個字段,每一個字段是幹啥的。遇到這一類面試官個人經驗就是要麼婉拒,要麼直接懟回去。

下面再說下面試中須要注意的一些細節:

第一,若是你的工做年限不長,尤爲是渴望在技術方面有必定的造詣,那麼你首先考慮的應該是新的單位是否能有利於你技術上的成長,而不是兩份一樣的工做,薪資上的上下相差的三五千、五六千。若是

想轉行的同窗(好比從客戶端轉服務器,從C++轉JAVA),不要由於薪資忽然變低而拒絕這種陣痛,要把目光放長遠一點。

第二,一些公司雖然招聘信息上寫了最多能給到多少多少,但實際即便你全程面試下來都很完美,可能最終你也會由於薪資要求達不到不被錄取。

第三,一些根本不想去的公司,若是你有時間的話,去面試積累下經驗也不是什麼壞事。

第四,面試的時候,同時也是你在考察面試官,通常面試官問你的問題,你能回答出來的在百分之八十左右,這樣的公司能夠考慮去入職,你進去的話可能纔會在技術上有一些提高。若是你全場秒殺面試官的題目,

你的技術天花板可能也在那裏。

第五,面試的時候聊清楚你未來的職位內容,避免進去客串一些不想作的工做。

第六,遇到不會的面試題,不要直接就否認本身,能夠嘗試着去和麪試官溝通一下,或者要求給點提示或者思路。

第七,不要輕視筆試中的一些數學智力題目,認真做答,試問算法不也是數學智力題嗎?

第八,自信一點,每一個人的經歷和經驗都是獨一無二的,面試的時候,一些特定領域的問題,回答不出來也不要太在乎。

但願對閱讀的朋友有所幫助。由於我的經驗能力有限,所說的也可能只是一家之言,說的不穩當的地方還請溫和地提出建議。

因時間有限,不少地方不便詳細展開,若是您對於面試有什麼細節的地方想和我交流,歡迎關注個人微信公衆號『easyserverdev』。

相關文章
相關標籤/搜索