闲来无事,利用大半天的时间将自己对计算机课程的而看法整理成一张书单,希望对现在仍然迷茫的大学生有帮助。(转载请注明出处)
本人推荐的97%以上的书籍都是国外书籍,国内大学的教材还是别看了。切记,切记! 0.000 计算机科学导论 教材:1.《编码:隐藏在硬件背后的语言》 2.《通灵芯片》 3.《D is for digital:What a well-informed person should know about computers and communications》 扩展阅读: 《图灵的秘密:他的生平、思想及论文解读》计算机数学基础 0.001 微积分 教材: 1.推荐看MIT的公开课《微积分重点》2.《什么数学:对思想和方法的基本研究》 3.《微积分和数学分析引论》0.002 线性代数 教材:1.推荐孟岩的博客 《矩阵系列》 google 关键字 “孟岩” “矩阵” 即可进入博客 2.推荐MIT的公开课《线性代数》 3.推荐书籍《线性代数》作者Gilbert Strang,只有看电子版的了。没引入0.003 概率论 教材: 1.推荐MIT的《概率导论》 2.《深入浅出统计学》 3.《统计思维:程序员数学之概率统计》 ps:关于数学分析、随机过程、等高级课程就不错赘述了。0.004 计算机科学基础之离散数学 教材: 1.《离散数学及其应用》0.005 计算机科学基础进阶之组合数学 教材: 1.《组合数学》0.006 计算机科学基础高级之具体数学 教材: 1.《具体数学》 ps:这本书难度比较大,科大博士的必修课。之所以推荐这本书是因为如果不读完这本书怎么可能有机会去领略Knuth的神作《计算机程序设计艺术》系列呢?尽管大神knuth在TAOCP卷一中写道有高中的数学知识就能看懂,但是以我的个人经验来看似乎做不到。计算机编程基础 0.007a 程序设计基础 教材: 1.《Little Scheme》2.《How to Design Program》 0.007b 程序设计原理 教材:1.《计算机程序设计的构造和解释》 英文名称《The Structure and Interpretation of Computer Programming》简称“sicp”江湖上人称“魔法书” 2.《Concepts, Techniques, and Models of Computer Programming》 ps:如果你读sicp不做里面的习题简直就是暴殄天物,浪费了。 推荐MIT的公开课“计算机科学及编程导论”尽管他们用python取代了scheme。 0.008 C语言程序设计基础 教材:1.《C语言的科学和艺术》 2.《C程序设计的抽象思维》 3.《C语言程序设计》K&R 进阶教材: 1.《C专家编程》 2.《C语言接口与实现:创建可重用软件的技术》0.009 汇编语言程序设计 教材:1.《汇编语言》作者:王爽 这可能是本书单中唯一一本中国人写的教材面向对象程序设计 C++程序设计 教材: 1.《Thining in C++》 2.《C++ Primer》 3.《Effective C++》 4.《深入探索C++对象模型》 ps:C++的经典教材太多了说不定我可以列出20本来,但是初学者还是先打好基础吧。JAVA程序设计 市面上有很多培训机构的java视频,有些视频讲的真心不错,可以找些看看。 教材: 1.《Thinking in Java》 2.《Effective Java》 3.《Practical Java》 4.《深入理解Java虚拟机》 5.《Java并发编程实践》计算机核心专业课 数据结构与算法: 教材: 1.算法:C语言实现(第1~4部分) 基础知识、数据结构、排序及搜索 2.算法:C语言实现(第5部分)图算法 或者3.《算法》第四版(java描述)(本书红黑树讲的奇好比CLRS好百倍) 4.《算法引论:一种创造性的方法》(一本被大家忽略的好书,正如序言说的,如果你没时间请直接看第五章)
5.《编程珠玑》
6.《算法概论》 一本不厚的算法书,作者惜墨如金,字字珠玑。对动态规划的讲解非常的棒! 7.《编程之美》一本很好的习题册 算法分析与设计 教材: 1.《算法引论:一种创造性的方法》 2.《算法导论》程序设计与计算机系统 教材:1.深入理解计算机系统 计算机网络 教材: 1.《Head First Network》 2.《Tcp/IP详解卷一:协议》 3.《计算机网络:自顶向下方法》操作系统(可以拆分成两门独立的课程) 教材: 1.《现代操作系统》 2.《操作系统:精髓与设计原理》 3.《莱昂氏UNIX源代码分析》 4.《现代体系结构上的UNIX系统--内核程序员的SMP和Caching技术》 5.《计算机系统设计原理》6.《UNIX编程艺术》 7.《鸟哥的Linux私房菜》make your hands dirty,学一学怎么用操作系统吧,各种名目,shell^_^ 听国外读书的朋友讲,学完的之后国外的学生就可以写出一个微型的操作系统内核。Linux/Unix编程实践: 1.《UNIX环境高级编程》 2.《UNIX编程环境》 3.《Linux/Unix编程实践教材》(这本更适合初学者)数据库 教材: 1.数据库系统导论 2.数据库系统概念 计算机体系结构 教材: 1.《计算机体系结构:量化研究方法》软件工程: 邹欣老师在中科大授课时候用的讲义,当时我震惊了。 http://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html 1.《人月神话》2.《代码大全》 3.《UNIX编程艺术》 4.《梦断代码》5.《程序员修炼之道:从小工到专家》 数据挖掘与机器学习 数学基础要好,特别是统计学,线性代数可能还需要更高级的随机过程知识 教材: 1.《Machine Learning in Action》 2.《集体智慧编程》 3.推荐斯坦福“机器学习公开课” 4.《统计思维:程序员数学之概率统计》网络编程: 1.《TCP/IP详解:卷一》 2.《UNIX网络编程(卷1):套接字联网API》 3.《UNIX网络编程.卷2:进程间通信(第2版)》 4.《Java并发编程实践》 5.《HTTP权威指南》编译原理 本人学本科学了一遍编译原理,在科大又学了一遍可以说所有课程里面最折磨人的莫过于《编译原理》这门课了。 教材: 1.《编译原理》:江湖上人称“龙书” 2.《编译原理》:江湖上人称“虎书” 3.还有一本江湖上人称“鲸书”的 4.《编程语言实现模式》一本更“practical”的书籍 5.《程序员的自我修养:编译、链接、与库》近年来中国人写的又一好书。 一门优秀的编译原理课程,在学完之后学生就可以做出来一个简单的编译器。在科大的时候我们正好五次实验最终实现了一个简单的编译器。设计模式: 不推荐初学者看GOF的《设计模式》 教材: 1.《大话设计模式》中国人写的不错的书籍,C#描述 2.《深入浅出设计模式》Head first 系列 3.《敏捷软件开发原则:模式与实践》c++/java 描述4.《重构:改善既有代码的设计》 5.《重构与模式》 6.《重构与手册》 7.好了最后看GOF的《设计模式》吧。最后大家读一读《数学之美》吧,非常棒的一本书。 图形、网络安全、等其他领域的课程日后再说其他话题 1.编程语言之争: 很多在校大学生冥茫到底该学习哪门语言,哪门语言更好。其实语言无好坏,“尺有所短寸有所长”。这就好比我问“到底是锤子厉害还是水果刀厉害”,如果是用来削苹果当然是水果刀厉害。如果是用来砸石头当然是锤子厉害。每门编程语言都有自己的应用场景,我的建议如下: 1.学好C语言 2.学一门传统的面向对象语言C++、C#、java都可以,按照自己的喜好来 3.学一门函数式语言,比如schme,F#,common lisp,ML等等。这里我推荐学习scheme,因为“sicp”,“hodp”两本及其优秀的书籍都是用scheme来讲编程思想的 4.学一门动态语言比如pyton,ruby等等。我个人比好喜欢python 现在很多人都会说“编程语言不重要,重要的是思想”,其实我是不完全同意的。深入一门语言编程,但不拘泥于一门语言。 一个好的学院应该会有相关的课程包含这些不同编程范式的语言,比如读研的时候,我在数据挖掘课上学的python,在编译工程课上学的ML,在形式化方法课程学的F#,我们还有一门课时讲授动态语言ruby的。当然了,还有专门的实践课javaee平台,c#.net平台,等等。计算机专业是实践性非常强的学科,没有累计一定的代码量是不行的。10W行,没错,希望大家在本科四年能够累积10W行的代码量。没必要读研了。如果你读了本书单中的大部分书的话。2.看英文书还是翻译的 大家看我推荐的书单就知道了,我都是写的中文名字。这并不代表我不推荐大家看英文原著。我的观点是,当你进入一个新领域第一本往往得看中文版翻译版的,因为看英文版的有很多术语你看不明白,这样进度会比较慢,打击自信心。反正我是这样的,我学任何陌生领域的第一本书看的都是中文翻译的,以后的书籍基本上就是如果翻译的好就看中文版的,典型的如《unix编程艺术》翻译的就非常好。翻译不好的就看英文版的,比如编译原理课程里面提到的“虎书”的java描述版就翻译的奇差,只能看英文版的。3.有这些书单就够了吗? No,学好一门课程需要非常多的动手实践,计算机专业尤其如此。一门优秀的课程往往得配上非常好的实验课程。比如《深入理解计算机系统》这门课的实验就非常的棒,令我印象最深刻的要数“二进制炸弹”了。当时我们大家都在拆弹,拆的不亦乐乎。可见cmu的老师非常用心的设计了这些实验,但是中国的教育呢? 很少有拿的出手的原创课程吧?大学老师们,你们用点心教学生吧!同学们你们用点心学吧。
如果您是工作一族那么读一读用红色标记的部分吧。
last but not the least 书单中尚有漏网之鱼,日后补上。手头还有很多事要忙,就此搁笔。 如果大家有疑问或者建议可以联系我。 email:sea11107@mail.ustc.edu.cn
补充: 我相信很多学弟学妹看了这个书单可能会产生一种感觉,学一门技术要看这么多书吗?答案是有必要!因为就算是一本极其好的书对一个知识点的阐述也都有不同的侧重点。举个很简单的例子,二分查找。有编程经验的人肯定知道“二分查找”为何物,任何讲数据结构算法的书都会讲,很多人认为自己就理解了。好了下面就检查一下你对二分查找的理解。所有问题都是围绕“二分查找展开”。 如果面试官这么问你:Q1:请描述一下二分查找的思想吧。 Answer:Alabla,很多人可以说出来。Q2:请问二分查找的返回值是什么? Answer:Q3:请在纸上写出完整的二分查找代码吧。(递归、非递归版本) Answer:(你能保证你能写对?90%的程序员都写不对)Q4: 你能给你写的二分查找编写测试用例吗? Answer:(你能保证你能写设计出很好的测试用例?)Q5:你能证明你的二分查找是对的吗? Answer:(循环不变式?)Q6:我现在题目稍微做些改动:给定一个有序数组(升序)arr,求最大的i使得arr等于v,不存在则返回-1. Answer:你能写对吗?Q7:按照上题的叙述我现在要求最小的i使得arr等于v,不存在则返回-1。 还有很多。。。。 如何寻找这些问题的答案呢? 一本书肯定是不够的。你可以到这些书籍寻找答案: 任何一本讲数据结构算法的书籍查找二分查找的概念。 johua bloch的一篇博文《Extra Extra Extra:Nearly all the binarysearch and mergesort are broken》 或者 jdk1.5的 java.util.Arrays里面查找错误二分查找的源代码,jdk1.6中查找正确的源代码 《编程珠玑》寻找不变式的相关答案 《编程之美》寻找相关题目的变体 《代码之美》寻找为二分查找设计测试用例的答案。 不变式的设计也可以再go语言的类库中找到。 好了很恐怖吧。