# 切入书单之前

首先声明，这是一份**极其主观**的计算机书单，大部分书我都没读完，有一些甚至只翻了半个小时，请谨慎参考。

![书架的一部分](https://pic4.zhimg.com/80/v2-d849dd67ad5f539686766f3077b493fb_720w.jpg)

*别问为什么买这么多书，问就是放在书架上五颜六色的十分好看。*

下面的内容并不与书单推荐有直接关联，只是谈点**人生经验**，感兴趣可以往下读。不感兴趣可以直接切到其他章节。

## 不必要的寻根究底

> 超出自己知识需求的寻根究底是一种傲慢。

考虑两个与主题毫不相关的问题：为什么一加二等于二加一？为什么结合律对乘法成立而对除法不成立？

可能有部分读者能给出**简单的**答案：实数集上的加法和乘法是都是阿贝尔群，所以它们满足结合律和交换律；而减法和除法只构成广群，仅满足封闭性，均不满足交换律和结合律。

很好，现在你通过一些基本的群论知识解释了四则运算表象下的一些实质。然后你发现这没有一点用，了解群论并不能让你进行更快的四则运算。甚至了解乘法的本质就是加法也不能让你迅速地进行乘法运算——乘法表该背还得背，毕竟要算 9×9=81 总不能真把 9 个 9 加起来。

这和主题有什么关系呢？长久以来，程序员装逼界（或者卖课的）有一种“练好内功”的说法——学好算法再去写代码就能势如破竹，学好计算机网络再去写网站就能更快地解决遇到的 BUG。这完全是错误的，现实完全不是这么回事，就像我没听说过画家了解颜料的组成就能画得更好。事实是：没有任何人有必要为了学好计算机去学习计算机原理，没有任何人有必要为了增进编程水平去学习编译原理，也没有任何人有必要为了编写优雅的代码去学习算法分析。

在你真正需要某些知识前，就以“寻根究底”的态度去学习，实质上是一种傲慢。一位资深的算法工程师去读 TAOCP 是正常的，但一个快排都写不利索的计算机系新生去读 TAOCP 就是一种傲慢。如果你身边有这样的朋友甚至老师，推荐你在对计算机的世界一知半解的情况下去读 TAOCP 这种书，不用怀疑——他就是在装逼。

我当然不是说应该在啥也不懂的情况下贸然踏足某一领域。如果你搭建网站的时候想用 Node.js 写点后端，那好歹要搞清楚 HTTP 的 GET 和 POST 是什么意思，但也不必为了这点东西去把 TCP/IP 原理学一遍，甚至去读三本厚厚的《TCP/IP 详解》，那就要让人怀疑这是否是智力出了点问题。道理很简单，学用得到的，并且学到你认为够用的程度，“不求甚解”不是件坏事，尤其是在学习如何运用工具时。计算机编程始终是一种工具，重要的是如何运用它，而不是去搞明白它的工作机理，要不然发明工具还有什么意义呢？

## 购书指南

读书几个常见的**雷区**（针对所有类别书籍，不只是计算机领域的书）：

* 按销量排序买书，最后大概率会买到一大堆破烂。
* 急于求成，买了一堆像是“从入门到精通”的书，这些也是破烂，无一例外。因为不存在任何一本书能让人从“入门”到“精通”。说真的，看这类书不如直接去看官方文档。
* 不事先了解翻译质量就去买外文翻译书籍，结果还不如直接读英文原版。
* 去某多多上买盗版书，结果印刷质量堪忧，图都糊成一片，根本没法读。盗版书不是不能买，但是一定要选销量高信誉好的大店铺，这样才能保证基本可读。实在没钱的话，看电子书也比看纸质盗版书好得多。
* 按照某乎或者其他网站上的推荐书单瞎买（包括本书单），买了一堆推荐者自己都没读过的破烂，与一堆虽然有水平但自己当前根本不需要读甚至未来也不需要读的书。
* 买书不考虑需求和自身水平，看到好书就买，结果收藏了一堆自己根本用不上的好书。
* 被某瓣水军欺骗，买来的高评分好书结果发现是破烂。（主要见于评分数量较少的书，评分数量大的书，尤其是专业书籍，几乎都是可信的）
* 上一条的另一个极端，买书之前完全不看某瓣评分也不看风评，买回来一堆冷门没人读的破烂。
* 按照买书买经典的原则，结果买回来《C 程序设计》这样真正的破烂。
* 不要相信任何“零基础”系列图书。一个人一生只需要读一本“零基础”的书，编程领域所有东西都是相通的，只要有任何一门语言的基础就不需要再去读任何语言的“零基础”书了。

读书的几个**建议**：

* 搞清楚自己当前的水平，与处在哪个阅读阶段，只读需要读的书。
* 在深入了解某一领域的知识之前，先阅读更加基础的前置读物。
* 挑书时仔细斟酌，通过某乎某瓣等网站确认书的质量确实过关才读，免得浪费时间。
* 尽量选择正版书，或是在网上找清晰的电子版阅读，保证良好的阅读体验。
* 对于外文翻译书籍，务必将翻译质量考虑在内。如果某本书关于翻译质量的风评非常差，甚至可以考虑阅读英文原版。
* **不要过度依赖出版物**。很多技术看文档是最好的，也能保证你获取的信息是最新的，例如 Vue/React 就很适合看文档学习，不要对看文档产生抵触心理。很多偏应用的技术根本不该找本书看，比如没人会为了学习怎么使用一个 UI 库去看书，这听起来太荒谬了。此外，还存在大量优质的在线电子书没有纸质出版的版本，实际上比纸质出版物更加优秀，并且在有开源校对的情况下翻译质量更好。
* 优先选择大型出版社出版的书籍，质量更有保证。

## 出版社推荐

中国出版（优质）计算机图书的出版社主要有三家：机械工业出版社、人民邮电出版社和电子工业出版社。仅就这几年来说，我个人倾向于将中国电力出版社也包含在内。

如果降低平均质量标准，仅看数量的话，可以把清华大学出版社也包含在内。

*请注意，平均质量高的出版社不意味着该出版社出版的所有书质量都很高。事实上，我个人认为没有一家出版社能有超过 10%的出版书是可堪一读的。*

其中，机械工业出版社的出版书主要偏向理论，其他出版社的出版书主要偏向实战。所有出版社都不可避免会有一些书存在翻译不说人话的问题，请务必小心。

也有人提到计算机领域的出版社时会提到华章图书、图灵教育这些词。这些都是上述几个出版社的下属出版社，例如机工社下属的华章图书（代表书有黑皮书系列、Effective 系列等，机工社的计算机类图书主要都是华章出版的）、人民邮电下属的图灵教育及异步图书（人民邮电大多数计算机类图书都是这两家出版的）、电子工业下属的博文视点等。

除了国内出版社，西方出版社也应当作为挑选时的依据之一。O'Reilly、Manning 以及 Pearson 是三个常见的西方出版社，前两者几乎只出版计算机领域的书籍。其中，前两个出版社还有比较出名的系列书籍，例如 O'Reilly 的动物书系列和 Manning 的“实战”系列。这些出版社出版的英文书常常被国内出版社（例如上文提到的三大社）在中国翻译出版，例如机工社著名的“黑皮书”系列主要是 Pearson 出版的许多知名英文教材的翻译。

出版社不完全意味着书籍质量高低，即使以高质量著称的动物书系列也存在大量质量一般甚至难以阅读的书。不要迷信出版社。

## 阅读英文原版书籍

需要指出的一点是，如果你英文水平过关，那么直接读英文书的是最好，这样避免了翻译的问题，还能学习最新而不是等翻译完已经过了一年多的技术。此外，英文的技术书还通常是开源的，可以免费下载到 epub 英文电子书而不是清晰度很差的 pdf 中文扫描版，而且这些电子书还是全彩的，而翻译成中文之后里面的图就多半变成黑白的了。

因此，即使你感到自己的英文水平不足，也应该尝试着阅读一下英文书，刚开始的一两本可能是痛苦的，但很快就不会再有晦涩感，你会像阅读中文一样流畅地阅读英文书。

你可以在[O'Reilly Learning](https://learning.oreilly.com/home/)上找到数万本可以免费阅读的英文电子书（不过过了试用期就得充会员了），我曾尝试翻阅其书库的前一千本热门书，惊讶地发现其中有大部分都是很有价值的，它们涵盖了方方面面，从理论到最佳实践，从量化金融到区块链，从前端到运维，甚至还有冷门如量子计算，宽泛如怎样做好一个计算机领域的领导，应有尽有。你可以在上面找到几乎所有国内能买到的翻译版计算机书籍的原始英文版本。此外，在 Github 上也有[开源项目](https://github.com/lorenzodifuccia/safaribooks)提供爬虫可以下载上面的电子书为 epub 格式（建议趁着试用会员没过期之前多白嫖一点）。

事实上，我下面推荐书单中的很多书都已经有了新版，只是虽然英文版已出，但中文版还没翻译好。有一些书虽然英文版已经基本写好了，但等到完全定稿又要花上不少时间，在定稿后的半年至一年时间才会安排英文版出版，等出版之后才会开始翻译中文，所以等你真的读到了中文翻译版其实已经落后了将近两年，甚至更多。因此我非常建议直接去读英文原版，而不是中文翻译，这样能最好地保证时效性。像是深度学习、Web 前端这些领域的技术书，落后一年的很多代码就已经比较过时了。并且直接阅读英文原版能直接避免翻译带来的理解障碍。

而且作为一个程序员，不大可能一辈子不和英文资料打交道。如果要读研究生，那不可避免要阅读英文文献；如果要做一个普通程序员，那也免不了也看英文文档，毕竟中文文档很多是过时的，甚至干脆没有。此外，你要找到自己程序发生了什么问题，在英文的程序员问答网站 Stack Overflow 上找答案，也远比在百度上直接找靠谱得多。趁早锻炼英文阅读能力，是很有好处的，从阅读一本有趣的英文技术书开始，是一个很好的选择。在去掉了翻译的障碍之后，你会发觉许多作者的笔风是多么幽默和生动，远比翻译死板的语言好得多。

> **如何开始**
>
> 如果你希望尝试阅读英文原版书，我的推荐是从薄薄的技术实战书开始。这些技术实战类的书籍时效性强，阅读英文原版能够直接获取最新信息，并且没有太多冗长的理论叙述，较为活泼生动，最重要的是生词不会很多，比较容易上手。如果一开始就从《编译原理》等艰深晦涩的理论书籍开始阅读英文原版书，密密麻麻的专有名词和本来就不容易理解的内容恐怕会十分劝退。
>
> 目前来说，《Head First Design Pattern, 2nd》（注意是第二版，第二版目前还只有英文版，没有中文翻译）可以是个不错的起点，Head First 系列语言幽默风趣，附有很多图片演示，容易理解，而这本 Head First Design Pattern 又尤其广受好评，如果你有一些面向对象的基础，那么通过这本书学一下迟早要用的设计模式是没什么坏处的，顺带着还能锻炼一下英语水平。

不过当然，也不必迷信英文技术书籍。虽然中文技术书籍总体水平要低于英文社区，但仍有一部分作者是富有经验并且也是相当善于编写易于理解的技术书的，例如周志明的《深入理解 Java 虚拟机》。
