byr看到的,苦于无法收藏,转载于此。
原文链接:http://bbs.byr.cn/#!article/SoftDesign/45263
简单总结一下计算机科学(CS)的课程体系
今天无意中看到了我多年前这个版上发过的一个帖子,叫《我心目中计算机软件科学最小必读书目》,然后发现自己的想法到现在真是变化好大,所以特意上站来把帖子删了。但是删完以后才发现网上已经到处都是转载了,心里那个惭愧啊,算是散播了一些偏见。因此想了想还是补一篇相类似的帖子吧,不过不想从什么“必读书目”的角度写了,类似地总结一下计算机科学(CS)的课程体系吧。
关于计算机科学(CS)的课程体系,我个人打算分三部分或者说沿着三条线来总结,分别是“数据结构 & 算法”,“程序语言”和“系统 & 工程”。
1. 数据结构 & 算法
数据结构和算法其实就是一回事
1.1. 离散数学
<Discrete Mathematics and Its Applications> (Kenneth H. Rosen)
好吧,可能对程序员们来说,已经想不起还有这么门课了。不过其实对于一个没接触过CS数学思维的人来说(比如大一新生),学一下离散数学还是有所帮助的,像递归这些概念我们已经习惯了所以觉得理所当然,但是对外行来说还是不那么容易理解的,至少我给我老婆讲的时候她没理解。
1.2. 数据结构 & 算法
<Algorithms> (Robert Sedgewick & Kevin Wayne)
<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才会写。
3.2. 数据库
<Database System Concepts> (Abraham Silberschatz et al.)
3.3. 软件工程
<Software Engineering: A Practitioner‘s Approach> (Roger Pressman and Bruce Maxim)
--