面向高中编程教学的编程模式自动挖掘及教育应用研究

2021-03-29 00:53傅骞唐文静王雯郑娅峰
中国电化教育 2021年2期
关键词:计算思维

傅骞 唐文静 王雯 郑娅峰

摘要:编程模式是指在代码中重复出现且具有结构意义的代码片段,准确识别高中程序设计所需的编程模式有助于教师把握编程教学的重点和途径,提升編程课程的教学效果。当前的编程教学研究鲜有关注编程模式对编程教学的意义,也未有研究明确高中编程教学中的编程模式内容和数量。为此,研究依据编程模式的结构特点,采用序列模式挖掘方法自动识别了高中阶段编程教学涉及的编程模式,并进行了有效性验证。结果表明,从现行高中信息技术课程必修“程序设计”模块识别的共计18种编程模式涉及多种基础知识点的复合应用,能够有效扩展编程教材中的教学知识范畴。研究还进一步阐述了编程模式的实践教学价值,并从教学内容、教学方法、教学资源三个方面给出了利用编程模式实施编程能力培养的具体方法。

关键词:编程模式;编程教学;高中程序设计;序列模式挖掘;计算思维

中图分类号:G434 文献标识码:A 文章编号:1006-9860(2021)02-0061-07

一、引言

自陈国良院士倡议将计算思维引人计算机基础教学。以后,计算思维得到了国内计算机基础教育界的广泛关注和重视。计算思维是运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解等涉及计算机科学的一系列思维活动。研究表明,21世纪技能中的创造力、批判性思维、问题解决能力等诸多技能均与计算思维高度相关3。因此,计算思维能力培养得到了各国教学界的普遍重视。2017年,我国发布《普通高中信息技术课程标准》,明确将计算思维能力作为信息技术学科的核心素养。

程序设计是学习和培养计算思维的重要载体。计算思维培养的目的是让学生用计算机的思维方式去解决问题,提高问题解决的逻辑思维能力,而编程学习恰恰提供了最直接的思维能力培养的手段和方法。青少年通过编程学习算法逻辑、分解复杂问题、设计解决流程等,这一过程充分体现了算法理解、抽象与分解等计算思维核心概念的习得过程。当前,在中小学阶段广泛开展编程教育已得到社会各界的共识,并成为中小学实施计算思维、问题解决能力、创新思考和分工合作等综合技能培养的重要途径[8]。

然而,我国的编程教育整体还处于初级阶段,以计算思维培养为导向的编程教学模式仍处在探索阶段。教学内容的重难点把控、计算思维的阶梯式培养路线以及教学资源的多维度立体化建设等方面都存在较大的空白。当前,在中小学阶段的编程教学中,往往注重基础语法知识的讲授,而忽视学生对问题的整体分析、对知识点的综合运用,使得学生真正解决复杂问题时无从下手。同时,计算思维能力的培养路径多凭教师个人经验,采用何种方式强化思维培养存在较大的“专家盲点”"。在教学资源的建设方面,如何避免单一的语法知识训练,采用以计算思维训练为主线的多维度资源组织形式还没有明确的方法路径。

在编程教学中引入编程模式,能够将计算思维培养以可操作的形式落实到具体的课程内容和教学过程中,从而较好地解决上述难题。编程模式是指在代码中重复出现且具有结构意义的代码片段,它可以认为是从编程经验中经过抽象和升华提炼出来的知识体系。它并不在教材知识的掌握目标中明确出现,却是解决某一类问题的方法论,具有更高的知识深度和更广泛的应用基础。例如,编程模式通常能够帮助程序员分解复杂问题,分模块形成解决方案,快速完成编码实现。在编程学习中,掌握了编程模式的学生能够较为容易的完成从简单语法知识应用到综合知识应用的能力过渡。因此,在培养计算思维的教学过程中引人编程模式,有利于从基本算法思维到抽象与分解等计算思维核心能力的阶梯式培养。同时,由于编程模式反映了高阶计算思维能力,考察编程模式的掌握程度,可以作为评估计算思维发展程度的有力工具。

