C/C++後臺開發需要點亮哪些技能樹||(鵝廠爲例)

前言
首先一般公司分爲前端和後端,前端就是和用戶打交道的,負責用良好的視覺效果將數據呈現給用戶,廣義的前端包括客戶端(安卓、IOS)、Web前端、小程序等。

而與之對應的後端則是負責業務邏輯處理,比如下單、支付等,重在業務流程的處理。

後臺一般和後端是一個意思,而服務器開發則稍微廣義一點,不僅包含了後臺開發,而且也包括支撐整個後臺應用的基礎開發,比如搜索引擎、微服務、RPC 框架、KV、存儲、MQ 等。

後臺/後端重在業務處理,是偏向應用層開發,而服務器開發不僅包括應用層開發,更是囊括了整個支撐後臺業務的相關組件的開發。

那 Linux C/C++ 服務器/後臺開發指的什麼呢,其實就是基於 Linux 上 的 C++ 編程。

但是相比 Java 系更強調 Linux 系統編程、網絡編程能力,有的還會涉及到服務端底層協議和網絡框架開發。

傳統的 Java 、Go後臺開發偏向 Web 開發,也就是接收前端請求,通過微服務互相調用,完成業務邏輯處理,然後返回給前端。

實際上在騰訊這邊的 C++ 後臺開發,也是類似的,本身有非常成熟的基於 C++ 的微服務體系,大多數開發也只需要關注業務邏輯就好,不過還是會要求 Linux 系統編程、網絡編程等能力。

後臺開發都考察哪些?

什麼技術水平,才能騰訊T9(原T3.1)offer?

一般來說 Linux C/C++ 後臺開發方向涉及以下這些基礎知識:

C/C++ 語言特性和實現原理
計算機網絡
網絡編程 和 Linux 系統編程
操作系統原理
部分 Linux 內核原理,如內存管理、文件系統、虛擬內存等
Linux 常見命令使用
算法與數據結構
數據庫使用及原理
常見 NoSQL組件,如 Redis、Memcached
版本控制 Git
非必選加分項:









分佈式相關,如一致性協議比如 Raft 算法、分佈式存儲等
docker、k8s 等虛擬化和雲計算相關的
系統設計能力,如短鏈服務、評論服務、Feed流系統、搶紅包、秒殺等在這裏插入圖片描述

常遇面試考察知識點:

c/c++相關

  • c++虛函數原理
  • 智能指針
  • c語言如何實現c++對象以及私有成員
  • c++多態實現
  • new和malloc的區別以及底層實現原理
  • STL中的vector怎麼擴容
  • 虛函數指針的初始化過程
  • c++11原子變量介紹
  • c++11特性有哪些,說用過的
  • 怎麼理解重載與重寫
  • 怎麼理解c++中的static關鍵字
  • vector和list 的區別
  • c++的內存分配
  • map與set的底層實現
  • 類靜態變量的初始化
  • 析構函數可以是虛函數?爲什麼
  • 深拷貝與淺拷貝
  • 指針常量,常量指針的區別

c語言語法推薦書籍: 《c專家編程》《c與指針》

c++語言語言推薦書籍:《c++ primer》《effect c++》

c++語言stl底層原理:《STL源碼剖析》

計算機網絡

  • 介紹下proactor和reactor
  • reactor的組成
  • TIME_WAIT危害
  • TIME_WAIT時長,爲什麼?
  • IP爲什麼要分片
  • 項目中說用到線程池,開多大,爲什麼運用線程池?
  • select和epoll區別
  • select什麼情況返回0
  • epoll可讀情況有哪些
  • 什麼時候需要TCP四次揮手?
  • 如何設置非阻塞
  • 什麼是零拷貝?
  • tcp與udp的區別以及應用場景
  • 如何設計一個可靠的udp
  • 粘包如何解決
  • 講一下擁塞控制和流量控制
  • http和https區別
  • 是否瞭解中間人劫持原理
  • http協議格式,幾種方法,功能是什麼
  • chunk塊瞭解?介紹下
  • 有chunk的時候contentlength是什麼樣子
  • 半連接在哪個階段
  • 三次握手四次握手詳細過程,越詳細越好
  • libevent結構,內部實現
  • tcp的可靠性體現在哪裏
  • ARP協議工作流程
  • epoll中的ET和LT模式
  • 介紹下滑動窗口
  • 指針與引用的區別
  • Accept發生在三次握手哪個階段
  • Udp的接收緩衝區和發送緩衝區和tcp的區別
  • http長連接與短連接的區別
  • udp包長度
  • 一次url訪問會經歷哪些過程
  • 數據包亂序會處理?
  • seq爲1000,發送了1000個數據,下一個seq是多少?
  • syn如果丟了,重傳多少次

