论计算机类专业人才系统能力培养的起点

2020-12-02 21:07刘奇志陈家骏袁春风
计算机教育 2020年4期
关键词:计算机系统程序设计基础

刘奇志,陈家骏,袁春风

(南京大学 计算机科学与技术系,江苏 南京 210023)

1 计算机类专业人才系统能力的两层涵义

能力的涵义比较宽泛,通常可分为一般能力与特殊能力两类。一般能力是指记忆力、想象力等掌握和运用不同知识需要的共同能力;特殊能力是指完成某项活动需要的专门能力,如数学能力、编曲能力等[1]。在计算机类专业人才培养语境下讨论的系统能力实质上也有两层涵义:一是方法论层面的一般系统能力,即能够从问题的全局把握各个组成要素及之间的关联性、层次性和动态性的能力[2-3];二是基于跟计算机系统有关的专业知识和技术发现问题、分析问题和解决问题的特殊系统能力。

方法论层面一般意义上的系统能力,通常表现为系统思维能力和系统实践能力。系统思维建立在认知、逻辑思维和结构化思维基础之上。系统实践指在实际问题情景中,如何运用系统思维设计、实现和应用等。计算机类专业人才特有的系统能力,其核心在于掌握计算机系统内部各个组成部分的设计方法与工作原理、功能特征与运用策略、逻辑关系和相互作用。

通过分析计算机类专业人才系统能力的两层涵义,可以看出:不管是一般系统能力,还是计算机类专业人才特有的系统能力,都不是一蹴而就的,需要专门的引导。

2 计算机类专业人才系统能力培养的起点

对应系统能力的两个层面,系统能力培养也需要从两个层面加以考量。

从方法论层面来看,系统思维能力和系统实践能力的获得,需要从认知、逻辑思维和结构化思维等角度,在实际系统的设计、实现和应用过程中,进行全面训练和持续学习,并且一般需要反馈训练,甚至需要建立在动态思维习惯的养成之上。实际上,一般系统能力的培养早在大学之前的教育阶段就开始了,甚至可以追溯到学前教育阶段。在大学阶段,这种能力需要在多门课程中进行更有针对性的训练和提高,各门课程应承担不同的角色和任务。计算机类引导级课程应承担奠定系统认知基础和逐步引入逻辑思维乃至结构化思维的任务,并应提供设计、实现和应用过程的反馈训练机制及动态思维实践机会。程序设计基础在系统认知、逻辑和结构化思维、反馈训练及动态思维实践等方面具有天然的优势,适合作为大学期间一般系统能力培养的起点,具体引导作用见本文的第三部分。

从计算机系统层面来看,特殊系统能力培养需要围绕计算机系统在分析、设计、实现、测试、优化等多个方面分别引导和训练:①分析给定系统结构及输入对应的输出;②根据给定输入和输出设计系统,让软件和硬件协同工作,并合理构建人机交互模式;③调试和修正系统各层面的错误;④分析、验证和调优系统整体性能[4-5]。传统培养模式是按计算机系统的层次结构切分,将知识点划入不同的课程分别加以介绍,主要涉及数字逻辑电路、计算机组成原理、汇编语言程序设计、操作系统、编译原理、计算机网络等课程。新型培养模式引入计算机系统基础等课程,着力从程序员视角将计算机系统基本概念在一门课中串起来,帮助程序员建立一个整体系统知识框架,并假定学生对C 语言程序设计有一定的基础[6]。鉴于当前国际国内初等教育中的计算机教育水平参差不齐、缺乏规范,于是高等教育程序设计基础成为特殊系统能力培养的排头兵,具体内容见本文的第四部分。