当前,在大学计算机相关专业的教学中,常常有设计模式、编程框架、算法设计、数据结构这样的与编程模式相关的课程,但在当前的高中编程教学中,算法设计中只针对基础的顺序结构、分支结构和循环结构或整体的枚举和递归的算法思想进行讲解,具有更为复杂语法结构的编程模式虽在教材示例代码中出现,但在教材的知识讲解中却没有明确指明,编程模式的重要性被忽略。例如,在人教&国图版教材讲解循环结构时,只涉及了for循环、while循环、循环嵌套以及break和continue语句4个知识点讲解。而实际上,在利用break和continue语句跳出循环时,须有一个if条件语句进行判断,这意味着学生在完成跳出循环体的任务时,必须掌握循环语句与if条件语句的嵌套,这在教材中并未提及。这也造成在实践教学中,教师鲜少关注到从掌握程序设计基础知识到培养计算思维之间的过程是什么,即思维范式显性化的编程模式教学内容常常被忽视。基于此,本研究基于编程模式的语法结构特征,从新编信息技术教材程序设计模块配套源程序中,自动挖掘高中基础程序设计中常用的编程模式,明确常用的编程模式数量和范围,并更进一步阐述运用编程模式培养计算思维能力的重要教学意义和具体操作方法。

二、基于序列模式的编程模式抽取方法

编程模式(或称代码习语)指在代码中重复出现的且具有结构意义的代码片段,具有单一的语义目的。因此,采用序列模式挖掘算法可以快速识别这些高频的具有固定序列组合的片段,从而达成编程模式自动挖掘的目的。高中基础编程教学课程中涉及的源程序数据集较小,程序结构相对较为简单,不涉及复杂算法和数据结构。因此本文采取序列模式挖掘中的PrefixSpan算法实施编程模式的抽取,其在执行效率、时间复杂度和空间复杂度方面优于经典的Apriori和GSP算法。

在编程模式抽取中,首先通过对源程序进行语法解析,将源程序识别为抽象语法树;然后基于抽象语法树,结合结构性的知识点语法特征,将树中具有结构意义的节点名字和结构信息命名形成项,多个项形成具有结构信息的源程序序列;最终基于PrefixSpan算法挖掘源程序序列中的频繁序列,通过语法分析和规则判断对频繁序列进行还原得到编程模式,具体过程如下:

(一)数据选择

高中信息技术课程标准发布至今,全国各地共出版五个版本的信息技术教材,教材中均包含Python基础程序设计内容。本研究的源程序來源于最新五个版本的信息技术必修一《数据与计算》中的基础程序设计模块课程示例和配套答案,五本教材分别为:沪科教版、浙教版、粤教版、教科版和人教/国图版,挖掘所用的配套源程序数量共有141个。

(二)编程模式挖掘

本研究挖掘编程模式的算法为PrefixSpan算法,在PrefixSpan算法中涉及以下几个基本定义:

在PrefixSpan算法中将一个源程序序列定义为S:

令:S=(g1,g2,g3……ga)

