以赛促教,以赛促学
作者: 刘嘉 赵宏
[摘 要] 程序设计是大学生必须掌握的基本技能,但受限于总学时和专业知识的学习,高校无法在学生程序设计技能培养方面开设大量课程来提高学生的程序设计能力。以组织学生参加“天梯赛”程序设计大赛为例,从“天梯赛”赛制和考查的知识点出发,论述学生通过程序设计基础课、计算机专业课和赛前强化训练等环节覆盖“天梯赛”考查的知识点,提升学生程序设计能力的过程。最后以成绩优秀参赛队员的毕业去向,说明“天梯赛”对程序设计类课程的教学和学生编程能力提升所带来的正面影响。
[关键词] 计算机教学;程序设计;“天梯赛”;数据结构;算法设计
[基金项目] 2021年度兰州理工大学高教研究项目“以竞赛促进学生程序设计能力的探索”(GJ2021C-12)
[作者简介] 刘 嘉(1976—),女,宁夏银川人,计算机应用技术硕士,兰州理工大学计算机与通信学院讲师,主要从事操作系统与人工智能研究研究;赵 宏(1971—),男,甘肃西和人,计算机应用技术博士,兰州理工大学计算机与通信学院教授,主要从事高性能计算与嵌入式系统研究。
[中图分类号] G642.0 [文献标识码] A [文章编号] 1674-9324(2023)32-0162-05 [收稿日期] 2022-06-29
一、“天梯赛”赛制介绍
教育部2021年颁布的“全国普通高校大学生竞赛榜单”中有三个程序设计类竞赛,分别是ACM-ICPC国际大学生程序设计竞赛、中国高校计算机大赛-团体程序设计天梯赛和蓝桥杯全国软件和信息技术专业人才大赛。其中的“天梯赛”是较晚成立的比赛,2022年是第七届。近年来,“天梯赛”参赛人数快速增加,2019年参赛人数为7 603人,到2022年人数达到14 180人,四年间人数增长近一倍[1],由此可见,“天梯赛”在高校中的影响力不断提升,吸引了越来越多的学生参加。究其原因,与“天梯赛”的赛制有关,“天梯赛”以团队整体成绩为排名依据,考核学校整体的程序设计水平。通过参赛学生的成绩,可以评估学生所在学校的计算机教学水平。
二、“天梯赛”赛题知识点剖析
(一)题目难易结合,知识点覆盖全面
ACM进入中国已有二十年,很多学校在将ACM与课程结合上已经累积了很多经验,王宏在文献[2]介绍了清华大学利用ACM“赛课结合”在计算机教学上取得了很好的成绩。李环[3]分析了当前传统教育出现的问题,然后探讨了利用ACM竞赛解决这些问题的方法。ACM的全英文题目以及高难度算法使得比赛的参赛门槛很高,奖项基本被一些竞赛强校所垄断,普通高校很难取得好的成就。与ACM竞赛相比,“天梯赛”的最大特点是由不同难度的题目组成。“天梯赛”题目按难易程度分为三个等级,分别为L1、L2和L3。L1级为基础级,设8道题,其中5分、10分、15分、20分的题各2道,满分为100分;L2级为进阶级,设4道题,每道题25分,满分为100分;L3为登顶级,设3道题,每道题30分,满分为90分。三个等级共15道题,满分为290分。
从近几年“天梯赛”的成绩看,2019年至2021年度竞赛中均没有满分选手,2022年竞赛中出现1名满分选手,说明“天梯赛”能够对不同水平层次学生的程序设计能力进行考查,客观评价学校整体程序设计教学效果。如表1所示,从2020年至2022年比赛成绩分布可以看出,参赛学生成绩主要集中在100分~175分之间,这个区间的学生主要完成了基础的L1级和部分L2级的题目。高于这个成绩(大于175分)即可获得除团队奖外的国家级个人奖,个人奖的获奖比例大约在20%到30%之间,符合高水平人才分布的规律。
(二)考核知识点全面
“天梯赛”题目分为三级,知识点覆盖了高级语言、数据结构和算法设计。如表2所示,L1级的题目基本不涉及算法,5分和10分题目为最简单的基础题,知识点为基本输入输出、表达式和简单的分支结构;15分和20分的题目也是基础题,但解题需要具有一定编程技巧,知识点多为选择结构、循环结构、数组、字符串等,其中字符串类型在这一级中属于较难的题目,曾出现过只有1%的选手获得满分的情况。L2级题目共有4道题,每题25分,满分100分,这4道题主要考查数据结构的内容,包括堆栈、二叉树、图等基本的数据结构,排序、最短路径等算法,解答这些题目需要学生具有较好的算法设计能力。L3级题目有3道题,每题30分,满分90分,这部分题目可以选拔出顶级选手,题目包括数论、图论、动态规划、高级搜索等算法设计类题目,需要选手具有较强的分析问题能力以及快速编程能力才能获得分数。
(三)专业覆盖面广,参与人数多
“天梯赛”题目难度具有坡度,与ACM相比参加门槛较低,使得很多对程序设计竞赛感兴趣的学生可以参加,尤其是非计算机专业学生,可以通过参加“天梯赛”锻炼自己,提高程序设计水平。根据统计,2019年参加“天梯赛”的学生专业数量为182个,到2022年增加到270个。参赛专业数量的增加,说明“天梯赛”给各个专业的学生提供了一个学习平台,吸引更多学生参与,同时,也说明“天梯赛”在高校中的影响力逐年扩大。
三、学校课程对“天梯赛”的支撑
“天梯赛”试题分为L1、L2和L3三个等级,分别面向程序设计的初级、进阶级和高级三个阶段。我校开设的课程能够部分覆盖“天梯赛”的知识点。
(一)初级L1
“天梯赛”初级L1可以使用的语言有C、C++、Java和Python,大部分高校至少开设其中一门语言课程。以我校C语言为例分析程序设计课程对“天梯赛”的支撑:“C语言程序设计”课程开设在大一第一学期,课程目标是通过学习C语言基本语法,使学生掌握利用计算机科学求解各学科问题的一般方法,具备高级语言程序设计能力,C语言课程的主要知识点如表3所示;“天梯赛”从2019年到2022年L1级共有32题,大部分全部为C语言的前5个知识点;只有字符串不属于C语言基本知识点,但是字符串操作是C语言考试中常见考点,因为对字符串操作需要使用输入输出、循环结构、数组操作等知识,属于C语言中较难的内容;因为L1题目考核点在高级语言程序设计,没有涉及复杂的数据结构和算法,所以大部分学生在L1级的通过率很高。
(二)进阶级L2
L2级难度高于L1级,除了需要学生具有较强的编程能力外,还需要具有一定的数据结构知识,能够使用经典算法解决问题。如表4所示,进阶级L2的知识点主要包含在“算法与数据结构”课程中,例如一些复杂的数据结构和经典算法。从近四年的“天梯赛”题目可见学生学习“算法与数据结构”后即可获得L2级所需的知识点,但是2020年到2022年,L2得分超过75分(满分100分)的人数分别约占30%、40%和10%,所以只是学习基本概念,还是无法正确解题。
(三)高级L3
“天梯赛”称L3级为登顶级,因为这一级的题目基本是程序设计竞赛中最难的题目。L3级有3道题,2019年到2021年最后一题没有得满分的选手,L3的3道题得分率均低于3%,可见题目难度很高。L3级题目主要是一些复杂算法,例如2020年“天梯赛”有快速排序和图的深度优先搜索,2021年有字符串的模式匹配和快速排序。另外,L3中还会出现数论或组合论相关的题目,通常设置在最后一题,得分率不足0.5%,说明学生的数学相关知识不足。因为“天梯赛”是个人独立完成比赛,计算机专业的学生没有相关数学知识背景,无法完成与数学有关的题目;而数学专业的学生程序设计水平无法支撑其完成L3级的题目。这也是“天梯赛”很难有学生获得满分的原因。
四、“天梯赛”强化训练对课程知识的补充
(一)“天梯赛”对程序设计能力的提升
程序设计能力是计算机类专业学生的基本能力,也是检验计算机类毕业生是否合格的基本标准[4]。程序是系统软件和应用软件的本体,程序设计课程旨在训练学生的分析和解决问题能力、计算思维能力、软件工程能力、团队协作能力等[5]。培养学生程序设计能力是高级程序设计语言课程的主要目标,通常程序设计语言课程开设在低年级,学生还没有学习专业课程,计算机基础较差,所以设计合理的教学方法可以帮助学生更好地学习程序设计。
传统程序设计语言课程的教学是以语法为中心,学生学习的重点是如何使用语法。这种教学方式忽略了程序设计能力的关键是要建立计算机思维方式,学习的是使用计算机解决问题的方法。2022年“天梯赛”L1-3“谁能进图书馆”是一道10分的题目,分数设置可见组委会认为题目不难,但是很多能做出30分题目的选手这道题却没有得到满分。这道题考核的是if-else语句的使用,只需要列出所有可能的条件,每个条件由一个if-else输出即可。但是只需要使用简单的语法,却为什么会让很多优先选手在这里失分呢?原因是选手分析问题时没有列出所有的情况。很多选手是从给出的数据出发,考虑输入的4个整数组合的所有条件,稍有不慎就会丢失一个条件,或条件重复,导致某个测试点无法通过。这道题应该采用逆向思维,从结果出发去推导出条件。这道题可能的结果有三个,即:①2人全部可以进入;②2人全部不可以进入;③1人可以进入1人不可以进入。其中结果①只有一个条件,结果②有2个条件,结果③有3个条件,如表5所示。学习程序设计的关键不是语法怎样使用,而是怎样用程序解决问题。为了让学生在学习中能够将学习的重点从语法转向解决问题,在教学中可以采用任务驱动教学法[6]或案例教学法[7],“天梯赛”的赛题非常适合作为案例进行讲解。
(二)“天梯赛”对算法设计能力的培养
算法是程序的灵魂,关系到程序的运行效率,常应用于人工智能、操作系统、数据库、计算机网络等方向,是计算机解决复杂工程问题的关键因素。经过计算机行业几十年的发展,经典算法已有一百多种,算法竞赛不是让选手当场设计一个新的算法,而是应用已有算法完成特定问题的求解,同时还要满足一些限制条件,例如时间和空间的限制。所以在竞赛中要在很短的时间内选择合适的算法,然后使用算法求解题目,对选手综合素质有很高要求,选手必须熟练掌握大量经典算法,才可做出正确选择。
2022年“天梯赛”L2-4“大众情人”,大部分学生在正确理解了题意后,能够明白一个人的异性感就是距离最远的异性到你的距离,所以题目实际是要求最短路径。在“算法与数据结构”课程中求最短路径的算法一般是Dijkstra算法,而本题中如果采用Dijkstra算法会导致超时,题目要求的是多源点的最短路径,所以应该使用Floyd算法。很多选手卡在这道题,因为教材没有讲到Floyd算法,选手熟悉的是Dijkstra算法。由于课堂教学学时有限,“算法与数据结构”课程能够讲解的算法大概有30个左右,但是算法关系到程序设计运行的准确性和效率,掌握的算法数量也是衡量一个程序员能力强弱的重要标准,所以很多学生会在课堂之外努力学习新的算法,“天梯赛”的训练就可以补充这部分课堂缺失的内容,而且大量训练也可帮助学生提高程序设计能力。
五、我校近三年“天梯赛”成绩和参赛队员的去向
我校每年为“天梯赛”组建的团队有50人左右,参加“天梯赛”的队伍有4~5队,排名取成绩最好的三支队伍的成绩。2020年我校在“天梯赛”华山论剑赛道排名甘肃省高校第二名,2021年和2022年均在华山论剑赛道获得甘肃省高校特等奖。还有5人次在比赛中获得国家级奖项。
参加“天梯赛”的学生经过三年的训练,均有较高的程序设计能力,毕业时无论是继续学习还是工作都比较受欢迎。我校2017级到2018级共有23名“天梯赛”队员毕业,其中保研9名,考研4名,其余队员均在秋招即签约工作,平均薪金远高于普通学生。
结语
程序设计竞赛在我国已经开展二十余年,“天梯赛”也已经举办7届,参加“天梯赛”的学校从最初只有发达地区的重点院校发展到全国近两百所学校。之所以“天梯赛”会在高校迅速推广开,主要是我国经济发展从高速发展阶段转向高质量发展阶段,需要的人才也从数量的需求转换为质量的需求,这对高校提出了更高的要求。各个高校也在不断探索新的教学方法,提高教学质量,培养更具有时代特色的高素质人才。“天梯赛”以及其他的程序设计类竞赛就是在计算机中探索出的一种有效的方法,一方面学校不断提供各种资源促进学校竞赛的发展,鼓励学生参加各种竞赛;另一方面,通过竞赛使学生综合素质得到提高。但是由于各个学校的生源不同,教学方式不同,如何结合学校特点,发挥竞赛优势,设计适合学生特点的教学模式,是每个高校都在研究的问题。