是否以程序设计基础作为计算机类引导级课程尚有争议,但以其作为系统能力培养的起点却不难达成共识。世界两大著名的非营利性学术团体ACM 及IEEE 发 布 的Computing Curriculum规范(如CC2001、CS2013 等)影响深远。CC2001[7]用3 层模型(Introductory,Intermediate,Advanced)来看待高校的计算课程,并总结了国际上现有引导级(Introductory)课程层6 种不同的导入模式(命令式优先、对象式优先、函数式优先、广度优先、算法优先和硬件优先)。6 种模式中,跟计算机系统结合最为紧密的是第一种命令式优先模式和第六种硬件优先模式,分别对应当前系统能力培养的两种主流模式。硬件优先模式在计算机类专业中很少采用。以程序设计基础作为引导级课程是命令式优先导入模式的典型代表。因此,该课程作为引导级课程不仅是国内外计算机学科广为采用的导入模式,也是更利于系统能力培养的一种导入模式。

此外,对系统能力培养的探讨本身也需要系统观。英国的彼得·切克兰德(获英国计算机协会授予的“最具杰出贡献人员”奖)在systems thinking,systems practice 一书中指出,相对于基于系统工程方法的“硬”系统思维,“软”系统思维更强调对系统复杂性的探究过程本身是一个开放的学习系统[8]。实际上,正如探究计算机系统和实际问题求解过程,开展计算机类专业人才系统能力培养过程本身也是复杂、开放的系统,涉及多门课程的教与学,并随着科技的发展而变化,需要探究者持续学习和不断总结。本文提供南京大学计算机科学与技术系程序设计基础课程组在本专业人才系统能力培养过程中的阶段性思考,以及在引导级课程中切实开展系统能力培养的具体策略。

3 程序设计基础在一般系统能力培养中的引导作用

方法论层面的系统思维能力以认知为基础,系统实践能力通常需要具有反馈习惯,而且在思维和实践环节都应自觉关注系统的动态特征。程序设计基础能够较好地支持一般系统能力这几个方面的基本训练。

3.1 建立感性认知,夯实系统思维基础

系统思维能力不是空中楼阁,从认知到拥有逻辑思维能力,进而发展到具备结构化思维能力,最后上升到系统思维能力,是一个循序渐进的过程。程序设计基础首先引领学生认识程序的基本结构与要素,编写解决简单问题的小规模程序,并在通用平台上运行起来,建立感性认知。然后结合具体实例,从C 语言的关系与逻辑操作和结构化程序设计方法出发,有针对性地介绍流程控制与模块设计方法,启发学生掌握分类、枚举、迭代和递归等问题求解思路,逐步训练学生的逻辑思维和结构化思维。最后引导学生通盘考虑问题和系统各个层面及其间的关系,揭示程序与程序设计的本质及相关概念。这一过程符合人们从感性到理性的认知特点,能够为系统思维打下良好的基础。

值得注意的是,程序设计基础教学中应让初学者尽快进入程序员角色,体验认知和思考的乐趣,避免使学生在尝试编写程序之前,被抽象的概念和术语及计算机系统对数据的存储方式等知识困扰[9]。

3.2 提供反馈机制,强化系统实践基本功

程序设计过程中,从问题的分析和求解方案的设计,到代码的编辑、编译、链接和执行,每个环节都有可能出错,需要学生返回过程前面某个阶段进行错误修改,然后重新继续过程的后续阶段。例如,C 语言编译器在编译时发现源程序中存在语法错误,链接器在链接目标文件时发现外部引用错误,程序运行结果与预期不符等,需要修改代码、设置环境、审查程序的逻辑重新设计,直到程序产生正确结果为止。这是一个天然的反馈机制,而且常常存在多次反馈的情况。这样的过程有助于强化基本的系统实践训练,并能有效地将知识的记忆融入解决实际问题的过程。

另外,程序设计基础是一门实践性非常强的课程,实践教学过程中的反馈式[10]教学设计,可以进一步加强训练效果。教学中有针对性地布置训练任务,并及时进行正反两方面的反馈,展示好的做法,明确标注程序中存在的缺陷和不好的做法,可以激励和督促学生不断地思考、训练,直至养成良好、规范的习惯。

3.3 关注技术演变,培育动态思维习惯

