本科拿到BAT SSP offer,個人Linux C/C++後臺服務器開發學習路線(面經,秋招)

前言

小北去年經歷春秋招,拿到了很多大廠 offer,其中包括 sp、ssp 等,感受在複習準備校招上仍是有必定方法的,由於我本身是 Linux C/C++路線。前端

因此這一篇的主題是「Linux C/C++ 服務器/後臺開發學習路線」。git

這樣的文章相信你們都見得很多了,寫以前也很是忐忑,能不能和其它人寫得不同,
也定下了一個目標,這篇文章,不能是簡單的堆砌學習資源和書單推薦,更要細化如何有效的去執行落地。程序員

爭取作到讓看到的同窗有一種相見恨晚的感受哈哈哈。github

因此你們能夠試着看一下,幫我檢查下有沒有達到預想的效果哈哈,但願不要被打臉🤣面試

那就正式開始吧。算法

這篇文章會有點長有點幹,能夠先去衝杯咖啡,慢慢看~docker

正文 | 乾貨 |收藏

1、後端/後臺/服務器開發?

常常在各大公司招聘上看到後端、後臺、服務器開發等等,有些同窗常常被這些名詞搞混。數據庫

其實這些名詞都是相近的,可是也有點區別,這裏說說個人理解:編程

  • 首先通常公司分爲前端和後端,前端就是和用戶打交道的,負責用良好的視覺效果將數據呈現給用戶,廣義的前端包括客戶端(安卓、IOS)、Web前端、小程序等。
  • 而與之對應的後端則是負責業務邏輯處理,好比下單、支付等,重在業務流程的處理。

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

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

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

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

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

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

2、後臺開發都考察哪些?

通常來講 Linux C/C++ 後臺開發方向涉及如下這些基礎知識:

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

非必選加分項:

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

因爲篇幅限制,這篇文章主要介紹基礎知識的學習路線和方法,其它加分項之後再單獨寫。

3、C/C++

首先是語言的基礎知識,一些關鍵字和實現原理等:

  • 指針、引用、數組、內存
  • 引用與指針區別
  • C 和 C++ 的一些區別,好比 new、delete 和 malloc、free 的區別
  • 虛機制:虛函數、虛函數表、純虛函數
  • 繼承、虛繼承、菱形繼承等
  • 多態: 動態綁定,靜態多態
  • 重寫、重載
  • 智能指針原理:引用計數、RAII(資源獲取即初始化)思想
  • 智能指針使用:shared_ptr、weak_ptr、unique_ptr等
  • 一些關鍵字的做用:static、const、volatile、extern
  • 四種類型轉換:static_cast, dynamic_cast, const_cast, reinterpret_cast
  • STL部分容器的實現原理,如 vector、deque、map、hashmap
  • 模板特化、偏特化,萃取 traits 技巧
  • 編譯連接機制、內存佈局(memory layout)、對象模型
  • C++11 部分新特性,好比右值引用、完美轉發等

這裏列出來的只是一些比較重要的部分,實際上可能只算 C++ 的冰山一角, 你們且學且珍惜吧,這不 C++11 還沒整透徹,C++ 20 又出來了,生命不息,學習不止。

怎麼學?

1. 《C++ Primer》

這本書基本包括了 C++ 11 的所有特性,最好把前面三部分:C++基礎、C++標準庫、類設計者的工具都看一遍,我當時花了一個多月斷斷續續看到了第16章模板那裏。

2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》

第一本是重點,光看《C++ Primer》缺乏實踐的話,大機率還寫不出合格的 C++ 代碼,而《Effective C++》就是經過 55 條很是具體的作法告訴你什麼樣纔是符合 C++ 編碼規範的,能夠縮短你寫出合格 C++ 代碼的時間,減小踩坑,強烈推薦必讀,後面兩本優先級稍低,能夠有時間再讀。

3. 《STL 源碼剖析》和《深度探索 C++ 對象模型》

看完 Primer 和 Effective,你應該已經可以比較熟練的使用C++了,可是還缺乏對 C++ 底層實現機制的認識。好比虛函數表、成員變量佈局等,同時對於 STL 庫可能也僅僅停留在使用上。

推薦的這兩本能夠分別完善你在 C++ 底層實現和 STL 源碼、原理上的認識。

以上書籍同時建議和侯捷老師的視頻配合服用,效果更佳。

