简单总结一下计算机科学(CS)的课程体系

来源:互联网 发布:中国战争潜力知乎 编辑:程序博客网 时间:2024/04/29 10:03
简单总结一下计算机科学(CS)的课程体系 
  
2014年11月25日 添加了几个回复 
  
今天无意中看到了我多年前这个版上发过的一个帖子,叫《我心目中计算机软件科学最小必读书目》,然后发现自己的想法到现在真是变化好大,所以特意上站来把帖子删了。但是删完以后才发现网上已经到处都是转载了,心里那个惭愧啊,算是散播了一些偏见。因此想了想还是补一篇相类似的帖子吧,不过不想从什么“必读书目”的角度写了,类似地总结一下计算机科学(CS)的课程体系吧。 
关于计算机科学(CS)的课程体系,我个人打算分三部分或者说沿着三条线来总结,分别是“数据结构 & 算法”,“程序语言”和“系统 & 工程”。 
  
1.    数据结构 & 算法 
数据结构和算法其实就是一回事 
1.1.    离散数学 
<Discrete Mathematics and Its Applications> (Kenneth H. Rosen) 

Discrete_Mathematics_and_Its_Applications.jpg 
好吧,可能对程序员们来说,已经想不起还有这么门课了。不过其实对于一个没接触过CS数学思维的人来说(比如大一新生),学一下离散数学还是有所帮助的,像递归这些概念我们已经习惯了所以觉得理所当然,但是对外行来说还是不那么容易理解的,至少我给我老婆讲的时候她没理解。 
1.2.    数据结构 & 算法 
<Algorithms> (Robert Sedgewick & Kevin Wayne) 

Algorithms.jpg 
<Introduction to Algorithms> (Thomas H. Cormen et al.) 

Introduction_to_Algorithms.jpg 
现在已经不是我读大学的那个时代了,我看那些本科生直接看算法导论完全没压力,所以其实也不用这本那本的推荐了。实在还嫌算法导论难的话就上面那本吧,简洁得多,有具体的程序语言实现,也没那么些数学证明。 
1.3.    高度依托于算法的课 
其实依托于算法的课程非常非常多,鉴于都是选修课,就介绍两个吧: 
1.3.1.    数据挖掘 
<Data Mining: Concepts and Techniques> (Jiawei Han et al.) 

Data_Mining_-_Concepts_and_Techniques.jpg 
现在大家都把数据挖掘挂在嘴上了,不提不行啊。 
1.3.2.    人工智能 
<Artificial Intelligence: A Modern Approach> (Stuart Russell and Peter Norvig) 

Artificial_Intelligence_-_A_Modern_Approach.jpg 
我本人是做人工智能的,所以算是捧捧场吧。人工智能其实是个大杂烩,传统的那些分支,比如搜索,约束,推理,规划,知识表示,已经非常冷门了,所以反过来那些热门的分支都出去自立门户了,比如机器学习,自然语言处理,计算机视觉,机器人。 
  
2.    程序语言 
程序语言的知识体系其实并不像国内高校教的那样。程序语言有没有理论体系,有,你要是看过王垠的博客就知道了。在美国的大学里程序语言理论一般分三部分或者说三门课程。第一门语法学,其实就是编译原理;第二门语用学,这个下面会讲;第三门语义学,这个我觉得太理论,离现实太远了。就我本人而言,当年博士资格考试考过语义学之后就再也没有用过。还有,很多人都推崇那本《计算机程序的构造和解释》,其实我觉得如果不搞学术的话完全没必要看那么深。 
2.1.    编译原理 
<Compilers: Principles, Techniques, and Tools> (Alfred V. Aho et al.) 

Compilers_-_Principles,_Techniques,_and_Tools.jpg 
美国的CS教学特别强调“计算理论”相关的课程内容,比如自动机,lambda表达式,P = NP?。当然做学术的话这些东西可能会用到,但是干程序员的话这些东西基本上不会用到。而唯一比较接地气而又涉及到计算理论的东西就是编译原理了。 
2.2.    程序语言语用学 
<Programming Language Pragmatics> (Michael l. Scott) 

Programming_Language_Pragmatics.jpg 
其实我一直没搞懂为什么中国的大学计算机系都不开这门课,按道理国内都应该特别喜欢教这种很“记背”类型的课程啊。我要对国内的学生们强烈推荐这门课程,语用学其实就是比较和总结各种各样程序语言的共性和区别。在去学各种各样具体的编程语言之前,这门课程可以从总的视角来帮助学生了解不同程序语言的背景和特征,对具体语言的特征不但知其然还知其所以然。要是国内大学像美国一样也把这门课列成必修课程的话,可以帮助学生树立很多正确观念,比如“不同语言是有不同的适用范畴的,没什么优劣之分”。 
2.3.    具体的程序语言 
<C++ Primer> (Stanley B. Llippman et al.) 

C++_Primer.jpg 
<Thinking in Java> (Bruce Eckel)  

