1. 程式人生 > >2019年秋招提前批麵筋

2019年秋招提前批麵筋

綜述

本人非科班生,本科普通二本院校、碩士西安某末流985,本碩專業都是電子與通訊工程,基本做的東西離不開微控制器、DSP、FPGA、STM32,先前完全沒有接觸過網路、資料結構演算法等。研二上學期想往網際網路轉,所以自學了一年計算機專業的知識,也面了一些網際網路大廠,積累了一些經驗。本人僅僅參加了提前批獲得offer也都一般般,因為學校三方發得比較早,並且華為給的薪資還不錯,就提前結束了秋招。就面試一個月期間,認真總結了各個大廠面試要點,並做了相關的總結。如果對於一個非科班自學計算機的人想去BAT,應該具備以下能力:

  • 1、語言能力:對於C++後臺開發
    起碼對於C++以及C語言要比較熟悉,這裡推薦的書籍包括以下:C程式設計語言(第2版_新版)、C和指標、C陷阱與缺陷、C專家程式設計、C Primer Plus第6版 中文版、C++Primer、Effective C++中文版(第三版)、More Effective C++中文版、深度探索C++物件模型、STL原始碼剖析。前面基本C語言吃透了,看C++物件模型以及STL原始碼應該比較清晰,必須深入STL內部,分析其記憶體模型、物件模型以及模板程式設計一些要點。
  • 2、Linux基本操作能力
    最好的方法就是按照虛擬機器,然後在Linux上面寫程式碼,熟悉Linux常用的指令。推薦書籍:Linux命令列大全、快樂的 Linux 命令列、鳥哥私房菜
  • 3、熟悉網路的能力
    起碼清楚的連線TCP三次握手、四次揮手等內部細節過程,瞭解TCP和UDP的區別,瞭解HTTP協議。推薦書籍:TCP-IP詳解卷一:協議、圖解HTTP
  • 4、熟悉作業系統的能力
    現代作業系統(第三版)中文版(選取重點的章節看)、程式設計師的自我修養—連結、裝載與庫、深入理解計算機系統(原書第2版)_CSAPP(沒學過嵌入式的,得好好看看這本書,從最底層理解程式如何執行)
  • 5、
  • 6、
  • 7、
  • 8、自己總結過一篇超過10萬字的面試總結,包含上述提到的各部分面試考點,希望對各位有所幫助。
    面試總結

1、騰訊校招實習生內推面試(4.24)

一面:人生第一次面試獻給了騰訊。超級緊張。

  • 1、STL記憶體分配原理?是如何組織的?
  • 2、你知道sbrk和brk的區別嗎?calloc、malloc、realloc的區別?
  • 3、TCP/IP為什麼是三次握手?TIME_WAIT狀態有啥作用?一般哪一端處於這個狀態?伺服器端可以嗎?如果可以,那麼一個IP重複,產生很多TIME_WAIT狀態會如何?
  • 4、Linux5個IO模型,阻塞與非阻塞的區別,非阻塞呼叫,資料沒來函式返回錯誤碼是什麼?用什麼函式將非阻塞修改成阻塞?,檔案描述符是什麼東西,有什麼作用?
  • 5、說說nginx的重定向與反向代理
  • 6、智力題目:有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麼怎麼利用手中的兩個球,用什麼最優策略知道這個臨界的層是第幾層?

這是第一次面試,並且是第一次提前批電話面試,連TIME_WAIT的作用都回答不全,當然失敗告終。後面騰訊實習生招聘也來了西安現場面試,自己也過去了,人超級多,當然面試全程問專案,問智力題,問資料庫,無賴沒對應專案,沒學過資料庫,資料結構也很水,當然失敗告終。後續加緊時間自己學了一些東西。

OPPO提前批面試(7月18號):

一面:

  • 1、自我介紹
  • 2、挑個你最拿手的專案介紹
    介紹了自己寫的簡單網路庫,順便說了下Redis和Libevent,中途問了具體寫了哪些模組,如何除錯,定位Bug(我的回答是valgrind+gdb+strace),什麼是單元測試,花費了較長的時間。(中間扯了挺長時間的專案)
  • 4、單例模式需要注意什麼?
  • 5、做了一個卷子,10到選擇題,2道程式設計題,任選一道,題目都不難,但是需要很快做完。
  • 6、問了一道智力題目,小白鼠試毒藥問題。這時候面試官去改卷子。改完問你思路。
  • 7、演算法題目,如何快速求第K大的數,不考慮空間複雜度,類似於TOP K的問題。但是提示下,才想到利用快排。