相较于关注要素,一般系统能力更善于把握各要素之间的区别和联系,能够在全面了解静态特征的同时,洞悉动态特征。程序设计经历了从采用低级语言到采用高级语言、从简单编码到全面软件工程的发展历程。在这一历程中,体现了人们对程序设计活动的不断认识和改进。以程序设计语言为例,自20 世纪70 年代贝尔实验室发明C 语言以来,该语言得到了广泛的使用和发展,形成了多种C 语言的实现版本,以及不同版本的语言标准。各种版本在功能和函数库的设置及语法上存在差别,不同公司或团队开发的集成开发环境对语言标准的实现程度也不尽相同。在这些内容的教学过程中,可以引导学生的动态思维习惯,深化一般系统能力的培养。

对于日新月异的计算机科学与技术,若能不断优化程序设计基础的教学设计,注重知识的前后关联,给出问题的来龙去脉,不仅介绍早期经典做法与最新标准的差异,还能结合科研内容与方法介绍科技前沿动态,必定能尽早潜移默化地影响学生的动态思维。当然也要提醒初学者应以掌握程序设计基本方法为目标,避免被语言标准或语言的实现细节纠缠。

4 程序设计基础在特殊系统能力培养中的引导作用

计算机类专业人才特有的系统能力,需要建立在对计算机系统各组成部分及相互关系的认知基础之上,能够分析、设计、实现、测试和优化计算模型。程序设计基础用C 语言介绍过程式程序设计方法及相关基础知识,可以为上述各种能力的培养奠定一个较为扎实的基础,让学生在初步了解计算机学科的同时,为其他核心课程(如计算机系统基础、操作系统、编译原理等)提供必要的准备。当然教学中要分清与相关课程内容的联系、区别与边界,尽量减少与后续课程内容的重复。

4.1 阐释C 语言相关概念,无缝连接计算机系统知识

在国际国内计算机科学教育中,引导级课程采用何种编程语言存在相当大的争议。作为一种不再年轻或备受追捧的编程语言,C 语言与计算机系统关系紧密,对数据的描述和对数据的操作相分离的模式与冯·诺依曼体系结构比较吻合,有助于学生理解现行主流计算模型,相关知识点与后续课程计算机系统基础可以无缝衔接。例如,程序设计基础中基本操作符、流程控制、单模块设计、多模块设计等概念,可以分别对应计算机系统基础中数据的机器级处理、选择语句和循环结构的机器级表示、过程调用的机器级表示、程序的链接等知识点;基本数据类型、派生(构造)数据类型、指针等概念,可以分别对应数据的机器级表示、复杂数据类型的分配和访问、地址空间和地址转换、数据对齐等概念。

需要注意的是,程序设计基础的课程内容应当围绕程序设计本质和系统能力培养进行合理安排与组织,而不是围绕语言元素展开,在讲解过程中应适时提炼程序设计和特殊系统能力有关的思想方法。

4.2 剖析过程式程序结构,直通计算机系统功能分析

分析给定计算机系统结构及输入对应的输出是最起码的计算机类专业人才特有的系统能力。作为引导级课程,程序设计基础借助于C 语言介绍过程式程序设计的基本做法。一个过程对应一个子功能,可以在程序执行的任何一个时间点被其他过程或自身调用。过程内部的计算步骤按顺序、分支或循环流程执行。这种程序有利于初学者根据输入分析输出,能尽快为系统分析能力打下基础。

在C 语言编程实践中,学生会自然而然地希望进一步了解计算机执行程序的机理。例如,变量是过程式程序的重要实体,通过解释C 语言变量的属性,可以让学生将代码中的变量与内存中的变量联系起来,并能接触地址概念,很容易激发学生对机器级相关概念的好奇心。函数是另一个重要实体,函数调用过程会引起学生对计算机系统中的堆、栈的好奇心。教学中,可以在此基础上引导学生对比实现同一功能的不同代码在计算机系统中运行时的差别。此外,在教学过程中的不同阶段,对比、总结函数间的不同通讯方式,还可以帮助学生建立相关计算机系统知识的整体框架。

