李 暾,刘万伟,毛晓光
(国防科技大学 计算机学院,湖南 长沙 410073)
试图在36或48学时将计算机专业4年的知识,传授给非计算机专业的学生,是目前大学计算机基础课程面临的主要挑战与问题。这些知识涵盖了计算机工作原理(从三极管到云计算)、如何使用计算机(常用计算机软件的使用),以及计算机专业面临的问题(数据结构、算法效率等)。归纳而言,课程内容面面俱到,以背诵知识和工具操作为主,使得该课程难以满足各专业和大学新生的要求。作为一门通识课程,大学计算机基础课程正在经历从传统计算机基础知识传授向计算思维能力培养转型,国内外高校教师对这类课程进行了很多有益的尝试[1-6]。
为适应新工科以及计算机教指委[7]对本课程的要求,在仔细分析各专业对计算机技术的需求后,我们认为,大学计算机基础课程教学应更加关注如何发挥计算的能力解决问题,而不应过多强调太专业的计算机科学知识。具体而言,即培养学生利用计算思维创造工具解决其专业学习中的问题。
针对目前存在的问题,亟须将课程内容转换到以计算思维培养为核心上来。这种转换面临着如下几个问题:首先,教学内容如何安排,即以什么为主线来组织内容,而不是泛泛地介绍计算思维的概念、计算思维是什么不是什么。其次,实践体系如何构建,使学生能在实践中潜移默化地形成计算思维能力。最后,如何在各类约束下开展教学内容的改革,这些约束主要来自于学生,例如,大一新生几乎没有计算思维的背景知识,也几乎没有其所在专业的专业知识。
为此,首先要分析挖掘计算思维的核心能力,然后围绕核心能力的培养组织教学内容和实训体系。具体而言:①在计算思维核心能力方面,内容组织上应是运用计算思维解决具有一定难度的问题,并能将这种技能迁移到学生未来专业的学习与问题求解中;②在计算思维的实践上,选择一门易于入门,且能快速掌握的程序设计语言进行实践;③在实训体系设计上,遵循的原则是实训案例需基于学生知识背景结构设计,实训案例问题的解决不需要太复杂的计算机科学专业知识。
对计算思维的教学,不要纠缠于计算思维是什么、不是什么等概念上的辨析,而是以能力培养为中心,将知识点转换为核心能力。我们认为,计算思维核心能力主要包括逻辑思维、算法思维、分解、泛化与模式归纳、建模、抽象和评估,下面逐一进行简单介绍。
逻辑思维(Logical Thinking)和算法思维(Algorithmic Thinking)都是计算思维的核心概念,处于非常重要的地位。从高层次看,算法构建于逻辑之上,逻辑给出了推理的规则,而算法将规则集成起来,基于规则推理的结论执行某些动作(序列)。对本门课程而言,逻辑主要涉及命题逻辑(命题及逻辑联结词)、自然语言表达的命题的符号化,以及将逻辑表达式转化为某种程序设计语言表达式的方法。我们认为,在本阶段对算法的要求应集中于算法是动作序列,这些动作序列带有一些特定的性质(输入、输出、明确性、有限性和有效性)。
由于计算思维通常用于解决大型复杂问题,而由于人每次能处理的问题规模有限,对大型复杂问题,分解是必需的。更进一步,分解是一种系统化的方法,遵循分解的原理和步骤,几乎总能将问题持续简化,直至找到解决方法。
求解的问题多了,会发现有些问题之间具有相似性,相似性会导致问题的解中有些元素是重复出现的,或解中有些元素是类似的。仔细考察这些相似性,找出解决方案中的相似性,归纳出普适解决方案,这就是计算思维核心能力中的模式归纳。模式归纳有一些通用的规则,通过观察解决方案中重复出现的名词(对应着操作对象)、动词(对应着操作)、形容词和具体数值(对应着可被替换的性质)等,可对解决方案进行改进,归纳出循环、子过程和规则。
抽象对问题求解有非常大的作用,它聚焦于求解问题相关的细节,而避免无用细节的干扰。抽象包含两个方面的含义:第一个方面指的是舍弃事物的非本质特征,仅保留与问题相关的本质特征;第二个方面指的是从众多的具体实例中抽取出共同的、本质性的特征。这是两种不同的操作。
对抽象出来的结果,建模是用另一种方式对其进行描述,包括其静态的属性和动态的行为,利用逻辑思维和算法思维,可以在建模的基础上构建出计算的解。针对大一新生的知识背景,选用ER图作为静态建模的工具,以有限状态机作为动态建模的工具。前者在引入实体的方法后,就与面向对象设计方法无缝衔接,而后者可以描述大部分计算思维问题求解产物的行为特性,具有普遍意义。
最后一个核心能力是评估,即在得到问题的解后,进一步考察解,以确保解是正确的、高效的、优雅的、可用的。这个核心能力重点培养学生在各种指标之间平衡的思维方式,即要想在解决方案中兼顾各种指标,很难做到每个指标都是最优的,需要进行权衡,在各指标间进行折中。
在上述计算思维核心能力的指导下,形成培养计算思维的教学内容[8-9]和实训体系[1-2]。实训的设计原则包括:①基于学生知识结构构建案例,案例来源于有现成公式的数学和物理问题,以及本门课程学习的计算机基础知识点。选择后者的出发点是将计算机科学中的问题为案例进行研究和求解,体验初步的计算思维解决专业学习问题,并希望学生能将这种方法迁移到今后各自的专业学习中,解决专业领域的问题。②案例的求解不需要太复杂的计算机科学专业知识,即不涉及复杂算法和复杂数据结构。这是为了减轻学生利用计算思维求解问题所需的背景知识,能尽快开始实践,解决中学课程涉及的以及日常生活中遇到的具有一定难度的问题。③一定要让每个案例都涉及若干个计算思维核心能力的培养。解决任何一个问题都不只涉及一种计算思维核心能力,而是多种核心能力共同作用的结果。这是为了在有限时间内最大化实训效能,使学生体验更多的核心能力组合模式。
我们选用的实训语言是Python,具体的实训体系如表1所示。实训体系分为8个模块,每个模块包含3~5个实训,每个实训包含4~5个实训习题,每个实训涵盖若干个计算思维核心能力。采用层层递进、逐渐提高难度的方式组织实训与编制实训习题,使得学生在实训过程中尽早建立信心。
表 1 计算思维实训体系
以“冯诺伊曼体系结构建模与模拟”实训为例,该实训以课程中计算机工作原理为案例,通过构建给定指令集的冯诺伊曼计算机模拟器,一方面可使学生深入理解所学知识,另一方面可开展计算思维核心能力的实践训练。针对给定的指令集,构建其模拟器涉及的计算思维核心能力训练如表 2所示。
在该实训下,安排了3个实训习题,第一个是以面向过程的实现具有10条简单算术运算指令的计算机的模拟器,第二个是将该机器以面向对象编程技术再次实现,第三个是一个有16条算术、逻辑、跳转指令的计算机的模拟器实现。
表 2 计算思维核心能力在冯诺伊曼体系结构模拟器实训中的体现
表 3 计算思维核心能力反思表
将实训与课程内容相结合,具体应用时,先让学生利用各种解题方法完成实训作业,这些方法可能不是计算思维核心能力相关的方法。此后,要求学生对完成的实训进行回顾,对照计算思维核心能力进行反思,对完成的实训习题进行重构和改进。我们发现,计算思维核心能力概念性的讲授,在学生没有切身体会时,收效甚微。而实践后再对照反思,效果明显。表3列出了一些反思内容,请注意这些内容不是一成不变的,会随着学生的进步有所深化。
本实训体系部署近两年以来,支撑了本校两个年级2 000余学生的大学计算机基础课程实训,以及40余所高校3批次70余名老师的导教活动;已有3万余人次使用,用户来自国内外几十所院校和科研院所,被十余所国内高校相关课程的实践所采纳。
针对大学计算机基础在计算思维培养方面面临的问题,我们提出了通过计算思维核心能力培养为主的教学内容与实训体系教改,着重介绍了实训体系建设、应用方法及应用效果。实训体系的建设是一个持续改进的过程,未来,针对用户的反馈,将在增加实训案例的基础上,不断改进现有实训,使得实训的组合更加灵活、评测更合理。