这篇文章罗列出我今年读过的书。所有评论均代表个人观点,我的目标是——好书推荐,烂书预警。
我一直觉得所有的程序员至少要研究三个东西 一个操作系统;一个数据库;一个服务器(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详解》吗?这种阅读也是没有必要的。
阅读的目的是为了获取知识,如果你觉得“不自信”那么不应该阅读而应该实践。(比如你对自己是不是要阅读《深入理解计算机系统》有疑问,很简单做一下课后题或者做一下里面的实验。)