直接在 B 站搜索「候捷 C++」便可,主要有如下幾個系列:

  • 《C++內存管理》
  • 《STL源碼分析》
  • 《C++ STL與泛型編程高級》
  • 《C++11 新特性》

我基本都看了,收穫挺大的,建議看下,能夠開倍速。

看完以上資料,算是 C++ 入門了,應付面試也是足夠的,基本到達了正確高效地使用 C++ 這一層面。

是否是聽到這有點崩潰,特麼的看了這麼多,才入門???

若是你想在 C++ 語言上更進一步,那麼有如下的書籍推薦:

  • 《C++ 語言的設計與演化》
這本書是 C++ 之父 Bjarne Stroustrup 寫的,關於 C++ 的前世此生,以及將來的演進方向,能夠了解 C++ 的設計哲學。C++ 複雜的語言特性一直讓人詬病,經過這本書,能夠看到各類特性引入的目的,也更深刻了解到了 C 和 C++ 之間關係。好比 C++ 裏有個原則就是全部的實現機制都不能帶來額外的運行時開銷。

我也正在看這本書。

  • 《C++ 沉思錄》
  • 《C++ Templates》和《C++模版元編程》
C++模板元編程屬於另一個世界了,通常公司裏開發用得比較少,這個也是一個大坑,若是實在感興趣能夠去看看,感覺下 C++ 的博大精深,不過這玩意我也不太會,也不推薦你去花時間在上面。
  • CppCon視頻
這是 C++ 社區組織的相似開源峯會那種,每次都會討論一些關於 C++ 的話題,沒事去刷一個,仍是挺有意思的。
Youtube 直接搜 CppCon 便可找到。

4、操做系統

操做系統這門課,個人感受是易學難精,可是掌握到平常編程和麪試夠用仍是比較容易的。

那麼畢業生或者說你去準備校招面試應該達到怎樣的水平:

  • OS 四大模塊的理論知識: 進程與線程管理、內存管理、IO與文件系統、設備管理
  • 瞭解 Linux 內核部分實現原理,如內存管理、進程管理、虛擬文件系統等

其中內存、進程、IO 是重點,這幾塊也是和編程關係最密切的,這裏推薦先挑本偏理論的書看看,瞭解操做系統的全貌:

  • 《現代操做系統》
  • 《操做系統—精髓與設計原理》

沒必要全看,二者任選一本都不錯,我本身是仔細看了第二本,由於是咱們教材,同時挑着看了現代操做系統部分章節。

這部分看完你應該對下面這些話題有一個清晰認知了:

  • 操做系統由哪些構成
  • 進程的狀態、切換、調度
  • 進程間通訊方式(共享內存、管道、消息)
  • 進程和線程的區別
  • 線程的實現方式(一對1、多對一等)
  • 互斥與同步(信號量、管程、鎖)
  • 死鎖檢測與避免
  • 併發經典的問題:讀者寫者、哲學家就餐問題
  • 爲何須要虛擬內存,MMU 具體如何作地址轉換的
  • 內存爲何分段、分頁
  • 頁面置換算法
  • 文件系統是如何組織的
  • 虛擬文件系統(VFS)是如何抽象的
  • ...

可是這還不夠,看完偏理論的書,當面試官問「進程和線程的區別」時。

大概只能回答出「進程是資源分配的最小單位,線程是CPU調度的最小單位,balabala...」這樣正確卻普通的答案。

可是若是你瞭解 Linux 內核的實現,就能夠實際出發,講講 Linux 中進程和線程是如何建立的,區別在哪裏。

好比在 Linux 中進程和線程實際上都是用一個結構體 task_struct 來表示一個執行任務的實體。進程建立調用fork系統調用,而線程建立則是 pthread_create方法,可是這兩個方法最終都會調用到 do_fork來作具體的建立操做 ,區別就在於傳入的參數不一樣。

深究下去,你會發現 Linux 實現線程的方式簡直太巧妙了,實際上根本沒有線程,它建立的就是進程,只不過經過參數指定多個進程之間共享某些資源(如虛擬內存、頁表、文件描述符等),函數調用棧、寄存器等線程私有數據則獨立。

這樣是否是很是符合理論書上的定義:同一進程內的多個線程共享該進程的資源,但線程並不擁有資源,只是使用他們。

這也算符合 Unix 的哲學了— KISS(Keep It Simple, Stupid)。

可是在其它提供了專門線程支持的系統中,則會在進程控制塊(PCB)中增長一個包含指向該進程全部線程的指針,而後再每一個線程中再去包含本身獨佔的資源。