tcp/ip相關推薦書籍:《tcp/詳解:1》

熟悉使用wireshark捕包工具,加深印象可以使用python的一個庫,scapy/dpkt.

數據結構相關

  • hash處理衝突的方法
  • 二分查找及其變種
  • 數組與鏈表的區別
  • redis數據結構用過哪些,瞭解跳錶?
  • 紅黑樹比平衡二叉樹有哪些優點
  • 二叉樹,b+樹,hash,二叉查找樹區別
  • 說說紅黑樹的特性
  • 各種樹,排序的時間複雜度
  • 數據庫索引,事務,事務級別
  • 不考慮事務的隔離性會出現什麼問題
  • 事務隔離級別
  • 索引的類型
  • AC自動機時間複雜度

數據結構書籍《大話數據結構》

數據庫相關

  • 如何提高查詢速度?
  • 加了索引就快了?
  • 數據庫索引底層結構
  • mysql與memcache的區別
  • mysql常見三種存儲引擎的
  • MySQL B+Tree索引和Hash索引的區別?
  • B+樹索引和哈希索引的明顯區
  • 非關係型數據庫和關係型數據庫區別,優勢比較?
  • mysql常見查詢優化方案
  • mysql書籍推薦:《mysql必知必會》,《高性能Mysql》

操作系統

  • 進程與線程的區別
  • 多進程與多線程區別,應用場景
  • volatile和原子變量的區別
  • proc文件系統
  • 自旋鎖與普通鎖的區別
  • 虛擬內存
  • 進程的內存分佈
  • 棧內存爲什麼由系統自動分配和釋放
  • 守護進程如何創建
  • 進程間的通信方式及其區別,應用場景
  • 死鎖條件和解除
  • 進程調度方式
  • 對編譯連接的理解
  • 共享內存實現原理
  • 殭屍進程是什麼,如何處理
  • 自旋鎖在單cpu與多cpu下的使用
  • 用戶態與內核態

操作系統推薦書籍:《深入理解操作系統》,《Linux內核設計與實現》

Linux基礎知識及應用編程(後臺必備!)

  • 如何查看進程打開的文件
  • 介紹下nm與ldd命令
  • shell命令查內存,端口 ,io訪問量,讀寫速率
  • awk grep具體應用
  • 硬鏈接與軟連接,目錄可不可以用硬鏈接
  • 常見命令netstat iptable tcpdump top
  • makefile介紹下(cmake介紹下)
  • gdb查看堆棧中所有遍歷
  • gdb查看shared_ptr 指向的內容
  • gdb如何調試多進程多線程
  • g++和gcc編譯出來有什麼區別
  • 死鎖怎麼調試
  • core文件中是什麼,gdb調試core文件
  • 如何讀取一個10G文件,cat一個10g文件會發生什麼

Linux基礎命令推薦書籍:《Linux就該這麼學》

Linux應用編程推薦書籍《後臺開發應用與實踐》《Linux多線程服務端編程》

補充資料:gdb手冊和makefile詳解

大數問題

  • 有200億qq,但實際只有25億用戶,找到重複的qq
  • 25億qq佔用內存多大
  • 1-100萬,計算找出所有的質數(計算密集型任務),用單線程與多線程怎麼處理
  • 1個G的文件寫程序,從A機器發送到B機器,怎麼發?
  • 100G的文本,每行80k還是80字符,提示用多個機器,多進程,多線程,求出重複最多的行。一個機器內存8G,計算每個機器大概分多少?能讀取100G的文本嗎?找重複率前十的文本
  • 三個有序的序列,查找公共的部分,第一次我說用哈希表,他說序列太大,空間複雜度要低點,我說了二分查找,他問三個序列查找的順序和時間複雜度。(時間複雜度爲N*logN
    *logN)
  • 100WURL,如何存儲
  • 10臺服務器,100w用戶,如何進行負載均衡,如何有個服務器掛掉了咋辦
  • 10000個數據查找最小的100個?時間複雜度?
  • 場景題:QQ的服務器會保存登錄用戶的QQ號,只要有登錄,文件裏面就會有記錄,現在需要統計哪些QQ號登錄過,怎麼做?(先說了分治用小文件,他說除了這個了,我說bit數組,他就問需要多大內存?)

大數問題通常的套路是hash,分治,布隆,bitmap,如果推薦的話還是上面數據結構相關資料.當然如果能瞭解下比如hdfs文件系統,mapreduce,spark/flink流式計算最佳哈

