0 引 言
在推进我国社会主义教育现代化,建设教育强国的历史任务中,培养具有前瞻交叉思维的科技创新人才是高等教育承载的重任和使命[1-2]。当前,我国高等院校聚焦创新教育教学体系,全面提升自身原始创新能力,加大和提升应用型、复合型、技术技能型人才,特别是拔尖创新人才的培养比重和水准,尝试探索专业学科实质性复合交叉合作规律,发掘未来科技创新领军人才培养新模式。
培养未来科研工作者对客观世界数据的敏感度、数据抽象能力以及数据处理的直觉性、熟练度、执行力等综合能力,是计算机基础学科与计算机工程技术能力培养相关课程的教学目标之一,涵盖数据思维能力和计算思维能力的培养与训练。计算思维是人们用计算机解决问题时要遵循的一种思维方式,是数据思维在计算机世界中的延伸。
在计算机基础学科与工程技术能力培养相关的课程中,前后有衔接关系的课程之间通常存在教学内容分立性强、知识连贯性不充分等问题,因此融合程序设计语言、数据结构、算法、软件实践等专业基础课的核心内容课程的新范式尤为重要,该范式运用在面向多工科专业拔尖生开设的程序设计与数据结构课程效果显著。
1 面向拔尖生培养的教学内容融合新范式
在拔尖人才计算机学科素质培养模式探索中,以学生熟练掌握程序设计手段,能够灵活驾驭数据结构和经典算法,以及普遍具备常规问题求解能力为目的,实现多工科专业领域拔尖生在编程语言、数据结构和算法方面从基本通识、熟练运用到精通掌握的渐进培养过程,使学生具备客观数据抽象描述能力、经典算法实现与分析能力、程序设计与调试能力、处理与分析数据的能力等。
1.1 计算机学科系列课程衔接关系分析
计算机学科系列课程的常见衔接关系如图1所示,以程序的设计、调试与优化等为能力培养核心,沿数据结构、算法、操作系统、编译、面向对象程序设计等课程辐射,形成知识的递进。在以C语言为学习起点的高校培养方案中,多以面向对象的Java、C++等高级语言作为进阶课程;以“C语言—数据结构/经典算法”为线索的各课程关系部署则主要有分立和融合两种方式。
分立方式是以各自独立却又紧密联系的“先修—后续”课程的方式开展教学。如华盛顿大学的两门课程“Computer Programming I”(函数、参数、返回、值、if else、for循环、while循环、文件处理、数组、指针等)和“Computer Programming II”(栈、链表、队列、哈希、二叉树、优先队列等)分别覆盖了C语言基本语法及语义、数据结构及相关算法的基本内容,国内很多高校也采用此方式。
融合方式是将程序设计、数据结构、经典算法等组合在一门课程中讲授。如莫斯科大学开设的算法及编程入门课“算法和算法语言”,按照约1:2:2的课时比例用25次课讲授“算法理论基础”“C语言编程”“算法和数据结构”3部分内容;北京航空航天大学开设“数据结构与程序设计基础”,用约80学时按先“程序语言”后“数据结构”的顺序讲授课程。
相较于分立方式,融合方式具有内容多、知识域广、对综合能力的提升要求高、学习挑战性大等特点,更契合拔尖人才计算机学科素质的培养需求;考虑到教学内容和方案要具有“因材定制”特性,有必要对所涉及的知识按培养要求进行梳理与组织,打破课程领域知识之间的人为壁垒,恢复其原有的流畅过渡性,确立重要概念及知识递进关系,还要避免课程间因内容衔接带来的教学冗余、主旨思路不清等情况的发生。
1.2 3条主线作用下的知识融合新范式
以“C语言—数据结构/经典算法”为核心的知识融合新范式是以C语言为载体,从计算机底层逻辑和高级语言语法开始,纵贯数据结构线、算法基础线和问题求解线;各主线之间既并行又耦合;数据结构线和算法基础线共同支持问题求解能力提升这一目标主线。如图2所示。
(1)数据结构线:以基本数据类型为基础开启程序设计的学习,逐步增加对物理世界数据的描述能力和数据类型的可构造性的讨论,拓展到数据及各数据元素的逻辑结构、存储结构等类型抽象过程,在抽象数据类型上继续提升高级语言编程能力。
(2)算法基础线:以分治、枚举/遍历等朴素算法思想为起点,了解算法及其时空复杂度、正确性、运行状况分析等初步知识,逐步掌握查找、插入、删除、排序等算法的经典思想和问题求解思路,通过求解步骤的算法化、代码化过程,开展对基本类型数据的基础操作训练,逐步拓展到结合抽象数据类型的算法实战。
(3)问题求解线:问题求解实践技能的提升,既需要各专业领域的理论和技术支撑,还需要面向问题的多种解决思路、相应方法或算法储备。在问题求解能力培养中起到关键作用的是数据抽象过程以及算法设计和实现过程,学生通过问题建模、数据抽象、算法选择与设计、程序实现、调试与功能测试等环节的基本训练和实战锻炼来逐步提升问题求解能力。
1.3 基于融合新范式的程序设计与数据结构课程
拔尖生课程通常对领域知识结构的全面性、紧凑性有相对较高的需求,3条主线的提炼以及关键概念和知识的有机组织是一次有益尝试;结合“主线范式”创建的程序设计与数据结构课程可以充分依据3条主线来实施核心教学环节的设计,完成以知识点融合与递进关系为核心内容的教学方案制订与课程建设。
课程设置以下教学模块:高级语言基本要素、分治与模块化程序设计、构造类型与数据结构基础、数据操作与算法初步、指针、线性表、树结构及相关算法、图结构及相关算法、外部数据载体及文件等;配置与教学同步的实验模块:简单变量编程、程序控制流程关键语句及I/O语句、函数与数组、栈的顺序存储及应用、排序算法、链表相关算法、树相关算法、图相关算法等。
课程旨在完整提升学生的问题算法化、算法程序化、数据结构化等工程技术能力和科研素养。数据结构线主要对应高级语言基本要素、构造类型与数据结构基础以及后续相关内容和实验;算法基础线主要对应分治与模块化程序设计、数据操作与算法初步以及后续相关内容和实验。
2 程序设计与数据结构课程教学方案
结合主线融合范式的课程建设,通过若干教学环节设计和知识点融合思路的提炼与整理,形成课程教学方案。本文选取部分教学模块方案进行说明,其中“考虑时空的‘算法初步’与问题算法化能力训练”是专题教学设计,其余3项为结合课程建设思路的较为宏观的教学方案设计。
2.1 关键概念的适当前置、接续递进和难点分解
数据结构线是沿着基本数据类型、数据类型的可构造性、数据的计算机存储方式与逻辑关系、抽象数据类型等关键线索展开的一条主线。
教学过程中,将结构体、数组等数据类型与整型、浮点型等基本数据类型放在第1个教学模块“高级语言基本要素”集中交代给学生。①在讲授“基本数据类型”时,让学生了解计算机中的变量具备的4个属性——变量名、变量类型、变量的值以及变量的存储/地址,理解某类型数据的直接访问方式、随机存储方式等;②将多个不同基本数据类型按问题需要构造出新的类型,使学生体会自己在计算机数据存储管理上的能动性,理解数据类型的可构造性;③在讲授“数组”部分时,让学生体会多个同类型数据连续存储的计算机处理方式,体会大数据量连续存储带来的空间占用需求和潜在的不足。
以上3点支撑抽象数据类型相关知识的引出,例如在“构造类型与数据结构基础”模块,接续“数组”及其空间连续存储机制,引出“线性表”中的顺序表,同时帮助学生建立数据结构的抽象性、存储机制、逻辑机制等数据结构框架。
按照教学设计,“线性表”部分中的顺序表与链表是分别放在“指针”概念引入之前和之后讲解的,这是本课程与传统的“数据结构”部分讲解的不同之处。在“指针”模块之后的“线性表”模块中,将顺序表和链表分别以回顾与新引出的方式整合,讨论二者物理存储形式不同但逻辑一致的内涵和实质等相关内容。
在“指针”之后,因学生基本具备了由直接访问方式扩展为间接访问方式的知识储备,结合实际例题或实验题目与学生讨论数据访问的时间、空间效率和算法复杂度的联系,从而与算法基础线之间产生主线知识耦合、算法分析水平提升等讲解交互与能力促进。
对于课程的重点和难点内容,在组织安排各模块教学内容的过程中,形成知识点难度分解的理念:知识点第1次出现时教学信息量力求简洁,但必须完整,关注学生对课程知识结构构建的全面性;第2次出现时注重概念的深入和递进,主要是结合实例带给学生的“深入”和首次学习时的“浅出”,关注知识结构上各节点知识的深刻性;后续重复出现该知识点时逐步综合并加深,可视学生的接受能力、学习精力等情况动态调整学习要求,开展数据思维能力训练。课程教学过程中贯穿了上述难度分解教学的理念。
2.2 基础语法向高级语法的内容衔接与过渡
在高级语言语法中,地址、指针、函数传参及其综合运用等是程序设计语言的初学者公认有难度的内容。从课程内容衔接角度看,“数据结构”部分的典型内容,如链表、树、图等,大量用到指针、动态内存分配等概念或工具。在讲解“程序设计语言语法”时,结合上文提及的难点分解原则,有的放矢地安排发挥不同作用的讲解“角色”,进行知识点的铺垫、强化与承接,捋顺“程序设计语言语法”向“数据结构”过渡的关系,过程简述如下。
(1)先入为主:地址的概念在介绍数据的计算机存储的第一时间给出;
(2)概念强化:讲解数组时,讨论数组名的地址属性,再次强调地址的概念;
(3)对比强调:函数讲解中通过对比传递单向值与传递地址(比如参数为数组名)的不同,来凸显传递地址型参数的函数调用中空间利用的高效和独特;
(4)如影随形:借助简单算法实例练习向函数传递地址型参数时,适当抛出使用指针的等效语法表达形式(此时还未正式引出指针的概念);
(5)正式引出:在“指针”教学模块中全面介绍指针,讨论并训练数组、指针、函数等的综合;
(6)综合训练:结合实验模块主题,就指针与动态内存分配进行大量应用性练习,突破指针难学的障碍;
(7)无缝过渡:函数、指针等概念和工具基本掌握之后,便可在链表、树和图结构中小试牛刀。
2.3 考虑时空的“算法初步”与问题算法化能力训练
课程在梳理“数据操作与算法初步”的教学目的和与前后章节衔接关系过程中进行了如下教学设计。
(1)教学目的:学习算法、时间/空间复杂度等基本概念,掌握简单的复杂度分析过程和方法,能够在典型场景中合理使用二分查找与顺序查找算法并利用复杂度合理地选择排序算法,能够在后续章节中恰当运用本章知识正确分析树、图等典型数据结构的基本操作算法复杂度。
(2)教学内容:课堂讲授计算、算法、计算问题、复杂度等基本概念,以及二分查找、元素插入和删除、插入排序、选择排序、归并排序、快速排序等基本算法,利用相关算法设计过程让学生掌握问题求解方案和程序设计由粗到细递进深入的过程(即逐步求精),利用相关算法分析帮助学生理解、掌握和实践算法分析过程。实验学时要求学生实现复杂度为O(n²)的排序算法和复杂度为O(nlogn)的排序算法,对比算法排序10万个随机浮点数的时间开销,帮助学生理解算法复杂度分析结果的含义。
(3)实施方式:①在讲授递归、函数、数组时,通过min-max例子的多求解方案比较,引入分治思想,集中于算法基本概念、复杂度、排序算法和分析过程等;②在讲授算法基本概念时,使用二分查找、顺序查找、数组插入、数组删除等算法,过程中注重基本概念的实例应用,便于学生深入理解;③排序算法选择插入排序、冒泡排序、选择排序、归并排序、快速排序,从算法思想入手,先给出算法框架,逐步细化每个操作步骤,让学生体会问题求解方案设计过程和程序设计由粗到细递进深入的过程,最后通过“排序算法”实验体会不同复杂度对效率的影响;④归并排序实现过程中要用到空间动态申请,而此时还未讲到“指针”,因此进行简化处理,仅讲授如何使用空间动态申请,“指针”模块介绍相应内容时再与归并排序呼应。
(4)教学要求:①理解计算、算法、算法正确性、算法复杂度等基本概念,能够在简单问题实例上通过计算给出算法的执行结果,对算法正确性进行判断和初步分析;②针对具体计算问题,能够形式化描述计算问题,由粗到细逐步设计算法操作步骤,写出算法的伪代码并解释各步骤功能,利用C语言实现算法,分析和判断算法的正确性;③能灵活运用算法知识,对计算问题的特征进行分析,提出改进算法或重新设计算法并分析复杂度,达成时间高效、空间高效求解计算问题的目的。本部分教学按上述3个层次作递进要求,学生至少应达到第1条基本要求。
2.4 问题求解与实践能力训练
一般而言,问题求解能力需要专业领域知识和编程技术两个要素,专业领域知识为问题求解提供理论和方法的支持,编程技术则是将算法付诸实施的关键。通过实践教学环节设计,课程将程序设计语言与问题领域数据抽象描述、求解步骤算法化等训练内容融合,在“问题—算法—程序”的逐步求精过程中,渐进完成对学生代码能力的训练,逐步积累选择恰当的抽象数据类型及经典算法的经验,达到学会分析问题、组织数据,设计结构清晰正确有效的算法解决问题的目的。
随着课程内容的深入,前3个实验模块“简单变量编程”“程序控制流程关键语句及I/O语句的使用”“函数与数组”完成后,在栈的顺序存储及应用模块,实践教学的重心从“程序设计训练”向“使用程序语言实现简单数据结构”过渡;之后的实验在题目中设置了对程序设计和数据操作能力的实战锻炼,如2.3小节中提及的实现两种复杂度的排序算法、对比算法排序10万个随机浮点数的时间开销等,学生在实战中体会高级语言要素及数据结构和算法在问题求解中的实际效力。在教学大纲、实验大纲中设定的教学模块与实验题目之间是相互配合、协同递进的。
3 教学实践、考核与效果
程序设计与数据结构课程考核分为以编程水平和程序调试能力测试为主的期中上机考试和以高级语言语法、问题领域数据描述、求解步骤算法化能力测试为主的期末综合试卷考试。课程总成绩为百分制,以平时编程练习(10%)、实验环节(40%)、期中机考(20%)、期末笔试(30%)、竞赛加分等项累加而得,其中实践训练与考核环节的评分占总成绩的70%。
2021年秋季学期为我校2021级未来技术学院及智能机器人班、小卫星班、永坦班、善义班等多工科专业拔尖生489人开设此课程。课程总成绩平均分88.67,各分数段学生数统计如图3所示,根据人才培养目标和对拔尖生的特殊要求,课程设定75分为教学目标达成度的成绩阈值,超过该阈值的学生比例为95.91%。
从我校本科教学管理与服务平台“评价管理”页面获取“学生分项评价结果”数据,筛选其中与课程设置、教学内容和学生状态相关的评价指标及平均分(百分制)如下:课程及教学“目标清晰(96.96)”“启发创新(96.37)”“知识前沿(96.55)”“设计合理(92.72)”;实践教学“实验设计(95.50)”“实验内容(95.34)”“实验效果(94.41)”“实验考核(96.39)”;学生的“学习兴趣(95.73)”“学习投入(97.38)”“学习成效(94.59)”。
经完整教学周期的效果实证与教学实践总结,课程能够满足多工科专业领域拔尖生知识结构构建全面性需求,能够为学生奠定通用性计算机软件技术基础,拓展智能技术实践能力,提升工程应用能力、数据思维能力和科学研究素养。
4 结 语
将软件实践课程与数据结构及算法的基础理论课程教学内容相融合的“主线范式”用到程序设计与数据结构课程,引导学生在问题—算法—程序的逐步求精及编程训练过程中,准确把握高级语言要素、数据结构及算法在问题求解中所发挥的作用。
经一个完整的教学实践周期闭环反馈及课程总结,拔尖生能够综合运用语言工具、数据结构抽象方法、算法设计思想和方法,驾驭计算系统和计算资源求解科学的或工程的问题,课程达到提升各工科领域拔尖生工程素质和科研素养的目标,满足新工科建设要求下多工科专业领域拔尖生知识结构构建的全面性、紧凑性等需求,可为拔尖生奠定通用计算机软件技术基础,把握计算机基础学科内涵,拓展数据思维与计算思维能力,提升工程应用能力等,课程能够适应高等学校应用型、复合型、技术技能型人才培养标准和工程应用能力要求。
参考文献:
[1] 中华人民共和国中央人民政府. 中共中央、国务院印发《中国教育现代化2035》[EB/OL]. (2019-02-23)[2022-05-23]. http: //www. gov. cn/xinwen/2019-02/23/content_5367987. htm.
[2] 中华人民共和国中央人民政府. 教育部办公厅关于印发《未来技术学院建设指南(试行)》的通知[EB/OL]. (2020-05-15)[2022-05-10]. http: //www. gov. cn/zhengce/zhengceku/2020-05/24/content_5514379. htm.
基金项目:哈尔滨工业大学拔尖人才培养项目“‘程序设计与数据结构’荣誉课程建设”(2021)。
第一作者简介:赵巍,女,哈尔滨工业大学副教授,研究方向为模式识别、图像处理、计算机视觉,zhaowei@hit.edu.cn。
引文格式:赵 巍,骆吉洲,冯骁骋,等. 面向拔尖生培养的程序设计与数据结构课程探索 [J].计算机教育,2023(2):68-73.
转自:“计算机教育”微信公众号
如有侵权,请联系本站删除!