C++ 後台開發面試時一般考察什麼?
請問諸位前輩,C++方向後台開發一般考察什麼呢?linux會考察多深?操作系統一般問什麼?
對於應屆生來說,謝謝!
先後在騰訊和百度用 C++做推薦系統、搜索引擎的後台開發,說說我自己在面試應屆生時的關注點:
1. C++基本的認識,問得比較多的是指針、多態(虛函數表、內存 layout等)、作用域、內存的管理等等。(通常只有宣稱熟悉 C++或者簡歷中有很多 C++項目的人,我才會把這個當做一個重要的方面考察;對語言細節研究不深入,或者一直用其它語言比如 go/java 之類的,那也無妨,這塊可以稍微放寬要求。)
2. 演算法和數據結構,數據結構我比較關注哈希、優先順序隊列等,演算法則是字元串處理、簡單的 DFS、BFS、動態規劃都有
3. 系統的知識:進程、線程、協程、鎖的使用、消息隊列、共享內存、還有網路協議、epoll、select等。順便會考察一些處理問題的基本思路,比如通過哈希來劃分、通過隊列來序列化操作等等。此外,往往很多同學的項目經歷中,有很多點可以結合系統的知識來考察,看看是否真的做過項目。比如我就碰到過自己寫過 web server 的,搞過 key-value 資料庫的,聲稱讀過 redis 源碼的,這些很適合配合系統知識考察,確認是不是真的做過這些項目,理解如何。
4. 和應聘者背景經歷有關的知識,比如學信息安全,剛好是我的專業,我會問一些簡單的安全知識,比如緩衝區溢出、SQL 注入、虛擬機、https、數字簽名原理等等。當然,後面從事了個性化推薦有關的工作,機器學習也稍微懂一點,偶爾可以聊聊。這個主要是發現一些學習態度也特別好,但是又想做後台的同學。
=====================================================================
20151206 update有人說我問的都是知道不知道的東西,這些只需要翻翻某些書就可以了,而「編碼習慣」「思維方式」才是「核心素質」。
首先以我對題主這個題目的理解,我想題主關注的應該是以哪些具體的知識作為「切入點」,以便將來成為一名「C++後台工程師」。如果我跟題主說,「改編思維方式」「改善編碼習慣」才是最重要的,那麼等於說了正確的廢話。
我認為我們說的不是一個層面的東西。具體的知識只是切入點而已,如果沒有知識儲備作為切入點,說一個人有好的編碼習慣、思維方式,那不是空談嗎?
我文中有表述到了我通常會根據面試者本身的背景和知識儲備切入的意思,而且我並沒有說我只問知道不知道概念,我先考察的是學習態度和知識儲備,我認為這是篩選實際工作中可靠的工作夥伴的方式。
另外,編碼習慣和思維方式,是需要具體的知識和問題來考察的,比如演算法、系統設計,至於怎麼挖掘出來,是面試技巧和面試官本人的能力問題了。
還有,並不是翻翻APUE就行了,很多知識,不是每個人都有能力理解和融會貫通。如果這麼說的話,我說的2中的演算法和數據結構知識點,是不是翻翻演算法導論就可以了?
希望對大家有用。
今年剛找完工作的應屆生來答一發,校招主要考察基礎和思維,主要涉及C++語言基礎,數據結構與演算法,TCP/IP協議,網路編程,Linux。
雖然面試技巧和心態也很重要,但這裡只有24K純技術乾貨。點贊後,收藏吧!
C和C++語言基礎
參考書籍:《C++ primer》,《effective C++》,《STL源碼解析》,《深度搜索C++對象模型》
- extern關鍵字作用
- static關鍵字作用
- volatile是幹啥的
- 說說const的作用,越多越好
- new與malloc區別
- C++多態性與虛函數表
- C++多態的實現?
- 虛函數的作用?
- 虛函數用於實現多態,這點大家都能答上來但是虛函數在設計上還具有封裝和抽象的作用。比如抽象工廠模式。
- 動態綁定是如何實現的?
- 靜態多態和動態多態。靜態多態是指通過模板技術或者函數重載技術實現的多態,其在編譯器確定行為。動態多態是指通過虛函數技術實現在運行期動態綁定的技術。
- 虛函數表
- 虛函數表是針對類的還是針對對象的?同一個類的兩個對象的虛函數表是怎麼維護的?
- 編譯器為每一個類維護一個虛函數表,每個對象的首地址保存著該虛函數表的指針,同一個類的不同對象實際上指向同一張虛函數表。
- 純虛函數如何定義,為什麼對於存在虛函數的類中析構函數要定義成虛函數
- 析構函數能拋出異常嗎
- 構造函數和析構函數中調用虛函數嗎?
- 指針和引用的區別
- 指針與數組千絲萬縷的聯繫
- 智能指針是怎麼實現的?什麼時候改變引用計數?
- 構造函數中計數初始化為1;
- 拷貝構造函數中計數值加1;
- 賦值運算符中,左邊的對象引用計數減一,右邊的對象引用計數加一;
- 析構函數中引用計數減一;
- 在賦值運算符和析構函數中,如果減一後為0,則調用delete釋放對象。
- share_prt與weak_ptr的區別?
- C++四種類型轉換:static_cast, dynamic_cast, const_cast, reinterpret_cast
- 內存對齊的原則
- 內聯函數有什麼優點?內聯函數與宏定義的區別?
- C++內存管理
- STL里的內存池實現
- STL里set和map是基於什麼實現的。紅黑樹的特點?
- STL里的其他數據結構和演算法實現也要清楚 這個問題,把STL源碼剖析好好看看,不僅面試不慌,自己對STL的使用也會上升一個層次。
- 必須在構造函數初始化式里進行初始化的數據成員有哪些
- 模板特化
- 定位內存泄露 (1)在windows平台下通過CRT中的庫函數進行檢測; (2)在可能泄漏的調用前後生成塊的快照,比較前後的狀態,定位泄漏的位置 (3)Linux下通過工具valgrind檢測
- 手寫strcpy,memcpy,strcat,strcmp等函數
數據結構與演算法
這一塊考察範圍太廣,主要靠多刷題吧,牛客網,劍指OFFER,LeetCode等。
Hash表
- Hash表實現(拉鏈和分散地址)
- Hash策略常見的有哪些?
- STL中hash_map擴容發生什麼?
(1) 創建一個新桶,該桶是原來桶兩倍大最接近的質數(判斷n是不是質數的方法:用n除2到sqrt(n)範圍內的數) ;
(2) 將原來桶里的數通過指針的轉換,插入到新桶中(注意STL這裡做的很精細,沒有直接將數據從舊桶遍歷拷貝數據插入到新桶,而是通過指針轉換) (3) 通過swap函數將新桶和舊桶交換,銷毀新桶。
樹
- 二叉樹結構,二叉查找樹實現;
- 二叉樹的六種遍歷;
- 二叉樹的按層遍歷;
- 遞歸是解決二叉樹相關問題的神級方法;
- 樹的各種常見演算法題(http://blog.csdn.net/xiajun07061225/article/details/12760493);
- 什麼是紅黑樹?
- 紅黑樹與AVL樹的區別
- Trie樹(字典樹)
鏈表
- 鏈表和插入和刪除,單向和雙向鏈表都要會
- 鏈表的問題考慮多個指針和遞歸 (1) 反向列印鏈表(遞歸) (2) 列印倒數第K個節點(前後指針) (3) 鏈表是否有環(快慢指針)等等。
棧和隊列
- 隊列和棧的區別?(從實現,應用,自身特點多個方面來闡述,不要只說一個先入先出,先入後出,這個你會別人也會,要展現出你比別人掌握的更深)
- 典型的應用場景
海量數據問題
- 十億整數(隨機生成,可重複)中前K最大的數
- 十億整數(隨機生成,可重複)中出現頻率最高的一千個
排序演算法
- 排序演算法當然是基礎內容了,必須至少能快速寫出,快排,建堆,和歸併
- 每種演算法的時間空間複雜度,最好最差平均情況
位運算
布隆過濾器
幾十億個數經常要查找某一個數在不在裡面,使用布隆過濾器,布隆過濾器的原理。布隆過濾器可能出現誤判,怎麼保證無誤差?
網路與TCP/IP
參考書籍:《圖解TCP/IP》,《TCP/IP詳解 卷一》,《圖解HTTP》,《HTTP權威指南》
- TCP與UDP之間的區別 (1) IP首部,TCP首部,UDP首部 (2) TCP和UDP區別
(3) TCP和UDP應用場景
(4) 如何實現可靠的UDP - TCP三次握手與四次揮手
- 詳細說明TCP狀態遷移過程 (1) 三次握手和四次揮手狀態變化; (2) 2MSL是什麼狀態?作用是什麼? (3)三次握手為什麼不是兩次或者四次?
- TCP相關技術
- TCP重發機制,Nagle演算法
- TCP的擁塞控制使用的演算法和具體過程
- TCP的窗口滑動
- TCP客戶與伺服器模型,用到哪些函數
- UDP客戶與伺服器模型,用到哪些函數
- 域名解析過程,ARP的機制,RARP的實現
- Ping和TraceRoute實現原理
HTTP
- http/https 1.0、1.1、2.0的特點和區別
- get/post 區別
- HTTP返回狀態碼
- http 協議頭相關
http數據由請求行,首部欄位,空行,報文主體四個部分組成
首部欄位分為:通用首部欄位,請求首部欄位,響應首部欄位,實體首部欄位- https與http的區別?如何實現加密傳輸?加解密方式?
- 瀏覽器中輸入一個URL發生什麼,用到哪些協議?
安全相關
至少了解攻擊的原理和基本的防禦方法,常見的攻擊方法有一下幾種
- SQL注入
- XSS
- CSRF
- SYN洪水攻擊
- APR欺騙
資料庫
主要參考書籍:《資料庫系統概念》,《高性能MySQL》
- SQL語言(內外連接,子查詢,分組,聚集,嵌套,邏輯)
- MySQL索引方法?索引的優化?
- InnoDB與MyISAM區別?
- 事務的ACID
- 事務的四個隔離級別
- 查詢優化(從索引上優化,從SQL語言上優化)
- B-與B+樹區別?
- MySQL的聯合索引(又稱多列索引)是什麼?生效的條件?
- 分庫分表
Linux
主要參考書籍:《現代操作系統》,《APUE》,《UNP》,《LINUX內核設計與實現》,《深入理解LINUX內核》
- 進程與線程
(1) 進程與線程區別?
(2) 線程比進程具有哪些優勢?
(3) 什麼時候用多進程?什麼時候用多線程? (4) LINUX中進程和線程使用的幾個函數? (5) 線程同步? 在Windows下線程同步的方式有:互斥量,信號量,事件,關鍵代碼段 在Linux下線程同步的方式有:互斥鎖,自旋鎖,讀寫鎖,屏障(並發完成同一項任務時,屏障的作用特別好使) 知道這些鎖之間的區別,使用場景?- 進程間通訊方式
- 匿名管道與命名管道的區別:匿名管道只能在具有公共祖先的兩個進程間使用。
- 共享文件映射mmap mmap建立進程空間到文件的映射,在建立的時候並不直接將文件拷貝到物理內存,同樣採用缺頁終端。mmap映射一個具體的文件可以實現任意進程間共享內存,映射一個匿名文件,可以實現父子進程間共享內存。
- 常見的信號有哪些?:SIGINT,SIGKILL(不能被捕獲),SIGTERM(可以被捕獲),SIGSEGV,SIGCHLD,SIGALRM
- 內存管理
- 虛擬內存的作用?
- 虛擬內存的實現?
- 操作系統層面對內存的管理?
- 內存池的作用?STL里內存池如何實現?
- 進程空間和內核空間對內存的管理不同?
- Linux的slab層,VAM?
- 夥伴演算法
- 高端內存
- 進程調度
- Linux進程分為兩種,實時進程和非實時進程;
- 優先順序分為靜態優先順序和動態優先順序,優先順序的範圍;
- 調度策略
- 交互進程通過平均睡眠時間而被獎勵;
- 死鎖
(1) 死鎖產生的條件;
(2) 死鎖的避免;- 命令行
- Linux命令 在一個文件中,倒序列印第二行前100個大寫字母
cat filename | head -n 2 | tail -n 1 | grep "[[:upper:]]" -o | tr -d "
"| cut -c 1-100 | rev
- 與CPU,內存,磁碟相關的命令(top,free, df, fdisk)
- 網路相關的命令netstat,tcpdump等
- sed, awk, grep三個超強大的命名,分別用與格式化修改,統計,和正則查找
- ipcs和ipcrm命令
- 查找當前目錄以及字母下以.c結尾的文件,且文件中包含」hello world」的文件的路徑
- 創建定時任務
- IO模型
- 五種IO模型:阻塞IO,非阻塞IO,IO復用,信號驅動式IO,非同步IO
- select,poll,epoll的區別
- 線程池,內存池 自己動手實現一遍
Linux的API
- fork與vfork區別
fork和vfork都用於創建子進程。但是vfork創建子進程後,父進程阻塞,直到子進程調用exit()或者excle()。
對於內核中過程fork通過調用clone函數,然後clone函數調用do_fork()。do_fork()中調用copy_process()函數先複製task_struct結構體,然後複製其他關於內存,文件,寄存器等信息。fork採用寫時拷貝技術,因此子進程和父進程的頁表指向相同的頁框。但是vfork不需要拷貝頁表,因為父進程會一直阻塞,直接使用父進程頁表。 - exit()與_exit()區別 exit()清理後進入內核,_exit()直接陷入內核。
- 孤兒進程與僵死進程
- 孤兒進程是怎麼產生的?
- 僵死進程是怎麼產生的?
- 僵死進程的危害?
- 如何避免僵死進程的產生?
- Linux是如何避免內存碎片的
- 夥伴演算法,用於管理物理內存,避免內存碎片;
- 高速緩存Slab層用於管理內核分配內存,避免碎片。
- 共享內存的實現原理?
- 系統調用與庫函數(open, close, create, lseek, write, read)
- 同步方法有哪些?
- 互斥鎖,自旋鎖,信號量,讀寫鎖,屏障
- 互斥鎖與自旋鎖的區別:互斥鎖得不到資源的時候阻塞,不佔用cpu資源。自旋鎖得不到資源的時候,不停的查詢,而然佔用cpu資源。
- 死鎖
其他
- ++i是否是原子操作 明顯不是,++i主要有三個步驟,把數據從內存放在寄存器上,在寄存器上進行自增,把數據從寄存器拷貝會內存,每個步驟都可能被中斷。
- 判斷大小端
設計模式
- 單例模式線程安全的寫法
- STL里的迭代器模式,適配器模式
分散式系統
- map_reduce原理 (這篇文章講的很通俗易懂)
- 負載均衡
- CDN
主要列出考察內容的方向,問題的理解就得靠自己實踐和閱讀書籍了,相關問題的答案在我這篇博客中給出了自己理解的程度,歡迎交流!
你都看到這了,不點個贊再走嗎?
去年實習生招聘的時候面試了騰訊的後台開發。這裡的後台開發指的就是Linux上的C++編程。首先澄清一點,很多大學生(比如我以前)對後台開發的誤解,通常人們說前端後台,後台就馬上聯想到web後台,java、php和各種web框架橫飛的既視感。所以當時我看到招聘後台工程師,技能要求是C++也滿是狐疑。 其實web後台屬於後台,但後台(姑且稱之為大後台)卻不只有web後台。兩者是包含關係。從網路協議的角度分析,web後台聚焦的是HTTP,而一般C++後台更多聚焦的是TCP。web後台可以看作是一個大後台最靠前的東西,它解析了HTTP請求,然後可能層層轉發給了後面整個分散式系統的許多組件,然後調用他們的服務。公司內部伺服器主機之間絕大部分是通過TCP來通信額。具體來說C++後台關注的是socket,也就是網路編程,還有並發的知識(當然了C++也可以做web後台的:CGI 逃)。因為大公司的server一般都是Linux,所以應聘C++後台,一定要會Linux,這裡的會Linux操作大致分為兩類:
- 一類是Linux基本操作,包括常用Linux命令和工具的使用、shell腳本的編寫,能通過腳本完成一些日常任務。
- 另一類才是重點——Linux環境編程,你需要對Linux/Unix環境下各種環境編程的API要熟悉(POSIX那些函數,當然ANSI標準庫的函數也要熟)。經常考察的就是IO、各類IPC的操作方式、socket通信的流程、select/poll/epoll 等IO多路復用模型。socket和IO多路復用是網路編程的重點。
題主還問操作系統一般問什麼,這些東西就是一般和操作系統雜糅到一起的,學習Linux環境編程絕對不僅僅是記憶幾個函數介面那麼簡單,因為大多數是系統調用,參與內核操作的,所以需要了解其中的原理,而其中的原理就是操作系統的概念了,比如上面我說的IPC,就可以扯出fork函數,進而面試官就可以問題進程的其他東西,然後和線程做過比較之類的,線程又可以牽扯出同步、互斥鎖等概念,怎麼樣是不是想起操作系統課本了。還沒完。
其實面試製勝的關鍵並不是面試官會問你什麼,而是你能主動給輸出什麼。面試不是做選擇題,判斷題。換句話說:要學會舉一反三。比如他不問你Linux環境編程,他問了你一個malloc、new區別之類的東西,這個問題很好答,說完之後呢,你可以主動輸出一些更深入的東西,通過它們的區別來深入談論操作系統的內存管理,比如邊界對齊,還有這塊內存的首部或尾部包含其他信息等等。具體可以閱讀CSAPP內存管理的章節,此外了解一下C++的placement new可以幫助你對malloc和new的區別有更深的了解,從而更好的回答這類問題。C/C++語言的一大特點就是,語言不僅僅是語言,你總能和操作系統扯上一腿。 另外無論是哪種後台,資料庫是必然逃不開的。你肯定要對資料庫有了解。不僅僅是SQL,還要懂一些優化,了解主鍵的原理(B樹/B+樹啊)。MySQL的話,了解一下引擎的知識吧。數據結構、演算法等內容也是必考,不過那不只針對C++後台開發,這裡就不過多介紹了。
如果你想知道C++怎麼寫web後台的話,那麼了解一下CGI。HTTP協議的內容也是知道比不知道要好。起碼知道個get/post,cookie/session之類的。。
以上針對應屆生,不是長期職業發展。。因為我本人也是本科生,所以不確定研究生的面試是否會更深入。吐槽一下,在Java大法好的年代,我等C++碼農越來越少了,不過如果你碰上招聘C++的公司的話,通過概率也較大哦,因為競爭也少。。
我在投行和對沖基金都面試過人,主要思路還是解決實際問題,不會去太追究一些偏的語言語法。我也不會只按照一個問題列表來問,經常對方的答案中提到了一些東西,我會抓著問下去。非常靈活。我也不一定在意對方是否立刻給出正確答案,我更希望看到對方的思考過程。基本的概念和邏輯不能有錯。有一些問題可能有一些偏向性,和我個人的經驗有關,這個因素我也是會考慮的,不會太苛求。
舉一些例子,以及我希望看到的答案。注意,這裡只包括C++語言,而沒有考察演算法和數據結構。語言只是一個方面,一般情況還是要用一些演算法題來考察程序員的。
對剛畢業的在學校有一定C++經驗的學生:
double a = 1/3; a=? 很多新手都答錯的問題,答錯了說明沒有寫過數值代碼,這種bug非常難查。virtual function 的實現,vtable這是基本問題了,幾乎每個人都會提到vtable這個詞,但是不熟練的人會認為vtable是跟著每個object的。還可以問virtual function的缺點,能答出有利於compiler做優化算是不錯的。
reference和pointer的區別。哪些情況非用pointer不可。
vector的增長, map的實現,iterator invalidation相關的問題。
為什麼要用virtual destructor? 為什麼沒有virtual constructor? 如何定義clone來實現類似virtual constructor的功能?
inline的優劣,inline keyword的含義。
memory alignment and padding, 看看對方有沒有這種底層的概念。
實現一個簡單的vector的move assignment operator.
對有一定經驗的朋友:
std::shared_ptr的實現。關鍵是reference count在哪裡定義。能一次答上來當然最好,如果不行的話我希望對方能在我的引導下的出正確答案。可能有人會回答class data member或者是static variable,我都會告訴他們不正確,但希望他們自己解釋為什麼不正確。這個問題主要是考察是不是真的了解share_ptr。unordered_map的原理。Hash table是如何實現的。如果從空的table開始一直增加元素,會出現什麼情況。我希望對方能答出rehash,這個在低延遲系統裡面非常重要,一個rehash就會不小的延遲了。
mutex在Linux系統下如何實現,一個lock操作的成本是什麼,是否block的成本是不一樣的。mutex和spin_lock的區別,優缺點。
dynamic_cast是怎麼實現的?這是難題。能有思路就說明有讀過ABI了。我自己不止一次被人問到過,第一次沒答上來。
用template 寫factorial。
C++ 03有什麼你不喜歡的語法或者功能?這題目算是聊天題,光這個題就可以聊上半個小時了,可以看出對方的功底怎麼樣。
final和override的作用,以及使用場合。概念很簡單,我更關心的是對方是否真正知道為什麼要用它們,在什麼情況用?不用會有什麼後果。
Throw exception和return error code各自的優缺點。
lambda function, capture by reference by value的區別。
new expression, operator new和malloc的聯繫。1.c++的基本知識,主要是一些c++特性的東西,問的比較多的是c++多態、虛函數,特別喜歡問vector與List的原理。2.多線程相關,多線程主要問高並發、通信,然後還有鎖相關的東西,3.資料庫方面的知識,資料庫主要是一些常用sql的編寫,怎樣提高資料庫的性能,mysql與oralce的特性等。4.網路通信,主要是TCP/IP和Http,TCP/IP就是幾次握手,可能會手寫簡單的客戶端服務端的實現,Http主要問一些Http協議中的東西,比如Http的格式,最喜歡問get和post的區別5.linux的會問一些常用命令,比如查看進程、查看網路、許可權修改等等,然後就是gcc相關的東西,可能還會問一些c++在linux與windows開發下有哪些不同,需要注意什麼。6.如果你前面答得不好,可能會進行白板編程,主要涉及一些常用演算法和數據結構ps:應屆生的話,多刷題目,筆試成績好的話,面試就不會問那麼多技術問題了,可能就是閑聊一下,問問平時看什麼書,喜歡什麼運動等等
本科應屆生,不請自來答一發吧。 既然是C++後台開發,那就不會局限於C++本身,除了C++之外還有後台開發的相關內容,根據我自己面試的情況,主要分為:數據結構和演算法,C++,計算機網路,操作系統(Linux)幾塊。當然總不會所有的內容都面面俱到,面試官還是會根據你簡歷來選擇側重考察哪一方面的知識的。比如我個人簡歷上突出的是C++和Linux方面的經歷,所以這兩塊問的比較多。 首先是數據結構和演算法,都說這是程序員安身立命之根本,一般面試第一關遇到的都是面試官說「我們來寫個演算法吧」,我遇到的演算法基本上要麼是位運算的,要麼是DP和貪心,有一些查找和排序(包括topK)演算法,很多leetcode和劍指offer上面的原題或者變種題,難度中等吧。數據結構的話比較簡單,最難的也就考過字典樹,好像大家都遵循著夠用就行的原則,反正就是隊列,樹,圖,這幾種,主要考察的是各種操作的時間複雜度,應用場景怎麼選擇等等。 然後是C++部分,基礎語法是不會考的,很喜歡考類的內存布局,vtable的原理,虛繼承的時候類內存布局,多繼承的時候類的布局。另外一個重點在內存部分,只要跟內存相關的都喜歡考,對指針的理解,allocator的實現,vector內存分配的策略,各種智能指針實現原理及其使用注意事項, rule of three, RAII,內存泄漏的原油時候如何調試等等。 Linux這裡主要考察進程調度和進程生命周期,特別是CFS調度演算法,幾乎是必問,進程部分還有進程間通信。還有文件系統,對VFS的結構很喜歡考,解釋軟鏈接和硬鏈接(從inode和dentry去解釋),還有文件緩存,IO調度演算法等等。Linux這裡也喜歡問內存,slab,slub,夥伴演算法,進程內存空間,線程內存空間等等。在系統編程層次主要考察各種IO系統調用、進程相關的系統調用、socket編程。然後把這些系統調用對應到進程生命周期和進程間通信的各個階段去考。還會考查高級IO操作,IO多路復用,poll,epoll等等,AIO,零拷貝。另外就是Linux的各種使用命令等等,都是常用命令,sed,grep,top這種。 計算機網路主要集中在tcp/ip還有http上面,喜歡考tcp/ip的各種狀態轉移,把UNP中那副狀態轉移圖中的11個狀態背下來就可以應付,還有就是滑動窗口,慢啟動,快恢復等等,偶爾會考路由演算法。Http會考查一些狀態碼,各種http選項,重點考查緩存控制,考查keep-alive和pipe line等等。 大概知識點就是這些了,以後再慢慢補充細化。
個人見解。
拋開演算法的話。
OOP三大項,封裝繼承多態。v func是怎麼實現的,一般考到v table還能挺住的人不多。以前面pure storage被給了多重繼承虛函數指針問在內存里是什麼樣的。這麼用心艹的不多見,但v func有太多可以問的
把所有const static的各種情況都看一遍。雖然有點可笑,但還是有很多人分不清const pointer和pointer to const以及兩者合體的區別的。static放在不同的地方不是一回事。
內存泄漏肯定是會被問的。rule of three是基礎。exception safe是難點。解決方法其實都很簡單,在工業界,smart pointer就完,沒那麼多花樣。工業界基本見不到裸指針。別小看exception safe,很耗時間學的。
然後就是stl,大多數自詡懂的C++的人,包括曾經的我,基本都講不明白allocator是怎麼回事。
RAII,至少要聽過。
其他的想考你的太多了,但我覺得僅僅是應用C++的話,這些應該差不多重點了。
OS作為考OS來說,那多深都有可能。如果問C++的話,取決於公司。大公司進去就是螺絲釘,框架都是好的,用而已。
小公司會怎麼考,無法預測。但os還是要好好看的,熟悉了你可以秒殺一切所謂系統設計的題,真的。現在大多數玩意其實都是六七十年代那幫大牛玩剩下的。
OS學校出來的人基本會集中在兩個知識點上,進程管理和文件系統。前者對非infra的開發類很重要,infra類兩者都重要。基本知道進程是什麼玩意,什麼是context switch,現實中你幹什麼會觸發它且cost是什麼。virtual mem和physiccal mem分別是什麼。理論上就好,這東西面試時面試官也只能用嘴問。當然你要是寫過nachos或者mit那個累UnixV6這都是小case。
分散式我不覺得本科會涉及,但說真的不難,當年我憑著GPU並行計算的一點功底和OS的知識也從來沒倒在過這類問題上。總歸talk is cheap嘛~
後端的話,好好看看SOA和REST,你做後端逃不出這倆。以及js 的single page application的原理(很多應用需要這個理念去減小延遲),以及C++如何實現async。你對node和engine x多少要有點基礎了解。
看看MVC,所謂後端,就是M,前段無非是個C。
Design Pattern初學者說能看懂比較難,大致掃掃知道點名詞。
弄明白進程,stack和heap。我給你個簡單的程序,你能在內存里給我畫出來從頭到尾的經過。
concurrent programming一般不會考到。也最需要實際經驗成長。簡單的例子最好能寫出來。race condition有些很複雜的你看不出來但簡單的要能說明白。
明白cpu cache是怎麼運作的。為什麼很多數據結構或演算法明明很好卻很慢。Locality。
如果你很好的明白concurrent,那instruction pipeline要是能講明白就更好了。
敏捷式開發你要明白是怎麼回事。code review,測試流程多少要有個概念。
template平時沒用過太野性的方法,都是中規中矩。metaprogramming多少要明白好處在哪。這東西玩好了好厲害,美國在火星上那小車裡面幾乎都是metaprogramming。
忘了講了,static linking,dynamic linking,優缺點。
你是老牌公司後段很可能會遇到sun的機子,sun的unix的linking只走一遍,就是說你的程序里一定要避免環形dependency。非有環的話,除了手動加,你怎麼解決?其實這是演算法層面的東西。
我給你幾個文件組成的程序,你要能給我講明白從compile 到likning到最後每一階段所做的事。如果你是用宇宙studio編程的,這點要重點複習。
同樣,如何manage大型C++ code。怎麼分成模塊,合理的繼承。更重要的是,怎麼分模塊測試。
讓你現場寫程序記得能加const加const,小程序全inline,能傳ref別值copy。開頭一定要有哨兵,就是#ifndef #define #endif
出手就有namespace,告訴別人你是干過活的。
去看Google c++規範。c++是不同代碼風格能寫成截然不同的語言。
能用stl絕對不自己寫。tranform那些要會用。要會自己寫comparator。尤其是傳給set和map的。
一定要有進程的概念,比如如果只有一台機子,你自己弄個in mem cache肯定比redis快。
講smart pointer一定要提到一個思想,就是誰擁有這個指針。
大多數人看書只看第一章,所以用宏做計算的風險很可能會被考到。詳情見scott meyers effective第二章。
目前就想到這麼多,非大牛,個人經驗分享。
補充
c++11不需要過度的在意,先看好基礎,大多數工業界的人自己也還在學習階段,而且除了fancy的新項目,成熟的項目一般不會跟風追新。
但smart poibter一定要看好。一般C++做出點樣的公司,內部都有自己的C++標準,很早就基本都是處在一個03和11之間的一個狀態,主要就是smart pointer。
你能會自然是好,但一般不會強求。和metaprogramming一樣,面你的人在這方面很可能還停留在理論帝的水平呢。太多東西都是私下玩,很多東西工作中不一定總能碰到。
若有時間,scott meyers的四本effective絕對經典。
如果你能上youtube,搜jon kalb在cppcon上的exception safe,講得非常好,當年cppcon最佳talk。他在今年九月的cppcon做chair。
再補充:
等編譯的時候寫的答案想不到得到大家這麼多謬讚,萬分感謝。
關於是否針對應屆生這件事,我個人建議應屆生最好別把自己當應屆生。首先應屆生里名校導致能力超強的,學校c++很強導致這一門特彆強的,以及有些五年本科其中算在課程里強制兩年去實習的,這些都大有人在,這些人的實力遠超於大家眼裡應屆生的標準,而你要和他們競爭。
其次面試官一般不會指望應屆生能回答出所有的問題,但會傾盡所能地去問,這樣雖然沒幾個人能全回答上來,但可以對這一批candidates得到一個很清晰的層次,誰強誰弱。面試沒有硬分數線,誰做的更好,誰就能脫引而出。另外如果某一點能打開話題,可以了解到他在學校時非課堂上的技術愛好,同時可以了解到他與人交流的能力。強者留下,弱者離開,不會因為應屆生就放水什麼的,更何況大家都是應屆生。而且不是說全問,聊天嘛,在某個知識點順勢就切進去了。
experienced有experienced的面法,一般會更偏重去深入到領域層面看其是否和組裡做的東西契合。Experienced很少有普招的,都是組裡自己面。
一定要動手。親手做過的東西,你永遠不會忘。就算一時想不起來,幾個關鍵詞一提點,馬上就全回來了。
最後,不要忽略數據結構和演算法的份量。
//======
大多數公司是不會用Boost的,因為它們自己就是Boost++。想起以前我們公司一個C++的超級大牛聊天時曾提到九十年代有一個詞叫contract programming。就是說我給你一切先決條件,只要你滿足了這些條件,那麼我的code保證一定肯定絕對work as expected。不是萬能,而是發覺一切缺點要麼解決要麼設先決條件,用設立一個和用戶間的contract來保證一定肯定絕對的正確性。
而boost滿足不了這一點。官網FAQ都自問自答,這個library保證一定work嗎?不,我們不敢保證。應該不是實力問題,而是社區軟體不會那麼push自己?我也不清楚。但大多數公司在11之前都會自己造輪子。而且負責任的公司不會出了事寄希望於一個社區。還是自己寫靠譜。
僅僅是覺得有趣的事情補充一下而已。同樣只是一家之言,boost的缺點還很多比如去看看它的bug list。boost是超強的思維發散地,但實現方面很多人不是很喜歡。看Boost的優先順序一定在看C++11之後。C/C++校招面試,跟其他技術崗位類似,一般問三方面內容:基礎知識+演算法+項目
基礎知識,可以參考牛客網的專項練習:智能專項練習
演算法部分,面試主要刷這兩個題庫: 劍指Offer , leetcode
項目部分,面試官會根據你的項目進行深入的提問,看看你的知識掌握情況和項目經驗。
具體內容通過看別人的面經就可以總結出來了,牛妹幫你整理了 篇C/C++面經供參考:
1、今日頭條視頻面試
2、好未來電面面經
3、分享下我被頭條三面掛的經歷 T o T
4、華為二面心得 Take IT Easy
5、百度地圖面經
6、阿里C++研發實習二面和三面面經(已跪)
7、【阿里、騰訊、頭條】等12家企業【C++方向】30場面試經驗
8、阿里校招實習一面面經
9、春招cpp後台開發 360 美團 好未來
10、去哪兒網, 騰訊, 百度(5.22已拿offer)
11、阿里巴巴秋招再見
12、銀行筆面試經驗貼_工行軟開+農行軟開+招商銀行軟開+民生銀行
13、今日頭條 騰訊 宜信 完美_C++_春招_面經
14、遊戲C++客戶端面經(完美,360,騰訊IEG,網易雷火)
15、被掛了10次的菜雞春招之旅
16、春招實習分享
17、百度三面(offer)amp;amp;阿里四面(進行中)
18、本科大三渣渣的實習路
19、新疆學子的騰訊後台開發的面經
20、今日頭條實習面經
21、雙非大三春招實習面經
22、實習面試總結
23、騰訊C++面經
24、京東C++面經,狀態hr後等結果中
25、去哪兒(一面+hr面offer)
26、阿里,摩根,野村,騰訊,微軟,圖鴨科技面經分享
27、華為(蘇州)4.16號面試經歷
28、騰訊2017實習生招聘後台開發c++崗位面試
29、第一次面試的總結:騰訊2017年實習生招聘
30、希望或多或少有幫助:4月11日網易杭研面經
31、阿里內推三面C++開發
32、360搜索服務端-C++面經(一面+二面)
33、春招總結 - 一個錯過秋招的浪子的心酸求職路
34、回報牛客~越努力,越幸運!CVTE實習生研發崗面經
35、中興實習面試技術面+綜合面(已Offer)
36、百度三面熱乎的面經,之前京東和完美的面經有空再補吧
37、北京百度C++一面二面經驗
38、弱弱的發一下招銀電面攢人品
39、騰訊一面,攢人品!
40、趨勢科技面試問題
41、cvte 電話一面c++
42、招銀科技一面 c++
43、網易雷火線下筆試
44、塗鴉移動一面面經
45、CVTE面試全過程
46、關於面試一點感觸
47、阿里四面面經 + 已成功拿到offer
48、金山內推電話面試
49、螞蟻金服C++一面_筆經面經_牛客網
50、微店面經_筆經面經_牛客網
51、騰訊二面三面、百度二面三面面經
52、分享面試歷程 -- 海康 百度 華為
53、怕是要來回報一下牛客網了
54、2016年面試總結(c++,機器學習),希望給同學們一點幫助
55、失敗的深信服一面
56、真·學渣的秋招總結
57、我的2016筆試面試經驗(送給下一屆的學弟學妹們)
58、熱騰騰的面經來了:360、歡聚時代的測試開發 華為C++開發
59、去哪兒2016.10.10在線筆試writeup
說一說我司的面試風格。
首先面試官會詢問面試者對哪個技術領域最熟悉,或過去做過的項目里哪個地方最得意。然後根據面試者的回答,深入的問下去。
例如,面試者熟悉網路編程,那麼我們通常會問有哪些方式可以實現非同步通信?網路編程性能瓶頸通常在哪裡?
如果是對多線程編程熟悉,那通常會問怎麼設計線程模型?怎麼進行線程間通信?
如果用過 C++11,那麼來解釋一下 RValue Reference 是怎麼回事?有什麼好處?
此外,還會安排一道簡單的編程題目,可以用任意語言。
總的來說,面試官不會為難面試者,而是儘可能的挖掘面試者最擅長的領域,以及對這個領域理解的深度。然後再引導面試者在這個方向繼續深入下去,並觀察面試者在這個過程中的反應。
如果面試者能清晰地描述自己已經了解的知識,並且能夠在面試官的引導下對這些知識有進一步的認識,那這種面試者就是我們想要找的人啦。
對於面試者的背景,其實並不重要,不知道就說不知道好了,並不會減分,面試官也有好多不知道的事情呢。重要的是理解能力和學習能力。像 C++ 語言本身的知識,只要有足夠的理解能力和學習能力,在項目中鍛煉 1~2 個月足夠了。
c++這種雜而全的oo語言,是很難通過面試官的刁難的。不管我是被面試的要去過別人的刁難,還是我是面試官去刁難別人,一般想刁難都能弄死對面的。這和水平沒什麼關係,實在是c++這個玩意兒太豐富了,能不利用網路和電腦到面面俱到的人……一定是吹牛逼的
所以,我個人只會問一些像 @chencw2ly說的一樣的簡單問題,來看看對方經驗是否和簡歷上描述的比較符合。
然後實際上決定對方是否合適的有:
1. 對方談吐,思路,解決問題的方式方法等軟技能這些軟技能基本很多其他工種也會用到,就不談了2. 對方對「漂亮」的代碼理解的方向,是否符合心意。
所謂漂亮的代碼,就是你用代碼去解決問題的時候,認為最舒服,最美妙,成本最低的解決方法是什麼樣子的。這決定了將來他參與項目的時候,解決問題所寫的代碼質量是否能被團隊接受。3. 對方和其他競爭對手相比的優勢
這個當然不能這麼問,而是應該通過多個角度的觀察和詢問得出相對靠譜的結論。我也希望我去別的企業面試的時候,別的企業面試官或者老闆,和我談的也是這些內容。
如果有人像匿名用戶的回答那樣面面俱到的問我,我一定甩包走人。這樣的企業,不去也罷。要有這樣的覺悟:
你是去拿人錢財替人消災混口飯吃的,不是去做百科全書的。啊當然,我的態度僅供職場老油條參考,應屆生千萬別這樣,面試官就是大爺,把他們伺候爽了才是你們的義務。恰好最近在做招聘,面試了從近乎應屆到工作十年八年的c++後端工程師。說一說我面試考察的一些重點首要考察的,當然是基礎知識。從最基礎的c++基礎語法知識以及stl原理,到初級的多態的實現,再到高級的內存模型,c++11的新特性,最後到模板編程,基本可以了解面試者對c++的掌握程度,可以對面試者的c++基礎打一個分數,十分滿分我還沒面過超過5分的…其次要考察的是語言無關的基礎知識,包括操作系統概念相關知識,多線程編程,網路編程,TCP相關網路知識,編譯原理相關基礎知識,數據結構,演算法。我會視面試者簡歷來著重問某幾方面,演算法數據結構是必然要考察的重點。最後要考察的是存儲,計算相關的流行技術,面試者讀過redis源碼,我就問redis相關的技術,讀過leveldb,我就問leveldb,用過nginx,我就問nginx。最後會出一個開放性的問題,來考察面試者的發散思維。
九月份面試了幾家公司,我感覺C++方向的問題基本都有套路了,有幾個問題很常見,比如:1. vector增長模式2. 虛函數表3. 函數指針複雜形式的識別4. HASH的設計5. 幾個常用工具的使用,gdb,gcc,git還有很多,不過我期中見過一個問題,感覺很有價值,就是面試官讓你講講一個程序從源代碼編寫一直到程序執行整個生命周期的過程,講的時候可以在自己熟悉的領域多說幾句,很開放的一道題目。
因為自己也是剛剛畢業,知道在校招的時候是怎樣過來的,社招還不是特別清楚,在這裡列出常問面試題回饋大家。
1、分析下面代碼有什麼問題?_C/C++常考面試題_牛客網2、分析下面代碼有什麼問題?_C/C++常考面試題_牛客網3、指出下面代碼有什麼問題?_C/C++常考面試題_牛客網4、寫出完整版的strcpy函數_C/C++常考面試題_牛客網5、檢查下面代碼有什麼問題?_C/C++常考面試題_牛客網6、下面代碼會出現什麼問題?_C/C++常考面試題_牛客網7、下面代碼會出現什麼問題?_C/C++常考面試題_牛客網8、下面代碼會出現什麼問題? _C/C++常考面試題_牛客網9、看看下面的一段程序有什麼錯誤?_C/C++常考面試題_牛客網10、分別給出BOOL,int,float,指針變數 與「零值」比較的 if 語句(假設變數名為var) _C/C++常考面試題_牛客網11、以下為Windows NT下的32位C++程序,請計算sizeof的值 _C/C++常考面試題_牛客網12、寫一個「標準」宏MIN,這個宏輸入兩個參數並返回較小的一個。_C/C++常考面試題_牛客網13、為什麼標準頭文件都有類似以下的結構? _C/C++常考面試題_牛客網14、編寫一個函數,作用是把一個char組成的字元串循環右移n個。_C/C++常考面試題_牛客網15、已知WAV文件格式如下表,打開一個WAV文件,以適當的數據結構組織WAV文件頭並解析WAV格式的各項信息。 _C/C++常考面試題_牛客網16、編寫類String的構造函數、析構函數和賦值函數_C/C++常考面試題_牛客網17、請說出static和const關鍵字儘可能多的作用_C/C++常考面試題_牛客網18、請寫一個C函數,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1 _C/C++常考面試題_牛客網19、寫一個函數返回1+2+3+…+n的值(假定結果不會超過長整型變數的範圍) _C/C++常考面試題_牛客網您好,可以去我的github,已整理,求給個star。https://github.com/chankeh/cpp-backend-reference/blob/master/back-end.md
應屆生么,其實最重要的是,聰明上進合眼緣。
如果有項目經驗,或自己的代碼量較高,更佳。
如果再功利一些的話,那去買幾本面試寶典,犯不著在知乎上問。
千里之行,始於足下,白駒過隙……想想當年自己也是這樣過來的,工作之後仍不能懈怠,學習你們都問這麼複雜的問題,能招到人嗎?
我只要能正確回答 sizeof 的返值,並且能寫個簡單的字元串拷貝的就行。
就這樣,10個面試都沒一個合格。
建議刷題的同學。主觀題千萬別刷。反正我只要看著和正確答案雷同一律刷掉。
如果寫精通c++,那一定要問模板了,來來先寫個靜態的繼承關係判斷
前面的簡單問題答不好:撂牌;答好了:留牌,增加難度後邊的難題答不好怨天尤人:撂牌;虛心請教恍然大悟:留牌,錄用後邊的難題答好了:撂牌
前段時間參加了好幾個公司校園招聘的C++後台開發崗位的面試。其實主要來說面試的都是些基本知識。1)Linux基本操作,gcc、gdb、makefile、shell腳本2)C++虛函數、純虛函數、派生類對象的內存分布、STL基本原理等等吧3)演算法與數據結構,可能是應屆生項目也沒啥價值吧,這部分還蠻多的,蠻考驗智力的4)多線程、多進程、還有那個IPC的幾種方式、計算機基礎知識比如:64位CPU指的是什麼?(這個問題大意了,我想都沒想脫口而出地址匯流排寬度,實際上是通用寄存器寬度或者是數據匯流排寬度)
換過幾次工作,說下自己被考過的問題。多態,虛函數實現原理是被問最多的。其次是gdb的用法。再就是用c++實現基礎的數據結構,演算法
主要是要順眼可以培養就行。
我現在已經從事互聯網行業招聘快2年,為各大互聯網公司招人,包括大到BAT,小到初創公司;但是其實,我懂的C++知識不多,都是很表面的,不過招聘也完成的不錯,也基本能跟程序員們能聊個大概。但是如果你讓我說什麼是C++,具體我真心說不出來,還是要綜合學習比較技術性的東西,才能了解C++呀~
演算法,多線程,C++1x。
推薦閱讀:
※C++開發轉後台還是Android?
※應屆生做基礎架構適合加入大公司成熟的部門么?
※mac下python爬蟲亂碼問題?