Thinking_in_Java.jpg 
这里贴两本C++和Java的吧,其他的就不贴了。除了C/C++和Java这种学校会教的以外,值得推荐的还有用于脚本的Python,用于网页的PHP和用于动态效果的Javascript,至于Lisp,Prolog啊什么的对普通程序员太远了。 
  
3. 系统 & 工程 
这些都是配盘子的课了,我打算提5门,分别是“计算机组成与设计”,“操作系统”,“计算机网络”,“数据库”和“软件工程”。 
3.1. 计算机系统 
<The C Programming Language> (Brian W. Kernighan & Dennis M. Ritchie) 

The_C_Programming_Language.jpg 
<Computer Systems: A Programmer's Perspective> (Randal E. Bryant & David R. O'Hallaron) 

Computer_Systems_-_A_Programmer_s_Perspective.jpg 
对于前三门计算机系统的课程,不得不提一下大神级的著作《深入理解计算机系统》,这确实是经典中的经典,我当年都还是看了APUE之后才看的,仍然觉得受益非浅。当然这些课都得先学c语言做基础。 
3.1.1. 计算机组成与设计 
<Computer Organization and Design: The Hardware/Software Interface> (David A. Patterson and John L. Hennessy) 

Organization_and_Design_-_The_HardwareSoftware_Interface.jpg 
现在基本上硬件课程在计算机系已经越来越不重要了,做系统结构的大多都跑电子系(EE)去了,并且他们搞完系统结构之后还得过来找程序员的工作,像汇编语言这样的东西也越来越淡出大多数程序员所能接触到的范围了,看看《深入理解计算机系统》了解了解就足够了。 
3.1.2. 操作系统 & 计算机网络 
<Modern Operating Systems> (Andrew S. Tanenbaum and David J. Wetherall) 

Modern_Operating_Systems.jpg 
<Computer Networks> (Andrew S. Tanenbaum and David J. Wetherall) 

Computer_Networks.jpg 
以前读大学的时候老师都把这两门课当“记背”类型的课了,都是直到后来看了CSAPP和APUE才会写。 
3.2. 数据库 
<Database System Concepts> (Abraham Silberschatz et al.) 

Database_System_Concepts.jpg 
3.3. 软件工程 
<Software Engineering: A Practitioner's Approach> (Roger Pressman and Bruce Maxim) 

Software_Engineering_-_A_Practitioner_s_Approach.jpg 
  
---------------------------------------------------------------- 
  
看了仅有的几个回帖之后,想想其实说说哪些课程是不必深究的也是有意义的,所以我在这里补充几个回复: 
  
关于《计算机体系结构量化研究方法》 (回复@monica,@ly517691895) 
<Computer Architecture: A Quantitative Approach> (John L. Hennessy and David A. Patterson) 

Computer_Architecture_-_A_Quantitative_Approach.jpg 
本人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) 

Introduction_to_the_Theory_of_Computation.jpg 
首先,我对做计算理论的人是很崇敬的,完全没有忽视的意思,看看图灵奖一半以上的得主都是这个方向的就知道了。我是在美国的大学读的CS博士,我读博士的时候,计算理论这门课是最难的一门,没有之一,博士资格考试计算理论是必考,也是最难的一门,没有之一。不巧的事,我就是在学术界做科研的,本来当年考完博士资格考试就想着我这辈子应该再也不会用计算理论的东西了吧,谁知道后来生平第一篇论文投出去的时候,审阅的人就问我这个问题证明了难度了吗,我想还有这码子事啊,于是赶紧证明一下是P-Complete的,寄了过去,谁想到审阅的人回复说,证明是make sense的,但是里面有个小错,我给你纠正了,最终结果不是P-Complete的而是P-hard的。 
原文里关于编译原理我也说了,“美国大学CS特别强调‘计算理论’相关的课程,做学术的话这些东西可能会用到,但是干程序员的话这些东西基本上不会用到。” 
所以我的观点是,计算理论这种东西太高大上了,更像是数学专业而不像是CS的课程,读博士将来做学术的话好好学学是应该的,但是对于绝大多数念完CS专业去公司里干软件工程师的人来说,没必要学那么深,学好编译原理足够了。 
  
----------------------------------------------------------------  
  
关于之前的帖子《我心目中计算机软件科学最小必读书目》(回复@blanche) 
  
我多年前是系统级软件的程序员,就是成天抱着APUE和UNP的那种,后来辞了职去读博士才转的方向,由于受之前的工作经历影响,我上次那篇帖子是站在系统级软件工程师的角度说的,但是时过境迁,现在的计算机工业界特别是互联网行业已经大大地向前端转移了,所以很可能一个写PHP或者Javascript的程序员会觉得上一个帖子写的和他的知识体系完全不是一个方向,因此我觉得上一个帖子有点偏了。那天也是一时冲动就删了,其实想想叫《我心目中计算机软件科学最小必读书目》的话是有点偏了,但要是不删掉改个名字叫《我心目中系统级软件程序员的最小必读书目》也还是可以的。 
0 0
原创粉丝点击