计算机专业系统能力培养的探索与实践(一)

经常听到有老师问以下问题:为什么学完高级语言程序设计后有些学生就不喜欢计算机专业了?为什么越来越多的学生越学越不喜欢计算机专业?

也经常听到学生问以下问题:像地质系这些非计算机专业的学生自学JAVA语言等课程后也能找到软件开发的工作,而我们计算机专业学生多学那么多课程不也只能干同样的事情吗?我们计算机专业学生比其他专业自学计算机课程的学生强在哪里啊?现在计算机学科发展这么快,什么领域都和计算机相关,为什么我们计算机学科毕业的学生真正能干的事也不多呢?……

确实,对于大部分计算机本科专业学生来说,硬件设计能力不如电子工程专业学生,行业软件开发和应用能力不如其他相关专业学生,算法设计和分析基础又不如数学系学生。那么,计算机专业学生的特长在哪里?笔者认为计算机专业学生的优势之一在于计算机系统能力,即具备计算机系统层面的认知与设计能力、能从计算机系统的高度考虑和解决问题。但与国外一流大学相比,国内高校在系统能力培养方面还存在一些问题。因此,本文将介绍笔者在这方面的思考及初步探索,并将在后续几篇文章中给出南京大学计算机系在这方面推行的综合改革方案。

1 计算机人才系统能力培养的重要性

随着大规模数据中心(WSC)的建立和个人移动设备(PMD)的大量普及使用,计算机发展进入了后PC时代,呈现出“人与信息世界及物理世界融合”的趋势和网络化、服务化、普适化和智能化的鲜明特征。后PC时代WSC、PMD和PC等共存,使得原先基于PC而建立起来的专业教学内容已经远远不能反映现代社会对计算机专业人才的培养要求,原先计算机专业人才培养强调“程序”设计也变为更强调“系统”设计。

后PC时代,并行成为重要主题,培养具有系统观的、能够进行软、硬件协同设计的软硬件贯通人才是关键。而且,后PC时代对于大量从事应用开发的应用程序员的要求也变得更高。首先,后PC时代的应用问题更复杂、应用领域更广泛。其次,要能够编写出各类不同平台所适合的高效程序,应用开发人员必需对计算机系统具有全面的认识,必需了解不同系统平台的底层结构,并掌握并行程序设计技术和工具。

Paste_Image.png

图1 计算机系统抽象层的转换

从图1可以看出,计算机系统由不同的抽象层构成,“计算”的过程就是不同抽象层转换的过程,上层是下层的抽象,而下层则是上层的具体实现。计算机学科主要研究的是计算机系统各个不同抽象层的实现及其相互转换的机制,计算机学科培养的应该主要是在计算机系统或在系统某些层次上从事相关工作的人才。

相比于其他专业,计算机专业学生的优势在于对系统深刻的理解,能够站在系统的高度考虑和解决应用问题,具有系统层面的认知和设计能力,包括:能够对软、硬件功能进行合理划分;能够对系统不同层次进行抽象和封装;能够对系统的整体性能进行分析和调优;能够对系统各层面的错误进行调试和修正;能够根据系统实现机理对用户程序进行准确的性能评估和优化;能够根据不同的应用要求合理构建系统框架等。

要达到上述这些在系统层面上的分析、设计、检错和调优等系统能力,显然,需要提高学生对整个计算机系统实现机理的认识,包括:对计算机系统整机概念的认识;对计算机系统层次结构的深刻理解;对高级语言程序、ISA、OS、编译器、链接器等之间关系的深入掌握;对指令在硬件上执行过程的理解和认识;对构成计算机硬件的基本电路特性和设计方法等的基本了解等。从而能够更深刻地理解时空开销和权衡、抽象和建模、分而治之、缓存和局部性、吞吐率和时延、并发和并行、远程过程调用(RPC)、权限和保护等重要的核心概念,掌握现代计算机系统中最核心的技术和实现方法。

2 美国一流大学相关教学情况

近年来我们对美国MIT、UC Berkeley、Stanford和CMU这四个大学的计算机专业相关教学体系和相关课程教学与实验情况进行了跟踪调查。

(1)麻省理工学院(MIT)

