作為一個有理想的程序員,必讀的書都有哪些?
很多人給學弟學妹們推薦圖書時,一上來就是各種大部頭的經典書籍,有些書確實是非常經典,但是能不能讓人堅持看下去是一回事,就像有些道理人人都懂,但是能踐行下去的人沒幾個。在這里也只推薦我覺得比較好的書,寧缺毋濫。
建議你應該好好準備算法和數據結構,做到常見的算法和數據結構知識點都能熟悉。如果你是應屆生,畢業求職的時候可以輕松拿一些大廠(BAT 等)的 offer,至少不會掛在算法數據結構上面;社招的話,也是非常重要的加分項。一畢業去大廠的好處點擊這里。
《編程之美》是一本特別能鍛煉思維能力的算法書。
嚴謹的教材適合系統學習,輕松活潑的教材適合提高學習興趣、非科班的同學。
無論你做什么開發,個人覺得 C 語言是所有想成為高手最應該熟悉的入門語言。
當然,如果你想掌握好 C++,《深度探索 C++ 對象模型》是一定要看的。
介紹 C++ 技術和編程技巧的圖書實在太多了,我這里推薦《提高 C++ 性能的編程技術》一書,這本書中介紹了常見的 C++ 編碼技巧,建議做 C++ 開發的同學把書中說的技巧全部掌握,最關鍵的是這本書非常薄。
如果覺得自己設計 C++ 類和接口不優雅,不能很好地劃分模塊,大型項目不知道如何去組織和搭建,推薦下如下兩本書,這兩本書是你成為高手的必讀書籍。
C++ 比較經典的書籍還有:
學習 C++11/14/17:
操作系統無論是面試還是自我提高的五大基礎之一,我的建議學習操作系統知識時,不一定要看完所有操作系統書籍,但一定將一些基礎概念(如進程、線程、內存模式等)看懂、理清。
你如果還有時間強烈推薦看看俞甲子的《程序員的自我修養:鏈接、裝載與庫》。這本書同時涉及到了 Windows 和 Linux 兩個操作系統平臺,用各種輔助工具剖析了程序從源碼到二進制文件再到裝載到進程地址空間里面的各個細節,甚至連進程地址空間中的堆結構、棧結構也分析得清清楚楚,同時也分析了 C Runtime(CRT)、glibc 這樣的操作系統接口庫的原理和執行邏輯,是一本實實在在幫你實戰操作系統原理的好書。
如果對操作系統內核感興趣,可以閱讀下:
學習計算機網絡除了掌握網絡基礎知識(比如三次握手和四次揮手),還要熟悉網絡編程。
網絡編程方面的實戰書來,我推薦韓國人尹圣雨寫的這本《TCP/IP 網絡編程》,這本書也適合無任何 Socket API 編程經驗的小白,這本書涵蓋從基礎的 Socket API 到高級的 IO 網絡模型,有非常詳細和生動的例子。
等你有了一定的網絡編程以后(熟練使用常見 Socket API),你可以看看游雙的《Linux 高性能服務器編程》,這本書給沒有基礎的人或者基礎不扎實的人的感覺是,尤其是書的前三章,這書怎么這么垃圾,又把網絡理論書上面的東西搬過來湊字數,但是如果你有基礎再按照書上的步驟在機器上實踐一遍,你會發現,真是一本難得的、良心的書,桃李不言下自成蹊吧。如果你掌握了這本書上說的這些知識,你再看陳碩老師的《Linux 多線程服務端編程》或者去看像 libevent 這樣的開源網絡庫,你會進一步的得到提升。這也是我學習網絡編程的一些經驗和經歷吧。
不管是什么開發,你都是需要基于特定的操作系統的,這里不提 Windows 系統,單單拿 Linux 操作系統來說,既然你選擇做這個方面的開發,你需要熟悉這個操作系統平臺提供的一些常用的 API 函數,網絡通信方面上文已經說過,除了網絡通信還有如操作文件、操作內存、字符串操作、進程線程系列、線程同步系列(如互斥體、條件變量、信號量)、管道等常用的各種API接口函數。這里的意思是,不是要你背誦記憶每一個接口函數的簽名,而是你要知道何時該用哪個接口,如何用,有什么注意事項。
我入門的時候看的是 Robert Love 的《Linux 系統編程》,熟悉這個人的應該知道,Google 的工程師,他也《Linux 內核設計與實現》一書的作者。
(第六版以后,這個不再是用 Windows Native API 寫 C 程序了,而是轉到 C# 平臺上了),這本書是中國第一代程序的 Windows 啟蒙書籍,你所看到的大多數桌面軟件,如 QQ,的開發者可能都是通過閱讀這本書啟蒙起來的。
這本書搞 Windows 開發的一定都知道這本書的分量。
如果你熟練掌握匯編,你就比其他人多很多優勢,你會能透徹地知道你寫的每一行 C/C++ 代碼背后的機器指令的效率。無論是做安全工程還是自己技術提升上都是非常不錯的。這里推薦一本王爽老師的《匯編語言(第 3 版)》,這本書不厚,語言通俗易懂,你也不用刻意去記憶,基本上當小說書看一下就能很快看完了。匯編實戰類圖書還有另外一本《老碼識途:從機器碼到框架的系統觀逆向修煉之路》。我個人是非常喜歡這本書的。當年讀這本書的時候,真的有一種“笑看妻子愁何在?漫卷詩書喜欲狂”的感覺。
數據庫需要掌握的基礎知識有:
(1)熟悉基本 SQL 操作 包括增刪改查(insert、delete、update、select語句),排序 order,條件查詢(where 子語句),限制查詢結果數量(LIMIT語句)等
(2)稍微高級一點的 SQL 操作(如 Group by,in,join,left join,多表聯合查詢,別名的使用,select 子語句等)
(3)索引的概念、索引的原理、索引的創建技巧
(4)數據庫本身的操作,建庫建表,數據的導入導出
(5)數據庫用戶權限控制(權限機制)
(6)MySQL的兩種數據庫引擎的區別
(7)SQL 優化技巧
以上屬于對開發的基本的數據庫知識要求,你可以找一本相關入門級的數據庫圖書推薦:
高級開發除了以上要求還要熟悉高可用 MySQL、主從同步、讀寫分離、分表分庫等技術,這些技術的細節一定要清楚,它們是你成為技術專家或者高級架構的必備知識。我們在實際面試時,在討論高可用服務服務方案時,很多面試者也會和我們討論到這些技術,但是不少面試者只知道這些技術的大致思想,細節往往說不清楚,細節不會就意味著你的高可用方案無法落地,企業需要可以落地的方案。
這些技術我首推《高性能 MySQL》這本書,這本書高級開發者一定要通讀的,另外還有 2 本非常好的圖書也推薦一下:一本是《MySQL 排錯指南》,讀完這本書以后,你會對整個“數據庫世界”充滿了清晰的認識;另外一本是《數據庫索引設計與優化》,這本書讀起來非常舒服,尤其是對于喜歡算法和數據結構的同學來說。
這兩本書特別推薦學生朋友看一下,能大幅度地提高你實際編碼的技巧和編碼風格。
作為一名過來人的老學長,我碼這么多字,希望想做好開發的學弟學妹們,勿在浮沙筑高臺。如果你現在還是學生,你有大把讀書的機會,一定要珍惜大好讀書時光。工作年限不長的同學,也應該盡快在工作的早些年把基本功打扎實。三十歲以后面臨著工作、家庭等各種問題,你可能再不能心無旁騖地去學習和提升了。所以前期的積累很重要,畢竟選擇技術這條路,提高技術是升職加薪改善生活水平最直接的方法。
書單未完待續,后面會整理得更加完善,更加成體系。
文中提到的所有電子書下載鏈接: