2015 年读过的那些书

「年轻人,你的问题主要在于读书不多而想得太多。」 — 杨绛

2015 年读了不少书,收获也不少,到了年底写个小结。

自从转行之后面对一个全新的领域,很多知识要去补,并且互联网本身可能是现在这个时代发展最迅速的一个领域了,所以为了赶上步伐,更是有无穷无尽的知识值得去学习。再加上创业这个「快速列车」,踏上的不一定是快速积累财富的通道,但一定是快速成长学习的一个通道(当然,前提是你真的在努力做这件事)。接下来就分享下最近一年读的书以及书评,书单是按读的时间顺序从旧到新排序的,书评是将非技术类的放前面,技术类的按语言划分放后面。

2015 年的书单:

  • 精益创业
  • The Swift Programming Language
  • JavaScript: The Definitive Guide
  • JavaScript: The Good Parts
  • 深入浅出 Node.js
  • 计算机程序的构造和解释 (SICP)
  • 淘宝技术这十年
  • 黑客与画家
  • Think in Java
  • Spring in Action
  • 人月神话
  • SQL 必知必会

《黑客与画家》

这本书是我今年读到的最好的一本书,所以放第一个。

这本书是一个文集,各个章节是独立的,作者是硅谷最著名的孵化器 Y Combinator 的创始人 Paul Graham。前面一半讲的内容基本跟技术无关,但也是个人觉得最有价值的内容,主要是关于创新、教育、财富的积累分配、如何思考等等,内容非常有启发性,即使不在这个领域也很建议读一下。

详细的内容不想展开讲了,200 页的书一两天就能看完,我是陪老婆逛街时站着看完的……然后吃饭时迫不急待地把书里阐述的想法跟她讲了一通……

书里的技术部分有些我不太苟同,作者一直在安利 Lisp,唱衰 Java 什么的,普通的公司项目别说用 Lisp 了,搞个 Go 什么的也找不到靠谱的程序员啊。


《人月神话》

前两天看到个微博:

一个女人生一个孩子要十个月,所以十个女人生出这个孩子只需要一个月,加加班还可以压缩到两个星期……嗯,给你五个女人,一个月后我要看到这个孩子。 —— IT公司老板的思考逻辑

上面这个微博阐述了什么是「人月」,一个女人生一个孩子要十个月,也就是说生一个孩子的工作量是十个「人月」,很多愚蠢的老板想当然地觉得要让项目快速完成,只需要多些人手或者是让员工加班就解决了,但问题其实没有那么简单,生一个孩子这事是无法由多人来拆分工作继而共同完成的,很多项目(尤其是中大型的)也同样是无法简单拆分工作的。当项目越来越复杂,需要的人手越来越多的时候,人与人之间的额外的沟通成本就迅速增加(几乎是指数式的),然后公司就开始渐渐跳入一个深坑,变得累赘不堪,再也爬不出来。

这本书主要就是为了解决软件工程上遇到的这类问题,书里讲的很多内容都是实际项目中经常会踩到的坑,我看的时候时不时地会觉得自己跳过的坑实在太多了,后悔没早点看这书,刚创业那会真是太 naive 了。

书的背后还有这样一句话:

有些书对读者和作者像是年金,它们年复一年地分红……

为什么对于读者像是年金?因为这本书的信息量比较大,你可能要亲自跳过一些坑之后才会对里面的内容感同身受,所以你每年拿出来读一遍说不定都会有新的见解,

为什么对于作者像是年金?这本书是四十年前出版的,没错,软件这个发展这么快的行业,居然能有一本书热卖四十年,虽然里面提到的技术名词我们这代人可能压根没听过,但里面阐述的软件工程上的一些坑,我们这代人还在继续跳,我们还是在寻求着橄榄枝。


《精益创业》

这本书正好是一年前看的了,内容大多记不得了,当初也是囫囵吞枣看了一遍。

个人对成功学这一类的书比较反感,我始终的一个观点就是「纸上得来终觉浅,绝知此事要躬行」。但这本书阐述的观点我还是比较认同的,在现在这个创业环境中,失败太常见了,小到一个细节上的设计失误,大到公司战略决策上的失误,无数公司黯然收场。如果我们无法做到有超越常人的预见性,就该「拥抱变化」、「拥抱失败」、不停试错。但试错是有成本的,我们应当尽量把这个成本降到最低,于是就催生了快速迭代、敏捷开发、最小化可行产品等等理念。

总的来说,这本书主导的一些做法在多数优秀的初创公司都是比较盛行的,还是比较有借鉴意义的。


《计算机程序的构造和解释》

这本书原名《Structure and Interpretation of Computer Programs》,简称「SICP」,被称作为「魔法书(Wizard Book)」。为什么这本书被称为魔法书呢?因为书里的内容在你眼里可能会是满满的「黑魔法」。

