自20 世纪40年代世界第一台现代计算机在美国诞生以来,美国一直执全球计算机学界之
牛耳,这同时也是美国计算机产业界占据绝对优势的重要原因之一。我们成批量地引进
的国外众多优秀教材绝大多数也都来自美国。计算机学科仍然在高速发展,与此对应的
计算机人才培养模式也在不断变化,密切关注和跟踪国外尤其是美国名校的教学新动态
乃至培养思路和教育思想,应该是非常有意义的。
本文即选择了美国计算机学科最负盛名的五所高校,对目前各校计算机科学(Computer
Science)专业的本科教学体系进行了一些分析。
斯坦福大学
斯坦福大学拥有独立的计算机科学系。浏览该校的教学手册,最具特色的恐怕要算多门
科普性计算机知识讲座了,一般有两到三个单元,涉及面非常之广,从量子计算到数字
演员,从计算科学的伟大思想到网络安全,从网上拍卖到使用元编译发现大型开放源代
码软件中的大量错误,其中还不乏对技术乌托邦、斯诺“两种文化”、计算机面临的困
境以及迅速发展所带来的诸多问题的思考。开课的老师阵容强大,基本上都是响当当的
名教授,甚至包括图灵奖得主John McCarthy。用这种讲座代替计算机科学导论性质的专
门课程,可以充分展示计算机科学的丰富内涵,使学生较早地了解学科的轮廓和脉络,
对于开阔学生视野,启发学生的学习兴趣也大有好处。由于美国大学中专业的选择非常
灵活,而近年来计算机学科招生受行业影响流失严重(这种情况甚至惊动了比尔·盖茨,
2004年微软到各大高校招兵买马时,他每站必到,利用自己的明星效应,大讲计算机学
科的美妙前景),可以想象,这种讲座同样也肩负着吸引学生选择计算机专业的重大使命
。
斯坦福大学典型的低年级课程设置如表1所示。
表1 斯坦福大学低年级主要课程设置
数学(至少23个单元)
数学 41(课程号,下同) 微积分 I 5
数学 42 微积分 II 5
统计 116 概率论 3~5
计算机 103 离散结构 4或6
以下任选两门:
数学 51 微积分 5
数学 103/113 线性代数 3
数学 109 应用群论 3
计算机 157 逻辑和自动推理 4
计算机 205 机器人、视觉和图形学数学方法 3
科学(至少11个单元)
物理 53 力学 4
物理 55 电磁学 4
其他
工程基础(至少13个单元)
计算机 106 程序设计抽象/方法学 5
工程 40 电子学基础 5
选修课
技术与社会(3~5个单元)
进一步的课程设置如表2所示。
表2 斯坦福大学高年级主要课程设置
程序设计(2门课)
计算机 107(课程号,下同) 程序设计范型 5
计算机 108 面向对象系统设计 4
理论(2门课)
计算机 154 自动机与复杂性理论 4
计算机 161 算法的设计与分析 4
系统(3门课)
电子电气 108B或282 数字系统或计算机体系结构 4
计算机 编译原理 3
计算机 计算机网络 3
计算机 操作系统 3
应用(选2门课)
计算机 人工智能 3~4
计算机 数据库 3
计算机 图形学 3
项目(1门课)
计算机 至少3个单元
限选课(多门)
加州大学伯克利分校
伯克利的课程设置也有很多独树一帜的地方,尤其是在专业基础课方面,除了有专业导
引课程“计算机科学专题”之外,对于没有编程经验的学生,第一门编程课是符号编程
入门,采用LISP语言。有一定编程经验或者有自学能力的学生,可以选择多种语言和环
境的自主学习(Self-paced)课程,包括C、 Fortran、C++、Java,以及UNIX的使用等,
这种多元化与伯克利计算机科学与电子电气工程同系有关。但是所有学生在第二学期都
要学习一组独特的基础课:61A“计算机程序的结构与解释”,采用MIT Abelson等编著
的同名教材(中译本机械工业出版社出版,清华大学出版社出版了影印版);61B“数据结
构”(教材采用自编讲义);61C“计算机结构”(Machine Structures),采用Hennessy的
《计算机组织与设计》(中译本清华大学出版社出版,机械工业出版社出版了影印版)。
这项规定就是转校生也不例外,可见其中蕴涵了伯克利多年的教学经验结晶。
伯克利其他比较有特点的课程还有:将离散数学和概率论结合讲授的CS70,主讲是名教
授 Christos Papadimitriou;CS98-1 编程练习课,以主要大学生编程竞赛中的赛题为
授课素材;CS 169 软件工程直接用Kent Beck的《极限编程》(人民邮电出版社出版了中
译本)作为教材,非常超前,但是既然连Pressman的《软件工程:实践者方法》新版中敏
捷方法都已经成为重头戏,既然IEEE都已经开始制定敏捷方法相关标准,这种课程选材
也就不显得那么骇世惊俗了。除了软件工程课程常见内容外,教学侧重实际,贯穿了极
限编程的思想,涵盖UML、JUnit单元测试、软件架构、设计模式和反模式、重构、CVS版
本控制、系统和集成测试,最后要求完成一个实际产品,并进行演示。
UIUC(伊利诺依大学厄班纳-香槟分校)
UIUC的计算机科学专业创建于1972年,到1986年基本定型,十多年来几乎没有什么变化
。其教学体系如图1所示。
图1 UIUC改革前的计算机科学课程体系
其中,数值分析方向课程中,Math225为矩阵论,CS257为数值方法,CS35x代表数值分析
导论、常微分数值方法、偏微分与数值逼近和数值线性代数;
理论方向课程中,CS173为离散结构,CS273为计算理论,CS37x包括算法、形式方法、程
序验证;
人工智能方向课程中,CS348为人工智能导论,CS34x包括机器人、机器学习与模式识别
;
软件方向,CS125为计算机科学导论,CS225为数据结构与软件工程原理,CS31x包括数据
库、图形学、多媒体,CS32x包括软件工程、操作系统设计、分布式系统、编程语言与编
译器、并行计算、实时系统、编译器构造、编程语言设计;
硬件方向课程中,CS231为计算机体系结构I,CS232为计算机体系结构II,CS33x包括计
算机组成、VLSI系统与逻辑设计、VLSI系统设计、通信网络、嵌入式体系架构与软件。
可以看到,处在图1中最下面的课程基本上都是在多门中选择一至三门,整个体系脉络清
晰,具有很高的灵活性。与斯坦福不同的是,UIUC的计算机科学导论课程比较简单,只
有一门为新生开的计算机科学导向课(CS100),而且并非必修。名为“计算机科学导论”
的CS125实际上是以Java语言为主的编程入门课,涵盖了一些算法的内容。此外还有与之
配套的实验课。当然,系里所开的许多面向高年级和研究生层次的讲座是对低年级开放
的。
2003年,在工程院院长David Daniel的倡导下,计算机系对教学计划进行了改革,以反
映目前社会、行业和技术的发展趋势。主要的变化有:
* 在必修要求中增加了两门编程课:CS241 系统编程,采用Gary Nutt的《操作系统》作
为主教材,Stevens的《Unix环境高级编程》作为编程教材;CS242 程序设计实验(Progr
amming Studio),教学大纲基本上以Kernighan的《程序设计实践》为蓝本(以上教材机
械工业出版社均出版了中译本和影印版)。
* 必修要求中增加了一年的高级项目,强调团队合作和软件工程实践,包括文档写作、
口头表达、项目规划与管理等,实际上是在实践中学习软件工程。这门课也可以用两学
期的软件工程或者一年的高级论文代替。仍然充分保留了灵活性,有利于因材施教。
* 增加了CS173 离散结构的学时,部分原CS273的内容移到这里,同时CS273又新增了原C
S375的内容。这实际上是提高了对计算机理论的要求。
* 在专业课程中增加了数据挖掘、信息检索和高级图形学。
CMU(卡内基梅隆大学)
与MIT、伯克利等学校计算机科学仍然和电子与电气工程同处一系不同,CMU的计算机科
学系成立于1965年,是全美最早的,如今它已经升格为计算机科学学院。其研究生项目
中除了机器人方向与硬件关系较多之外,其他基本上都是纯软的。从这个意义上来说,C
MU的教学体系对于偏软的计算机科学系应该有较大的借鉴意义。
CMU 的教学手册上没有从传统意义上针对计算机科学专业学生的导论课,虽然有名为“
计算机科学伟大思想”的两学期课程,但是从内容上看应该是离散数学的替代,因为此
外CMU并没有其他离散数学方面的课程。此课程没有教材,内容比传统离散数学要灵活得
多,涉及概率、代数、算法、加密理论、复杂性理论、博弈论等,非常注重学习的趣味
性和实用性。
与其他名校相同,CMU对程序设计的重视也给人留下很深印象:本土新生的第一堂课就是
“初中级程序设计”,直接讲授Java。然后是中高级程序设计(Java)、C语言编程技巧、
高级编程实践(Java)、程序设计原理(用SML语言讲授)。
目前计算机科学专业教学计划中的一个难点,是硬件课程的设置问题。硬件知识体系本
身非常丰富,但是硬件课程多了,又削弱了计算机科学专业的特色。CMU在这一问题上是
怎样处理的呢?计算机科学学院的现任院长Randal E. Bryant 亲自给出了回答,他用15
~213“计算机系统导论”一门课(12个单元)完成了硬件知识的教学。这项教学改革的成
果就是一本厚达900多页的书:《Computer Systems: A Programmer's Perspective》(
中译本《深入理解计算机系统》已经由中国电力出版社出版)一书。他在该书的序言中说
:
“本课程的宗旨是用一种不同的方式向学生介绍计算机。因为,我们的学生中几乎没有
人有机会构造计算机系统。而大多数学生,甚至是计算机工程师,也要求能日常使用计
算机和编写计算机程序。所以我们决定从程序员的角度来讲解系统,并采用这样的过滤
方法:我们只讨论那些影响用户级C程序的性能、正确性或实用性的主题。
比如,我们排除了诸如硬件加法器和总线设计这样的主题。虽然我们谈及了机器语言,
但是不关注如何编写汇编语言,而是关心编译器怎样翻译C的各种构造,比如指针、循环
、过程调用和返回,以及switch语句。更进一步,我们将更广泛和现实地看待系统,包
括硬件和系统软件,讨论链接、加载、进程、信号、性能优化、评估、I/O以及网络与并
发编程。
这种做法使得我们讲授本课程的方式对学生来讲既实用、具体,又能实践,同时也非常
利于调动学生的积极性。”
网站上的一些随书配套实验,也独具匠心。因此此书的成功是水到渠成的。根据配套网
站上的列表,它已经被全球80多所院校采用作为教材。
MIT(麻省理工学院)
MIT的课程设置,只能用其学生起点高来解释。该校没有典型意义上的计算机科学专业,
偏软的只有理论计算机科学和人工智能及其应用两个专业。因此没有类似于其他学校的
导论课程。
在MIT 的电子电气工程与计算机科学系中,所有学生都要参加如下四门课程:6.001“计
算机程序的结构与解释”,当然与伯克利相同,采用的是Abelson等编著的同名教材;6.
002“电路与电子学”;6.003“信号与系统”(自编讲义);6.004 “计算结构”(Comput
ation Structures),与伯克利的61C“计算机结构”对等(教材是自编课件)。此外有两
门专业基础数学课:“概率系统分析”(教授自编教材)和“计算机科学数学”,后者的
教材是国外院校普遍采用的Rosen所著《离散数学及其应用》(中文版由机械工业出版社
出版)。
对MIT的学生而言,实验课程有多种选择:电气工程和计算机科学实验,模拟电子实验,
数字系统实验,微机项目实验,半导体设备项目实验。此外,无论何种专业,都有软件
工程实验课。值得注意的是,本科生各专业的必修课程中并没有软件工程课程。也就是
说,软件工程的内容都在实践中完成了。带软件工程实验课的是因为提出Liskov 替换原
则而知名的女教授Barbara Liskov,她刚刚获得了2004年度的冯·诺依曼奖。作为美国
工程院和艺术科学院的双院士,她几十年在软件开发研究方面的经验,将有力地保证这
门实验课程的质量。
分析与总结
由上面的材料可以看出,各个学校的教学体系之间还是有不小差异的。这首先得归因于
历史沿革形成的专业侧重、机构设置上的不同。其中MIT算是一极,由于和电子电气专业
深深地融合,计算机专业带有很强的“硬派”色彩。而CMU可以算作另一极,计算机科学
有自己的独立学院,非常罕见,因此它的课程设置“软化严重”——与硬件相关的只用
一门课就解决了。UIUC和斯坦福由于都拥有独立的科系,所以可以归入后一阵营。伯克
利可以认为处于两极中间,但是仔细分析起来,它的计算机科学专业目前虽然仍属于电
子电气和计算机科学系,但是有相当大的独立性,1973年创立以来,一直有自己的主席
和教学安排,所以离后者更近一些。
此外,各校在专业导入课程的设置上差别也非常明显。基本上可以分为三类。按
IEEE-ACM《Computer Curricula 2001》(以下简称CC2001)的分法,斯坦福属于广度优先
(有明确的注重广度的导引课程),MIT的属于函数为先(采用函数式语言),CMU和 UIUC属
于对象为先(直接采用Java)。伯克利有些特殊,它有导引课,但是广度稍差,紧接着又
采用函数语言,同时开设学生自学为主可以任选的多种语言课程,属于混合多元型。应
该说各个学校在刚入门时如何调动学生积极性,培养对专业的感情上都有自己的思考。
无论哪种类型,将课堂变得有趣,能够容纳更多计算机科学的方面,都已经成为一种趋
势。
无论如何,各校存在的差异并不妨碍各自培养出同样优秀的人才,这也给我们提供了一
种有益的启示,办学思路和方法应该是因地制宜的。
当然,总的来说,各学校之间的共性还是主要的。归纳起来,有这么几个特点,值得我
们思考:
1. 硬件课程整体在减少
偏软类的三所院校中,CMU最为彻底,硬件课程只有一门课,而UIUC也只有两门必修(两
门体系结构),斯坦福也是两门(电子学、体系结构或数字系统)。其中的原因,前面引述
的Randal E. Bryant所言作出了解释,毕竟计算机科学需要关注的在计算机系统层次中
已经越来越高,底层越来越变得透明了。事实上,CC2001中制定的硬件课程也只有一门
。而国内目前一般还开设数字逻辑、微机原理、计算机组成与结构、微机实验等硬件类
课程。
2. 程序设计日益重视
在CMU, UIUC和斯坦福,必修的程序设计类课程往往在四五门左右。伯克利加起来也有
四门。MIT虽然没有大量前导性的编程课程,但是由于在后面计算机系统工程、计算机语
言工程、软件工程实验、Web软件工程诸课程都有实际的项目要完成,所以实际学时也很
多,UIUC的改革更说明了这一点。同时,还出现了强调提高程序设计技巧,与软件工程
环境和工具相结合,提倡团队合作,高级程序设计课程与数据结构、算法课融合的趋势
。这方面的代表有斯坦福。该校副系主任Eric Roberts曾执教入门类课程多年,总结了
一套在语言教学中融入软件工程和现代程序设计观念,结合算法和数据结构教学的经验
。其成果就是《C语言的科学和艺术》和《C程序设计的抽象思维》两本书(影印版已由机
械工业出版社出版)。作为CC2001工作组两位主席之一,他在C语言教学中强调库与接口
设计、编程风格的重要性,并进而介绍抽象、封装的概念,产生了很大影响。反观国内
目前很多学校的语言教学和程序设计教学,不仅学时偏少,与其他课程孤立,而且脱离
实际,造成语言学习和相关专业课学习都变得非常枯燥,不利于调动学生的积极性。
应该说,这些名校的教学体系、教材和经验都是丰富的宝藏,值得好好挖掘,比如每门
核心课程的教学法,实验课程的安排,各门课程的衔接,大型项目的选材等。
牛耳,这同时也是美国计算机产业界占据绝对优势的重要原因之一。我们成批量地引进
的国外众多优秀教材绝大多数也都来自美国。计算机学科仍然在高速发展,与此对应的
计算机人才培养模式也在不断变化,密切关注和跟踪国外尤其是美国名校的教学新动态
乃至培养思路和教育思想,应该是非常有意义的。
本文即选择了美国计算机学科最负盛名的五所高校,对目前各校计算机科学(Computer
Science)专业的本科教学体系进行了一些分析。
斯坦福大学
斯坦福大学拥有独立的计算机科学系。浏览该校的教学手册,最具特色的恐怕要算多门
科普性计算机知识讲座了,一般有两到三个单元,涉及面非常之广,从量子计算到数字
演员,从计算科学的伟大思想到网络安全,从网上拍卖到使用元编译发现大型开放源代
码软件中的大量错误,其中还不乏对技术乌托邦、斯诺“两种文化”、计算机面临的困
境以及迅速发展所带来的诸多问题的思考。开课的老师阵容强大,基本上都是响当当的
名教授,甚至包括图灵奖得主John McCarthy。用这种讲座代替计算机科学导论性质的专
门课程,可以充分展示计算机科学的丰富内涵,使学生较早地了解学科的轮廓和脉络,
对于开阔学生视野,启发学生的学习兴趣也大有好处。由于美国大学中专业的选择非常
灵活,而近年来计算机学科招生受行业影响流失严重(这种情况甚至惊动了比尔·盖茨,
2004年微软到各大高校招兵买马时,他每站必到,利用自己的明星效应,大讲计算机学
科的美妙前景),可以想象,这种讲座同样也肩负着吸引学生选择计算机专业的重大使命
。
斯坦福大学典型的低年级课程设置如表1所示。
表1 斯坦福大学低年级主要课程设置
数学(至少23个单元)
数学 41(课程号,下同) 微积分 I 5
数学 42 微积分 II 5
统计 116 概率论 3~5
计算机 103 离散结构 4或6
以下任选两门:
数学 51 微积分 5
数学 103/113 线性代数 3
数学 109 应用群论 3
计算机 157 逻辑和自动推理 4
计算机 205 机器人、视觉和图形学数学方法 3
科学(至少11个单元)
物理 53 力学 4
物理 55 电磁学 4
其他
工程基础(至少13个单元)
计算机 106 程序设计抽象/方法学 5
工程 40 电子学基础 5
选修课
技术与社会(3~5个单元)
进一步的课程设置如表2所示。
表2 斯坦福大学高年级主要课程设置
程序设计(2门课)
计算机 107(课程号,下同) 程序设计范型 5
计算机 108 面向对象系统设计 4
理论(2门课)
计算机 154 自动机与复杂性理论 4
计算机 161 算法的设计与分析 4
系统(3门课)
电子电气 108B或282 数字系统或计算机体系结构 4
计算机 编译原理 3
计算机 计算机网络 3
计算机 操作系统 3
应用(选2门课)
计算机 人工智能 3~4
计算机 数据库 3
计算机 图形学 3
项目(1门课)
计算机 至少3个单元
限选课(多门)
加州大学伯克利分校
伯克利的课程设置也有很多独树一帜的地方,尤其是在专业基础课方面,除了有专业导
引课程“计算机科学专题”之外,对于没有编程经验的学生,第一门编程课是符号编程
入门,采用LISP语言。有一定编程经验或者有自学能力的学生,可以选择多种语言和环
境的自主学习(Self-paced)课程,包括C、 Fortran、C++、Java,以及UNIX的使用等,
这种多元化与伯克利计算机科学与电子电气工程同系有关。但是所有学生在第二学期都
要学习一组独特的基础课:61A“计算机程序的结构与解释”,采用MIT Abelson等编著
的同名教材(中译本机械工业出版社出版,清华大学出版社出版了影印版);61B“数据结
构”(教材采用自编讲义);61C“计算机结构”(Machine Structures),采用Hennessy的
《计算机组织与设计》(中译本清华大学出版社出版,机械工业出版社出版了影印版)。
这项规定就是转校生也不例外,可见其中蕴涵了伯克利多年的教学经验结晶。
伯克利其他比较有特点的课程还有:将离散数学和概率论结合讲授的CS70,主讲是名教
授 Christos Papadimitriou;CS98-1 编程练习课,以主要大学生编程竞赛中的赛题为
授课素材;CS 169 软件工程直接用Kent Beck的《极限编程》(人民邮电出版社出版了中
译本)作为教材,非常超前,但是既然连Pressman的《软件工程:实践者方法》新版中敏
捷方法都已经成为重头戏,既然IEEE都已经开始制定敏捷方法相关标准,这种课程选材
也就不显得那么骇世惊俗了。除了软件工程课程常见内容外,教学侧重实际,贯穿了极
限编程的思想,涵盖UML、JUnit单元测试、软件架构、设计模式和反模式、重构、CVS版
本控制、系统和集成测试,最后要求完成一个实际产品,并进行演示。
UIUC(伊利诺依大学厄班纳-香槟分校)
UIUC的计算机科学专业创建于1972年,到1986年基本定型,十多年来几乎没有什么变化
。其教学体系如图1所示。
图1 UIUC改革前的计算机科学课程体系
其中,数值分析方向课程中,Math225为矩阵论,CS257为数值方法,CS35x代表数值分析
导论、常微分数值方法、偏微分与数值逼近和数值线性代数;
理论方向课程中,CS173为离散结构,CS273为计算理论,CS37x包括算法、形式方法、程
序验证;
人工智能方向课程中,CS348为人工智能导论,CS34x包括机器人、机器学习与模式识别
;
软件方向,CS125为计算机科学导论,CS225为数据结构与软件工程原理,CS31x包括数据
库、图形学、多媒体,CS32x包括软件工程、操作系统设计、分布式系统、编程语言与编
译器、并行计算、实时系统、编译器构造、编程语言设计;
硬件方向课程中,CS231为计算机体系结构I,CS232为计算机体系结构II,CS33x包括计
算机组成、VLSI系统与逻辑设计、VLSI系统设计、通信网络、嵌入式体系架构与软件。
可以看到,处在图1中最下面的课程基本上都是在多门中选择一至三门,整个体系脉络清
晰,具有很高的灵活性。与斯坦福不同的是,UIUC的计算机科学导论课程比较简单,只
有一门为新生开的计算机科学导向课(CS100),而且并非必修。名为“计算机科学导论”
的CS125实际上是以Java语言为主的编程入门课,涵盖了一些算法的内容。此外还有与之
配套的实验课。当然,系里所开的许多面向高年级和研究生层次的讲座是对低年级开放
的。
2003年,在工程院院长David Daniel的倡导下,计算机系对教学计划进行了改革,以反
映目前社会、行业和技术的发展趋势。主要的变化有:
* 在必修要求中增加了两门编程课:CS241 系统编程,采用Gary Nutt的《操作系统》作
为主教材,Stevens的《Unix环境高级编程》作为编程教材;CS242 程序设计实验(Progr
amming Studio),教学大纲基本上以Kernighan的《程序设计实践》为蓝本(以上教材机
械工业出版社均出版了中译本和影印版)。
* 必修要求中增加了一年的高级项目,强调团队合作和软件工程实践,包括文档写作、
口头表达、项目规划与管理等,实际上是在实践中学习软件工程。这门课也可以用两学
期的软件工程或者一年的高级论文代替。仍然充分保留了灵活性,有利于因材施教。
* 增加了CS173 离散结构的学时,部分原CS273的内容移到这里,同时CS273又新增了原C
S375的内容。这实际上是提高了对计算机理论的要求。
* 在专业课程中增加了数据挖掘、信息检索和高级图形学。
CMU(卡内基梅隆大学)
与MIT、伯克利等学校计算机科学仍然和电子与电气工程同处一系不同,CMU的计算机科
学系成立于1965年,是全美最早的,如今它已经升格为计算机科学学院。其研究生项目
中除了机器人方向与硬件关系较多之外,其他基本上都是纯软的。从这个意义上来说,C
MU的教学体系对于偏软的计算机科学系应该有较大的借鉴意义。
CMU 的教学手册上没有从传统意义上针对计算机科学专业学生的导论课,虽然有名为“
计算机科学伟大思想”的两学期课程,但是从内容上看应该是离散数学的替代,因为此
外CMU并没有其他离散数学方面的课程。此课程没有教材,内容比传统离散数学要灵活得
多,涉及概率、代数、算法、加密理论、复杂性理论、博弈论等,非常注重学习的趣味
性和实用性。
与其他名校相同,CMU对程序设计的重视也给人留下很深印象:本土新生的第一堂课就是
“初中级程序设计”,直接讲授Java。然后是中高级程序设计(Java)、C语言编程技巧、
高级编程实践(Java)、程序设计原理(用SML语言讲授)。
目前计算机科学专业教学计划中的一个难点,是硬件课程的设置问题。硬件知识体系本
身非常丰富,但是硬件课程多了,又削弱了计算机科学专业的特色。CMU在这一问题上是
怎样处理的呢?计算机科学学院的现任院长Randal E. Bryant 亲自给出了回答,他用15
~213“计算机系统导论”一门课(12个单元)完成了硬件知识的教学。这项教学改革的成
果就是一本厚达900多页的书:《Computer Systems: A Programmer's Perspective》(
中译本《深入理解计算机系统》已经由中国电力出版社出版)一书。他在该书的序言中说
:
“本课程的宗旨是用一种不同的方式向学生介绍计算机。因为,我们的学生中几乎没有
人有机会构造计算机系统。而大多数学生,甚至是计算机工程师,也要求能日常使用计
算机和编写计算机程序。所以我们决定从程序员的角度来讲解系统,并采用这样的过滤
方法:我们只讨论那些影响用户级C程序的性能、正确性或实用性的主题。
比如,我们排除了诸如硬件加法器和总线设计这样的主题。虽然我们谈及了机器语言,
但是不关注如何编写汇编语言,而是关心编译器怎样翻译C的各种构造,比如指针、循环
、过程调用和返回,以及switch语句。更进一步,我们将更广泛和现实地看待系统,包
括硬件和系统软件,讨论链接、加载、进程、信号、性能优化、评估、I/O以及网络与并
发编程。
这种做法使得我们讲授本课程的方式对学生来讲既实用、具体,又能实践,同时也非常
利于调动学生的积极性。”
网站上的一些随书配套实验,也独具匠心。因此此书的成功是水到渠成的。根据配套网
站上的列表,它已经被全球80多所院校采用作为教材。
MIT(麻省理工学院)
MIT的课程设置,只能用其学生起点高来解释。该校没有典型意义上的计算机科学专业,
偏软的只有理论计算机科学和人工智能及其应用两个专业。因此没有类似于其他学校的
导论课程。
在MIT 的电子电气工程与计算机科学系中,所有学生都要参加如下四门课程:6.001“计
算机程序的结构与解释”,当然与伯克利相同,采用的是Abelson等编著的同名教材;6.
002“电路与电子学”;6.003“信号与系统”(自编讲义);6.004 “计算结构”(Comput
ation Structures),与伯克利的61C“计算机结构”对等(教材是自编课件)。此外有两
门专业基础数学课:“概率系统分析”(教授自编教材)和“计算机科学数学”,后者的
教材是国外院校普遍采用的Rosen所著《离散数学及其应用》(中文版由机械工业出版社
出版)。
对MIT的学生而言,实验课程有多种选择:电气工程和计算机科学实验,模拟电子实验,
数字系统实验,微机项目实验,半导体设备项目实验。此外,无论何种专业,都有软件
工程实验课。值得注意的是,本科生各专业的必修课程中并没有软件工程课程。也就是
说,软件工程的内容都在实践中完成了。带软件工程实验课的是因为提出Liskov 替换原
则而知名的女教授Barbara Liskov,她刚刚获得了2004年度的冯·诺依曼奖。作为美国
工程院和艺术科学院的双院士,她几十年在软件开发研究方面的经验,将有力地保证这
门实验课程的质量。
分析与总结
由上面的材料可以看出,各个学校的教学体系之间还是有不小差异的。这首先得归因于
历史沿革形成的专业侧重、机构设置上的不同。其中MIT算是一极,由于和电子电气专业
深深地融合,计算机专业带有很强的“硬派”色彩。而CMU可以算作另一极,计算机科学
有自己的独立学院,非常罕见,因此它的课程设置“软化严重”——与硬件相关的只用
一门课就解决了。UIUC和斯坦福由于都拥有独立的科系,所以可以归入后一阵营。伯克
利可以认为处于两极中间,但是仔细分析起来,它的计算机科学专业目前虽然仍属于电
子电气和计算机科学系,但是有相当大的独立性,1973年创立以来,一直有自己的主席
和教学安排,所以离后者更近一些。
此外,各校在专业导入课程的设置上差别也非常明显。基本上可以分为三类。按
IEEE-ACM《Computer Curricula 2001》(以下简称CC2001)的分法,斯坦福属于广度优先
(有明确的注重广度的导引课程),MIT的属于函数为先(采用函数式语言),CMU和 UIUC属
于对象为先(直接采用Java)。伯克利有些特殊,它有导引课,但是广度稍差,紧接着又
采用函数语言,同时开设学生自学为主可以任选的多种语言课程,属于混合多元型。应
该说各个学校在刚入门时如何调动学生积极性,培养对专业的感情上都有自己的思考。
无论哪种类型,将课堂变得有趣,能够容纳更多计算机科学的方面,都已经成为一种趋
势。
无论如何,各校存在的差异并不妨碍各自培养出同样优秀的人才,这也给我们提供了一
种有益的启示,办学思路和方法应该是因地制宜的。
当然,总的来说,各学校之间的共性还是主要的。归纳起来,有这么几个特点,值得我
们思考:
1. 硬件课程整体在减少
偏软类的三所院校中,CMU最为彻底,硬件课程只有一门课,而UIUC也只有两门必修(两
门体系结构),斯坦福也是两门(电子学、体系结构或数字系统)。其中的原因,前面引述
的Randal E. Bryant所言作出了解释,毕竟计算机科学需要关注的在计算机系统层次中
已经越来越高,底层越来越变得透明了。事实上,CC2001中制定的硬件课程也只有一门
。而国内目前一般还开设数字逻辑、微机原理、计算机组成与结构、微机实验等硬件类
课程。
2. 程序设计日益重视
在CMU, UIUC和斯坦福,必修的程序设计类课程往往在四五门左右。伯克利加起来也有
四门。MIT虽然没有大量前导性的编程课程,但是由于在后面计算机系统工程、计算机语
言工程、软件工程实验、Web软件工程诸课程都有实际的项目要完成,所以实际学时也很
多,UIUC的改革更说明了这一点。同时,还出现了强调提高程序设计技巧,与软件工程
环境和工具相结合,提倡团队合作,高级程序设计课程与数据结构、算法课融合的趋势
。这方面的代表有斯坦福。该校副系主任Eric Roberts曾执教入门类课程多年,总结了
一套在语言教学中融入软件工程和现代程序设计观念,结合算法和数据结构教学的经验
。其成果就是《C语言的科学和艺术》和《C程序设计的抽象思维》两本书(影印版已由机
械工业出版社出版)。作为CC2001工作组两位主席之一,他在C语言教学中强调库与接口
设计、编程风格的重要性,并进而介绍抽象、封装的概念,产生了很大影响。反观国内
目前很多学校的语言教学和程序设计教学,不仅学时偏少,与其他课程孤立,而且脱离
实际,造成语言学习和相关专业课学习都变得非常枯燥,不利于调动学生的积极性。
应该说,这些名校的教学体系、教材和经验都是丰富的宝藏,值得好好挖掘,比如每门
核心课程的教学法,实验课程的安排,各门课程的衔接,大型项目的选材等。