其中n为一个源程序中出现的body属性的语法点的个数,如图1所示,出现了“Module”和“For”所以n=2。gi(1

支持度Support(S):在数据集中含有S的序列个数。

频繁序列:在知识点序列数据集中,如果序列S出现的频率不低于阈值min_supports,则将S视为频繁序列。

min_supports:自定义的支持度的最小值,用以判断是否为频繁序列。

根据PrefixSpan算法的基本定义,需要将配套源程序转化为源程序序列数据集。在此过程中,若简单地将源程序视为字符串进行处理,容易丢失源程序的语法结构,因此本文基于源程序的语法解析结果生成源程序序列。

首先,在语法解析过程中,生成源程序的抽象语法树。抽象语法树的根节点一般为“Module”,其余每个节点是抽象语法树的一个节点模块,每个节点会有节点名称和多个节点属性。由于本研究挖掘的目的是发现有意义的代码组合,所以将针对选择结构、循环结构、函数定义等具有较为复杂结构的节点进行挖掘。这些节点都具有body属性,body属性以列表的形式存储执行结构中的语句。

接下来,利用语法解析生成抽象语法树形成源程序序列数据集。现以上页图1为例为说明数据处理结果。上页图1中右上角是源程序,对应生成图中的抽象语法树,其中具有body属性的结构性语法节点有“Module”“For”和“If”节点,body列表中的节点在图中用带阴影方框圈出,即待挖掘的子序列,实线箭头表示属性,虚线箭头表示省略部分。在抽象语法树中,属于同一深度且在“body”属性列表中的语法节点组成一个子序列,并用小括号进行封装,如子序列1和子序列2所示。子序列中的每一项表示一个语法节点,项的名称表示方式为“父节点名称_该节点名称”如子序列1中第一个元素可以表示为“Module_For”,以此类推,最终生成中图中右下方所示序列。

由于教材中有26个源程序较为简单,全部由无body属性的知识点组成,所以141个源程序经过预处理后,最终得到115个源程序序列。对这些源程序序列进行编程模式挖掘:首先,设置最小支持度min_supports为18,基于PrefixSpan算法对这115个源程序序列进行挖掘,得到频繁序列;然后,对挖掘所得的频繁序列进行语法分析,还原成抽象语法树,其类型分为嵌套关系和间接并列关系;最后,对得到的抽象语法树去重,将抽象语法树转化为编程模式,得到最终的编程模式。基于该方法的编程模式。

三、编程模式挖掘研究结果

(一)频繁序列及编程模式挖掘结果

研究共得到18个编程模式及其对应的频繁序列,18个编程模式均体现了知识点的嵌套关系,而其中有5个编程模式体现了间接并列关系,具体如表1所示,代码示例展示了编程模式在源程序的具体体现形式,每个编程模式的支持度用Support表示。

(二)结果验证

通过PrefixSpan算法挖掘得到编程模式后,研究向具有Python教学经验的高中教师发放问卷,以验证所得编程模式的准确性和有效性。问卷采用量化的方式,将选项按照认同程度分为“非常同意、同意、一般、不同意、非常不同意”五个等级,并依次赋予5、4、3、2、1分,从而将教师的直观感受量化。问卷设计了20个问题,包括18道题询问所得编程模式是否在教学中常用,以及2道陷阱类题目用以检测收回的问卷是否有效。在本研究中,调查问卷共发放49份,收回有效问卷41份,问卷信度系数值为0.885,大于0.8,数据信度质量很高,问卷所得数据可做进一步分析。

对问卷进行预处理后,计算教师评价各个编程模式的平均分,用来衡量各个编程模式在教师心中的认可度,用Approval表示。整体上,编程模式的认可度差异不大,均值均高于3分,标准差约为0.28,最大值比最小值相差1.05分,说明挖掘所得的编程模式受到教师的认可。将算法挖掘所得编程模式的支持度和教师评分的平均分做斯皮尔曼双变量相关,相关性显著(ρ=0.018)且呈正相关关系。因此说明了PrefixSpan算法挖掘编程模式的有效性,以及挖掘所得的编程模式在实际教学实践中具有一定的教学意义。

(三)结果分析

从挖掘结果来看,编程模式的组成部分主要来源于if条件语句,while循环、for循环、函数、变量这5种最常用的基础程序设计教学知识点,这些单个的教学知识点在教材中都以知识要点的形式明确进行了解释。但是,从抽取的编程模式也可以看出,知识点的多种搭配应用范式在教学和教材中往往被忽略。此次抽取的支持度较高的18种编程模式,涉及了for循环和if语句、双重if语句与变量赋值、while条件语句和变量赋值等未在教材知识讲解中明确讲解的编程知识。这些编程模式虽然不是基础知识点,但对于学生灵活运用知识点解决编程问题尤为重要,因而在教材的实践活动项目及练习提升作业题等部分多次出现。如第5种模式“for循环+if条件语句”的组合应用,在5种教材中都未有这一知识点的明确讲解,但是在人教&国图版教材的break语句程序示例,练习提升中猜数游戏和课程例题票据中模糊数字推断问题等环节中多处出现。又如,第17种“while语句嵌套if条件语句后进行变量赋值”的编程模式对于解决人教版教材实践活动中较为简洁地解决“寻找1000以内的素数问题”必不可缺。由此看出,编程模式基于基础知识点,但深度高于基础知识,是基础知识的在实践中的灵活应用。

另外,编程模式是结构性语法节点组合的复杂结构,其本质体现了解决特定问题的泛化编程思路。如,在实际编程过程中,在while循环中常运用if条件语句作为循环终止的结构,用以解决众多涉及循环跳出的编程问题。所挖掘的第13条编程模式“while循环嵌套if语句”就明确了这一模式在应用中的使用,因而教师在课程中教授该模式显得非常有必要。又如,在对列表中符合某一条件的数据进行针对性处理时,第5种模式“for循环中嵌套if条件语句”是简洁而直接编程的思路。从这些具体的已挖掘的编程模式也可以明确,编程模式作为高阶思维的显性化表达形式,为解决编程所需的具体结构框架提供参考,是知识点与问题解决方式的桥梁,需要在教学活动中得到重视。

四、运用编程模式优化编程教学的实施建议不管是编程模式的自动挖掘还是编程教师的日常实践,都表明了编程模式在程序学习中的客观存在。但由于缺乏明确的编程模式引导,尽管意识到编程模式的教学价值,教师仍无法直接将其用于编程教学。基于本研究的挖掘结果,可以充分运用这些编程模式通过以下三个方面来促进编程教学。

(一)重构与优化编程教学知识体系

认知理论表明,编程教学知识点之间应该有所关联,教学应该以简单的知识点为起点,逐步引入比较难的知识点。但是,当前的编程教学知识体系重点仍在低阶语法知识的掌握与运用,在展开复杂度较高的编程任务时,简单知识体系无法保证学生从基础知识顺利过渡到知识的综合使用。高阶知识内容仍然是目前编程教学整体大知识体系中最为匮乏的内容,也是教学内容设计中的难点。根据新课标,程序教学的知识重点是帮助学生掌握输入输出、变量、选择结构和循环结构等知识点,而综合运用知识点明确问题,识别问题空间,则是能力培养的重点。从挖掘结果也可以看出,这些编程模式大多是循环结构和选择结构与变量、print函数和模块调用函数复合形成的,是综合知识能力运用的具体表现。因此,以编程模式为重点的教学内容强化了循环和选择结构、变量、print函数和模块调用函数的学习,十分切合新课标教学目标中对重难点知识技能的要求。

基于此,教师可以将编程模式的掌握列人到教学目标中来,将编程模式作为编程学习知识结构的重要组成部分,确保学生知识体系的完整性。编程模式是知识点的组合,在解决复杂问题进行编程实践时,教师可以将编程模式作为重难点知识进行讲解和运用,利用编程模式将知识点进行关联,帮助学生建立一个系统性强、层次分明的认知结构。从表1可以看出,编程模式的结构越简单,支持度越高。因此,在整个教学内容体系的设置上,需要按照支持度从高到低的次序把编程模式逐步加入到编程教学内容中。而在课时教学内容的设计上应该注重让学生逐步理解、运用编程模式,首先,在教学目标的设定上需要加人编程模式,让学生理解编程模式的重要性;然后,在示例代码的讲解中需要归纳该代码所含的编程模式,让学生理解编程模式的特点;最后,在课后作业中需要布置和本课编程模式相匹配的编程习题,让学生掌握编程模式的应用。

(二)构建高阶认知发展的教学路线

编程模式是高阶编程学习的一个重要知识,能够为学生提供解构复杂问题场景的有效路径,即指引问题解决的思路和架构整体解决框架。作为中介桥梁,编程模式的有效掌握将大大缩减学生从低级认知到高阶认知学习的鸿沟。因而,灵活运用编程模式构建面向高阶认知发展的教学路线,将极大地深化编程教学领域现有的教学内容和教学设计方法。借由编程模式在认知上形成的基础知识点和编程应用的关键连接,有利于帮助学生在知识点与实际编程之间建立过渡关系,符合高阶学习的认知规律。因此,可以利用编程模式分解知识内化步骤、增加知识内化次数、降低学习难度、优化编程教学路线,促使学生高阶认知能力的发展。

基于此,教师可以运用本研究挖掘得出的编程模式来改进编程教学方法,在代码讲解环节中引导学生通过归纳编程模式来提升代码编写能力,按照自顶向下逐步细化的思想,利用编程模式明确给出编程的一般性步骤,从而让学习者对算法有一个总体把握,而非纠结于细节语法错误。在操作上,建议采用SCS创客教学法"进行编程教学,并在知识要点讲解环节按照“新语法讲解一程序框架讲解一编程模式讲解”的顺序进行,具体过程建议如下:情境故事引人环节,通过设置情境激发学生对待解决问题的兴趣;单任务模仿环节,引导学生在教师安排下按照教材完成代码编写并运行成功;知识要点讲解环节,先讲解本代码中新出现的语法知识,再讲解程序的總体框架,把代码组合和程序功能对应起来,最后按照从简单到复杂的顺序和学生一起归纳其中的编程模式;在扩展任务模仿环节,教师根据编程模式匹配的要求,在不增加语法知识和新的编程模式的基础上,带领学生完成一个复杂度更高的任务,帮助学生加深对编程语法及编程模式的理解;创新激发引导环节,引导学生在扩展任务的基础上根据现实需求加人新功能;协同任务完成环节,学生通过相互协助,确认需要完成代码的最终功能,然后独立完成代码;成功作品分享,提供机会,让学生分享自己的作品,从代码功能、程序框架和编程模式三部分进行分享。

(三)构建结构化编程教学资源

当前高中编程教学资源库的建设还比较单一,多以基础知识的训练为主,以问题解决为特征的探究式、项目式教学案例资源设计尤为缺乏。这是因为在具体的教学案例资源建设中,对以现实情境为问题出发点的任务如何进行有效的条件约束,使其在保持问题复杂度的同时能够将知识范畴界定在可掌握的范围,对于一线教师具有巨大的挑战。以编程模式为支架构建面向复杂问题解决的高质量教学资源,将有助于帮助教师理清设计主线,确定知识边界范围,推进以计算思维能力为主的教学核心目标的达成。

基于此,教师可以在创建编程教学资源时以多样的编程模式为抓手,设计符合学生认知发展及具有思维挑战性的校本教材、教学案例、编程题库和微视频等教学资源。具体来说,可以从知识理解和思维提升两个维度来使用编程模式。知识理解维度强调编程模式的功能与作用,通过设计资源让学生反复练习来加深其对编程模式的掌握思维训练维度则强调编程模式与实际问题的关联,通过将编程模式内隐在实际场景中,让学生提升在现实问题中快速应用编程模式的能力。不同类型的资源需要不同的编程应用模式:在校本教材中,可以按照编程语法和编程模式相互结合的方式实施,尤其是课程后期教学进行到综合运用阶段,需要按照编程模式的复杂度来设计课程教学资源;在教学案例中,建议多引导学生思考现实问题和编程模式之间的联系;在编程题库中,建议和教材资源开发一样,通过编程语法和编程模式的相互结合来实现编程任务的循序渐进,在微视频中,可以考虑把特定编程模式的讲解和应用做成独立微课。

综上所述,以编程模式为主线的教学内容优化、教学方法改进以及教学资源扩展,使得当前的计算思维能力培养在教学实践层面上能够形成一个清晰的表达体系,而不仅仅停留在教学理论层面。在教学内容上,将编程模式纳人教学重难点,促进了以“构造”为特征的问题求解方法的培养,进一步强化了以计算思维培养为核心的教学目标;在教学方法上,利用编程模式增强基础知识讲授到复杂问题解决应用之间的过渡环节,使得教学方法遵循程序设计学习认知规律,使得计算思维培养方法更具科学性;在教学资源上,以编程模式为主线的资源建设不仅能够涵盖知识的思维性、关联性、丰富性和完整性,更重要的是,在典型教学案例、练习题的设计中以编程模式为内在靶点可以帮助设计者较容易地在任务的现实性和问题的复杂性之间找到平衡,设计出能够根据编程模式知识体系清晰转化为计算机求解问题的案例,以及促进学生在认识、内化编程模式的过程中形成相对稳定的程序设计学科思维方法。

五、结语

在编程教育政策的驱动下,高中编程教学从选修逐步过渡到必修仅有短短几年的时间,且课时安排较少,教师教学经验也较为匮乏。当前的教学内容、方法及资源建设多沿用了高等计算机教育的模式,造成知识体系庞大、教学内容冗杂等问题。编程模式可以为准确定位高中编程教学课程的教学重点,优化教学内容与方法,以及找到计算思维培养的有效途径提供具体支持。本研究在对新版高中信息技术教材进行分析的基础上,通过PrefixSpan算法挖掘得出了高中编程教学常用的18个编程模式,并通过高中编程教师的问卷反馈得出这些编程模式在高中编程教学的实际应用情况;然后从教学内容、教学方法、教学资源三方面阐述了编程模式具有的重要教学意义,并给出了具体的操作建议。在未来的研究中,应关注运用编程模式开展教学相关的实证研究,挖掘编程模式在编程教学中的实践价值。

参考文献:

[1]陈国良,董荣胜.计算思维与大学计算机基础教育[J].中国大学教学,2011,(1):7-11+32.

[2] Wing J M.Computational thinking [J].Communications of the ACM,2006.,493):33-35.

