後端面經(已收到騰訊實習offer)
阿新 • • 發佈:2019-01-10
大家好,這篇部落格是我部落格生涯的第一篇部落格,所以想先和大家分享一下春招過程中的收穫和感受。由於博主是新手,如有需要改進的地方或者不明白的地方,請在評論區留言,博主將在第一時間趕赴現場與君討論和請教。謝謝大家!!!
下面將知識點做個總結:
- 資料結構:
- 連結串列和陣列的區別(記憶體上的分佈、增刪查的時間複雜度)
- 樹的先根、中根、後根遍歷(延伸出來波蘭序列和逆波蘭序列)
- 雙鏈表的增刪查
- 圖的深度優先搜尋(延伸出回溯法)和廣度優先搜尋(延伸出分支界限法)
- 掌握幾顆樹:AVL(平衡二叉樹),BST(二叉排序樹),紅黑樹,B樹,B+樹
- 排序一定要掌握:堆排、基排、快排、冒泡(時間複雜度、空間複雜度、應用場景)
- 演算法
- 常用演算法一定要有印象:
- 貪心演算法(每次都取最優)
- 動態規劃(筆試和麵試經常出現,建議看下經典的揹包問題)
- 遞迴演算法(斐波列序列、快排、二叉樹的遍歷、求階乘),遞迴一般不能達到最優解,但面試過程中用遞迴可以使程式碼更加簡短。
- 分治(快排、歸併都利用了分治思想)
- 分支界限法(對應廣度優先演算法)
- 回溯法(對應深度優先演算法)
- 典型的演算法案例:
- 儲存10億個INT型的QQ號,但給的記憶體只有1GB。(明顯,一個int型佔用4個位元組,10億個QQ號就需要4GB的儲存空間,直接儲存記憶體不足。)解決方法是利用雜湊儲存,使用點陣圖(每個QQ號只用一位進行儲存,這樣一個int型32位就能儲存32個QQ號了)
- 在1億個數中找出前1000個大的數(用int儲存),只分配4KB的儲存空間。解決這種問題(找出前n個最大或者最小的數),一般使用堆排。前n個最大的數使用最小堆,前n個最小的數使用最大堆
- 找出第k大的數,利用快排(快排的思想就是每次找到一個數在整個序列中的具體位置)
- 大整數乘法,使用分治思想
- 字串匹配(判斷迴文串、找出最長迴文子串、找出最長迴文子序列、判斷字串A是否為字串B的字序列)
- KMP演算法(找出字串A在字串B的位置,不存在返回-1)
- 必須會手寫的演算法
- 快速排序
- 折半查詢
- 歸併排序
- 連結串列的逆序
- 連結串列的生成、查詢、刪除、新增
- 要掌握寫演算法的工具,博主練習演算法一般使用C++,原因是網上參考例程多,而且執行起來相對高效。
- 要掌握C++的STL庫,裡面包含了佇列、集合、棧等各種資料結構的容器,使用STL可以快速便捷的進行排序、去重、刪除、插入、修改、統計大小、逆序(分配的是動態的記憶體,不像C++的陣列一樣是固定的)。
- 字串的常見操作,博主發現很多筆試題喜歡考察字串相關的題目,所以對字串的逆序、統計大小、遍歷等要重點掌握。
- 常用演算法一定要有印象:
- 計算機網路
- 三次握手、四次揮手(掌握其原理、以及為什麼是這個次數、socket是怎麼建立連線的)
- 瞭解TCP連線的11種狀態變遷
- TCP和UDP的區別(報文頭部的區別、可靠性?、面向連線?、應用場景)
- 滑動視窗(整個流程、接收視窗和傳送視窗是如何移動的、序列和確認號)
- 防擁塞控制(掌握三個階段:慢啟動、擁塞避免、超時重傳/快速恢復)
- 七層模型(瞭解每一層的用途)
- IP地址的分類、私有地址的劃分、子網掩碼的作用、一些特殊地址的用途(0.0.0.0,127.0.0.1,255.255.255.255)
- 長連線、短連線、長輪詢、短輪詢
- 常見的應用層協議和相對埠號(FTP,SSH,TELNET,HTTP,DNS)
- 掌握ICMP協議(是網路層協議,應用場景?)
- 如果伺服器用nginx,後端語言為PHP,掌握從使用者進行域名訪問一個網站到返回頁面的過程中經歷過的一些活動:(博主這道題答的不太完整)
- DNS域名解析(掌握DNS的輪詢機制)
- TCP三次握手建立連線
- 客戶端傳送HTTP請求報文(在資料包的移動過程中,可能涉及到ARP協議來解析MAC地址—這點博主當時被問的一點懵逼)
- nginx維持連線,並將報文主體傳送給php-fpm進行解析並執行
- 服務端發回響應報文
- 服務端或者客戶端四次揮手結束會話(注意握手是客戶端發起的,揮手是客戶端/服務端都能發起)
- HTTP協議
- 一些常見的狀態碼:301,302,304,403,404,502,503,504(並且掌握以1、2、3、4、5開頭分別表示什麼型別的狀態)
- HTTP請求報文和響應報文的格式和內容(HTTP報文的4要素、常見的請求首部和響應首部)
- 請求方法:PUT,DELETE,POST,GET,HEAD,TRACE的區別(前4個對應增刪改查,重點掌握GET和POST的區別)
- HTTP的快取首部:如cache-control,max-age,if-modify-since,last-modify
- 會話:SESSION和COOKIE的區別,如何提高COOKIE的安全性(這裡可能會涉及到WEB攻擊,如CSRF和XSS)
- 作業系統
- 程序和執行緒
- 程序與執行緒的聯絡和區別,順便了解一下建立程序和執行緒的方法
- 程序的排程演算法
- 程序的通訊機制:管道、有名管道、訊息佇列、共享記憶體、socket(要掌握這幾種通訊方法的區別)
- 死鎖產生的原因、如何檢測死鎖、如何解決死鎖
- 執行緒的同步機制:臨界區、互斥量、訊號量、條件變數
- 使用者態和核心態的區別(博主一般是從特權級考慮的)
- 併發和並行的區別
- 記憶體
- 記憶體的分頁機制、頁表以及多級頁表
- 記憶體碎片(外碎片和內碎片)
- 段頁結合(實現機制、為什麼要使用這種機制?)
- 缺頁錯誤
- 虛擬記憶體
- 頁面排程演算法
- 磁碟:瞭解磁軌和扇區的概念
- 編譯和連結
- 瞭解基本的編譯流程(詞法分析、語法分析、語義分析)
- 瞭解連結器的作用
- 程序和執行緒
- C++
- 32位機和64位機中資料型別的區別(long和指標所佔位元組不一致)
- 多型—–虛擬函式:淺談C++虛擬函式
- 虛擬函式的實現原理
- 加了虛擬函式後,呼叫建構函式和虛構函式的區別
- 類和結構體:
- 佔用記憶體(要考慮記憶體對齊的問題)
- 類和結構體的區別(博主一般以類是引用型別,結構體是值型別入手)
- C++的分段機制(程式碼段、資料段、BSS、堆、棧)以及每個段的作用
- 動態分配記憶體(堆):瞭解new/malloc,delete/free的區別
- 掌握strlen和sizeof的區別
- 行內函數和巨集定義的區別
- 資料庫
- 三大正規化+BCNF正規化
- 資料庫的索引(B樹索引、雜湊索引、點陣圖索引)
- INNODB和MYIASM的區別
- 查詢優化
- 優化SQL語句
- IN、EXTISTS、JOIN的區別和應用場景
- 防止索引失效
- 優化SQL語句
- 事務的四大特性:原子性、隔離性、永久性、一致性
- 隔離性解決的問題:汙瀆、不可重讀、幻讀(理解這三者的區別)
- 防止SQL注入的方法
- 危險字元的轉義
- 對SQL預編譯
- Redis快取機制
- 應用場景和優點
- 與memcache的區別
- 如何實現永續性
- 主從模式
- 設計模式(21種設計模式)
- 7種結構模式以及應用場景:橋接模式、介面卡模式、代理模式、享元模式、組合模式、門面模式、裝飾模式
- 重點掌握單例模式和MVC模式(應用場景、優缺點)
- 瞭解UML圖,能看懂各種不同箭頭表示的意思。詳解UML類圖
- Linux系統
- 常見的命令
- vim的基本使用:掌握三種模式(命令模式,插入模式和底行模式)
- 查詢程序的相關指令:ps -aux/ps -ef
- 查詢相關埠的指令:netstat -ntl
- 查詢記憶體使用狀態:free -h
- 基本的操作:複製,刪除,重新命名,移動
- 設定開啟自啟動
- 設計定時執行
- 看得懂nginx的配置檔案,並瞭解如何配置域名/埠重定向,以及如何負載均衡
- 瞭解IO複用技術:poll/select,epoll的區別
- 常見的命令
- PHP
- 說明:由於博主主要掌握的後端語言為PHP,所以後端語言為JAVA/C的請略過此小節。
- include和require的區別
- PHP常見的魔方方法:__toString,__autoload,__isset,__call等
- PHP七個超全域性變數:_GET,_POST,_REQUEST,_SERVER,_COOKIE,_SESSION,_FILES
- isset和empty的區別
- 弱型別語言是如何標識型別的,以及垃圾回收機制
- PHP作為一種解釋型語言,是如何執行的
- PHP7相對於PHP5的優點,強烈推薦鳥哥的部落格
- 瞭解php_module、fast-cgi和php-fpm的區別
- 掌握正則表示式的相關語法,並可以手寫簡單正則表示式,如手機號碼、郵箱等
華麗的分割線過後,下面博主給大家帶來的一些面試的小問題。
專案:面試IT行業一定要有拿得出手的專案,不然真的很尬,面試官一般會從以下幾個角度發難:
- 簡單介紹一下專案,博主一般從兩個方面入手,實現的功能+用到的知識(語言、框架)
- 你任務專案中有什麼難點,你是怎麼解決的(這個真的問的頻率太高了)
- 你的專案有什麼亮點嗎(博主回答這個問題一般從設計模式入手,還有一些比較先進的工具,如redis快取等)
- 你在團隊中具體負責哪些內容
- 面試過程:
- 保持自信的心態,別慫。。展現出應有的自信。博主當時提前批面試騰訊時,經歷了所謂的壓力面,面試官差點把腳放桌子上了。基本上你說的每個回答都能給你挑出毛病來(博主當時就慫了,說話一點底氣都沒有,結果直接rejected)。當壓力面時,一定要自信,當面試官挑你毛病時,要試著去和他探討,發表自己的觀點。一慫面試官可能就覺得可能是實力不足。
- 別過於自信,可能死於話多。你要時刻的清楚,面試官的知識閱歷可能是你的n次方,所以其實你的每次裝逼面試官都看在眼裡,記在心裡。所以一定要展現出謙虛、熱愛學習、求知慾強的一面。
- 如果真的有能力的話,請回答的時候儘量地從底層去回答。其實博主感覺面試官在你回答的深度上就已經能大概知道你的底細了。比如面試官問你陣列是如何實現的,這時候如果你能提到段頁結合的問題的話是相當不錯的。(當時博主面試奇虎360時,雖然很多問題答的不理想。當時面試官問了PHP7和PHP5的區別,博主從底層的資料結構還有解析器等方面入手,雖然回答的不是很完整,但自那以後,面試官就覺得你是到達這個深度的人。之後,他很基礎的東西基本不問,比如三次握手四次揮手之類,問的都是一些實現的原理,比如swoole為什麼效率高、IO複用技術的實現。雖然博主只能答出6-7成的問題,但還是過了,而且和麵試官談的很開心)這種做法的前提是認為自己底層基礎夠紮實,不然就別坑害自己啦。
- 不管你是拿應聘的公司當備胎或者其他原因,既然你面試了,那你就要展現出非常熱愛這家公司、非常想要加入這家公司的決心。不要猶豫,要充滿激情,這樣給面試官的印象相對來說更好一點。
- 簡歷:
- 雖說簡歷寫得漂亮很容易就能過筆試直通面試,但還是不要寫的太誇張,尤其是技術面,面試官其實只要一深挖就知道自己簡歷的真假,別試圖矇騙。簡歷儘量寫實再渲染,這樣的話只要面試官撈起你的簡歷,就代表你的能力和麵試官的要求是匹配的,這樣也不會太虛。
- 簡歷貼不貼頭像看個人哈哈,記得某論壇說過,不貼無所謂,要貼就要展現出認真的一面,不要隨便拿張自拍。(只針對技術崗)
- 心態
- 心態真的超級重要的,尤其是在準備面試的前一個月。遭受著身體和心靈的雙重摺磨,瞬間就崩潰。我非常能體會那種,拼死拼活啥都沒。我覺得春招真的是一場沒有終點的戰爭,遙遙無期,所以日子真的很難熬。博主的建議是每天早上規劃一下今天的計劃,既然在offer上得不到收穫,那我也在知識上得到收穫,這樣也能達到一定的成就感和滿足感。
- 分享一下博主曾經崩潰的心態:
- 從2018年春節過完一個星期,我就飛奔回學校準備春招,真的是整整一個3月份,都躲在自習室,用手機熱點給電腦提供的wifi。由於博主是非科班出身,所以這個過程真的很痛苦,每天看面經、刷資料結構和演算法、計算機網路、作業系統、C++、資料庫。真的是日復一日,真的是要吐了。與此同時,還在瘋狂地投遞簡歷,由於博主使用的後端語言是PHP(PHP是最好的語言嘛),但眾所皆知,後端語言除了PHP,還有C和JAVA,所以真的是投簡歷的時候並沒有像前端一樣,只要是網際網路公司就能投。差不多投了15來家公司吧。但結果,在整個3月份,顆粒無收!,這是讓我最心寒的。博主抗壓能力一般,當遭受著心靈和身體的雙重摺磨的時候,心裡防線瞬間崩塌。
- 其他