這算是很是正統的實現方式了,好比 Windows 就是這樣乾的。

可是相比之下 Linux 就顯得取巧不少,也很簡潔。

對於進程、線程這塊你還能夠把 fork、vfork、clone 、pthread_create 這些模塊關係完全搞清楚,對你理解 Linux 下的進程實現有很是大的幫助。

說了這麼多,就是想強調一下理論聯繫實際的重要性。

特別是操做系統,最好的實踐就是看下 Linux 內核是怎麼實現的,固然不是叫你直接去啃 Linux 源碼,那不是通常人能掌握的。

最好的方式是看書,書的脈絡給你理得很清晰。

書籍推薦:

  • 《Linux內核設計與實現》
這本書恰到好處,即講清楚了內核實現的要點,又不會通篇源碼。

這本書重點關注「第 3 章進程管理」、「第 5 章系統調用」、「第12章內存管理」、「第13章虛擬文件系統」、「第 15 章進程地址空間」

這些章節屬於操做系統核心部分,其它如中斷處理、塊 IO、設備管理根據你本身興趣選擇看下就能夠了。

基本上作到這裏,操做系統就沒什麼大問題了。

5、計算機網絡

須要掌握的網絡協議和知識:

  • HTTP、TCP、IP、ICMP、UDP、DNS、ARP
  • IP地址、MAC地址、OSI七層模型(或者 TCP/IP 五層模型)
  • HTTPS安全相關的:數字簽名、數字證書、TLS
  • 常見網絡攻擊:局域網ARP泛洪、DDoS、TCP SYN Flood、XSS等

計網知識比較繁雜,不少同窗都反映網絡很難學,一大堆的網絡協議,依次學完後,仍是不知道網絡是怎麼構成的。

這就是沒有用對學習方法,致使只見樹木,不見森林。

學習時,推薦你抓住一條主線 「一個數據包是如何發送出去的?」

帶着這個問題依次去學應用層、傳輸層、網絡層、鏈路層,思考這些層之間是如何串聯起來的。

這就是自頂向下的思路,那天然要推薦:

  • 《計算機網絡:自頂向下方法》
這本書從咱們最常接觸的 HTTP、FTP、SMTP 等應用層協議講起,能夠清晰看到引入各個層的做用。

好比爲了區分同一個主機的不用應用,引入了傳輸層,並使用不用的端口號做爲區別;

爲了在不一樣子網間傳輸數據引入了網絡層,並使用 IP 地址尋址路由;

網絡層解決了不一樣子網間路由的問題,可是同一個局域網內肯定主機倒是經過 MAC 地址,因此引入了鏈路層來承載 IP 數據包;

同時爲了將 IP 地址和 MAC 地址作轉換映射又產生了 ARP 協議。

層層遞進,逐層揭開網絡,很是推薦!

還有一本書:

  • 《網絡是怎樣鏈接的》
很是淺顯易懂的描述了「一個數據包是如何發送出去的」,也不費時間,看慣了機工社的大黑書,看這種反而有種看小人書的感受,有基礎的話,一天左右就過完了。

只有把握住了整個網絡脈絡主線纔不至於被紛繁複雜的網絡協議所搞暈,剩下的就是不斷的細化,填充這些主幹上的細枝末節。

那麼有哪些細節能夠去填充呢?

好比 ARP 工做過程、IP 地址、IP 分片、NAT(UDP 打洞)、鏈路層訪問控制協議等等。

還有最重要的 TCP 協議,TCP 也是面試和計網中最重要的概念:

  • 三次握手、四次揮手
  • 狀態轉換
  • TCP 狀態中 TIME_WAIT
  • 擁塞控制
  • 快速重傳、慢啓動等

這麼多東西確定須要背,但不要死記,最好帶着問題去思考爲何要這樣作。