手撕算法(遞歸非遞歸)

  • 鏈表有無環判斷
  • 實現一個單例模式
  • 給一個字符串判斷單詞數
  • 開方算法
  • 青蛙跳臺階
  • 常用排序(快排和歸併要寫吐)
  • 反轉鏈表
  • 兩個鏈表,尋找公共節點
  • 查找字符串中不重複的最長子串
  • LRU
  • 手寫求樹的深度的代碼
  • 手寫生產者消費者
  • 編程實現string類
  • 兩個數組A,B,A有的B都有,求B-A;
  • 輸入一個字符串,輸出它的全排列
  • 統計完全二叉樹多少個節點
  • memcpy實現

算法學習書籍推薦《劍指offer》,建議三遍哈。

leetcode分專欄練習幾題,不在多,在於精。

針對項目相關

  • 介紹一個你做的比較的項目,幾個人做的,擔任什麼角色
  • 項目的技術點在哪裏
  • 項目不足在哪裏

你在項目中學到了什麼
讓你優化項目中的一點,如何做
項目什麼架構
測過系統性能嗎,掛掉怎麼辦?
最好是自己做過的項目,即時不是也需要弄明白其架構,爲什麼這麼做,有什麼優點,什麼優化方案?



場景題

  • 給一個場景,設計一下定時對url進行爬蟲,比如對新浪1個小時爬蟲n次,然後某些博客可能1個星期爬蟲1次。
  • 給一個場景,設計服務器實現爬蟲的url去重,如何讓多個服務器對一個url爬蟲指定次數
  • 好多小文件,設計一個服務器來實現如何存儲
  • 設計兩地高效傳文件

這部分

架構/分佈式/中間件相關

  • 常用負載均衡策略
  • 一致性hash原理
  • 緩存容災中數據一致性問題
  • 瞭解cap理論嗎
  • 介紹下高可用,高性能,可伸縮基本概念。
  • 瞭解微服務?docker?k8s?
  • Nginx瞭解到什麼程度,nginx配置更新實現,事件模型

推薦書籍:《redis設計與實現》《從0開始學架構》《docker入門到實踐》《大型網站技術架構-核心原理與案例分析》

疑惑

還有一個很多選擇 C++ 方向同學都存在的疑惑,在這裏我也想解釋一下:

C++ 語言特性多,又難學,很多都是底層開發纔會用到,C++ 就是個坑,是否應該轉 Java、Go 呢?

當然不是的,的確在頭條、美團、阿里這種業務部門使用 Go、Java 系更多,首先還是那個觀點,校招生對於企業來說都是一張白紙,面試官考察的是你的基礎知識和聰明度,來決定是否有培養潛力,語言確實不重要。

那你可能會說,明明各種面經上常常出現 ConcurrentHashMap、虛表、虛函數實現機制這樣和語言強相關的問題。

在我看來啊,面試深入問一些語言實現細節,其實不是在考你語言,而是看你是否有主動鑽研的意識,是不是隻停留在應用的層面,同時也借語言考察一些數據結構、操作系統方面的基礎知識。

所以呢,我覺得 C/C++、Java、Go 你深入學習哪一個都可以,關鍵還是找對相應的學習路線,一直堅持學下去,不要每天都停留在我到底是學 Java 好還是 C++ 好這樣無解的問題。

而且也有不少Java 進騰訊需要轉 C++,C++ 進阿里、美團需要轉 Java 的,這都不是事兒。

那 C++ 目前應用場景有哪些呢?

一句話,對性能或者執行效率要求比較高的應用,比如遊戲引擎、infra、推薦引擎、存儲等,當然也能拿來寫業務(沒錯說的就是鵝廠),也有做 C++ 客戶端開發的,主要是 MFC、QT 等。

說實話,像遊戲引擎、infra這類都是門檻比較高的,並且招聘的數量也有限,一般人很難進,而且目前互聯網公司的業務部門大多使用的是 Java、Go這類語言。

所以 C++ 的需求量是相比 Java、Go 這類少很多的,但是同時學習 C++ 也沒 Java 那麼多,所以相對來說競爭還沒那麼大,並且 C++ 學的不錯,你同樣可以去面阿里、美團這種 Java 技術棧的公司,大廠基本不會限制語言的。

騰訊T9職級對應技術能力
在這裏插入圖片描述
C/C++Linux服務器開發/後臺架構師
Linux、C/C++技術交流羣:【960994558】整理了一些個人覺得比較好的學習書籍、大廠面試題、有趣的項目和熱門技術教學視頻資料共享在裏面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK等等.),有需要的可以自行添加哦!~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章