[3] Binkley M,Erstad O,et al.Defining twenty-first century skills [M]. Dordrecht:Springer Netherlands,2012.

[4]中华人民共和国教育部.普通高中信息技术课程标准[M].北京:人民教育出版社,2018.

[5]于纪明,李冠琼等.基于编程解决问题的青少年计算思维培养框架[J].计算机教育,2020,(7):98-101.

[6]孙立会,王晓倩.计算思维培养阶段划分与教授策略探讨——基于皮亚杰认知发展阶段论[J].中国电化教育,2020,(3):32-41.

[7] Bers M U.Coding as a playground:Programming and computational thinking in the early childhood classroom [M].New York:Routledge & CRCPress,2018.

[8]孙丹,李艳.我国青少年编程教育课程标准探讨[J].开放教育研究,2019,25(5):99-109.

[9]李阳.计算思维导向的跨学科儿童编程教育模式研究——基于芬兰儿童编程教育的经验与启示[J].现代教育技术,2020,30(6):19-25.

[10]郭银章,王丽芳.基于項目任务驱动的C语言程序设计课程教学改革与实践[J].计算机教育,2017,(2):41-44.

[11]亚达夫,钱逸舟.如何有效开展编程与计算思维教育:教师教育的视角[J].中国信息技术教育,2020,(8):4-8.