MIT的EECS系提供了三个不同的学位:Electrical Engineering(EECS 6-1)、Electrical Engineering & ComputerScience(EECS 6-2)和ComputerScience(EECS 6-3),每个学位中又提供了不同的方向。所有学位课程分为7类:数学(math)、导论(Introductory)、基础(Foundational)、核心(Header)、实验(Lab)、高级(Advanced)和大项目(Project)。

从EE、EECS和CS三个学位课程列表可以看出,导论课程EECS 1(6.01)和EECS 2(6.02)以及基础课程6.004是所有学生都必须学习的课程,其中,基础课程6.004的课程名为Computation Structures,它是一门贯穿整个计算机系统的课程。在硬件上它包含了门电路→功能部件→单周期和流水线CPU之间的所有基本内容,在软件上它包含了C语言→汇编语言→机器指令之间的基本内容,涉及到过程调用、系统调用、进程、并行、性能评价等一些重要概念。

在核心类课程中,6.004课程的后续课程6.033同时是EECS 6-2和EECS 6-3两个专业的学位课程。其教材是《Principles ofComputer System Design: An Introduction》(Jerome H. Saltzer和M. Frans Kaashoek编著),内容涵盖了计算机体系结构、操作系统、网络等多门课程中的重要概念,包括计算范式、并行、跨层通信、资源分配与调度、虚拟化等。它包含了一个程序员为开发高性能应用而必须知道的关于系统内部的所有关键概念和知识。

(2)加州大学伯克利分校(UC Berkeley)

UC Berkeley的EECS系有两个不同专业类型:Bachelor of Arts和Bachelor of Science。

前者(B.A.)为那些注册到 Collegeof Letters & Science 的准备拿双学位(如CS与数学,CS与认知科学)的学生提供,EECS系提供CS方面的课程。后者(B.S.)提供两种不同的Program:ECE (Electricaland Computer Engineering)和CSE(ComputerScience and Engineering)。ECE又提供三种不同方向:Electronics、Communications,Networks and Systems和Computer Systems;CSE仅有Computer Science一个方向,它与B.A.专业类型一样,是偏CS的专业,两者的差别仅在于所选的其他非CS课程是偏工程类课程还是偏人文社会学课程,对于CS方面课程来说,两者没有任何差别。此外,B.S.也提供双学位Program(如EECS与材料科学及工程、EECS与核工程)。由此可见,UC Berkeley提供的专业在偏工程方向上划分较细,也特别注重交叉学科人才的培养。

它提供了一门贯穿整个计算机系统的必修基础课CS 61C,其课程名称为Great Ideas in Computer Architecture(2011年以前为Machine Structures),所用教材除了C语言和计算机组成与设计方面的以外,还将一本关于数据中心方面的书增加为课后阅读材料;涉及的实验内容非常广,2011年前的14个实验主要分五类:C语言编程、汇编程序设计、流水线CPU等硬件逻辑电路设计、Cache模拟和多核多线程编程实验,2011年后又增加了云计算平台上的并行编程(MapReduce)、SIMD数据级并行编程和多线程编程(OpenMP)实验等,让学生通过实验体验不同粒度下的并行处理技术。

CS 61C的后续课程是EECS 150,是数字系统设计课程,它要求学生完成能够实现大多数常用指令的五级流水线MIPS CPU。

(3)卡内基梅隆大学(CMU)和斯坦福大学

CMU的计算机科学学院(SCS)与斯坦福大学CS系的做法类似,提供的多个培养方向中都有计算机系统或计算机工程(CE)方向。

两校都有一门为CS和EE(ECE)所有学生开设的贯穿整个计算机系统的基础课:CMU的CS 213和斯坦福的CS 107。所用教材都是《ComputerSystems: A Programmer’s Perspective》(Randal E. Bryant和David R. O’Hallaron编著),教学内容和实验内容差不多,都是通过一组精心设计的C语言编程实验,使学生能够更好地了解高级语言程序转换为机器代码的过程,深刻理解底层机器的系统结构(包括指令格式、数据表示、寄存器组织、Cache结构、虚存空间的映射等),提高编制高效程序和调试程序的能力,并为后续的体系结构、编译技术、操作系统等课程打下良好的基础。斯坦福的另一门必修课CS 110则MIT的6.033课程所用教材一样。

3 中美大学相关教学情况对比

通过对MIT等四个美国大学在相关课程方面教学情况的跟踪调查,我们发现,中美大学在计算机专业人才培养及课程教学方面存在许多不同。

