【转】给计算机专业大学生整理的书单

闲来无事,利用大半天的时间将本身对计算机课程的而见解整理成一张书单,但愿对如今仍然迷茫的大学生有帮助。(转载请注明出处)  
本人推荐的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语言的类库中找到。
好了很恐怖吧。
相关文章
相关标签/搜索