二面:

全程聊專案,就問專案,然後問得比較寬泛,感覺面試官也不懂細節之處,自己一個人在那裡說,他就好好好的,很像華為的面試,然後聊完出來就掛了。不知道為何。全程我一個人給他講,畫,感覺不錯吧,可是出來就掛了。

CVTE提前批面試(7月18號33分鐘):

一面

  • 1、介紹你的專案(自學過程及其經歷)
  • 2、shared_ptr、unique_ptr、weak_ptr的應用場景
  • 3、多型
  • 4、過載(怎麼過載,傳參一樣函式返回不一樣可以過載嗎)和重寫區別
  • 5、C++要引用C函式如何做?不用extren可以不?
  • 6、struct和class的區別,struct可以被繼承嗎?
  • 7、中途又問了一個專案
  • 8、有什麼問題要問?

產品線是啥,中途面試管說了,C++語音基礎比較薄弱,但是對技術比較熱情。面試極差,先前看了,但是沒有總結。然後下定決定好好總結屬於自己的一份面試題庫。

阿里內推面試(8月17號):

一面:

  • 1、malloc和new的區別,分配一個int *a陣列,delete a和delete a[]區別?
  • 2、多型的實現原理?
  • 3、智慧指標的應用場景?
  • 4、記憶體洩漏,通常怎麼做?
  • 5、vector和list的區別,map迭代器是否失效的問題?
  • 6、虛繼承的實現原理?
  • 7、右值引用左值引用和std::move的作用?
  • 8、瞭解c++11的std::forward嗎?
  • 9、std::lock怎麼實現?講了RALL手法實現鎖。
  • 10、瞭解資料庫嗎?
  • 11、今天時間有限,就到這裡了吧,要是有電腦怎麼可以做幾個題目。

(33分鐘,果然4天之後約了繼續面試,同一個面試官繼續面試58分鐘)
四天後…………

二面:

(8月21號)你好,前幾天面試,感覺你C++基礎知識還可以,電腦準備好沒,我們接著面試吧(55分鐘)。

  • 1、C++11中move有啥用?內部是如何實現的?
    move是用來實現物件內部快速轉移的,move返回的是右值引用,只有物件過載了右值引用也就是轉移運算子和轉移賦值運算子,那麼就可以在不必拷貝物件而轉移物件內部的變數,實現高效的移動。
    可以對C++內部型別進行move不?
    內部型別沒有過載轉移運算子,使用move應該就是直接賦值了。這個問題不清楚,沒見過。
  • 2、HTTP協議頭部有哪些欄位說說其中的含義是什麼?
    頭部有對方瀏覽器、作業系統型別、報文時間,主體報文長度欄位,連線型別是短連線還是長連線欄位也就是keepalive。
    那瞭解HTTPS嗎?
    不瞭解。
  • 3、例如我有一個HTTP請求,沒有到達對方伺服器,返回的是報文不可達,那你怎麼可以解決這個問題,有什麼思路?
    可以使用tracerout跟蹤HTTP請求,然後檢視其到達的路由器有哪些,然後看報文最後到達哪個路由器就失敗了。
    直接tracerout域名嗎?
    哦, 不對,不對。得先知道IP地址。
    那說說tracerout的原理是什麼嗎?
    通過設定報文的生命週期,從1、2、3等等,設為1,那麼經過一個路由器就會返回ICMP資訊,然後設為返回經過的第二個路由器資訊,這樣可以跟蹤到報文經過的路由器資訊。
  • 4、TCP是如何確保早發但是延遲到的報文是有序的?
    採用滑動視窗,應答機制。(回答不好)
  • 5、C++記憶體洩漏很容易,你一般通過什麼工具檢測,有沒有嘗試自己寫個東西去檢測?
    沒有嘗試寫過,一般使用vargrind檢測,一般都可以檢測出來。
    那你瞭解vargrind原理嗎?
    不瞭解。
  • 6、因為不是科班,然後讓我簡單介紹了自己從什麼時候開始學習這些知識,以及學習了哪些,怎麼學習的?
  • 7、Linux為什麼要弄個虛擬記憶體?
    為了讓每個程序看似有獨立的大的記憶體空間,並且都不互相干擾,可以很方便的編寫程式。
  • 8、對資料庫瞭解多少,有沒有一些具體專案中用過資料庫?
    學習了MySQL必知必會,看了InnoDB內部一些原理,具體還沒有用到專案中,打算最後將資料庫結合到自己的簡單Web伺服器上面。
  • 9、如果一條SQL查詢很慢,你覺得可以怎麼優化?
    可以看慢查詢日誌,或者通過expalian獲取SQL語句內部查詢表的過程以及是否用過索引等一些資訊
    那怎麼樣可能導致查詢變慢呢?
    例如聯合了許多表,但是又沒有建立好的索引,或者索引使用不正確。
    你剛剛說到慢查詢日誌,那多慢才會生成慢查詢日誌了?
    具體時間不記得了,但是可以設定。
  • 10、那你覺得建立索引應該滿足什麼條件?
    某列資料區分度不夠大,例如男女這種建立索引也沒用;並且建立索引應該在已有的索引上面建立聯合索引,這樣之前的索引也可以用,聯合索引也可以用。
    那使用索引應該注意什麼?
    最左字首原則(舉了個例子)以及索引不能運算、like首部不能使用萬用字元等。
  • 11、TopK問題?
    最小堆或者快排切分解決。
  • 12、二叉樹的翻轉,知道自己演算法很差。
    說得比較亂,還讓我捋捋思路。阿里面試官真的好。
  • 13、講將自己在學校裡覺得做的還可以的專案以及中間的難點?
  • 14、你實習在那邊主要做了什麼?
  • 15、開啟釘釘,給你發個題目吧,我遠端監控你的電腦,你可以隨便打開個IDE,寫個unique_ptr類,實現一些基本功能就可以。
  • 16、寫完了沒有,寫完了發給我釘釘上。
  • 17、有什麼問題想問的?
    唉,這場相比於第一場,問的問題更加靈活了,感覺面試官就是想起什麼問什麼,很專業,應該沒有什麼題庫之類的,阿里的面試就是這麼牛。 唉,肯定涼了,秋招再投吧。

三面(8月29 26分鐘):主要圍繞專案以及一些開放性的話題聊聊

  • 1、你的Web伺服器架構是什麼?
    多程序,主從模式。
  • 2、在用之前參考了哪些架構,多程序模型有什麼優點?
    說了下Nginx、Redis、Memcached。然後說了下多程序和多執行緒的區別以及優缺點吧。
  • 3、看過Nignx沒有?
    看過淘寶寫的Tenginx書籍,然後說了下架構。
  • 4、現在都流行分散式,瞭解一些分散式的技術嗎?
    說了下一致性hash的實現以及其原理。
  • 5、我們這邊主要做訊息中介軟體,瞭解訊息中介軟體嗎?RPC
    不是很瞭解,但是知道有些訊息佇列使用Redis來做的。
  • 6、為什麼選擇學習伺服器端程式設計,以後非要從事伺服器開發嗎?
    找個方向學習,具體以後做什麼還是工作決定,因為反正過去也是學習。學校培養的就是學習能力。
  • 7、大概你的情況瞭解了,有什麼問題想問的?
    請問您可以評價下嘛?
    你對伺服器開發的多程序和多執行緒有自己的理解,但是可能不是科班生,然後自己做東西,時間不足可能實踐也沒有那麼多。
    這如果過了下一輪屬於什麼面試?
    下一輪應該就是HR面試了,HR最近有點忙估計得到下週給你電話了。

網易遊戲內推面試

一面(8月21號56分鐘):