(1)关于分流培养问题

美国四校都采用了分流培养模式,都设置了偏硬件或系统的专业或方向,例如,有EE、ECE、CE和计算机系统等;而目前国内大多数高校都只有一个专业:计算机科学与技术,专门分出ECE、CE、计算机系统专业或方向进行人才培养的学校很少。绝大多数高校只能培养应用程序员,而且是对计算机系统底层知之甚少的应用程序员。

(2)关于CS和EE(ECE)课程共享问题

不管是像MIT和UC Berkley这样将EE和CS合为一个系的学校,还是像Stanford和CMU这样将EE(ECE)与CS分开设系或学院的学校,他们都采用课程互选共享的方式,即CS方面的课程由CS部门开设,EE(ECE)方面的课程由EE(ECE)部门开设,并且课程可共享,学生可互选课程;在国内高校中这种机制还不是很完善。

(3)关于计算机系统入门课程

美国四校都开设了一门CS和EE(ECE)专业所有学生必修的贯穿整个计算机系统的基础课,表1给出了相关课程基本教学情况的对比总结。

表1 美国四校计算机系统入门课程教学基本情况

Paste_Image.png

从表1可看出,MIT的相关课程更偏重于硬件底层,UC-Berkeley次之,而Stanford和CMU的类似,主要从程序员角度介绍计算机系统,更偏向于系统软件层面。

MIT 6.004课程虽然课堂教学中没有突出体现从程序员角度认识计算机系统这样的思想,但是,在实验环节也设置了从C语言程序到汇编语言程序进行手工转换的实验,基本上涵盖了高级语言到机器级语言转换的所有重要概念。

从美国四校相关课程的教学内容以及设计的实验内容来看,充分说明了他们非常注重学生的系统能力培养,通过专门的一门课程把计算机系统的各个层次串起来,为学生完整地、全面地认识计算机系统打下了良好的基础。

在国内绝大多数高校开设的课程中,很难找到类似份量的关于计算机系统的入门课程,虽然国内高校也有计算机系统概论、计算机系统入门或导论之类的课程,但内容广而不深,什么都讲一点,什么都讲不透,基本上是计算机课程概论,而不是计算机系统概论。如果说国内的计算机组成原理课程相当于美国大学的计算机系统入门课程,那么其教学内容的广度和深度又都相差很远。国内绝大多数高校的组原课基本上仅是硬件概述,既不会与高级语言编程建立关联,也没有讲清楚与操作系统的关系,更看不到编译的影子,即使在硬件设计方面也远远没有达到MIT 的6.004和UCBerkeley的CS 61C的深度。因此,国内目前绝大多数高校的组原课没有起到作为贯穿整个计算机系统的基础课的作用。也就是说,目前国内绝大多数高校都没有一门真正关于计算机系统的入门课程。

(4)关于硬件设计方面的课程

通过对美国四校课程体系的跟踪调查,我们发现,这些学校在计算机系统入门课程后面都开设了关于数字系统设计的课程,课程内容基本上涵盖了国内数字逻辑电路和组成原理两门课的所有内容,有的学校分数字系统设计(一)和数字系统设计(二)两门课来讲,有的就是一门课,基本上都要求学生用EDA方式设计相对完整的流水线CPU,而且都是由EE(ECE)部门开设,但并不要求所有学生都学,通常是偏硬件类的EE、ECE、CE和计算机系统专业或方向的学生必学,其他方向学生选修。

反观国内绝大多数高校,基本上都是先上数字逻辑电路(有些合并了一些模电内容)课程,然后上组成原理课程(有些组成原理课程上的是微机原理与接口的内容),而且,这两门课程基本上都是所有学生的必修课程,并没有考虑不同方向学生对于计算机底层硬件知识和硬件设计能力的不同需求。

因为目前国内大多数学校的组原课程教学基本上还是沿用传统的教学理念,教学内容还停留在计算机硬件的基本构成和基本设计原理层面,既不像国外EE(ECE)部门开设的数字系统设计那种硬件设计课程,能够让学生真正了解如何用硬件描述语言通过FPGA来设计现代计算机硬件系统;也不是一门关于计算机系统的入门课程,能够让学生全面地理解整个计算机系统的实现机理。因此,目前绝大多数高校的组原课程的教学,既没能达到培养学生利用现代化工具进行实际硬件设计的能力,也没有让学生学会运用机器底层硬件和系统结构知识来增强高效软件开发和程序调试的能力,更没有通过该课程让学生建立起计算机软、硬件系统的整体概念[5]。

