程序員練級攻略:系統知識
進入專業的編程領域,學習系統知識是很是關鍵的一部分。html
- 《深刻理解計算機系統》,原書名爲《Computer Systems A Programmer’s Perspective》。
本書的最大優勢是爲程序員描述計算機系統的實現細節,幫助其在大腦中構造一個層次型的計算機系統。從最底層的數據在內存中的表示到流水線指令的構成,到虛擬存儲器,到編譯系統,到動態加載庫,到最後的用戶態應用。經過掌握程序是如何映射到系統上,以及程序是如何執行的,你可以更好地理解程序的行爲爲何是這樣的,以及效率低下是如何形成的。前端
網絡編程知識
理查德·史蒂文斯(Richard Stevens) 的三套巨經典無比的書。大師的 我的主頁 。linux
Linux網絡編程與協議分析知識
學習網絡協議不單只是看書,最好用個抓包工具看看這些網絡包是什麼樣的。程序員
- 《Wireshark 數據包分析實戰》。在這本書中,做者結合一些簡單易懂的實際網絡案例,圖文並茂地演示使用 Wireshark 進行數據包分析的技術方法,可讓咱們更好地瞭解和學習網絡協議。固然,也擁有了必定的黑客的技能。
看完《Unix 高級環境編程》後,能夠趁熱打鐵看看《Linux/Unix 系統編程手冊》或是羅伯特·拉姆(Robert Love)的 Linux System Programming 英文電子版 。其中文翻譯版Linux 系統編程 也值得一讀,雖然和《Unix 高級環境編程》很像,不過其主要突出的是 Linux 的一些關鍵技術和相關的系統調用。算法
關於 TCP 相關文章。數據庫
對於系統知識,主要有如下一些學習要點。編程
- 用這些系統知識操做一下文件系統,實現一個能夠拷貝目錄樹的小程序。
- 用 fork / wait / waitpid 寫一個多進程的程序,用 pthread 寫一個多線程帶同步或互斥的程序。好比,多進程購票的程序。
- 用 signal / kill / raise / alarm / pause / sigprocmask 實現一個多進程間的信號量通訊的程序。
- 學會使用 gcc 和 gdb 來編程和調試程序(參看個人《用 gdb 調試程序》一、二、三、四、五、六、七)。
- 學會使用 makefile 來編譯程序(參看個人《跟我一塊兒寫 makefile》一、二、三、四、五、六、七、八、九、十、十一、十二、十三、十四)。
- Socket 的進程間通訊。用 C 語言寫一個 1 對 1 的聊天小程序,或是一個簡單的 HTTP 服務器。
C10K 問題
操做系統處理大併發請求的問題小程序
實踐項目
實現語言能夠用 C、C++ 或 Java。
實現一個 telnet 版本的聊天服務器,主要有如下需求。
- 每一個客戶端能夠用使用
telnet ip:port
的方式鏈接到服務器上。
- 新鏈接須要用用戶名和密碼登陸,若是沒有,則須要註冊一個。
- 而後能夠選擇一個聊天室加入聊天。
- 管理員有權建立或刪除聊天室,普通人員只有加入、退出、查詢聊天室的權力。
- 聊天室須要有人數限制,每一個人發出來的話,其它全部的人都要能看獲得。
實現一個簡單的 HTTP 服務器,主要有如下需求。
- 解釋瀏覽器傳來的 HTTP 協議,只須要處理 URL path。
- 而後把所代理的目錄列出來。
- 在瀏覽器上能夠瀏覽目錄裏的文件和下級目錄。
- 若是點擊文件,則把文件打開傳給瀏覽器(瀏覽器可以自動顯示圖片、PDF,或 HTML、CSS、JavaScript 以及文本文件)。
- 若是點擊子目錄,則進入到子目錄中,並把子目錄中的文件列出來。
實現一個生產者 / 消費者消息隊列服務,主要有如下需求。
- 消息隊列採用一個 Ring-buffer 的數據結構。
- 能夠有多個 topic 供生產者寫入消息及消費者取出消息。
- 須要支持多個生產者併發寫。
- 須要支持多個消費者消費消息(只要有一個消費者成功處理消息就能夠刪除消息)。
- 消息隊列要作到不丟數據(要把消息持久化下來)。
- 能作到性能很高。
小結
編程語言。以工業級的 C、C++、Java 這三門語言爲主,推薦學習 Go 語言。
算法和數據結構。尤爲是最基礎的算法和數據結構
計算機的相關係統。至少要掌握三個系統的基礎知識,一個是操做系統,一個是網絡系統,還有一個是數據庫系統。它們分別表明着計算機基礎構架的三大件——計算、存儲、網絡。
可是,日後面走,你須要開始須要術業有專攻了。下面給一些建議的方向。
- 底層方向:操做系統、文件系統、數據庫、網絡……
- 架構方向:分佈式系統架構、微服務、DevOps、Cloud Native……
- 數據方向:大數據、機器學習、人工智能……
- 前端方向:你對用戶體驗或是交互更感興趣,那麼你走前端的路吧。
- 其它方向:好比,安全開發、運維開發、嵌入式開發……