4.3 训练系统级语言编程,启蒙计算机系统的设计和实现

计算机类专业人才特有的系统能力中,设计和实现能力极其重要,通常需要软件和硬件两方面的知识储备,甚至需要谙熟系统与用户之间的交互关系。C 语言是一种贴近硬件的高级编程语言,程序设计基础可以从一开始在编程训练中帮助学生建立软件和硬件两方面的感性认知,在此基础上建立的程序设计意识更有利于后续计算机系统设计和实现能力的培养。例如,求两个正整数m和n的最大公约数,可以先分别求出m和n的所有约数,然后找出两者公共约数中的最大值,也可以用辗转相除法,后者更便于计算机实现。辗转相除法的缺陷在于,当m、n非常大的时候,计算m除以n的余数将是一个复杂而耗时的过程,而只涉及整数的移位和加减法的Stein算法效率更高。学完该课程后,学生不难了解到利用计算机求解实际问题必须转换为适合计算机系统的算法和程序,才能在计算机上有效运行和获得结果。

当然,要想获得更好的实现能力训练效果,教学中还需突出重点、阐明难点。课堂教学可以选取典型例程深入讲解,实验教学要精心设计训练题、上机测验和小项目,提供充分的上机指导来解决学生在实践中遇到的技术难题。通过理论和实践环节分别引导学生面对实际问题时的分析、设计和实现能力。

4.4 提供多种程序调试手段,点拨计算机系统的纠错和优化

实际编写的程序中可能含有语法、逻辑或运行异常错误。不符合语法规则的错误可以由编译器检查发现。逻辑或运行异常错误往往较难发现。除了设计的算法或数据结构不符合问题的求解之外,程序本身也有可能不符合算法或数据结构的逻辑。例如分类情况考虑不周或部分重叠、代码中分支或循环流程的误写等。对执行环境的缺陷或用户操作的失误考虑不足会引起运行期间程序异常终止,例如内存空间不足、打开不存在的文件进行读操作、数组下标越界、程序执行了除以0 的指令等。这些逻辑和运行异常错误可以通过少量模拟数据进行分单元分模块乃至集成化的整体测试,并通过调试(debug)来对错误进行定位和排除。程序设计基础教学过程中会介绍多种程序调试手段,例如通过逻辑分析和判断、增加阶段性输出、利用C 语言的条件编译或断言、借助debug 工具设置断点等,帮助学生分析、发现和调试程序的错误,并在实践中积累调试技巧、经验和能力,以便灵活运用,进而能对系统整体性能进行分析、验证、排错和调优。

当然,由于C 语言具有较强的灵活性,适合熟练的程序员用来开发高效的系统软件、支撑软件或应用软件,而对于初学者,会存在一些羁绊。程序设计基础教学中可以根据需要,介绍有关的C 语言元素及其使用方法,以及会使初学者迷惑的语言陷阱,不必完整介绍C 语言的所有规则或机制,以免把学生引入重点学习C 语言而不是程序设计基本方法的歧途。

5 结语

在计算机类专业人才系统能力培养课程体系中,基于C 语言介绍过程式程序设计范型的程序设计基础这一课程扮演着不便替代的重要角色。尽管各个高校该课程的具体教学内容存在一些差异,以该课程作为引导级课程至少可以培养学生围绕计算机系统进行编码、调试和纠错,在特殊系统能力方面提供有效训练。如果教学方法得当,还能帮助学生在思考系统各个组成部分的逻辑关系和相互作用等一般系统能力方面奠定一个较为扎实的基础。

猜你喜欢
计算机系统程序设计基础
基于SolidWorks和VBA的电机阶梯轴建模程序设计
项目化教学在Python程序设计课程中的应用
医学专业“Python程序设计”课程教学改革总结与思考
控制
从细节入手,谈PLC程序设计技巧
IBM推出可与人类“辩论”的计算机系统
夯实基础,举一反三
夯实基础,举一反三
“防”“治”并举 筑牢基础
拨乱反正 夯实基础