我们这一代理工科的多少都学过一些程序语言,大多是从 C 语言开始学的,接下来不管是学校课程还是自学,无非就是 C++,Java,Python 等等,这些更高级的语言最重要的一个特性就是面向对象。如果说量子力学是对物理系本科生的第一个 Brain Storm 的话,那么面向对象可能就是对 CS 本科生的第一个 Brain Storm,从此面向对象的思维方式就会贯穿今后的工作学习了。

而这本书是用一种 Lisp 方言(Scheme)来讲解的。第一章讲了在 Lisp 的世界里,函数是一等公民,函数可以被当做参数进行传值、返回,这个特性赋予了程序更高的抽象能力,所以对习惯了面向对象的思维方式的程序员来说,这可能又是一个 Brain Storm,这种编程方式被称为函数式编程(Functioanl Programming),这种思维方式可以对应于数学中的泛函。

这本书看着不算厚,但想好好理解的话得刷书里的题,很费时间,我才刷了两章。刷完两章题目后的感受是:对程序抽象能力是一种很好的培养。虽然实际工作中用函数式编程的场景不多,更很少有机会写 Lisp(虽然现在各个主流的语言都支持 Lambda 了,但工业界觉得面向对象才是最适合整合广大程序员力量的一种方式),但当你从一个更高的维度降下来,再看待同样的东西的时候,你的理解会更透彻,可以理解为《三体》里的『降维攻击』:)

当然,这本书只是 MIT 的本科教材,也没必要把它捧得太神啦:)


《The Swift Programming Language》

市面上多数程序语言的书籍都有一些不足,譬如:

  • 内容过于肤浅,只讲 How,不讲 Why,一般实践类的书都是这样
  • 语言很机械,让人食之难咽,中文翻译的书不少都这样
  • 讲得过于面面俱到,有些很少用到的东西还在那长篇大论
  • 举例子可能会走两个极端:没有例子,读完了也写不出什么程序;例子太长,2-3 页的例子看代码要看老半天

这些问题有些是因为作者自身理解不透彻,有些是作者语言风格的问题,还有些是书本身定位的读者群体就是这样的。

但这本 Apple 官方的 Swift 书籍个人觉得在这些问题上拿捏的很好,排版很清晰有条理,对于有一定语言基础的读起来应该会很顺畅,Swift 独特的语法以及理念会讲得比较深入,语言界的「江湖规矩」就不会太拖泥带水。个人觉得 Swift 看这本就够了。

Swfit 这门语言个人也很喜欢,这是门很「现代」的语言,语言特性很丰富,譬如:auto、optional、generics、lambda、tuple 等等。一些老牌语言也只是近些年来才加上这些特性,譬如 auto, tuple 是 C++11 才有的,optional, lambda 是 Java 8 才有的。

语法方面也比较简洁,公司的 iOS 程序员从 OC 转到 Swift 之后写得更开心、生产效率也更高了:)

而且 Swift 现在在 Linux 平台上也可以使用了,说不定以后在服务器端也能占得一席呢。


《Think in Java》

中文名《Java 编程思想》,是 Java 的经典书籍了。

这是本大部头的书,比较难啃,我是花了两个星期硬啃下来的,跳过了一些内容,尤其是有关桌面的完全不用看(因为这个领域 Java 已经失去地位了,哈哈)

书的内容方面个人不太喜欢,感觉比较繁琐,面面俱到,没什么侧重点,有些例子太长了,像反射、注解什么的。

但深入了解 Java 的书籍貌似也不多,下次可以考虑看下 Oracle 官方的试试。这本看完可以接着看看《Effective Java》、并发编程、JVM 虚拟机什么的。感觉 Java 的世界真的是太庞大了……


《Spring in Action》

这本书刚出了第四版,还没有中文翻译的,但肯定得看最新版的。

Spring 这个框架是企业级 Web 框架里最成熟的了。Java EE 官方也有相应的东西叫 EJB(Enterprise Java Bean),这个 EJB 据说是 Java Bean 的加强版,但配置太困难了(这点我也是道听途说),所以大家更喜欢用 Spring 的 POJO(Plain Old Java Object),简单的理解就是 Spring 框架下一个很普通的 Class 生成的 Bean 能跟 EJB 有同样的威力。据说当年 Sun 公司的人安利过淘宝用 EJB,用了一段时间后淘宝还是全部转到 Sping 框架了:)

Spring 本身现在已经越来越庞大了,功能也非常多,再加上这里面还穿插着 Java EE 的技术,入门的门槛有点高了。

