<Introduction to Algorithms> (Thomas H. Cormen et al.)
现在已经不是我读大学的那个时代了,我看那些本科生直接看算法导论完全没压力,所以其实也不用这本那本的推荐了。实在还嫌算法导论难的话就上面那本吧,简洁得多,有具体的程序语言实现,也没那么些数学证明。 1.3. 高度依托于算法的课 其实依托于算法的课程非常非常多,鉴于都是选修课,就介绍两个吧: 1.3.1. 数据挖掘 <Data Mining: Concepts and Techniques> (Jiawei Han et al.)
现在大家都把数据挖掘挂在嘴上了,不提不行啊。 1.3.2. 人工智能 <Artificial Intelligence: A Modern Approach> (Stuart Russell and Peter Norvig)
我本人是做人工智能的,所以算是捧捧场吧。人工智能其实是个大杂烩,传统的那些分支,比如搜索,约束,推理,规划,知识表示,已经非常冷门了,所以反过来那些热门的分支都出去自立门户了,比如机器学习,自然语言处理,计算机视觉,机器人。 2. 程序语言 程序语言的知识体系其实并不像国内高校教的那样。程序语言有没有理论体系,有,你要是看过王垠的博客就知道了。在美国的大学里程序语言理论一般分三部分或者说三门课程。第一门语法学,其实就是编译原理;第二门语用学,这个下面会讲;第三门语义学,这个我觉得太理论,离现实太远了。就我本人而言,当年博士资格考试考过语义学之后就再也没有用过。还有,很多人都推崇那本《计算机程序的构造和解释》,其实我觉得如果不搞学术的话完全没必要看那么深。 2.1. 编译原理 <Compilers: Principles, Techniques, and Tools> (Alfred V. Aho et al.)
美国的CS教学特别强调“计算理论”相关的课程内容,比如自动机,lambda表达式,P = NP?。当然做学术的话这些东西可能会用到,但是干程序员的话这些东西基本上不会用到。而唯一比较接地气而又涉及到计算理论的东西就是编译原理了。 2.2. 程序语言语用学 <Programming Language Pragmatics> (Michael l. Scott)
其实我一直没搞懂为什么中国的大学计算机系都不开这门课,按道理国内都应该特别喜欢教这种很“记背”类型的课程啊。我要对国内的学生们强烈推荐这门课程,语用学其实就是比较和总结各种各样程序语言的共性和区别。在去学各种各样具体的编程语言之前,这门课程可以从总的视角来帮助学生了解不同程序语言的背景和特征,对具体语言的特征不但知其然还知其所以然。要是国内大学像美国一样也把这门课列成必修课程的话,可以帮助学生树立很多正确观念,比如“不同语言是有不同的适用范畴的,没什么优劣之分”。 2.3. 具体的程序语言 <C++ Primer> (Stanley B. Llippman et al.)
<Thinking in Java> (Bruce Eckel)
这里贴两本C++和Java的吧,其他的就不贴了。除了C/C++和Java这种学校会教的以外,值得推荐的还有用于脚本的Python,用于网页的PHP和用于动态效果的Javascript,至于Lisp,Prolog啊什么的对普通程序员太远了。 3. 系统 & 工程 这些都是配盘子的课了,我打算提5门,分别是“计算机组成与设计”,“操作系统”,“计算机网络”,“数据库”和“软件工程”。 3.1. 计算机系统 <The C Programming Language> (Brian W. Kernighan & Dennis M. Ritchie)
<Computer Systems: A Programmer's Perspective> (Randal E. Bryant & David R. O'Hallaron)
对于前三门计算机系统的课程,不得不提一下大神级的著作《深入理解计算机系统》,这确实是经典中的经典,我当年都还是看了APUE之后才看的,仍然觉得受益非浅。当然这些课都得先学c语言做基础。 3.1.1. 计算机组成与设计 <Computer Organization and Design: The Hardware/Software Interface> (David A. Patterson and John L. Hennessy)
现在基本上硬件课程在计算机系已经越来越不重要了,做系统结构的大多都跑电子系(EE)去了,并且他们搞完系统结构之后还得过来找程序员的工作,像汇编语言这样的东西也越来越淡出大多数程序员所能接触到的范围了,看看《深入理解计算机系统》了解了解就足够了。 3.1.2. 操作系统 & 计算机网络 <Modern Operating Systems> (Andrew S. Tanenbaum and David J. Wetherall)
<Computer Networks> (Andrew S. Tanenbaum and David J. Wetherall)
以前读大学的时候老师都把这两门课当“记背”类型的课了,都是直到后来看了CSAPP,APUE和UNP才会写。 3.2. 数据库 <Database System Concepts> (Abraham Silberschatz et al.)
3.3. 软件工程 <Software Engineering: A Practitioner's Approach> (Roger Pressman and Bruce Maxim)
---------------------------------------------------------------- 看了仅有的几个回帖之后,想想其实说说哪些课程是不必深究的也是有意义的,所以我在这里补充几个回复: 关于《计算机体系结构量化研究方法》 (回复@monica,@ly517691895) <Computer Architecture: A Quantitative Approach> (John L. Hennessy and David A. Patterson)
本人05年通信工程本科毕业,08年是在电院的计算机应用技术硕士毕业(院系合并之前),毕业后在爱立信写基站板子上的软件,所以我的看法应该不代表“我邮的CS”,从出身而言,我也应该不会因为不了解硬件而忽视硬件课程。 就说说不是我邮的情况吧。我是在美国大学读的CS博士,回复里也有人提到了,由于历史原因,美国很多大学CS和EE都是放在一个系的,但是碰巧了,我读的那个大学不但CS和EE分为两个系,而且CS属于科学学院,EE属于工程学院,甚至EE居然叫做Electrical and Computer Engineering而不是Electrical and Electronical,而这个EE系分四个大组,用中文来说分别是电气工程,电子工程,通信工程和计算机工程。在我读的那个CS系,只有一个韩国教授做的是体系结构这种硬件的方向,他的实验室索性设在了EE系里,所有学生都去EE系的实验室和计算机工程的那个大组一起做,课程也基本上和EE的一起选,但最后所有这个韩国教授的学生还都去的是软件工程师的职位。美国的CS系都要考博士资格考试,当时操作系统和系统结构这两门课是二选一,除了韩国教授的学生以外,我读博士的那么多年里所有其他的学生选的都是操作系统。。 所以我的观点在原文里也说了,如果你做的是计算机硬件相关的方向,那么《计算机体系结构量化研究方法》肯定是必学的,但是鉴于现在CS系做硬件的人越来越少,完全是软件一统天下的局面,我真心觉得CS的课程设置里体系结构并不是必须的了。多说一句,别说CS系了,我当年本科通信工程一个班32个人里面,软件工程师出了八九个,而硬件工程师只出了一个。 关于《计算理论》(包括《形式语言与自动机》)(回复@monica, @pistong,@UnitTest) <Introduction to the Theory of Computation> (Michael Sipser)