少點代碼,多點頭發
上篇給大家寫了 應屆生工作一年不到,從被裁到上岸,我們該如何自渡?如何保證自己的核心競爭力? 反響很好。但是吧,我犯了一個錯誤,敖丙提醒我的。
太難了,失業這幾天沒發原創,連個原創都忘記標了,真是傻🐶。 所以我今天又放了一次次條,這次可標了原創。沒看的趕緊看看,穩穩的有幫助。
大大小小也面試了快十家公司了,有些非常重要的面試題和面試經驗必須給大家整出來。
首先聲明,我投的崗位是搜索方向、后端開發(偏底層、高性能)、java后台(這個崗位是阿里面試官看我簡歷讓我試試的)。
面試的問題主要分為幾塊去說,C&C++&STL、數據結構與算法(含編程)、操作系統、多線程問題、場景題目、項目。
項目在社招面試中占據的分數很高,所以面試講項目的時間會多。項目細節就不給大家透漏了,會把項目中的知識點穿插到對應的知識模塊。
項目這塊
這一塊一定是面試最重要的地方。在整個社招面試的時候,自我介紹從來都是從項目說起,不會像校招那樣會介紹來自哪里,叫什么名字,會什么技術。
每次自我介紹都是這樣說的:
-
做了什么項目 -
如果項目是獨立設計和開發,要描述為什么做這個項目,設計思路 -
我在項目中扮演什么角色(如果是團隊項目,一定描述清楚自己做了什么功能,起到什么作用) -
項目包括哪幾個模塊,每個模塊實現什么功能 -
項目用了哪些技術,為什么選擇用這些 -
項目中那些點是非常有意義的,為什么
基本就是這些,在講項目的時候注意要埋伏一些重要的伏筆,比如項目亮點,直說這些亮點非常好,至於原因可以鋪墊下,引起面試官的好奇。
阿里面試官給過我一些建議,非常中肯的,也給大家說說。
不得不說大佬的建議非常有力量的。看完大佬給的建議趕緊重新梳理了一遍項目、看看項目有哪些亮點技術和設計、那些難點、產生什么價值。
這是說項目的方式和准備項目方面。面試過程中,面試官問項目是真的問到你很多都是想不到的。
你可能覺得是個很簡單的問題,平時不會在意那種,但面試官深深的挖,總感覺下面有礦一樣。
可能面試官總是能通過這種細節撂倒你,你也覺得就是你的問題,沒掌握好。
舉個例子,高效的網絡IO底層大多都是epoll實現的。
面試官先是問我epoll的原理,底層用什么實現?為什么高效?紅黑樹結構中epoll結構體怎么樣的?回調使用什么觸發的?epoll的邊緣觸發和水平觸發?操作系統怎么管理信號的?為什么這里用紅黑樹不用哈希表?等等。
就這樣一層一層的往下挖,一直挖穿為止。有時候你都說道操作系統,硬件中斷層面了。
但是面試官還是如飢似渴,難道還需要說說高低電平,載波脈沖么?
所以項目真的要細節掌握透徹,就連有時候用的一些依賴庫什么的,你都的知道為啥用這個,有沒有更好的?
項目問的細是一方面,還有一方面就是問的深。
舉個例子,當時說項目中用了一種高效的內存分配器,沒有用原生的ptmalloc(也就是malloc)。
不要說new了,new的底層還是mallloc。是因為減少多線程情況下的鎖開銷,每次malloc都會進行加鎖和解鎖的過程。
面試官緊接着就問,那你用了tcmalloc的確減少了在多線程情況下的鎖性能問題。如果我讓你繼續優化你有什么方法?也是在多線程情況下,內存分配問題。
緊接着又問,你剛剛說減少鎖的性能開銷,那你知道操作系統層面,鎖的代價是多大么?你知道操作系統是怎么加鎖的么(鎖的原理是什么)?
我是真的服,面試官什么都懂。🐂,遇到不會的只能說這塊我沒掌握,說下我的理解吧。
社招,項目這塊說的好可以占據很高的分,具體多大比例看面試項目契合度了。如果你的項目剛好對方公司也用到了,那就是基本聊項目聊完。
說的不好,那就有點難了。
總結一下,項目到底該如何准備?如何說?
准備方面,幾個核心點。
-
為什么要做這個項目? -
怎么做的? -
項目中那些亮點、難點、價值? -
項目完成,有沒有解決當初的問題?收益怎么樣?
如何說,其實簡單。只要你准備好了,說清楚,說精彩。最好還能說得跌宕起伏,在穿插幾個故事。
其實項目再怎么准備都不為過,不管是從項目的深度,項目的細節。
C&C++&STL問題
程序編譯問題
-
程序編譯整個過程?每個步驟都干了什么? -
詞法分析,分析什么?語法分析,分析什么?語義分析,分析什么?
這個問題我很清楚,是阿里問的。這就是說編譯原理了,雖說不是科班出身,但是書還是略微看過。
不用驚訝,都是為了修行。
-
每個過程怎么用GCC編譯的? -
如何進行反匯編?
對象模型問題
-
C++有哪幾種對象模型,C++現在使用的那一種? -
普通繼承的對象模型是怎么樣的?存在虛函數的繼承對象模型是怎樣? -
虛繼承的對象模型是怎樣的?為什么需要虛繼承?解決什么問題? -
多重繼承對下模型? -
成員變量會內存對齊么?為什么需要內存對齊?底層怎么實現的? -
為什么對象模型需要這樣存放?
智能指針問題
-
智能指針有哪幾種? -
循環引用怎么解決,為什么用weak_ptr就能解決? -
智能指針每一種的使用場景? -
智能指針底層怎么支持的,怎么做到的?
STL問題
-
STL有哪幾部分組成? -
為什么需要迭代器? -
vector非尾結點刪除,和插入會有什么問題?迭代器失效問題? -
優先級隊列怎么實現的? -
自己實現序列式容器需要實現哪些成員函數?關聯式容器呢? -
配置器是干嘛用的? -
仿函數使用在什么場景? -
boost庫使用過么?使用過哪些函數?
多態問題
-
為什么需要多態? -
多態有哪幾種?靜態多態是什么?動態多態呢? -
多態如何實現的? -
虛表指針是什么?虛表里面怎么存的?順序是什么?為什么需要按照聲明的順序? -
虛表第一個位置存放的type_info是干什么用的?RTTI機制是干什么的?為什么需要RTTI機制? -
使用多態中遇到哪些問題?
其他還有一些簡單問題,比如問你sizeof是編譯期還是運行期決議的?函數調用約定是什么?等等
數據結構與算法
直接問你數據結構的不多,一般會搭配着項目問。
-
問你設計時為什么選用這種數據結構?
-
常見數據結構以及底層實現?
-
樹形結構和哈希結構的各自優缺點?
-
有些會問你圖結構一些問題
算法也不是直接讓你寫一個快排什么的,都是給你場景題,讓你自己選擇用什么算法。
不排除直接讓你寫快排,比如我這次在面試某家公司的時候,讓我寫一個單鏈表快排,不能交換數值,必須交換數據節點的地址。
查找算法和排序算法考的多。
查找算法的話就那幾種。
-
遍歷查找 -
樹形查找 -
二分查找 -
插值查找 -
哈希查找 -
圖的遍歷查找
排序算法也就那么幾種(從之前的博客中拷貝的圖)
鏈表類的問題考的特別多,寫算法題目也經常讓寫鏈表類的題目。我這次面試寫算法基本都是在寫鏈表類的題目。
操作系統&計算機網絡
這塊也會根據項目中的問,我的項目是搜索引擎,問操作系統的問題自然多。
-
mmap如何映射?mmap在那些場景中使用?有哪些優點? -
物理地址和虛擬地址如何映射?swap區是干嘛的?4g的內存可以運行8g的程序么? -
32位系統和64位系統區別是啥?為什么32位系統地址是4字節,64位是8字節? -
信號槽機制是怎么實現的? -
信號和信號量的區別? -
鎖的性能開銷,鎖的實現原理? -
進程和線程管理? -
多線程資源競爭問題?死鎖經典問題(哲學家就餐問題)? -
io這塊問的很多,包括文件IO/網絡IO/映射IO,都是要講原理和細節? -
三次握手和四次揮手必問的? -
三次握手和四次揮手的狀態轉移? -
socket編程每個函數對應握手那個過程?有家面試官竟然問函數參數代表的意思。 -
網絡io的全過程,發生多少次數據拷貝?
場景題目
這塊題目是真的難以准備,都是隨機應變的。大多數場景題目都是看思維,有些是看你思維完了,再讓你對某個模塊擼個代碼。
說說我這次遇到的幾個深刻得場景問題。
題目:
-
有一個單機高性能的服務,最大只能抗qps 3k,現在因為活動qps漲到了5k。
問題:
面試官:你怎么解決性能問題,從那些方面去考慮?
我:先看服務內部是否需要優化,看看具體哪些地方消耗rt,針對該模塊優化,在看資源是否可以擴容等等
面試官:緊接着說,資源是固定的不能擴容?怎樣保證服務正常?
我:思考了一會,表示驚訝。
其實這道題,我思路錯了,一直在糾結服務性能優化上。面試官說的很清楚,要保證服務正常。
所以一定是限流,優先保證服務穩定性。
說實話,工作中的服務不算嚴格意義上的限流,采用的是TCP連接隊列限流的。
TCP隊列大小固定,當隊列滿了,接下來所有新鏈接都會被reset,當隊列有空余時才可以接受新連接。
題目:
-
有一個IO場景,100work線程處理完計算服務,把計算結果進行IO操作,IO等待時間長。
問題:
面試官:100個同時IO耗費時間很長,大多數線程都在等待,你怎么優化?
我:可以采用批量IO,用一個單獨的線程專門負責IO工作
面試官:IO線程何時去進行批處理?
我:io線程使用阻塞等待,滿一批就進行IO;或者work線程每次寫數據時檢測下隊列滿了就去喚醒IO線程
面試官:那IO線程完了怎么通知那一批work線程?
我:信號通知
面試官:信號通知不能攜帶數據結構,假設IO完了之后必須給每個對應的work線程返回一個數據結構,怎么辦?
我:用一個全局隊列保存IO返回的數據結構,work線程去阻塞等待返回的數據結果。
入門之前我覺得寫代碼應該挺難的,屬於技術活。現在我發現,面試是個技術活,比寫代碼難度大多了。不光要有實力,也必須要有運氣。
反正你如何准備,面試官都會問到你懷疑人生。大多數時候我們都是順着面試官的反問去思考,結合自己的經歷回答。
三個小點提示下:
-
不一定順着面試官的思路想,要更多的有自己的思路,適當的時候記得反問面試官? -
不一定所有問題都答出來,但是一定你答的問題很精彩。 -
遇到不會的或者比較難的問題,先說自己的思路,再去詢問下面試官的思路,探討的方式面試。
差不多了,今天分享就到這里了。不是所有面試題,挑選了一些重要的問題說說。
題外話
今天開始在陸陸續續拒絕一些公司了,對於那些很還不錯的公司,對你滿滿誠意,拒絕起來還是有些傷心的。
同時我在想,不管怎么樣最終都只能選擇一家公司工作。但是在面試的時候又不得不多嘗試。
嘗試的越多,意味着做出選擇的越多。但是,在職業選擇上,是真的不是很好選。
每個人對於工作回報的預期不同,有的人把工作當做全部,是實現理想價值的地方,是實現夢想的地方;有的人把工作知識當做能力鍛煉的地方,為了以后更大的夢想;也有人是為了賺錢。
總結一下就是三點
-
積累個人能力 -
積累經濟財富 -
實現個人價值或者夢想
在選擇職業時大家可以根據這三方面仔細思考。要是三個條件都能滿足,那就太好了。
更多時候都是有取舍的,大家自行取舍。
下一篇文章給大家總結下本次招工做中的一些總結和需要注意哪些問題。當然我的所有總結都是基於自己的經歷,如果有什么異議,歡迎大家探討。
俊男靚女們的點贊就是龍叔創作的最大動力,奧利給!!!