網易遊戲筆試4道程式設計題目,就做對了一道半。第二題就是杭州網易遊戲電話過了,但是沒有接過,意味就沒有機會了,結果一週之後,廣州的HR打電話,約了8月21號中午11點半準時面試。
到了8月21號11點20,廣州的網易遊戲打電話來了,說了下,自己呆的地方訊號不好,可以5分鐘後再打過來嗎?5分鐘跑下樓,找個個桌子,迅速拿出紙和筆準備面試。幾分鐘後打開了。
你好,請問是某某同學嗎?我們是網易遊戲的工程師,今天的面試官有兩個人(兩個人…唉,好吧)。

  • 1、好吧,那我們開始來個數學題目,7點55分時針和分針的夾角是多少?
    天啦,思考了幾分鐘,竟然沒想出來,媽呀。估計當時聽到兩個人就震驚了。暖場題目結束。好吧,你這道題目時間已經過來,今天面試不問專案,就問基礎時候,來電C++語法吧。
  • 2、程式的記憶體佈局?
    從低地址到高地址依次是程式碼段、資料段、BSS段、堆、棧、環境變數部分、保留給核心的部分。
    那靜態變數儲存在哪個段?
    初始化的在資料段,未初始化的在BSS段。
    還有哪些在資料段?
    初始化的全域性變數。
    那他和靜態變數有啥區別?
    靜態變數作為區域性的時候,僅僅初始化一次,並且只能在其作用域內訪問。全域性的可以在當前檔案中其定義的開始以後,全部可以訪問。
    非靜態的區域性變數為什麼要儲存在棧中?
    因為對於函式的呼叫,都會生成棧幀,而這個棧的建立的編譯器自動幫助我們的,並且棧的記憶體空間是可以重複利用的,在函式呼叫開始建立棧幀,函式退出棧幀就銷燬了,區域性變數也就銷燬了。
  • 3、C++有那幾種全(傳)引數(廣東話真難懂,幾個地方,另外一個人說是幾種傳引數)
    傳值、傳引用、傳指標。
    那麼這都有什麼區別?
    傳值,棧上拷貝物件;引用不會拷貝,指標也不會拷貝;引用和指標區別babalalabl。
    那什麼情況下要傳引用呢?
    當被呼叫函式需要修改呼叫函式某個物件的時候,而又不想拷貝物件,那麼就可以傳引用。
  • 4、struct和class有什麼區別?
    一個預設是全域性,一個預設是私有。其他都一樣。(後面查了看了,好像struct不知道模板,這道題目還得看看)。
    類的三個特性是什麼? struct也可以class的三大特性嗎?
    繼承、多型、過載。可以
    那多型的原理說下?
    虛擬函式、虛表、重寫。
  • 5、m個數組求前k大,TopK可以有幾種做法?
    最小堆。
    好 ,那這個時間複雜度是多少?
    說得不好最後在面試官友好的提醒下說了是mlogk。
    還有啥方法?
    快排切分的思路。
    那快排和堆排序穩定嗎?
    不穩定。
  • 6、私有IP地址的範圍是什麼?
    直接說,這個真的不記得了,但是我除錯自己伺服器的時候通常用的是127.0.0.1
  • 7、TCP如何確保報文傳送過來是正確的?
    三次握手、超時重傳、慢啟動、擁塞控制等。
    不是這個,我問的是如何確保報文內部的資料是正確的?(大寫的尷尬)
    哦,那使用CRC校驗實現,傳送直接校驗,收到校驗,然後比較校驗值是不是一樣的。
  • 8、說說TCP四次斷開,伺服器和客戶端的每個狀態遷移?
    balalalal。
    說說timewait作用?
    兩個作用,1和2.
    假如我伺服器傳送了FIN,客戶端響應了ACK,這是我伺服器端還在寫這個sockt,會怎麼辦?
    應該是寫返回錯誤,然後再errno裡面會設定對應的錯誤碼。
    那錯誤碼是什麼?
    這個不記得,錯誤碼的英文含義應該是提示連線已經斷開,你就不要往裡面寫了。
  • 9、TCP協議內部有幾種定時器?
    超時重傳定時器,還有三個,唉不記得了,不好意思哈。
    那你的Web伺服器裡面肯定需要用到定時器,說說你是怎麼處理的?
    通過最小堆維護定時器事件,在epoll_wait之前,取出堆中最近的時間作為其第4個引數,等返回之後,比較最小堆與當前的時間,確定定時器事件是否到達了。
  • 9、你的web伺服器是多程序還是多執行緒模型?
    多執行緒的,主負責accept,然後將收到的fd輪詢發給work執行緒,最後由work執行緒處理這條連線。
    那你瞭解多程序的模型嗎,這種模型也很多啊,例如Nignx?
    Nignx瞭解一點,很牛逼的Web伺服器,後面向學習。
    那Nignx模型,怎麼做到主和從的,例如主程序accpet,怎麼把這個fd傳遞給子程序。(這個問題比較難)
    可以利用管道,把接收到的fd傳過去。
    那兩個獨立的程序相同的fd是不是難道代表一樣的含義嗎?你覺得這樣可以嗎?
    這個確實有點矇蔽,回答不太清楚。後來檢視Nignx是在listen之後,才fork子程序的,這樣每個子程序都繼承了Listenfd,然後每個子程序都可以競爭的accpet。
    可以說說管道嗎?
    管道分為匿名和有名。區別在於是否僅僅支援在具有親屬關係的程序之間通訊。
    那你說說匿名管道具體應該如何使用?
    主程序初始化管道,產生兩個讀寫fd,fork子程序,繼承這兩個fd。管道是半雙工的,例如1給2寫,就關閉1的讀,2的寫,然後就可以單向1寫到2了。
  • 10、標準輸出、輸入、錯誤的fd是什麼,同時多個程序寫會發生什麼?
    0、1、2,同時多個多可以寫,但是輸出可能會競爭,順序混亂了。
  • 11、哪些指令可以檢視檔案內容?
    more、less、cat
    要查詢末尾幾行怎麼辦?
    tail
  • 12、如何查詢處於程序狀態的套接字?
    netstat –atl | grep ….
  • 13、怎麼殺死程序?
    ps –elf kill -9 pid
  • 14、如何檢視當前目錄佔用的大小?
    df和du一個是查詢總記憶體,一個是查詢當前目錄,具體其中哪個查詢當前目錄,暫時不記得了。
  • 15、伺服器不停寫一個日誌,例如已經寫了1G了,那我在外部刪除這個日誌檔案會發生什麼?
    檔案系統會重新生成一個同名的日誌檔案,然後從頭開始寫。(這個真的不知道。)
    你確定可以重頭開始寫嗎?那加入重頭開始寫,那先前的1G記憶體是釋放了,還是沒有釋放?
    真是不好意思,這個真的沒有看過,不清楚。
    你看過檔案系統沒?(這才是重點,想問我看過檔案系統沒有)
    沒有,真不好意思。
    好吧,今天面試就到這裡了,你有什麼問題想問我們?
    您可以說說對我的評價嗎?因為這些都是自學的,以後學習可以朝哪些方向繼續下去。
    第一個問題:面試結果3到5天內給通知,我們現在不方便告訴,畢竟後面還有一些人,我們需要比較斟酌。
    第二個問題:我覺得你自己這樣學習還可以。
    好,今天那就這樣吧。
    總結:網易遊戲,面試多而細。涼涼送給了自己。

