有哪些你看了以后大呼过瘾的编程书?
509 个回答
没想到竟然上了日报。好方……
———————————————
大学时我对编程语言有过一些困惑:应该学哪个编程语言?到底怎么样才算是掌握了编程语言?5年前我幸运地看到了垠神在新浪博客的一篇文章 - 如何掌握程序语言,里面推荐阅读SICP的前三章。我读过之后,受益良多。
曾几何时,SICP是每个MIT CS学生大一就要上的基础课的教材,毕竟是世界名校,比我们的课程不知高到哪里去了。然鹅,时过境迁,MIT的教授们已经停止这门基于SICP的课程了,因为一方面他们已经教了太久(十几年了),感觉很烦了,另一方面他们认为软件工程的学生现在把大部分时间花在阅读软件库的说明书上,然后搞清楚怎么调用,SICP跟这套工作流程已经不怎么相关了。
好了,虽说这门课已经不更新了,SICP的作者承认他们并不知道应该如何安排更合理的课程,所以我们还是要看看这本书。
另外,基于这本书,伯克利的一位教授搞了个教学网站 - http:// composingprograms.com/a bout.html ,用Python来教SICP,有兴趣可以去看看。这个网站的内容也是基于伯克利的CS 61A,这门课的名字就叫SICP。实际上MIT也已经用Python替换了Scheme,所以我个人更推荐上面这个网站,比起Scheme,Python更加适合初学者。不过SICP的内容不会过时,Scheme只是一个表现形式,扫一遍前三章也绝对不亏。非初学者也会有时看时新的感觉。
SICP帮助读者了解CS的核心概念,属于从高空俯瞰世界,刚入门的读者不应该错过。
说完了高空,接下来我想推荐另一本中间高度的书,这本书帮助我从了解如何组织代码的模块,以及实践中业界遇到的问题,以及如何用合适的架构来解决这些问题。
Clean Architecture: A Craftsman's Guide to Software Structure and Design
这本书是Uncle Bob最近几年的博文合集,读完以后有种灵台清明的感觉,做code review的时候思路清晰了很多。
看过差的架构才明白好的有多么珍贵。架构都是一点点烂掉的,所以防微杜渐很重要,而要防微杜渐,就必须要从一开始就知道正确的架构方向。这本书不长,英文版也只需要不到10个小时就能读完,大学里或是工作中的读者应该会喜欢这本书。这本书2017年9月才出版,时效性远远超过经典的Martin Fowler的Patterns of Enterprise Application Architecture,你如果准备读后者,建议你先读这本小书。
说完了中间高度,还有一本更加细节的书,我实在不能不推荐,因为我看到高票答案里都没提到,也许是因为这本书2017年三月才出版,还没有中文的。
Martin Kleppmann的DDIA:Designing Data-Intensive Applications。
这本书的作者阅读量非常广泛,以数据密集型软件的设计为楔子讲了分布式系统的很多东西,从设计思路到一些具体细节,收放自如。从Netflix的技术博客,到开源软件的技术来源,再到OSDI上各个业界大厂发的论文,让我大饱眼福。一共12章节,目前看到了第9章。
如果说上一本是讲了高可扩展性、高可维护性的架构,是骨架;那么这本书是讲了分布式、高并发、高性能、高可用的软件,是血肉。细胞的级别讲不出来,绝知此事要躬行。
微软CTO Kevin Scott对这本书的 评价 是『每一位软件工程师的必读书。』
目前这本书在Goodreads上有404个评价,评分高达4.68,要知道SICP才4.45.
简单强调一下:国内的朋友不要排斥阅读英文资料,作者都是理工科,写作词汇量基本也就是四级英语,跟咱们高中英语差不多。
看了这两个回答,赶紧学习吧:
Memoria:17 年美国 CS new grad 就业到底有多差?
SICP, 《Structure and Interpretation of Computer Programs》, 中文名是《计算机程序的构造和解释》。
当年在某号称养老院的大厂, 有充足的时间学习喜欢的技术和看书。某次网上看到有人推荐此书,到亚马逊一看,不仅评分高,关键是评论的前两条分别是Peter Norvig和Paul Graham两大神的五星好评(评论参见
这里和
这里),于是立刻下单购买了。
虽然已经过了两年多了,但是自己还记得读它时给自己带来的惊喜。
惊在于这本80年代写的书,哪怕过了30年在知识爆炸各种新技术层出不穷的今天,书中的内容不但没有过期而依然保持高价值,因为它讲的不是术而是道,即不是某一项具体的技术,而是通过scheme这门lisp方言和相关的例子,解释了计算机程序的本质和特征。还记得当时看到书中一个例子,通过scheme写出了getter和setter,以此来增加一层抽象,隔离底层的具体实现,自己心中十分激动。因为可能大部分人(包括我)学习getter,setter的概念是通过Java等面向对象编程语言, 而理解面向接口编程的原则也是通过OOP, 但是scheme这门“简单”(指一眼看去只有括号和极少关键字的观感)的lisp方言,一样能够实现setter和getter, 以此展示抽象这一计算机程序的重要特征。另一方面也印证了《Code Complete》里面强调的"programming into a language rather than programming in a language"原则, 即我们应该把编程的通用原则和规范应用到具体编程语言中,而不是受某门编程语言的限制而忽略了编程的通用原则。另一个印象深刻的例子展示出了代码即数据,这种统一性比上一个例子更有广泛的意义。因为程序就是一种数据的表达形式,和0代表否1代表是本质上没区别,只是表达内容更为复杂表达形式更加丰富。
喜在于虽然阅读过程十分烧脑,要理解书上的scheme例子,特别是后面越来越复杂的例子,并不简单。 但是整个过程下来,通过例子所引导思考过程,让自己更加深入理解了作者想要表达的东西。重重思考而“悟道”带来的欣喜,就是所谓的“思考的乐趣” 。
坦白而言,从功利的角度,看《XXX实战》等类型的技术书,对我们工作或面试的实际帮助更大,可以帮我们解决工作中某个问题,或者工作面试多答对一个问题。 但是,如果你热爱编程,热爱思考,充满好奇心,那么我将此书隆重推荐给你。
此时我也决定重读此书了: )
以上。