时间:2024-05-04
张为华,李 弋,赵文耘
(复旦大学 软件学院,上海 201203)
系统能力是在掌握计算机系统基本原理的基础上,熟悉如何进一步开发构建以计算技术为核心的应用系统 。随着信息技术的发展,计算机已成为工作和日常生活的重要工具,逐渐形成支持移动端、PC端、云端等的多种计算模式。日益复杂的应用和计算模式的变化对计算机专业人才的系统知识结构、大局观和创新能力提出了更高的要求。
为了应对这些挑战,ACM/IEEE 对其课程体系进行了调整,在CS2013[1]课程体系中新增加了一些课程以强化学生的系统能力。教育部高等学校计算机类专业教学指导委员会针对新形势梳理了计算机培养的各种能力(见表1)[2],计算机专业高级人才应具有计算思维能力、算法设计与分析能力、程序设计与实现能力和系统能力,其中系统能力最重要,占总能力的75%。
系统能力是在掌握计算机系统基本原理的基础上,熟悉如何进一步开发构建以计算技术为核心的应用系统[3]。在传统课程体系下,计算系统相关的基本原理分散在计算机组成、计算机体系结构、操作系统、编译原理等课程中。在这种体系中,各个知识点独立,割裂了计算机系统概念之间的联系,增加了整体系统认知的难度。卡耐基梅隆大学(CMU)的Bryant等人[4]基于程序员的视角设计了计算机系统基础(ICS)课程,综合介绍计算机系统的基础概念。由于该课程较好地诠释了计算机系统的相关知识,突出了各知识点的关联性和知识的整体认知,很多高校都相继开设计算机系统基础课程以加强学生的计算机系统能力,全球已有近300家机构开设了该课程。
表1 计算机能力构成分布
基于学生的具体情况差异,国内的ICS教学普遍对授课形式和内容进行了调整。课程一般分两学期讲授,教材也有所不同。随着ICS课程本地化进程的推进,学生的系统观都得到了不同程度的加强,但在ICS的教学过程中也面临一些挑战:首先,学生的计算机基础普遍较差,编程能力较弱,有的学生在进入大学前从未接触过计算机,对知识的理解能力较弱;其次,现有教材内容的顺序没有考虑知识点的关联性,知识呈现碎片化;最后,没有结合学生的培养计划和培养目标调整教学内容的深度,学生系统能力培养缺乏体系。这些因素在一定程度上影响了ICS的整体授课效果,造成很多学生学习ICS课程的困难,不利于学生对系统的整体理解和后期的培养。
针对这些挑战,应对ICS的授课内容进行调整和优化。首先,将课程内容按应用程序员视角和系统程序员视角进行划分,应用程序员视角内容前移,而系统程序员视角内容后移。这样划分后,前部分内容更容易理解,针对学生的计算机水平梳理ICS的课程内容,偏编程的内容尽量前提,偏原理性内容后移,也更容易被无计算机基础的学生掌握,也为理解后部分知识建立基本的概念。其次,根据各章的关联性重新组织课程内容,加强内容的关联性和紧凑性,从而避免相关内容跨度太大造成的理解缺陷。最后,根据培养目标,对一些内容进行细化和加强,避免必要系统知识的缺失,提升学生的系统观。
ICS已成为国内计算机专业系统能力培养的核心基础课程,目标是解释计算机系统的本质概念,并展示这些概念对应用程序正确性、性能和可用性的影响[5]。通过学习,学生应理解应用的运行,并编写高效的应用程序。
ICS教材从程序员的视角出发,分别从程序结构和执行、程序在系统的运行以及程序间的通信和交互3个抽象层面介绍计算机系统相关概念。在程序结构和执行部分,课程介绍程序和信息在硬件上的表示、程序运行的硬件——处理器和存储系统、程序的优化。在程序在系统的运行部分,课程先介绍可执行程序的生成,然后讲述应用程序运行相关的进程和虚存——操作系统管理处理器和内存资源的机制。在程序间的通信和交互部分,课程先介绍基本的交互机制——系统I/O和网络通信,再引入并发更好地支持多种交互模式和提高资源的使用效率。
由于知识点较多,ICS课程一般分两个学期讲授。课程内容通常按表 2组织,第一个学期主讲程序的结构和执行,第二个学期则讲授其余的两个部分。
表2 ICS课程内容的划分
ICS对计算机系统的综合介绍,能够为后续课程的学习奠定坚实基础,促进系统教学的改革。由于ICS课程已覆盖大部分系统概念,一些学校已用其代替传统的系统类课程培养非系统方向的学生。例如,复旦大学软件工程专业电子商务方向的学生,学完计算机系统基础后,已不要求选修体系结构、操作系统、编译等传统系统基础课程。
目前国内大学的计算机专业面向全国招生,新生的计算机水平参差不齐。虽然少数学生有较好的计算机基础,甚至高中参加过信息竞赛,但绝大部分学生没有任何编程经验,甚至没有使用过计算机。
在一年级,学生一般会系统地学习程序设计语言课程,大部分学校也会开设简单的应用开发类课程,如Web程序设计等课程。前者培养学生高级语言的编程能力;后者则讲授HTML、JavaScript和简单的数据库知识,训练学生编写简单互联网应用的能力。
通过这两门课的学习,学生初步具有编写应用程序的能力,但对计算机系统的理解依然有限。ICS课程一般在大学二年级开设,现有的内容和组织方面存在不足,导致教学效果不够理想,学生对系统知识的理解不够全面。
(1)学生能力的适应问题。我们对近几届学生做了调查,统计结果表明,近60%的学生在进入大学前几乎没有接触过计算机或学习过相关知识。Bryant的教材[5]按照程序的表示、组织、运行和相互间交互的自然顺序组织。这种方式要求学生对计算机比较熟悉,然而大部分学生计算机基础较弱的现状造成学生理解知识的障碍和课程实验的实现困难。
(2)知识点的关联问题。授课顺序没有考虑知识点之间关联关系的强弱,组织相对松散,不利于综合理解,如存储系统安排在程序优化之后,但程序的执行效率与存储介质的特点和程序访问的局部性紧密相关,导致学生在学习优化时,不能理解与存储相关的优化。两学期教学虽然让学生有充裕的时间学习和理解,但是破坏了连续性,妨碍学生对计算机系统的整体认识,如虚存和存储系统安排两个学期,不利于整体把握。因此,需要结合学生的能力以及知识点的顺序关系和相关性,合理对授课内容进行划分。
(3)部分内容的深度问题。在一些学校现有的学生培养方案中,非系统方向的学生学习计算机系统基础课程后,很少会系统地学习计算机系统相关的知识。从实际需求和能力培养的角度而言,目前对ICS的一些方面介绍得不够深入,需要进一步强化,如程序员系统地找到程序性能问题的原因,并给出改进性能的方法,是一项很重要的能力,但这部分内容在现有ICS教学中并非重点。
(4)缺乏综合性。ICS从程序员的视角介绍计算机系统相关的概念,是第一门学习系统概念的课程,内容中概念的综合性相对较低,如Lab中实现HTTP代理涉及比较多的概念,但一些概念就只是简单的应用。
为了提升ICS课程的整体授课效果,结合现有学生计算机能力的现状,可以从下列几个方面着手,提高ICS课程的教学质量。
(1)难度的渐进性。当前的授课内容应该与学生的能力增长相适应,让学生逐渐掌握计算机系统的相关概念。
(2)内容的关联性。根据认知的先后次序和知识点的依赖关系,对授课内容进行组织,逐渐强化学生对系统基本原理的理解。
(3)内容的深度。结合后续系统课程的教学内容,系统地增加重要而未覆盖的论题,并相应地适当增加课时。
(4)知识体系的综合性。增加综合性内容,从而提升知识之间的综合性。
对于计算机的理解,一般可分为应用程序员视角和系统程序员视角。应用程序员编写的软件程序直接面向用户,利用计算机及支撑的系统软件解决应用问题。系统程序员开发的软件程序主要为应用软件提供各种系统层支持,因为需要熟悉底层的硬件和系统软件。
ICS从程序员的角度介绍计算机系统,内容也可以按应用程序员和系统程序员两个视角进行划分[6]。
(1)应用程序员视角。内容主要涉及编程,多为简单的基础知识。为了提升学生的编程能力,这部分教学实践偏多。通过编程练习,逐渐提高学生对计算机系统的熟悉程度。
(2)系统程序员视角。内容更多偏重原理以及系统底层的概念和知识,主要提升程序员对计算机系统运行的理解。这些内容主要覆盖硬件和操作系统层面的知识,结合前一视角的知识深化系统观的培养。
我们根据这个原则分析了目前国内普遍采用的CMU使用的ICS教材[5]内容。导论综合性最强,提纲挈领地介绍简单程序运行所涉及的系统概念。信息表示及操作介绍计算机如何表示信息并进行运算。程序机器层的表示可以帮助程序员更加准确地把握程序在计算机上的执行。程序链接让程序员理解复杂程序的生成和加载,有助于理解C语言中变量的申明和访问。网络编程和并发编程,重点是如何利用系统提供的接口编写程序,但网络编程要求运用之前章节系统概念和工具编写高效的应用。处理器架构和内存架构,基本上都是介绍硬件的工作原理和特点。程序优化则需要学生理解程序在机器上的执行,并充分掌握程序运行的硬件,主要指处理器和存储的工作原理和特点。异常控制流、虚拟内存系统和系统I/O,可以分为两个层次:一部分讲这些机制实现的基本原理,另一部分则介绍使用相应的编程接口为编程提供支持。
从这两个视角,计算机系统基础的内容可以按应用程序员视角和系统程序员视角进行重新划分(见表 3),具体授课内容的顺序也可以按这个划分进行排布。第一学期的的内容为应用程序员视角的内容,知识相对简单,需要深入理解的内容相对较少,并形成第二学期知识的基础。第二学期的内容主要为系统程序员视角的内容,在掌握第一学期知识的前提下,学生理解第二学期的内容会更容易,实现课程实验也会更轻松。
表3 基于程序员不同视角的教学内容划分
新的课程内容组织,把ICS教材中一些章节的内容,根据认知的层次拆分,分别在不同的阶段讲授。课程分为两个学期讲授,各自完成两个层面的认知目标。第一个学期,主要培养学生的一般程序员相关能力,利用系统提供的编程接口编写应用程序,逐渐培养学生对计算机系统的认知;第二个学期,从系统程序员视角培养学生,提高学生的理论水平,能够合理解释应用程序执行的基本原理,掌握计算机系统的重要概念。
第一个学期,课程主要讲授应用程序员视角需要理解的知识,强化学生的应用编程能力以及对计算机基本概念的理解和强化。课程的内容组织如下:①以典型的程序“Hello World!”为例,提纲挈领地介绍应用程序生成和运行涉及的系统概念;②从解释的角度理解不同信息在计算机内的表示方式,正确区分真实世界和计算机内部信息之间的联系和区别,并掌握计算机对不同信息的基本操作;③理解可执行程序在计算机内的表示,掌握计算机典型的指令集,学习如何用低级指令实现高级语言中的函数调用;④理解可执行程序的生成,反之也帮助学生理解编程时对于变量的申明和访问;⑤以动态的角度了解程序的运行,主要讲授进程和线程的概念,以及利用进程和线程系统API创建和管理多进程/线程应用程序;⑥学习I/O的基本原理,掌握用文件的模型来抽象不同的I/O访问,并学习不同I/O访问接口的优缺点;⑦基于进程和线程的概念,学习并发编程。 通过第一个学期的学习,学生对计算机系统特别是类Unix系统,已经有了比较深刻的认识,也可以用C语言编写各种应用程序。
第二个学期,课程主要在第一学期一般程序员的视角基础上,培养学生的系统程序员视角。课程的内容组织如下:①学习处理器的基本原理,通过构造简单的处理器,了解运行应用程序的处理器工作原理,掌握处理器的工作特点;②了解计算机的存储架构,掌握不同存储的工作特点和用处,特别是cache的工作原理和对应用程序性能的影响;③了解性能原理和分析机制,学习如何系统地发现应用程序的性能瓶颈,并进一步改善应用的性能,特别是如何充分发挥底层硬件平台的性能;④学习虚拟内存系统,理解计算机系统提供适当的机制以方便应用程序的执行;⑤学习实现进/线程的原理,并进一步了解进程/线程的创建机制;⑥结合虚拟内存,阐述文件共享和重定向的实现机制;⑦综合运用多个系统概念,学习网络原理和编写高效的网络程序。
进行ICS课程内容优化后,一些章节的内容也需要进行适当的调整。原有的一些章节内容基于之前章节的知识,如并发编程的部分内容就是基于网络编程例子展开讲解的,采用新的内容组织后,章节之间的顺序改变,套用现有章节内容则无法完成,因此,需要为并发编程设计只依赖于独立知识(不依赖于网络编程)的课程示例。
在一些学校现有的学生培养方案下,非系统方向的学生在学习完计算机系统基础课程后,很少会系统地学习计算机系统相关的知识,但是一些计算机系统概念和方法对程序员编写程序有很大的帮助。
为了强化学生的系统能力,增强课程的整体性,在计算机系统基础课程中也需要对一些知识点进行强化,主要体现在以下3方面。
(1)细化性能评估。随着系统的复杂性和程序规模的扩大,准确的性能评估是程序员的必备技能之一,然而ICS原有课程体系中对该部分内容强调不够。为了强化学生的相关能力,应将原有体系结构等课程的性能评估内容移到ICS课程中,并结合当前并行评估环境的挑战,引导学生理解评估的重要性,同时给部分有能力的学生增加相关实验。
(2)扩展处理器设计的方法学。目前ICS课程分别介绍了单周期和基于流水线的多周期处理器的设计。这种方式只让学生建立了处理器的基本概念,错过了培养分析问题和解决问题能力的机会。实际上,这部分的教学可结合处理器的发展阶段——单周期、多周期、流水线和ILP优化等,重点讲述前一阶段引入的问题和后一阶段解决的方法,从“问题—解决”的角度引导学生深入思考。
(3)相关知识的综合和递进。ICS现有知识体系缺乏关联和知识的综合运用,妨碍学生建立整体系统观。现有知识结构优化方式,也为进一步增强知识的综合性提供可能。由于并发内容的提前,在新的组织方式下,网络编程部分可结合并发的知识展开,对应Lab的实现也可以改为采用并发的形式进行设计。这个调整增强了网络编程部分的综合性,有利于培养学生的系统观。由于存储架构知识提前,讲解优化部分内容时,可结合存储架构进行存储系统相关优化知识的讲解。
针对学生的现状和现有教学方式的不足,我们对ICS的授课内容进行了调整和优化,强化学期内知识点的递进性和关联性。首先,提高学生的编程能力,加强对计算机系统的基本认识;其次,从原理上介绍系统如何支撑应用程序的运行。课程内容的层次化,有助于学生循序渐进地学习计算机系统。针对现有课程培养体系引入的问题,选择部分知识点强化教学内容,提高学生对系统的综合理解能力和动手能力。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!