二面(8月29號下午三點56分鐘):

我靠,記不清楚了,明天回憶回憶。

騰訊SNG內推面試

一面視訊面試(8月21號10.30 40分鐘):

  • 1、自我介紹
  • 2、寫個strcpy函式
    寫了個庫函式內部的實現,然後說了一些記憶體重疊的兩種情況,如果發生了記憶體重疊需要從後開始拷貝等。
  • 3、寫一個“abcd,efgh,hijk …”反轉為“dcba,hgfe,kjih”函式
    很快寫完了,然後簡單的解釋了下。
  • 4、寫一個epoll邊沿出發讀取socket套接字的函式
    寫的比較快,主要在於一次性讀完,然後處理ewouldblock和返回0的情況,寫完之後,簡單的解釋了下。
  • 5、講講top輸出的含義
    說了下top就想windows的工作管理員,將程序按照佔用ram排序,並給使用者看,具體內部的一些引數暫時還不清楚,就知道可以顯示程序佔用CPU的程度等資訊,非常全面。
  • 6、awk使用過了沒?
    使用過了,例如我輸出過netstat中的某一列等。
  • 7、講講TCP三次握手
    講了三次握手,順帶講了為什麼2次和4次不行的情況。
  • 8、有什麼問題想問的?
    是不是看著不是科班生,然後一些C++的基礎知識都沒有問,然後啥時候可以出結果?
    結果我們還得商量下等等吧。(反正這個面試官面試的時候心不在焉感覺不負責的樣子,讓我很不爽,面試的時候我在說,他還在和別人討論問題。)