[12] lyer S.Cheung et alLleaming Programmaic Idioms for Secalable Semantic Parsing [Cl-Hong Kong:Association for Computational Linguistics,2019.

[13] Allamanis M,Sutton C.Mining idioms from source code [C].Hong Kong: Association for Computing Machinery,2014.

[14]姬浩博.基于PrefixSpan算法的Web模式挖掘方法研究[D].太原:山西大学,2016.

[15]张婷燕,周春红等.优化学生认知结构提高《C语言程序设计》教学质量[J].商场现代化,2011,(9):151-152.

[16]傅骞.基于“中国创造”的创客教育支持生态研究[J].中国电化教育,2015,(11):6-12.

作者简介:

傅骞:副教授,博士,硕士生导师,研究方向为信息技术及教育应用、创客教育。

唐文静:在读硕士,研究方向为教育大数据、创客教育。王雯:研究方向为教育大数据、创客教育。

郑娅峰:副教授,博士,研究方向为研究方向为教育大数据、学习过程自动分析。

收稿日期2020年8月2日

责任编辑:邢西深

猜你喜欢
计算思维
高中信息技术课堂中计算思维能力培养问题的探讨
公安专业学生计算思维能力培养对策初探
基于计算思维的多媒体技术及应用课程教学模式研究
信管专业计算机科学概论课程的教学改革实践
基于计算思维的软件类研究生高级算法课程教学研究
基于计算思维程序设计的军事案例研究
程序设计课程中计算思维和应用能力培养问题研究
民族高校C语言程序设计课程教学改革的研究
算法的案例教学探析
浅谈艺术专业学生计算思维能力的培养