我个人是从 Spring Boot 入门的,然后结合 Spring Web、Security、Data JPA 等 Project,可以快速上手做个小项目玩玩。等有个大概的了解后,开始看看官方的 Spring Framework Reference Documentation 深入理解一下。但这个 Reference Documentation 也是很庞大的,没有例子解释,更适合当字典来参考,没什么基础直接啃还是比较困难的。

这本《Spring in Action》主要讲了 Spring 框架下核心的和常用的内容,详略得当,个人觉得作为入门挺合适的,语言风格也很好。


《JavaScript: The Definitive Guide》

JavaScript 的世界据说是充斥着烂代码,我以前的印象也是这样的,因为刚有互联网那个年代网页经常出错、蹦出对话框什么的,觉得都是 JS 的锅。而且以前大家对 JS 也不太看重,直到 Google 搞出个 Gmail,大家才发觉原来可以用 JS 做这么炫酷的事,直到今天,JS 是互联网上唯一通行的脚本语言了,没有竞争者,所以这门语言再怎么有问题都得好好用呀。再加上如今 Node.js 的出现,JS 就更加受到关注。感觉 JS 已经完全脱离了当初设计时的初衷,被赋予了超过其本身的使命。

而我们最初的一个项目用的也是 Node.js,所以我当时有必要对 JavaScript 好好了解一下,但只看了这本书 前面 JavaScript 核心的部分,后面有关 DOM 树操作的没看。这本书作为 JavaScript 圣经,内容是很翔实的,而且根据 Douglas Crockford(我也不清楚这人啥来头……)的说法,JavaScript 世界里的烂书太多了,因为大家都不真正理解它,这本貌似是他唯一推荐的一本。


《JavaScript: The Good Parts》

前面说了,JavaScript 烂代码太多。主要原因是 JS 非常灵活,你怎么写都是对的,而且像内存泄露什么这种事发生也影响不大,因为页面一关就都销毁掉了。

为了学习正确的打开方式,把代码写得规范点,还是很有必要读下这本书的,200 多页,应该很轻松读完。作者 Douglas Crockford 还写了个 JSLint 工具,就是检查你写的风格是不是按他要求的做的:)现在还衍生出来 ESLint 什么的,已经成为前端工作流中的一个环节。


《深入浅出 Node.js》

Node.js 现在看着挺热闹的,但好书不多,国内流传得比较多的就这本。想深入了解下 Node.js 的可以读读,讲的都是 Node.js 底层的东西。看网上大家吹捧 Node.js 多好多好,不如自己好好了解一下。

最近已经放下 Node.js,主攻 Java 和 Spring 框架了,所以也不太了解这个领域未来的发展。但这个领域变化很快,还没很成熟的模块、框架,大家要做好学完就过时的心里准备,当初撑起 Node 半边天的 Tj 大神已经转战 Go 了,他弄的 Express 框架应用得非常广泛,但最近也有点面临无人维护的困境。


《淘宝技术这十年》

个人挺喜欢这本书,也是本轻松的读物。从这本书里可以了解到一个看似简单易用的淘宝,背后是多么复杂庞大的一个系统,凝聚了多少人的力量,所有技术的产物都是把简单易用留给用户,把复杂藏在背后的系统里。并且这样一个庞大的系统是如何一步一步走到今天的,从当初的简陋的 LAMP 架构,到购买 IOE,再到去 IOE,最后自主研发底层的基础设施。看完觉得还是挺喜欢阿里的工作氛围的。


《SQL 必知必会》

这本数据库的书很简单,一天就能轻松看完,主要就是讲怎么写 SQL 语句,适合服务器端开发人员对数据库进行一些简单的操作。查询讲得比较多(因为用得也多),一些高级的特性也都简单介绍了一下,至少让你知道有这么个东西可以用。所以总体来实用性很好,适合数据库入门,或者想快速上手做点东西,拿来简单地参考一下。想深入了解或是走 DBA 这条路的话,这本书显然是不够的。


2016 年的读书计划

过去一年中,觉得书还是系统地获取知识的最佳途径,项目实践是深化理解的一个过程,而搜索引擎则是解决问题、获取某个知识点的快速途径。

2015 年接触的东西比较杂,基本上从前端到数据库都亲手做过,语言、框架也学习了好几种,接下来一年里计划深入研究下 Java、Spring 以及数据库,架构设计、项目管理这些能力也要走在公司发展的前头,还有算法、网络基础什么的欠缺的都得补上,最后非技术类的也得尽量多学习。

当 Glendower 咆哮道「我可以召唤地下的幽魂」,

Hotspur 说「我也会,谁都会,可是你召唤它们的时候,它们果然会来吗?」

— 莎士比亚的《亨利四世》

现在这个时代的科技巨头里我最欣赏的是 Elon Musk,跨界跨领域创造传奇靠的不光光是胆识,也靠强大的行动力。