与 30 家公司过招,得到了这章面试心法
來源:開源中國 |編輯部的故事
作者介紹
筆者坐標(biāo)上海,做技術(shù)開發(fā),之前有幾個(gè)月的時(shí)間,基本上都是在面試中度過的。我求職的職位是Linux 服務(wù)器開發(fā),最傾向的職位是服務(wù)器開發(fā)主程或技術(shù)經(jīng)理。在那幾個(gè)月的求職過程中,我面試了 30+ 家公司,包括騰訊、百度、阿里的螞蟻金服和國際支付寶部門、餓了么、愛奇藝、360、攜程網(wǎng)、京東、華為、bilibili 與 UCLOUD 等。在這個(gè)過程中,思考了一些面試相關(guān)的問題,總結(jié)出這篇文章,希望給讀者一些啟發(fā)。
本文求職職位不是java崗位,文章僅供參考。
總結(jié)下來,技術(shù)面試大致有三種情形,下邊一一來講講。
一、考察數(shù)據(jù)結(jié)構(gòu)和算法為主
IT 公司一般都會考察數(shù)據(jù)結(jié)構(gòu)和算法能力,其中以百度與愛奇藝等為代表,面試官一般是先簡單地了解你之前的工作經(jīng)歷和項(xiàng)目經(jīng)驗(yàn),然后就直接出算法和數(shù)據(jù)結(jié)構(gòu)的題目,具體涉及到以下內(nèi)容:
快速排序。考察的地方包括算法步驟、平均算法復(fù)雜度、最好和最壞的情形,有人說校招要把算法寫出來,我這里是社招,所以一般描述一下算法過程即可。
二分查找法。一般面試官會要求面試者把算法寫出來,或者先結(jié)合一個(gè)具體場景來提問,需要你聯(lián)想到要使用該算法,比如求一個(gè)數(shù)的平方根,接著要你把它具體實(shí)現(xiàn)。
鏈表。常見的面試題有要求你寫出從一個(gè)鏈表中刪除一個(gè)節(jié)點(diǎn)的算法、單鏈表倒轉(zhuǎn)、兩個(gè)鏈表找相交的部分等,一般需要完全無誤地寫出來。
實(shí)現(xiàn)一些基礎(chǔ)的函數(shù)。例如 strcpy、memcpy、memmov 與 atoi 這些函數(shù),面試官會要求你用自己的理解和思路去實(shí)現(xiàn)。同樣,這些一般也需要完全無誤地寫出來,并且要保證高效,比如你的實(shí)現(xiàn)中有動(dòng)態(tài)分配堆內(nèi)存,那么這道題目就算答錯(cuò)。
鏈表和實(shí)現(xiàn)基礎(chǔ)函數(shù)的關(guān)鍵點(diǎn)一般在于考察你的代碼風(fēng)格、對邊界條件的處理,比如判斷指針是否為空,千萬不要故意不考慮這種情形,即使你知道也不行,只要你不寫,一般面試官就認(rèn)為你的思路不周詳,容錯(cuò)率低;再比如,單鏈表的倒轉(zhuǎn),最后的返回值肯定是倒轉(zhuǎn)后的鏈表頭結(jié)點(diǎn),這樣才能引用一個(gè)鏈表,這些都是面試官想考慮的重點(diǎn)。
哈希表。對哈希表的細(xì)節(jié)要求很高,比如哈希表的沖突檢測、哈希函數(shù)常用實(shí)現(xiàn)、算法復(fù)雜度;比如百度二面就讓我寫一個(gè)哈希表插入元素算法,元素類型是任意類型。
AVL 樹與 B 樹。考察概念與細(xì)節(jié),比如會問 MySQL 數(shù)據(jù)庫索引的實(shí)現(xiàn)原理,基本上就等于在問你 B 樹。
紅黑樹。這個(gè)基本上是必問的數(shù)據(jù)結(jié)構(gòu),包括紅黑樹的概念、平均算法復(fù)雜度、最好最壞情況下的算法復(fù)雜度、左右旋轉(zhuǎn)與顏色變換。面試官常見的套路有:你熟悉 C++ 的 stl 嗎?你說熟悉,ok,stl 的 map 用過吧?用過,ok,那 map 是如何實(shí)現(xiàn)的?紅黑樹,ok,那什么是紅黑樹?這樣提問,紅黑樹就開始了。Java 的也類似。
二、考察操作系統(tǒng)原理等基礎(chǔ)技術(shù)
這一種以餓了么、bilibli、喜馬拉雅、360 與攜程等為代表,主要兼顧算法與數(shù)據(jù)結(jié)構(gòu),但重點(diǎn)放在其它開發(fā)技術(shù),比如操作系統(tǒng)原理、網(wǎng)絡(luò)協(xié)議細(xì)節(jié)與具體的開發(fā)庫源碼等內(nèi)容。
基礎(chǔ)的 C++ 問題
考慮到閱讀群眾是java,略過。
網(wǎng)絡(luò)通信問題
考察對網(wǎng)絡(luò)協(xié)議的理解和掌握程序,比如 TCP/IP 協(xié)議棧的層級關(guān)系,三次握手和四次揮手的細(xì)節(jié),注意我說的是細(xì)節(jié),比如 CLOSEWAIT 和 TIMEWAIT 狀態(tài)。bilibili 問了這樣一個(gè)問題,你可以感受一下:
A 與 B 建立了正常連接后,從未相互發(fā)過數(shù)據(jù),這個(gè)時(shí)候 B 突然機(jī)器重啟,問 A 此時(shí)處于 TCP 什么狀態(tài)?如何消除服務(wù)器程序中的這個(gè)狀態(tài)?
再羅列其它一些常見問題:
-
萬得問過流量擁塞和控制機(jī)制
-
騰訊問過 TCP 和 IP 包頭常見字段有哪些
-
東方財(cái)富網(wǎng)問了阻塞和非阻塞 socket 在 send、recv 函數(shù)上的行為表現(xiàn)
-
異步 connect 函數(shù)的寫法
-
select 函數(shù)的用法
-
epoll 與 select 的區(qū)別,基本上只要問到 epoll,必問 epoll 的水平模式和邊緣模式的區(qū)別
-
一些 socket 選項(xiàng)的用法,nagle、keepalive、linger 等選項(xiàng)的區(qū)別
-
TCP 與 UDP 的區(qū)別和適用場景
-
通信協(xié)議如何設(shè)計(jì)避免粘包
-
HTTP 協(xié)議的 get 和 post 方法的區(qū)別,問得比較深的會讓你畫出 HTTP 協(xié)議的格式
-
可能會問到 Windows 完成端口模型(IOCP)
總之,網(wǎng)絡(luò)通信問題能搞得多清楚就搞多清楚,最起碼把 TCP 應(yīng)用層各種 socket API 的用法細(xì)節(jié)搞清楚。
操作系統(tǒng)原理
上海黃金交易所和喜馬拉雅聽書都問了 Linux 下 elf 文件的節(jié)結(jié)構(gòu),映射到進(jìn)程地址空間后,分別對應(yīng)哪些段。相關(guān)的問題還有全局變量、靜態(tài)存儲在進(jìn)程地址空間的哪里。餓了么二面問了操作系統(tǒng)的保護(hù)模式實(shí)模式、中斷向量表、Linux 下的 CAS。Linux 系統(tǒng)下可能還會問什么是 daemon 進(jìn)程,如何產(chǎn)生 daemo 進(jìn)程,什么是僵尸進(jìn)程,僵尸進(jìn)程如何產(chǎn)生和消除。
堆和棧的區(qū)別,棧的結(jié)構(gòu)、棧的細(xì)節(jié)一點(diǎn)要搞得特別清楚,因?yàn)橐恍夹g(shù)要求比較高的公司會問得比較深入,例如京東的一面是讓我先寫一個(gè)從 1 加到 100 的求和函數(shù),然后讓我寫出這個(gè)函數(shù)的匯編代碼,Java 開發(fā)的同學(xué)可能會讓你試著去寫一點(diǎn) JVM 的指令。如果你對棧的結(jié)構(gòu),如函數(shù)參數(shù)入棧順序、函數(shù)局部變量在棧中的布局、棧幀指針和棧頂指針位置不熟悉的話,這題目就無法答對了。
棧的問題,可能會以常見的函數(shù)調(diào)用方式來提問,常見的有 cdecl、stdcall、thiscall、fastcall 的區(qū)別,比如像 printf 這樣具有不定參數(shù)的函數(shù)為什么不能使用 __stdcall。
此外還有進(jìn)程和線程的聯(lián)系與區(qū)別,問得最多的就是線程之間的一些同步技術(shù),如互斥體、信號量、條件變量等,Windows 上還有事件、臨界區(qū)等,這類問題還可以引申為什么是死鎖、如何避免死鎖。這些東西你必須熟悉到具體的 API 函數(shù)使用的層面上來。這是實(shí)際開發(fā)工作中編碼最常用的東西,如果你連這個(gè)都不能熟練使用,那么你多半不是一個(gè)合格的開發(fā)者。
進(jìn)程之間通信的常用技術(shù)也需要掌握,Linux 常用的通信方式有共享內(nèi)存、匿名和具名管道、socket、消息隊(duì)列等等,管道和 socket 是兩個(gè)必須深入掌握的考察點(diǎn)。
使用過的開源技術(shù)
考察使用過的開源技術(shù),比如 Redis 與 MySQL 等項(xiàng)目。開源技術(shù)的使用一般不做硬性要求,但是這里必須強(qiáng)調(diào)一下 Redis,熟練使用 Redis 甚至研究過 Redis 源碼,現(xiàn)在一般是對做后臺開發(fā)的技術(shù)硬性要求。
基于 Redis 的面試題既可以聊算法與數(shù)據(jù)結(jié)構(gòu),也可以聊網(wǎng)絡(luò)框架等東西。我面試的公司中基本上百分之九十以上都問到了 Redis,只是深淺不一而已,比如喜馬拉雅問了 Redis 的數(shù)據(jù)存儲結(jié)構(gòu)、rehash,bilibili 問了 Redis 的事務(wù)與集群。
三、考察項(xiàng)目經(jīng)驗(yàn)
只問一些做過的業(yè)務(wù)或者項(xiàng)目經(jīng)驗(yàn),這類公司他們招人其實(shí)對技術(shù)要求不高,除非是資深及主管級開發(fā)。只要你過往的項(xiàng)目與當(dāng)前應(yīng)聘職位匹配,可以過來直接上手干活就可以了,當(dāng)然薪資也就不會給很多。比如游戲公司會關(guān)心你是否有某某類型的游戲開發(fā)經(jīng)驗(yàn)、股票類公司會關(guān)心你是否有過證券或者交易系統(tǒng)的開發(fā)經(jīng)驗(yàn)等。
業(yè)務(wù)開發(fā)哪里都能找到,真正重視技術(shù)的公司,應(yīng)該是廣大做技術(shù)尤其是初中級開發(fā)的朋友更為關(guān)注的。
不靠譜型公司
面試過程中,其實(shí)還會發(fā)現(xiàn)一些不靠譜的公司,我遇到的大致有四類:
裝 X 忽悠型公司
面試過程冗長繁瑣,我面試的有一家公司就是這個(gè)樣子,先是一輪長長的電話面試,然后是五輪技術(shù)面試,前三輪是刷 leetcode 上的原題,然后后幾輪面試官從基本的操作系統(tǒng)中斷、GDT、LDT、分表分頁機(jī)制問到上層高并發(fā)海量數(shù)據(jù)的架構(gòu)。從外太空聊到內(nèi)子宮,最后問具體職位做什么時(shí),要么遮遮掩掩要么原型畢露,或者討論薪資時(shí),要么面露難色要么各種畫餅,但是實(shí)際就給不了多少薪水的。
佛性公司
全程面試官面帶微笑,問的問題你回答之后面試官也表示很贊同,但最后你就是沒通過。我猜測要么公司不是很缺人,想觀望一下是否有合適的人才,要么招聘信息上開的薪資給不到。
老奶奶裹腳布型公司
其特點(diǎn)是面試周期長,往往第一輪面試通知你過了,讓你回去等上十天半個(gè)月后,給你打電話通知你來第二輪面試。面試要求穿正裝,帶好各種證件,面試前必須先查驗(yàn)?zāi)愕纳矸葑C、學(xué)歷證學(xué)位證,甚至是四六級考試證等等,麻煩至極。即使你一路過關(guān)斬將過了終面,薪資也給不了多少。大家都是要養(yǎng)家糊口的,都是忙著找工作,誰有時(shí)間和你耗上十天半個(gè)月呢?
不尊重人的公司
我這里說的不尊重人,不是指的是面試過程中對你人身攻擊,而是不根據(jù)你的工作年限和經(jīng)驗(yàn)隨意安排面試官。舉個(gè)例子,比如你工作十年,你去面試一個(gè)技術(shù)總監(jiān)的職位,對方公司安排一個(gè)工作不滿兩年的部門職員作為面試官,這個(gè)面試官如果是走過場可以理解,但是非要和你糾結(jié)一個(gè)如二進(jìn)制位移、現(xiàn)代編譯器要不要在子類析構(gòu)函數(shù)前加 virtual 關(guān)鍵字這些技術(shù)細(xì)節(jié)就沒必要了。還有一類就是故意問一些刁鉆的問題,或者全場都心不在焉、玩手機(jī)、漫不經(jīng)心的面試官,比如問你 TCP 協(xié)議頭有多少個(gè)字段,每個(gè)字段是干啥的。遇到這一類面試官我的經(jīng)驗(yàn)就是要么婉拒,要么直接懟回去。
技術(shù)之外的關(guān)注點(diǎn)
除了技術(shù)上的東西,面試中還有其它方面需要思考,這些東西有時(shí)候可能比你直接面試通過一家公司還重要,因?yàn)槠渲杏幸恍┦顷P(guān)系到你整個(gè)職業(yè)發(fā)展的:
第一,如果你的工作年限不長,尤其是渴望在技術(shù)方面有一定的造詣,那么你首先考慮的應(yīng)該是新的單位是否有利于你技術(shù)上的成長,而不是把眼光放在三五千的工資差距上。另一方面,如果想轉(zhuǎn)行的同學(xué),比如從客戶端轉(zhuǎn)服務(wù)器,從 C++ 轉(zhuǎn) Java,那么不要因?yàn)樾劫Y突然變低而拒絕這種陣痛,要把目光放長遠(yuǎn)一點(diǎn)。
第二,一些公司雖然招聘信息上寫了最多能給到多少多少,但實(shí)際上即使你全程面試下來都很完美,可能最終也會因?yàn)樵谡衅感畔⒎秶鷥?nèi)提出的薪資要求“太高”而不被錄取。
第三,一些根本不想去的公司,如果你有時(shí)間的話,去面試積累下經(jīng)驗(yàn)也不是什么壞事。
第四,面試的時(shí)候,同時(shí)也是你在考察面試官,一般面試官問你的問題,你能回答出來的在百分之八十左右,這樣的公司可以考慮去入職,你進(jìn)去的話可能才會在技術(shù)上有一些提升。如果你全場秒殺面試官的題目,那么一旦你入職,你的技術(shù)天花板可能也就在那里了。
第五,面試的時(shí)候聊清楚你將來的職位內(nèi)容,避免進(jìn)去客串一些不想做的工作。
第六,遇到不會的面試題,不要直接就否定自己,可以嘗試著去和面試官溝通一下,或者要求給點(diǎn)提示或者思路。
第七,不要輕視筆試中的一些數(shù)學(xué)智力題目,認(rèn)真作答,試問算法不也是數(shù)學(xué)智力題嗎?
第八,自信一點(diǎn),每個(gè)人的經(jīng)歷和經(jīng)驗(yàn)都是獨(dú)一無二的,面試的時(shí)候,一些特定領(lǐng)域的問題,回答不出來也不要太在意。
上邊這些就是我經(jīng)過與 30+ 家公司過招,引發(fā)的關(guān)于面試的思考,希望對閱讀的朋友有所幫助。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的与 30 家公司过招,得到了这章面试心法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zookeeper 生产实践的一些经验分
- 下一篇: 互联网项目中MySQL应该选什么事务隔离