二面電話面試(1個小時):

剛剛抱怨完,就電話來了,約了下午3點複試。這次複試就完全問專案細節了,還挑剔了許多其他的地方。

  • 1、自我介紹
  • 2、你的Web伺服器為什麼併發只能到1000?測試環境是什麼樣的?
    說了下機器的配置,然後說了下是如何測試的。等等一些細節,最後說了下,可能記憶體不足的情況,說了好久。
    你如何優化或者通過什麼工具優化?
    說了下strace看系統api呼叫時間。top命令檢視伺服器佔用記憶體等。唉這裡感覺應該說看日誌等資訊的。
    你知道一個socket連線佔用多少記憶體嗎?
    這個問題真的不清楚,說了下socket一個連線是通過四元組維持的,每個socket佔用記憶體具體多少不清楚,但是TCP肯定會為連線分配緩衝區等。
  • 3、說說一致性hash?
    A:原理和實現講了半天,我覺得應該已經講明白了,他還是始終問為什麼一致性Q:hash可以實現負載均衡?
    A:通過hash函式hash到hash環上,hash函式越好,那麼負載均衡的能力也就越好,非常依賴於hash函式的選擇。然後說如果可以畫圖那就好了。
    Q:那你也要表達清楚啊,別緊張了,說得緊緊巴巴的
    A:第一次面試騰訊,超級緊張啊。
  • 4、給我講講智慧指標吧
    講了三大智慧指標的引用場景,以及可能出現的問題。中間又被提及不要緊張,唉唉唉。
    Q:使用share_ptr就一定可以避免記憶體洩露嘛?
    A:不一定,如果一個物件被兩個智慧指標管理,那麼會產生兩個引用計數區域,因此一個智慧物件析構,將是否物件記憶體,而另外一個還指向釋放的記憶體,當其析構,則會釋放已經釋放的記憶體,產生不可預期的問題。
    Q:為什麼會產生兩個引用計數區域?
    A:解釋了下shared_ptr內部的具體實現。
  • 5、我看你做的都是基礎平臺開發,你講講你的職業規劃
    技術專家或管理層次。
    Q:你現在做的這些可能以後工作了都不會用到,你以後想從事業務開發,還是基礎平臺開發?就算從事基礎平臺開發,也不會涉及socket套接字的基本使用。
    A:現在處於學生階段只是找一個點去學習,因為沒有業務開發的環境,所以只有學習這些基礎知識,並且基礎知識好了以後業務開發遇到問題就會比別人看得更透明。
    Q:我只是現在糾正下你的思想,以後工作了可能技術對於業務而已就顯得不那麼重要了,更重要的時候對業務的理解以及整體架構的理解。
    A:這個因為沒有做較多的業務,理解沒那麼透,但是一個時期一個理解嘛,隨著時間的推移,理解也在動態的變化,估計到了那個時候就可以理解,謝謝您的提醒。
    Q:說說你的缺點吧
    A:1、2
  • 6、給我講講同步和非同步?
    同步:呼叫阻塞指導資料到來等。
    非同步:如IO複用是非同步,訊號驅動式IO是非同步,呼叫完後立即返回,然後資料到來,核心通過訊號通知。
    Q:你說說作業系統非同步是如何實現的?
    A:(這個有點矇蔽),接著講剛剛剛的訊號驅動式IO,然後問了下,是不是非同步實現的一種方式,面試官也沒有回答,這個問題就跳過去了。
  • 7、講講實習做了啥吧?
  • 8、有什麼想問的?
    大概多久可以到下一輪面試?
    A:起碼得3到5個工作日吧。唉,估計涼涼了,等等等等………面試官一會說緊張,說說不流暢,唉唉唉唉,心煩。