這篇文章羅列出我今年讀過的書。所有評論均代表個人觀點,我的目標是——好書推薦,爛書預警。
我一直覺得所有的程序員至少要研究三個東西?一個操作系統;一個數據庫;一個服務器(Web服務器、Nosql服務器)。
Linux &Unix
我喜歡閱讀操作系統方面的書,但是這方面的書一直一來被Linux Kernel的書統治。《深入理解Unix系統內核》這本書有些年頭了,但是內容卻不陳舊。我在閱讀的時候結合了《4.4BSD操作系統設計與實現》而且特意去復活了一份FreeBSD3。非常值得一提的是它還介紹了Mach(Mac OS的內核)。一個完整的操作系統kernel是由進程管理、內存管理、文件系統(VFS)、設備管理和網絡棧組成。也有人把文件系統和設備管理合并稱為——Linux I/O子系統。《Linux內核探秘》就是專門講解I/O子系統的,是一本這些年難得一見的“理論結合實踐”的好書(更值得一提的是“國產”)。《Linux性能優化大師》這本書的封面非常非常酷炫(裝B黑),可惜內容一般。尤其是第二章、第三章是赤裸裸的“騙稿費”。如果你沒有時間,只看第一章、第五章好了;如果你很窮,我推薦你看免費的《Linux性能調優指南》(IBM那本redbook的中文版)。《Unix內核源碼剖析》沒有想象中的那么好,再怎么說讓一個“現代人”去復活“PDP”這種只聽說過沒見過的,還要學習它的指令集簡直令人發指(在Intel CPU統治的時代學習PDP有意義嗎?)。書里面分析的是Unix v6,如果你去查Unix族譜
會發現它是BSD的爹,簡直是上古神器(好像只剩下進程管理的一小部分、文件系統和設備管理的一小部分有意義了)。Unix的書一直很少,《4.4BSD操作系統設計與實現》和《深入理解Unix系統內核》。遺憾的是這兩本都沒有結合代碼講解,“不解渴”。
數據庫
《Mysql技術內幕》我是看到“技術內幕”才看的,沒想到它只是一本“Mysql標準教材”(但是作為一本教材它的個頭也太大了吧)。《MySQL管理之道》是一本MysqlDBA的工作手冊,對Mysql的優化和“潛規則”講解的非常到位。《Oracle編程藝術》這本書的新版非常貴(100多塊錢)我翻閱了一下感覺和老版區別并不是很大。《Oracle內核技術解密》是難得一見的國產好書,作者解釋了很多Oracle的技術細節非常值得學習借鑒。《Oracle核心技術》要比《Oracle內核技術解密》更有深度,作者是一個dump狂人,看到東西就是各種dump。。。。《Oracle編程藝術》全局性的介紹Oracle的技術架構(當之無愧的技術內幕),后面兩本則關注Oracle的一些具體細節(比如內存結構、Undo、Redo的實現、事務的實現)
服務器
Nginx的代碼非常簡潔、干凈,作為學習的榜樣非常的合適。《深入理解Nginx》非常全,Nginx的方方面面幾乎都介紹到了,所以塊頭也比較大,幸運的是這本書挑著看不會影響閱讀。《分布式服務框架》和《Netty權威指南》可以結合起來看,作者是有過微服務架構經驗的,所以《分布式服務框架》寫非常全面,囊括了系統架構要考慮的方方面面。可惜,有點先入為主,改名叫《跟我學做RPC》比較合適(其實分布式服務框架有多種實現方式,不僅僅包括RPC)。《Netty權威指南》是難得一見的關于Netty的好書,干貨不少。如果你用Netty或者想自己開發一個服務器這本書是非常值得一看的“實踐手冊”(好了,好了,把那邊《Unix網絡編程》扔到一邊吧。咱們得往前看,看實際一點的東西。)《精通Linux內核網絡》,這本書我沒看完,即便跳著看也很累。如果說《Linux內核探秘》是介紹I/O子系統那么這本書就是介紹網絡棧,而且介紹的深度非常深,細節非常細。我不喜歡這種類型的書,太大,太累。
性能
《性能之巔:洞悉系統、企業與云計算》一本專業的書,它對性能問題的定義不是局限在某一點而是告訴你一套方法論。然后把性能歸為“操作系統的鍋”、“應用程序的鍋”兩個大問題。通過分析操作系統的進程管理、內存管理、文件系統、設備管理、網絡棧來找到性能問題的原因。(現在明白研究操作系統的意義了嗎?)遺憾的是對于“應用程序的鍋”(此處的應用是指xx語言的運行環境或者某個中間件,比如JVM)篇幅太小,如果有再版本希望可以增加一些案例,這樣可以講清楚“應用程序運行時”和“操作系統”之間的關系,能讓讀者很快以達到融會貫通的目的(畢竟一個性能問題不是一個人的鍋,從應用程序、操作系統都有問題)。《Java性能優化權威指南》,就像名字一樣——“權威”。通篇都是在“賣”Oracle的工具(快來啊,看我們的工具多么的先進)為此不惜打上Java之父的名頭(我對這老爺子沒啥好感,感覺就是個“職業站臺”的)。干貨集中在JVM部分和垃圾回收算法。但是中很尷尬,如果想學習JVM我推薦《深入理解Java虛擬機》如果是垃圾回收算法那么《垃圾回收算法手冊》這本書最“權威”(你看真正的裝B黑,機械工業出版社的這套“計算機科學叢書”的牛B是不容置疑的)。
前端之旅
這三本是關于AngualarJS的書,前面兩本是大塊頭,后面是國產的(所以短小精干)。《AngualarJS高級程序設計》實在是有愧“高級”這兩個字。《AngularJS深度剖析和最佳實踐》很短小,沒有廢話,但是對于初學者有些地方會顯的很突兀,所以閱讀的時候可以結合《AngualarJS權威教材》。我的前端之旅大部分是來自“網絡文章”,前端技術變化太快基本上等到你書寫好出版它就過時了。我的旅途學習了framework:angualarjs1、reactjs、vuejs,語言:typescript、es6,各種構建工具:grunt、gulp、webpack還有國產的fis、cooking。這三本書是我在學習AngualarJS1的時候找看的。(提示一下Angualar 1已經過時了,現在是2。。。另外別急著學2,因為它甚至不支持IE9。。。。囧)
CCNP
不會配交換機的軟件工程工程師不是一個好架構。這三本書是Cisco CCNP的三本標準教材。CCNA的教材太簡單所以直接無視了,CCIE的教材太扯淡幾乎只會吹牛B。另外H3C出版的《路由與交換》四本書也不錯,原理性的東西非常多。《計算機網絡》只能算是網絡入門,如果想深入的了解計算機網絡學會配置、理解網絡設備、網絡協議是必不可少的。(網絡可不僅僅是操作系統“網絡棧”那么簡單,眼光要長遠、寬一些~~~)
SDN
我喜歡《云計算網絡珠璣》非常短小沒有廢話,尤其是最后去吐槽Neutron讓我有了“共鳴”(我是OpenStack職業黑,看到我就黑,嘿嘿嘿嘿,嘿嘿嘿)。《軟件定義網絡》(我買的是第一版,圖中是第二版)對SDN原理性講解非常到位,后面的“實踐”可以快速翻翻,其中OpenFlow部分可以結合《圖解OpenFlow》一塊看。
OpenStack
《深入淺出Neutron》通篇內容你都可以在“網文”中找到。大塊截圖、大塊配置、玩命的貼代碼,篇幅本身就少再加上一折騰——沒干貨了。《OpenStack設計與實現》是唯一一本靠譜的OpenStack書,原理性的解釋配合文字比較到位。可惜OpenStack太“臃腫了”沒人能講清楚里面的細節所以只能從架構,全局的角度扯談一番。(有意思的是OpenStack的架構怎么看都沒有問題,而實現就是一坨狗屎)
KVM
《深度實踐KVM》名副其實,比較有深度。除了“KVM虛擬化管理平臺”很扯淡之外,其他的內容都是干貨。《KVM虛擬化技術實戰與原理解析》也有很多干貨。《Linux KVM虛擬化架構實戰指南》(看名字,你看名字。。牛B吧,還有這裝B黑)通篇沒有干貨,截圖,全是截圖。另外還有一本原版的《Mastering KVM Virtualization》也非常不錯。
其他
《Mesos:大數據資源調度與大規模容器運行最佳實踐》我以為這是一本講解Mesos的書沒想到是一本吹牛B的書。好不容易忍受了他教我如何“下載Mesos”,經歷了“如何在Mesos上跑Hadoop”,“如何在Mesos上跑Spark”的扯淡話題后進入正題——第七章。看了兩頁我就哭了——一個大表格羅列API、一堆代碼羅列例子。100多頁的書居然沒有一點干活~~~年度最差。《Scala程序設計 第2版》Scala是一個我瘋狂吐槽的語言,但是這不影響我學習它(哥就是這么“大度”)。這本書要比《Scala函數式編程》接地氣,比《Scala編程實戰》(這本是Cookbook)更像一本教材。建議每個想要學習Scala的人詳細閱讀它,希望你讀完它后可以掌握Scala的語法(哎呦,我又想到它那蛋疼的“隱式”了,容我平息一下“憤怒”。)《Erlang趣學指南》原版《Learn You Some Erlang for Great Good》,且不說內容如何“萌萌的配圖”都值得好好收藏。和《Erlang程序設計》的篇幅差不多但是干貨多了不少。今年還有一本OTP的新書——《Designing for Scalability with Erlang OTP》
不務正業
除了寫代碼哥最大的愛好是搞“哲學”(看公眾賬號的名字就知道了),這部分內容我稱之為——不務正業。
如果你想學哲學我推薦的第一本書應該是——《大問題》,每一章作者都會拋出一個問題,然后引導你去思考,介紹歷史上著名的哲人的思考。哲學沒有對錯,所有的哲人都是對的,哲學就是要引導你去思考。生死、宗教、社會契約、自由、美,每一個你以為自己得到答案的問題其實都是哲學問題。《西方哲學史》已經第二版了。作者是鄧曉芒教授和趙林教授。哲學沒有對錯,不是說黑格爾就比亞里士多德高明,所有的哲學觀點都值得深思。所以學習哲學就是學習整個哲學史,去學習哲人如何思考。康的哲學是三大批判,純粹理性批判是基礎。《未來形而上學導論》就是濃縮版的純粹理性批判。(《純粹理性批判》你要一個字一個字的讀才能弄懂,這個濃縮版你要一個字一個字的反復讀才能看懂)。這本100頁書就像“意式濃縮”特別刺激,絕對不可能一口悶。很多人以為康德僅僅是一個哲學家,其實他的本職工作是——自然科學家,如果他不是去研究哲學估計"自然科學一哥"這個位置就不是“牛頓”的了。《宇宙發展史概論》這本書之前商務印書館引進過,這次的版本重新校對過包裝更加精美可以留作收藏。《S. 忒修斯之船》是本年度最適合裝B的一本書,沒有買的同學趕快去買。買到的同學你就不會在乎內容是什么了而會感嘆——這要是每天都帶著,裝逼如風啊!!!
如何閱讀
不談目的的閱讀都是耍流氓,我把自己的閱讀分為兩個目的
修內功,這種閱讀是長期的、持續性的。閱讀的書籍也集中在一些“知名的”書,比如《4.4BSD操作系統設計與實現》、《深入理解計算機系統》之類的。這種類型的書有個最非常有名氣的系列——機械工業出版社的計算機科學叢書。內功不是說就死抱著不放,而是要時刻清楚自己的目的。比如都說《深入理解計算機系統》經典,難道需要我們從頭到尾為認認真真的讀嗎?其實大可不必,如果你覺得自己已經掌握了計算機體系結構對操作系統有了一點感性認識就可以不必閱讀。
修招式,這種閱讀是短期的以實踐為目的。比如學習交換機的配置,學習計算機網絡的各種協議,學習SDN之類的。基本上是你工作中需要或者個人對某個技術感興趣讓你去閱讀,它會持續一段時間而不是適合作為長期閱讀。比如你學會了配置交換機還會每天看CCNP教材嗎?你已經掌握了TCP/IP協議還會去有板有眼的看《TCP/IP詳解》嗎?這種閱讀也是沒有必要的。
閱讀的目的是為了獲取知識,如果你覺得“不自信”那么不應該閱讀而應該實踐。(比如你對自己是不是要閱讀《深入理解計算機系統》有疑問,很簡單做一下課后題或者做一下里面的實驗。)