计算机类学科推荐书单
本人从小喜欢编程,本科和研究生都念的软件工程专业,这么些年下来,也算是读了不少书。近日不少同学想让我给推荐一些书,拉个书单。本考虑到自己才疏学浅,好读书不求甚解,并且实践经历又极少,难免会有疏漏或者偏颇,但是耐不住要我推荐书的同学越来越多,姑且写这么个推荐书单,希望能对大家有所帮助。
下面这些书有的我读过,有的我只读了一部分章节,有的我想读但是没有读。对其评论可能有所偏颇,希望大家能够补充或者纠正。
算法
算法概论(Algorithms):这本书言简意赅,仅从算法的设计本身讲述了一些常用算法,书比较薄。其内容的组织形式比较利于学习算法的设计和思想,能够带来一些本质性的理解。建议至少读两遍。
算法导论(Introduction to Algorithms):这是一本经典教材,内容详尽、丰富。中文版不少插图有错误,强烈建议购买英文版,然后自行比对出版商提供的errata。书后的练习题也很多,有些难度很大,建议有选择性的做。这本书主线内容有两部分——算法设计和算法性能分析。两者相互影响相互促进,是以一个完全不同于算法概论的视角来解析算法的。建议至少读三遍。
程序员实用算法(Practical Algorithms for Programmers):这本书我没有读过。前两本书详尽的介绍了如何去设计一个好的算法。这本书侧重于在工程上如何实现高质量的算法。本书中的一些算法与前两本书中描述的算法并不完全相同,这一点需要特别注意。建议读这本书的时候,同时自己多实现一些算法,对比一下差别。
算法:C语言实现(Algorithms in C):这本书比上一本书还要详尽的实现了很多常用算法。同时也不乏对算法的分析和原理的讲述。有些部分,比如红黑树,甚至比算法导论中讲述的还要精彩。
算法艺术与信息学竞赛:上面提到的常规的、通用的算法,还是比较容易理解的,但是你是否真正的理解了其深层次的思想和本质?看看这本书吧,竞赛题基本上总是变态和匪夷所思的,你的任务就是在不可能中去寻找那一丝丝成功的路径。这是一本能够让你大脑超负荷运转的书。看这本书的同时,你可能要参考很多其他的资料。同时,希望你能够多做些ACM题。你会发现,很多问题需要你从不同的角度去看待,你可能会设计出很多算法来解决这一问题,但是经常会有更优秀的算法带来本质上的改变。
编程之美:微软技术面试心得:这本书也是一本难得的好书。书中的每一个问题都由浅入深的给出了多个解决的算法,之后还会进行更进一步的扩展。
代码之美:这本书记叙了很多实践中的代码优化问题,涉及到的语言、设计层次都很多,可能需要读者的知识面比较广,才能够有比较大的收获。
计算机程序设计艺术(The Art Of Computer Programming):只看过几十页。怎么说呢,只要你能耐得住寂寞一直看,肯定看得懂。就是内容实在是太详尽,太多了一些。算是算法类的终极读物吧。
数学
组合数学(Introductory Combinatorics):我所遇到的很多算法方面的问题,都是与组合数学有关的。同时,学习组合数学,也为古典概率论的学习打下了基础。这本书虽然只是简略的介绍了组合数学的方方面面,但是每一方面讲的也不会让人觉得不够细致。组合数学中主要讲述了三类问题——组合计数、组合设计、组合优化。这本书比较偏数学一些,和计算机科学的联系并不紧密。
具体数学(Concrete Mathematics):有人认为这本书是组合数学的进阶版本,我不这么认为。我认为这本书是从另一个角度讲述了组合数学,尤其是偏向于计算机科学应用。书中的很多内容十分的精妙,让人赞不绝口。看这本书的时候一定要耐着性子慢慢看,有可能几个小时才看不到 10 页。这本书建议至少读两遍。
陶哲轩实分析:这本书倒是可以视作数学分析的进阶版本。反正一般情况下计算机专业也用不上复分析,好好学学实分析还是很有必要的,尤其是在学习概率论等相关内容的时候。
概率论与数理统计:这方面我看的书比较少,只是觉得考研教材编的也不错。
统计学习方法:这本书我还没有看过。不过我觉得其内容应该与机器学习、数字图像处理、自然语言处理等十分相关。
信息论、推理与学习算法:说实话,我至今也不知道信息论会不会对我今后有所影响。我觉得,如果不做编码、通信、图像处理相关的事情的话,可能信息论能够发挥的作用比较有限。
自动机理论、语言和计算导论(Automata Theory, Languages, and Computation):这本书应该作为编译原理的前提教材。
Software Foundations:形式化方法课程的教材。可以建立起函数式编程思维的基础。
Types and Programming Languages:与 λ 算子有关的数学理论,如果你了解 Church 和 Turing,以及 Lisp 的话,你一定会对这本书非常感兴趣的。
计算机程序的构造和解释(Structure and Interpretation of Computer Programs):这本书怎么说呢,反正我是看了快两遍了,还是看的很头疼。不过这本书确实揭示了一些与现在流行的用 C 语言来进行基础教学的图书所不同的编程本质。
编程的本质(Elements of Programming):这本书我还正在看。也是一本比较头疼的书。这本书确确实实的是在讲编程的数学本质原理。
操作系统
一般性内容
操作系统概念(Operating System Concept):经典教材,没什么多的可说。
现代操作系统(Modern Operating Systems):没看过几页。
操作系统:精髓与设计原理(Operating Systems, Internals and Design Principles):还没有看过。
编码:隐匿在计算机软硬件背后的语言(Code:The Hidden Language of Computer Hardware and Software):还没有看过。
深入理解计算机系统(Computer Systems:A Programmer's Perspective):这本书让我觉得真正将操作系统、计算机组成原理和 C 语言联系起来了,非常推荐。另外,我觉得一般可以跳过第四章处理器体系结构。
编程卓越之道第一卷:深入理解计算机(Write Great Code:Understanding the Machine):还没看过。
编程卓越之道第二卷:运用底层语言思想编写高级语言代码(Write Great Code:Thinking Low-level, Writing High-level):还没看过。
Unix类操作系统
UNIX操作系统设计(The Design of the Unix Operating System):还没看,不过应该算是Bible了吧。
Linux内核完全剖析:针对于早起Linux内核代码的分析,比较简单,易于上手。
UNIX编程艺术(The Art of UNIX Programming):这本书更多的是偏重于UNIX程序的设计原则。
Windows操作系统
深入解析Windows操作系统(Windows Internals):还没看,不过应该算是Bible了吧。
Windows内核原理与实现:还没看。
Windows编程启示录(The Old New Thing:Practical Development Throughtout the Evolution of Windows):这本书解释了很多原本我不能理解的 Windows 的设计,确实很多事情慢慢变得让人费解,都是历史遗留原因。
编译原理
编译原理(Compilers:Principles, Techniques, & Tools):龙书,偏重于前端。
现代编译原理(Modern Compiler Implementation in C):虎书,确实要现代一些。
程序设计语言原理(Concepts of Programming Languages):没看呢。
编程语言实现模式(Language Implementation Patterns):没看呢。
程序员的自我修养:主要是和Windows有关。
链接器和加载器(Linkers and Loaders):这本就主要是和Linux有关。
C语言
C程序设计语言(The C Programming Language):都是计算机专业的了,就别看谭浩强了。习题非常棒,建议无论如何都要做一下。
C程序设计语言习题解答(The C Answer Book):配套答案。
C语言程序设计:现代方法(C Programming:A Modern Approach):没看呢。
C语言参考手册(C:A Reference Manual):当手册用吧。
C语言接口与实现(C Interfaces and Implementations):没看呢。
C专家编程(Expert C Programming):很有启发性。
Binary Hacks:一些二进制层面的技巧。
内存受限系统之软件开发(Small Memory Software):没看呢。但是应该很有启发意义。
C++语言
C++程序设计语言(The C++ Programming Language):Bible不解释。
Accelerated C++(中文版):上一本书全倒是全了,不过实在是太厚了,不适合上手,这本书就好多了。
C++语言的设计与演化(The Design and Evolution of C++):C++创始人写的,对于了解C语言和C++语言都十分有好处。强烈建议反复阅读。
C++标准程序库(The C++ Standard Library):标准库也是C++语言不可分割的一部分。
Boost程序库完全开发指南:Boost中的很多内容将加入到C++1x中。
C++编程规范(C++ Coding Standards):有很多有意义的指导。
Java语言
Java核心技术(Core Java):建议粗看,然后当手册用。
深入理解Java虚拟机(Understanding the JVM):没看呢。
Java并发编程实战(Java Concurrency in Practice):没看呢。
网络编程
UNIX网络编程(UNIX Network Programming):厚,内容详尽。
软件设计
7周7语言:理解多种编程范型(Seven Languages in Seven Weeks):没看呢。不同语言的思维方式不同,能够带来很大启发。
深入浅出设计模式(Head First Design Pattern):设计模式的入门书籍。
设计模式:可复用面向对象软件的基础(Design Patterns):Gang of Four的书,反正我上手的时候看不懂,建议看完上一本书再看这一本,然后当手册用。
企业应用架构模式(Patterns of Enterprise Application Architecture):强烈推荐。尤其是做Web开发的。
设计模式沉思录(Pattern Hatching):还没看。
代码整洁之道(Clean Code):还没看。
重构(Reflectoring):还没看。
软件工程
人月神话(The Mythical Man-Month):小说。
人件(Peopleware):如果说人月神话关注的是软件开发本身,这本书关注的则是软件开发中的“人”。说实话,看完之后心情很复杂。
观止——微软创建NT和未来的夺命狂奔(Show Stopper!:The Breakneck Race to Create Windows NT and the Next Generation at Microsoft):就当小说看吧^_^
程序员修炼之道(The Pragmatic Programmer):有一些启迪。
卓有成效的程序员(The Productive Programmer):就是讲述如何在开发软件的过程中变得更加高效。
Git权威指南:强烈建议每一个程序员都读这本书,然后将Git作为自己的常备工具。