数据结构部分修改于2010年1月30日
程序语言部分修改于2010年3月18日
BG57IV3
本科不是念计算机的,师弟链接了大牛amiao版内开的书目,感觉太多了,对于不是计算机科班出身的人来说,是很难看完那么多的。仔细删减了再删减,列一下我觉得的计算机软件学科至少应该过一遍的8本,只涵盖“程序语言(C&
C++)”、“数据结构”、“操作系统”、“计算机网络”和“计算机系统”五个主题,其他的诸如编译原理,汇编语言,数据库,Java,软件工程,面向对象等等相对外围的主题我觉得不是绝对必要的。
里面说了很多废话,其实就是8本书,我觉得是真正的必读,也是我觉得比较实际,能在一年之内看完的:
程序语言(C) +
程序语言(C++) +
数据结构 + 操作系统概念 +操作系统实践 +
计算机网络概念 + 计算机网络实践 +
计算机系统
1. 程序语言
《The CProgramming language》(C程序设计语言)(Brian W.
Kernighan & Dennis M. Ritchie)
(ps. C语言是计算机软件学科的描述语言,每个学科都有自己的一套描述语言,计算机软件学科的描述语言就是C语言。一般情况下,我们学习的操作系统源代码和TCP/IP协议栈源代码就是Linux内核的那个版本,是用C语言写的,看得懂C语言才可能看得懂操作系统源代码和TCP/IP协议栈源代码,所以学习C语言是必要的。)
(ps.Dennis M. Ritchie是C语言的创造者之一,他和KenThompson创造C语言只是为了能有效的重写UNIX系统,两个人最终凭UNIX系统拿到了图灵奖。“Hello,World!”就是这本书的原创。)
BG57IV3
《AcceleratedC++》(Andrew Koenig & Barbara E. Moo)
《C++Primer》(Stanley B. Lippman & Josee Lajoie & Barbara E. Moo)
(ps.
其实对于初学者,记住了类和对象的语法并不意味着懂了面向对象,但是似乎去记住类和对象的语法已经是一条去了解面向对象的必由之路了,毕竟很少人会从Smalltalk开始学习,那好吧,一门C++这样主流的支持面向对象的语言是绕不过去了。关于C++,我推荐两本书,《AcceleratedC++》和《C++
Primer》,它们最大的区别是一厚一薄,我一贯觉得看完《C++Primer》这样厚厚一本语法书才开始编程是极为荒唐的。所以《AcceleratedC++》这样的篇幅会更合适一些,它相当于鼓励人们花一个星期的时间对C++有所了解,然后就直接开始编程了,因为学习编程和学习别的事情所不同的地方在于学习编程是靠实践推动的。虽然我很喜欢《AcceleratedC++》这种学院派的行文风格,但也许这也正是它在社区里不被广为接受的原因之一,推荐《C++Primer》也算是我对中国技术社区这种语法至上理念的一种妥协吧。《TheC++
Programming Language》(BjarneStroustrup)要是跟其他书一样展开来写不知道该有多厚,所以初学者还是算了。《EffectiveC++》就像花朵和果实一样醒目,花朵和果实确实能够证明一棵树的茁壮,但是我们应该更在意的还是根本和枝干。《EffectiveC++》之所以被推崇到如此高度的原因应该是那一场场笔试和面试吧。)
(ps. 《LearningPython》(Mark Lutz),脚本语言在实际工程环境中的应用似乎越来越流行,如果学的话,Python应该是个好的选择。)
2. 数据结构
《DataStructures and Algorithm Analysis in C》(数据结构与算法分析:C语言描述)(MarkAllen
Weiss)
《Algorithms in C, Parts 1-4 Fundamental Algorithms,Data Structures, Sorting, Searching》(算法: C语言实现第1-4部分基础知识、数据结构、排序及搜索)(Robert
Sedgewick)
(ps.
因为MarkAllen Weiss的书涵盖得太广,对于基础的部分一笔带过,而后面的章节在没学过算法之前只能看得一知半解,所以还是推荐RobertSedgewick的这本。但是RobertSedgewick的书在细节上也许涵盖得更广,个人感觉其实已经没比《Introductionto
Algorithms》(算法导论)简单多少了,所以我们可以挑那些基础的章节仔细的啃,RobertSedgewick可没有一笔带过,所以啃得下来的话基础就打得非常扎实了。)
(ps.这条线再深入的话,那么《Introductionto Algorithms》(算法导论)就是不二选择了。)
(ps.关于Robert Sedgewick的和MarkAllen
Weiss的书,渊源是这样的,DonaldE.Knuth是计算机软件科学的鼻祖,大家也都听说过《TheArt of Computer Programming》(计算机程序设计艺术)吧,人家都说学软件的不知道Knuth就好比学物理的不知道牛顿,学音乐的不知道莫扎特贝多芬,不过《TheArt
of Computer Programming》这种书离我们远了点,实在有兴趣可以翻翻他另一本也很有名的《ConcreteMathematics》(具体数学),《ConcreteMathematics》的内容相当于《TheArt
of Computer Programming》的第一卷,汉诺塔问题就是这本书的原创。因为DonaldE.Knuth太不平民化了,所以有了RobertSedgewick,Robert
Sedgewick是DonaldE.Knuth的学生,他用具体的工程语言演示了Knuth的高深理论,书根据所使用工程语言的不同,分别叫做《Algorithmsin
C》、《Algorithms in C++》、《Algorithmsin Java》,每种分别是两本,第一本叫《Parts1-4》,指的是“基础”“数据结构”“排序”和“查找”,第二本叫《Part5》,指的是“图算法”。RobertSedgewick的书太大部头了,不适合当教材,也没有涵盖《Introductionto
Algorithms》里那些比较新的主题,所以有了MarkAllen Weiss,Mark Allen Weiss是RobertSedgewick的学生,他是按照教材的款式写的,也涵盖了《Introductionto
Algorithms》里那些比较新的主题,和他老师的风格一样,书根据所使用的工程语言的不同,分别叫做《DataStructures and Algorithm Analysis in C》、《DataStructures and Algorithm
Analysis in C++》、《DataStructures and Algorithm Analysis in Java》)
(ps.Mark Allen Weiss的另一个系列是《DataStructures and Problem Solving
Using C++》和《DataStructures and Problem Solving Using Java》,这个系列是以面向对象的语言特性为主线,以数据结构的实现为实例,详细地解释了这些面向对象的语言特性在具体的问题中是如何运用的,反过来具体的问题是怎么被这些面向对象的语言特性解决的,我个人很多对于C++的真实体悟来源于此书,强烈推荐。)
3. 操作系统
《OperatingSystem Concepts》(操作系统概念)(Abraham Silberschatz)
《Modern Operating Systems》(现代操作系统)(Andrew S.Tanenbaum)
《Operating Systems - Internals and Design Principles》(操作系统 -精髓与设计原理)(William
Stallings)
(ps.三本都是操作系统概念,所以三选一即可。Tanenbaum的很偏重工程实际,程序员们应该喜欢。Stallings的都是些宏观的概念。Silberschatz的我没看过,但从多方评价来看,应该也值得推荐)
(ps.说说Andrew S. Tanenbaum吧,linux的前身就是他所写的仅供教学使用的minix,他的另一本书《OperatingSystems
Design and Implementation》(操作系统设计与实现)详细介绍了minix,两卷本,上卷基于minix讲操作系统原理,下卷带光盘,即为minix源码。从某种意义上来说,TCP/IP协议栈也可以算是操作系统的一部分,应用上两者也是绑死的,所以一般操作系统的大牛们往往也是计算机网络的大牛(比如Dijkstra),Andrew
S. Tanenbaum的《ComputerNetworks》(计算机网络)也是很被推崇的。)
《AdvancedProgramming in the UNIX Environment》(UNIX环境高级编程)(W.RichardStevens)
(ps. apue是操作系统实践最好的书了,要是能啃完它,基本上操作系统的接口应该就都很熟悉了。不过要啃完apue确实是很难的,但是在这个领域真是找不出别的相对简单一点的来替代他,有人推荐《BeginningLinux
Programming》(linux程序设计),在我看来,还是差得太远了。)
(ps.这条线深入的话,客观来说,操作系统实践应该包括两部分,即应用和实现,应用就是使用操作系统的接口函数来实现应用程序,也就是apue的内容;而实现就是操作系统的源代码实现,一般来说就是linux内核,但是这部分是很难的,一般只有做嵌入式、写驱动或者做网络安全改协议栈的人才会看这么深。)
BG57IV3
4. 计算机网络
《ComputerNetworks》(计算机网络)(Andrew S. Tanenbaum)
《Computer Networking: A Top-Down Approach Featuring theInternet》(计算机网络 -
自顶向下方法与Internet特色)(James F. Kurose &Keith W. Ross)
(ps.
二本都是计算机网络概念,所以二选一即可。)
《Internetworkingwith TCP/IP Vol. III : Client-Server Programming and Applications--BSD SocketVersion》(用TCP/IP进行网际互连第三卷
: 客户-服务器编程与应用)(Douglas E. Comer)
《Unix Network Programming, Vol. I :Networking APIs》(UNIX网络编程第一卷:
套接口API)(W. Richard Stevens)
(ps.作为网络应用的实践,W.Richard Stevens的unp还是很难的,不过好在不像apue,unp有《Internetworkingwith
TCP/IP Vol. III》可以作为替代,《Internetworkingwith TCP/IP Vol. III》比起unp来说简单很多,完全是从零开始,并且是反反复复讲得很细的风格,所以高手们可能不喜欢,会觉得讲得太浅太罗嗦。)
(ps.W.Richard Stevens
的盛名确实名符其实,总共写了六本书,除了前面提到的apue以外,还有《UnixNetwork Programming》(UNIX网络编程)两卷,《TCP/IPIllustracted》(TCP/IP详解)三卷,本来《UnixNetwork
Programming》是计划写三卷的,可惜W.RichardStevens写完前两卷就英年早逝了。《TCP/IPIllustracted Vol. I : The Protocols》(TCP/IP详解卷1:
协议)是最好的从实践角度了解网络协议的书。同样,计算机网络实践也应该包括应用和实现,应用就是使用socket的这套接口函数来实现网络应用,也就是《Internetworkingwith
TCP/IP Vol. III》或《UnixNetwork Programming,Vol. I》的内容。而实现就是TCP/IP协议栈的源代码实现,即为《TCP/IPIllustracted
Vol. II : The Implementation》(TCP/IP详解卷2:
实现)或《InternetworkingWith TCP/IP Vol II : Design,Implementation,andInternals》(用TCP/IP进行网际互连第2卷:
设计、实现和内部构成)的内容。同样,实现比应用难很多。)
BG57IV3
5. 计算机系统
《ComputerSystems: A Programmer's Perspective》(深入理解计算机系统)(Randal E.Bryant & David O'Hallaron)
(ps.从后往前看,把之前看的串起来复习一遍,因为书是从底层硬件往上层软件写的,对我们这些做软件的来说,前面计算机体系结构的部分只能尽量看吧。在书中第2部分开始的地方,有章节详细讲了“链接”的内容,个人觉得是很重要的部分。)
BG57IV3