這裏列幾個問題:

  • TCP 如何實現可靠傳輸的(畫外音:如何基於 UDP 實現可靠傳輸
  • TCP 鏈接創建爲何不是兩次握手(畫外音:三次握手的充分必要性說明
  • TIME_WAIT 的存在解決了什麼問題,等待時間爲何是 2 MSL

整個 TCP 的核心就是圍繞着 可靠傳輸 + 高效傳輸(流量控制和窗口管理)

因爲 TCP 的細節實在太多,自頂向下那本書有點不太夠,因此你須要去看看:

  • 《TCP/IP詳解卷1:協議》
這本書不要從頭看,而是挑出其中涉及到 TCP 的章節

到這裏,對於整個網絡以及 TCP 都應該有了一個全面而細緻的認識。

可是計網中仍是有一些有意思的問題,若是你沒思考過,也許回答不出來。

好比:

  • 爲何有了 MAC 地址還要 IP 地址,IP 地址和 MAC 地址的區別是什麼?
  • 如何理解廣播域和衝突域?
  • 路由器和交換機有什麼區別?
  • TCP 鏈接的本質是什麼,真的是「連接」嗎?(曾經被問過:Java socket 建立的 TCP 鏈接,對於主機掛了和 JVM 掛了有什麼區別?

這些問題只有當你真正理解了才能回答出,僅僅記住協議的話,估計很難應對靈活的面試題。

此外,網絡部分還須要準備 HTTP、HTTPS,推薦:

  • 《圖解HTTP》

最後別忘了本身回答一遍那被問爛了、寫爛了的問題:

  • 從 URL 輸入到頁面展示到底發生什麼

越細越好,五百字以上吧,哈哈哈

6、網絡編程

C++ 後臺開發基本是離不開網絡編程的,其實甚至整個後臺開發也能夠看作是在作網絡編程。

只不過別人的框架幫咱們作了協議解析、網絡數據傳輸、解封包這些底層操做。

好比 SpringBoot 這種保姆級框架,基本上屬於將一個框架能幹的事都幹完了,以致於咱們開發業務只須要定義接收和返回包的數據格式,而後作邏輯處理就完了。

像序列化、解封包、IO 處理這種網絡編程必備的髒活業務開發根本不會接觸到。

可是網絡編程技能仍是很重要的,特別是對於 Linux C++ 開發來講。

Linux 下網絡編程核心的包括系統編程和網絡 IO 兩個部分:

  • 進程間通訊方式: 信號量、管道、共享內存、socket 等
  • 多線程編程:互斥鎖、條件變量、讀寫鎖、線程池等
  • 五大 IO 模型:同步、異步、阻塞、非阻塞、信號驅動
  • 高性能 IO 兩種模式:Reactor 和 Proactor( 可是 Linux 下因爲缺乏異步 IO 支持,基本沒有 Proactor
  • IO 複用機制:epoll、select、poll(破解 C10K 問題的利器)

推薦的書:

  • 《Unix網絡編程》
  • 《Unix環境高級編程》
這兩本是磚頭書,雖然是網絡編程和 Unix 系統編程方面的無出其右的聖經,但主要用途仍是墊顯示器(逃,
我的以爲這種書不是面向讀者的,具體緣由和如何閱讀這種書在後文介紹。
  • 《Linux高性能服務器編程》
我強烈推薦,這本書前半部分基本是在重複計網基礎知識,可是後面幾章關於高性能服務器程序框架、高性能IO、IO複用、定時器、多線程編程、線程池和進程池仍是講得很是全面到位的,值得一看,看完基本上對於整個網絡編程就有了框架。
  • 《Linux多線程服務器端編程》
這本書一樣強烈推薦,這是陳碩大佬寫的書,說實話第一部分:C++ 多線程系統編程都直接把我看蒙了,沒有想到 C++ 裏要作到線程安全這麼難,第一章我看了兩三遍纔看懂吧。。。 這是可貴的講解 C++ 多線程編程的書。

而且在書中,陳碩大佬用了一章講解了 Muduo 網絡庫設計與實現,Muduo 比較適合學完基礎的網絡編程後繼續進階學習如何設計和寫一個網絡庫,是一個高質量的 Reactor 網絡庫,採用 one loop per thread + thread pool 實現,代碼比較簡潔,書和源碼搭配着看做爲學習網絡編程方面來講是很是不錯。

學完網絡編程就能夠寫點小項目練手了,這裏列舉幾個項目:

  • HTTP 服務器,這個彷佛成了 Linux C/C++ 人手一個的項目了?

    這裏推薦兩個作爲參考:

    https://github.com/imarvinle/...: 這是我看完高性能服務器編程後寫的

    https://github.com/linyacool/... :這是牛客 linya 大佬寫的

    不過 HTTP 服務器看着挺簡單的,可是能夠擴展寫的地方仍是挺多的,好比能夠加入代理功能,這部分我在留學生 lab 中寫過,可是沒有集成到這個裏面來,能夠加入日誌庫,能夠添加 CGI 支持等等。

  • 網絡庫

    這個也算是造輪子了, 能夠就採用 one loop per thread + thread pool 這種模式,先去看懂 Muduo 源碼,而後本身再寫一個相似的,這個過程就算是抄,你也能夠學到很多東西的,學編程不就是這樣先看,再模仿、修改,而後創新嗎?

  • RPC

    寫一個 PRC 你須要考慮到序列化、網絡傳輸、服務發現等,比較有名的有 grpc、brpc,這兩個網上文檔都比較完善,能夠學習一下實現原理。

    這裏還有一個簡單版本的:https://github.com/guangqianp...

  • 相似QQ的網絡聊天室

    簡單版的就能夠直接在局域網內實現羣聊、單聊等。

    更進一步能夠考慮一下如何不經過服務器中轉消息實現 P2P 聊天,相似 QQ,這裏會涉及到 UDP 打洞、NAT 轉換等知識,仍是頗有意思的,我大二用 Java 搞過。

7、系統級編程

做爲 C/C++ 程序員,編寫的程序不像 Java、Python 這些是在虛擬機上,直接就是在操做系統上運行,那麼就必須瞭解操做系統底層機制和運行原理。

就和 Java 程序員要求瞭解 JVM 是一個道理,你得熟悉代碼運行的平臺,才能在出問題的時候準肯定位到。

這個也是在咱們學校在大三開設的一門課程《System Programing》,從 CMU 引進的,教材也是沿用 CSAPP,這也是我以爲大學上過最值的課了。

我從新認真讀 CSAPP 就是在大三上這個課期間,包括作了每一個章節附帶的 lab,
這是我當時作 Bomblab 的題解:

https://www.jianshu.com/p/479...

這裏推薦兩本書:

  • 《深刻理解計算機系統》
不須要我多介紹了
  • 《程序員自我修養》
別被名字欺騙了,這不是教你養生的,而是學了會掉頭髮的硬核知識

兩本書側重點各不相同,CSAPP 很是巧妙的把數字電路基礎、二進制與指令集體系、彙編語言、程序設計及優化、存儲器體系結構、連接與裝載、進程、虛擬內存這一堆來自各不一樣的計算機學科的核心知識點串在一塊兒,並以程序員的視角呈現,因此這本書的英文名字叫《Computer Systems A Programmer's perspective》。

而程序員自我修養則重在連接、目標文件、裝載、庫與運行時,看完這本書你會了解到一個 C/C++ 程序是如何被編譯成目標文件的,以及 Linux 下目標文件的格式,不一樣目標文件又是如何被連接成一個可執行程序,在連接時如何處理符號、重定位、地址解析等,以及靜態連接、動態連接區別等等,最後可執行文件又是如何被加載進內存,如何和虛擬內存空間映射的。

你可能會以爲這個又是隻能用於面試,實際派不上用場的知識?

那簡直大錯特錯,說真的,這兩本書,我是反覆看了三遍以上,固然後續看都是挑着重點看的。

舉個例子吧,寫 C/C++ 的同窗沒少遇到這些編譯錯誤吧:

undefined reference to xxx

Symbol key multiply defined (by xxx.o and yyy.o)

在我大一的時候遇到這些問題簡直一臉懵逼,根本連報錯都看不懂。

特別是涉及到多文件編程的時候,常常傻乎乎的在頭文件中定義變量,致使變量多重定義,這些問題沒有學過連接知識的其實很難理解。

在實際編程也是常常會遇到的。

又好比externstatic這些關鍵字是如何在編譯連接時起做用,變量的申明與定義又有什麼區別?

這部分能夠算是真正的內功了,提高你對計算機系統的理解,也有助於解決實際編程過程當中會出現的問題,固然也會在面試中出現。

8、數據庫

數據庫首先要學會 SQL 的使用,這裏推薦《MySQL必知必會》。

數據庫原理方面能夠看看《數據庫系統概念》,這本書挺厚的,包含了從 SQL 到數據庫設計再到數據庫原理、分佈式數據庫都有,能夠挑着看,好比關係模型、數據庫設計(三大範式)、數據磁盤存儲和組織方式、索引、併發控制等。

固然了整個數據庫最重要的仍是索引和併發控制(鎖、MVCC等),這部分也是面試常考的:

  • 索引存儲結構:B樹、B+樹索引、Hash索引
  • 索引的使用:主鍵索引、覆蓋索引、最左前綴原則、索引下推等
  • 鎖:樂觀鎖、悲觀鎖、表鎖,行鎖,意向鎖,讀鎖,寫鎖等等
  • MySQL InnoDB MVCC 實現機制
  • 存儲引擎:InnoDB、MyISAM等,各自的優缺點
  • 事務:ACID理論

這部分推薦兩本書:

  • 《高性能MySQL》
  • 《MySQL技術內幕》
這兩本主要對索引、innodb存儲引擎、鎖、併發控制講得比較清楚,建議挑對應章節看。

9、算法和數據結構

首先須要掌握常見的數據結構:

  • 線性表、數組、鏈表
  • 棧與隊列
  • 樹、二叉樹、多叉樹實現和遍歷方式,AVL樹實現以及插入刪除過程、紅黑樹(瞭解定義便可)
  • 圖,以及圖的實現方式、遍歷
  • B樹、B+樹
  • 散列函數和散列表

常見的算法:

  • 排序算法:冒泡、插入、快速、希爾、堆排、基數、歸併等
  • 字符串匹配算法:KMP
  • 常見算法思想:遞歸、枚舉、遞推、分治、貪心、動態規劃等

視頻能夠看看 :

  • mooc 上浙大的《數據結構》
  • 學堂在線上清華鄧俊輝老師的《數據結構與算法》

這兩個是我看過以爲不錯的纔在這推薦,第一個是初學數據結構時跟着看,第二個是大三複習時刷的。

入門版書籍能夠看看:

  • 《啊哈算法》
  • 《算法圖解》

稍微進階點的:

  • 《算法第四版》
這本書強烈推薦,難度適中,可是全面。

終極版:

  • 《算法導論》
這個量力而行就行了。。。

推薦理由是:我不推薦顯得沒有逼格(:

有了基礎的算法思想和數據結構儲備,剩下的就是刷題了:

  • 《劍指offer》
建議必刷
  • leetcode
建議分類刷,先易後難,好比數組、二分、二叉樹、動態規劃,一個一個系列搞定,總結經驗,保證 150 道簡單和中等以上吧

最重要的是,保持手感,有空就刷一道。

10、網站和視頻

有些同窗喜歡看視頻,那我也在這裏統一推薦一下吧

  • B站
你的一站式學習網站,用你想學的關鍵字在這搜就完了
  • 中國大學 mooc
基礎課程學習
  • 網易雲課程、學堂在線
一些技術課程、公開課學習

Linux C/C++ 能夠去看看黑馬的,我試看過幾集 IO,講得仍是不錯的,就是有點慢,我的以爲不如看書。

刷題能夠看看牛客左神的視頻

計算機網絡能夠看看 B 站韓立剛或者 mooc 哈工大的

操做系統能夠看看學堂在線上清華的《操做系統》

推薦了這麼多書,從哪看起?

1、淺談學習方法

若是你認真看過我前面介紹每一部分的學習路線時,能夠發現我特別強調學習抓主線,而且將每個基礎知識的主線給你們列出來了。

這裏再次強推,學習新東西的時候,重點是先對總體脈絡、知識結構有一個大概的映像和了解,而後抓住這個領域的主線,順着主幹,突出重點去學習。

集中時間,速戰速決,不要將時間線拉得太長,越長可能越堅持不下去,效果越差。

對於細枝末節的內容,能夠留到實踐的時候,用到了再去查!

若是一頭扎進零碎的知識,去看手冊、字典型的書,那必然是事倍功半的。

細節留給實踐去補充,咱們的時間要花在刀刃上,注重知識的體系性和框架的創建。

2、常見問題

說實話,其實這些書籍或多或少都被各路大神推薦過,確實經典。可是大神們卻不多告訴你他們是如何去看的,該怎麼去看這些書,難道一本本一頁頁的挨着啃嗎?

這部分纔是我今天最想說的部分,「該如何去看大厚書」。

好比我後臺就常常有同窗問:

  • 有些書看的找不到重點,看不下去了,怎麼辦,好比深刻理解計算機系統,UNIX 網絡編程,APUE,求指教
  • 我不是科班 CSAPP 可能不是所有看得懂,該怎麼辦?
  • 大佬,這麼多書看得完嗎?
  • 剛開始看這些書很痛苦怎麼辦?

這些書該怎麼看,可能過來人,準備過秋招的都比較清楚,可是做爲還在大2、大三的會比較懵逼。

就拿我當時親身經從來說,在網上搜網絡編程如何學習,不少人都推薦 UNP、APUE。

好嘛,買來看,從第一頁挨着挨着看,並且書中的示例代碼我大部分也照着敲了,最後看了七八章,發現始終是在學一些 socket api 和 系統 api 的用法,沒摸到網絡編程的框架思惟。

後面我又去搜,看到有人推薦《Linux高性能服務器編程》,去豆瓣看了下了目錄,彷佛正是我想要的東西。

直接找來 PDF 開始看,果真這本書才真正讓我理解了網絡編程的整個套路和框架,學到了各類事件處理模式、計時器、信號處理、線程池這些網絡編程中很重要的東西。

固然 UNP 和 APUE 也是不能丟的,這兩本書我當作了字典查詢,好比學到了 IO 部分,回去看 UNP 中關於五種 IO 模型的介紹。

用到 connect、listen、bind 這些函數,再回去看 UNP 第四章,不得不說,UNP 關於這些 socket API 的使用和各類異常狀況的處理方式都介紹得很是詳細和深刻,不愧是網絡編程領域的聖經。

可是初學者看卻容易在細節中迷失,抓不到綱領,這也是這類書的缺點。

相似 UNP、APUE 這種書自己是面向知識體系的,而不是面向讀者,它們其實更像字典,把這個領域內的全部知識,很是細緻的堆疊在一塊兒,看上去就是平鋪直敘,充斥着細節,對讀者極其不友好。而且書裏內容實在大而全,不少根本不用學。

好比 UNP 講了 sctp 這種協議用法、多播、unix 域協議這些實際用得不多的東西,挨着看不只會看不下去,並且比較浪費時間。

可是它們又是經典的,確實是這些領域內在體系性和深刻性上都作得很是好的書。

什麼書纔是面向讀者的呢?

那就是抓住該領域的核心主幹,提綱挈領,帶領讀者由淺入深,同時又有必定的細節,看完讓人茅塞頓開。

好比《自頂向下》、《Linux高性能服務器編程》、《Linux多線程服務端編程》、《STL源碼剖析》、《Effective C++》、《CSAPP》、《程序員自我修養》等都有各自想要論述的主線在裏面,看起來也是一環扣一環,很是按部就班。

個人看書方法就是對於面向知識體系那種堆砌細節的書,咱們先瀏覽目錄,作到對整本書有映像,再大體看一些咱們關心的部分,好比 UNP 和 APUE 中 IO、文件、進程控制、信號、線程、線程控制、基本套接字編程 這些是比較重要的模塊,其它邊角知識,能夠用到再去查。

還有一點,不少同窗反映看不懂相似 CSAPP 這樣的書,那咱們都知道,任何一本書基本上都是有前置依賴的。

沒有掌握要求的背景知識去看確定很吃力的。

就好比我大一下只有基礎的 C 知識和一丁點計算機導論知識,而後屁顛屁顛的跑去看 CSAPP(學長畢業擺地攤賣書我瞎買的),那時候只知道這本書被譽爲神書,可是看到前兩三章就蒙了,真的有點難,對於當時的我來講太底層了,根本不知道在說啥,看過也只是看過,就像天空飛過鳥兒,但沒有痕跡。

直到後來大三再次拿起,我才意識到這本書的偉大之處就在於將計算機不一樣學科知識有機的串在了一塊兒。那時候看,更可能是一種補充、深刻學習以及完善了,由於不少知識分別在數字邏輯、彙編語言、操做系統這些課程中學過了。

因此要明白,你看不懂不是由於你笨沒天賦,而是你有前置依賴的知識沒有完成,還沒學會走,就想跑了。

通常來講,每本書的首頁會介紹看這本書須要哪些前置知識,能夠關注一下。

還有一種看書的方法,我在複習的時候採用過,那就是橫向學習。

好比我複習操做系統,在《操做系統:精髓和設計原理》中看到了關於內存、虛擬內存的各類介紹,看完理論再去看《Linux內核設計與實現》12 章「虛擬內存」、15 章『進程地址空間』,最後再去看《CSAPP》第 9 章『虛擬內存』,這樣看下來,基本上內存這塊理解得比較透了,這些書關於這塊的介紹是各有優缺點的,正好互補。

又好比在《精髓與設計原理》中介紹了進程加載和連接,其實講得比較偏理論,看完仍是以爲似懂非懂。

那我又會去《CSAPP》看第 7 章「連接」,這一章基本講清了靜態連接、目標文件、可重定位目標文件、引用解析、加載這些關於連接的核心概念,可是一個章節講這麼多,不免不夠深刻。

我又會去看《程序員自我修養》這本書第 4 章「靜態連接」、第 6 章 「可執行文件的裝載與進程」、第 7 章 「動態連接」,這本書核心主題就是連接、加載,因此這一路看下來,對於連接、加載這塊基本上搞得比較透徹了,也許沒幾個面試官有你清楚。

一樣索引你也能從《數據庫系統概念》、《高性能MySQL》、《MySQL技術內幕》中挑選對應的章節,串起來看,取每本書優勢,這樣學習真的很高效也很深刻。

這就是我在複習的時候採用的用知識點串聯,跨多本書高效精準的複習方式,效果也很不錯,春招十幾回面試沒有一次由於這些基礎知識掛過。

囉嗦了一大堆,就是回答這些問題的:

「有些書看的找不到重點,看不下去了,怎麼辦,好比深刻理解計算機系統,UNIX 網絡編程,APUE,求指教」、「我不是科班 CSAPP 可能不是所有看得懂,該怎麼辦?」、「大佬,這麼多書看得完嗎」、「剛開始看這些書很痛苦怎麼辦」

3、要花多久時間才能學完

這個很差說,根據你的基礎和學習效率不一樣,好比我大1、大二對於一些基礎的知識學得比較認真,基礎還算能夠,按照這樣一套走下來也就大半年。大概天天花四五個小時以上吧。

若是真的是連計網、操做系統理論這樣的東西一點基礎都沒的話,那估計得一年以上,畢竟這些內容基本覆蓋了科班的核心課程,人家上三年課,你一年解決,已經算很快了好吧。

一年真的足夠從小白學起嗎?

感受是差不太多的,可是估計得天天付出五六小時以上了,而且學習方法得當。

你去牛客就會發現,存在各路大3、研一自學轉碼的同窗,最後還能成爲 offer 收割機,因此,不要懷疑一年不夠,最關鍵的是你要找到正確的路線,而後執行下去。

文中推薦的書真的所有要看嗎?

固然不是,我本身都沒看完,可是個人策略已經說過了,基本上大部分書都看了重要的章節,這樣看起來是很快的。

而且隨着你看書愈來愈多,基礎愈來愈好,你會發現每本書前面幾章都是鋪墊基礎知識,大部分能夠直接跳過,舉個例子

《Linux高性能服務器編程》這本書前幾章是這樣的:

  • 第1章 TCPIP協議族
  • 第2章 IP協議詳解
  • 第3章 TCP協議詳解
  • 第四章 TCPIP通訊案例:訪問Internet上的Web服務器
  • 第五章 Linux網絡編程基礎API

你以爲這些章節在看過《自頂向下》、《TCP/IP詳解》以後還有必要看嗎?我反正是半天掃過去就完了。

最後,無論說再多方法,再多的路線,最終都須要本身花時間去啃、去執行。

4、語言疑惑

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

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

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

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

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

因此呢,我以爲 C/C++、Java、Go 你深刻學習哪個均可以,關鍵仍是找對相應的學習路線,一直堅持學下去,不要天天都停留在我究竟是學 Java 好仍是 C++ 好這樣無解的問題。

另外,想對學 C++ 的同窗說,可能你會發現身邊同窗都在搞 Java、Go之類的,找工做缺乏一些一塊兒複習準備的朋友,有些甚至勸你別學 C++。那這個時候你必定要堅決本身的選擇,多在牛客或者網上找找同方向的朋友一塊兒交流、學習。

說實話,就找工做這塊來講,我的以爲區別真的是不大的,無論從薪資、面試難度來講都是差不太多,更多的仍是算法和基礎知識。

並且也有很多同窗 Java 進騰訊須要轉 C++,C++ 進阿里、美團須要轉 Java 的,這都不是事兒。

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

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

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

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

平常求三連環節

這篇文章我預感到會寫成萬字長文,可是沒辦法,想表達的東西太多了,你們記得收藏~

還有,我把文章提到的這些書籍、資料、還有我面試時看過的一些面經、博客都彙總了,能夠節省你去找資料的時間。

這是百度網盤連接:https://pan.baidu.com/s/1jsrmOYWsxwJASZL756CRCQ
提取碼: knml

連接失效的話,請加我微信領取:haveylin

(本文首發於我的公衆號「編程指北」,歡迎關注,第一時間獲取乾貨分享~

若是對你們有幫助的話,記得點個贊,收藏下噢,

我是小北,關注我,我們下週期見!

相關文章
相關標籤/搜索