(5)关于高级计算机系统内容的教学

在MIT和Stanford等学校还开设了关于计算机系统的高级课程,主要内容涵盖在ACM/IEEE CS2013中新增加的知识点SF中,而对应的课程目前在国内本科生教学中还不多见,因此,在计算机系统能力培养方面,国内的本科教育相对于美国一流大学来说,在此处也缺失了一块。

(6)关于课程教学理念

从美国四校相关课程体系可以看出,他们都非常注重计算机系统能力的培养,都在学完高层的编程语言及其程序设计课程后开设了一门关于计算机系统的基础课程,而且,在课程内容上特别注重在计算机系统各个抽象层上的纵向关联,沿着一条主线,把每个抽象层都串起来,从而形成完整的计算机系统概念。而国内的课程设置,基本上是按计算机系统层次结构进行横向切分,自下而上分解成数字逻辑电路、计算机组成原理、汇编程序设计、操作系统、编译原理、程序设计等课程,而且,每门课程都仅局限在本抽象层,相互之间几乎没有关联,学生对整个计算机系统的认识过程就像“瞎子摸象”一样,很难形成一个对完整计算机系统的全面认识。

2009年开始,计算机专业的研究生入学考试采用全国统考方式,计算机专业基础综合统考科目包括数据结构、组成原理、操作系统和网络四门课程,总分为150分。五年来的抽样结果显示,全卷平均分每年仅在60~78之间,试题统计难度(单选题指答对人数/总人数,综合应用题指样本平均分/该题总分,最终难度为加权平均值)仅在0.41~0.52之间,其中组成原理最低,特别是其综合应用题的难度仅在0.181~0.440之间,五年共10个综合应用题,只有两题的难度达到了0.4以上,说明所有考生平均仅掌握所考内容的大约30%左右,有的方面只有20%不到,也即考生们对绝大部分综合应用能力考核内容都没有掌握。从抽样省份来看,前三年抽样的大多是高等教育水平比较高的地区,可想而知,全国的抽样数据应该更差。近五年的综合应用题抽样数据表明,试题统计难度与解题涉及到的知识点个数相关性较大,通常涉及的知识点越多得分越差,说明学生的综合应用能力较弱,平时缺乏对相关知识和概念关联性的思考。

根据近年来对全国研究生计算机专业基础综合统考科目考试成绩的抽样调查结果,可以看出我国高校计算机本科专业基础课的教学确确实实存在“轻应用、缺关联、少综合、无系统观”的问题。

4 国内相关教学改革概况

目前,越来越多的高校发现了计算机专业基础课程教学中的一些问题,开始注重学生的系统能力培养。

目前为止,已经有一些高校以MIPS为模型机,对数字系统设计的相关内容进行了深入的讲解和实践,也有一些高校同时把CPU设计与操作系统和编译的内容融合起来进行实验课程的开设。浙江大学多年来每年在暑假都会开设有关CPU及其计算机系统设计的选修课;东南大学也专门开设了面向所有学生的计算机系统综合实验课程;北京航空航天大学从2006年开始筹划,花了5年时间实现了突破,在相关的数电和组原、OS及编译原理课程中逐步让学生完成一个完整计算机系统的设计;清华大学目前也已经完成了计算机综合实验平台的所有软、硬件部分的开发,准备在所有本科生中开设计算机系统综合实验课程。此外,中科大和国防科大等高校也一直在实施本科生的计算机系统设计能力培养计划。可喜的是,像南师大、南京航空航天大学、首都师范大学等一些高校的任课老师也在组成原理课程的教学及其相关实验中,引入了以MIPS为模型机的 CPU设计的教学和实验内容。

另一方面,像复旦大学软件学院和上海交大软件学院等则开设了与CMU的CS 213类似的课程,北京大学也在去年全盘引入了CMU的CS 213课程教学内容。但是,总的来说,目前在国内全面开展像CMU的CS 213那样的课程教学,困难还是不小,对任课教师和学生来说都是一个不小的挑战。

作者袁春风,南京大学计算机系教授
文章来源:
微信公众号:开点工作室(kaidiancs)
(未完待续)

推荐阅读更多精彩内容