张庆丰
【摘要】中学编程教育不同于大学编程教育,必需要另辟蹊径,探索适合中学生的编程教学模式。本文阐述作者通过实践,逐步摸索出一套基于训练模型的编程教学模式,以适应中学生的教学需求。
【关键词】编程教育;训练模型;在线测评
一、国家大力推动中小学编程教育
2017年7月20日,国务院印发《新一代人工智能发展规划》,规划中提出分三步走的战略目标,到2020年人工智能总体技术和应用与世界先进水平同步,到2025年人工智能基础理论实现重大突破,到2030年人工智能理论、技术与应用总体达到世界领先水平,将人工智能上升到国家战略。规划中同时指出:实施全民智能教育项目,在中小学阶段设置人工智能相关课程,逐步推广编程教育。
程序设计是计算机科学的基石,它使得人们在计算机上得以实现各种想法;算法是计算机科学的灵魂,它使用巧妙的方法将程序的效率不断得到提高,这两者紧密合作推动计算机科学几十年来的高速发展,将现代社会带入人类文明的高光时刻。
人工智能是计算机科学一个重要的分支,近年来发展迅猛,在各个领域都得到了广泛的应用。但是,人工智能的根基仍然离不开计算机科学的基础——程序设计和算法。因此,要发展人工智能归根结底还是要大力发展计算机科学,大力推动编程教育。
二、中小學开展编程教育所面临的挑战
中小学信息技术学科在大多数地区都是不参与考试的边缘学科,无论是从学校的教学安排还是从家长的角度,都没有得到足够的重视。编程课程在高中属于信息技术科目的选修内容,更是被视为大学计算机相关专业才应该学习的技能。这使得在大多数中小学开展编程教育非常困难。
笔者从事信息技术学科教学12年有余,高中和初中的任教经历各占一半。除了常规信息技术课程之外,还曾开展以下编程教育课程:
1.信息学竞赛:断断续续地带过四届学生——最多一届31人,最少一届仅有1人;2.少儿编程:Scratch校本课程和线上课程;3.创客教育:萝卜圈虚拟机器人。
大多数学生都是抱着“玩一玩”的心态来参加活动,一旦遇到困难就容易退缩,造成在整个教学过程中学生人数波动很大,甚至出现期末学生人数不足开班时的十分之一的情况。问题的根源在哪里呢?有以下几点原因:
1.唯分数论的思想导致很多优秀的学生不敢参与进来;2.信息技术老师不愿意参与如此辛苦又难出成效的工作;3.大多数学校在编程教育方面的师资投入不足,编程教学不是学校常规教学任务,老师仅靠情怀不足以支撑长期枯燥且高难度的工作热情;外出培训交流的机会不多,专业能力提升太慢难以适应竞赛要求;4.家长和学生普通没有认识到学习编程的优点,参与到编程学习的热情不高,即使参与编程学习也常常“知难而退”。
三、寻找问题根源,直面挑战
目前,市面上有关编程教育(主要是少儿编程)的项目非常多,主要可以分为三大类:图形化编程、机器人、信息学竞赛。根据不同学段的学生的知识结构和学习特点,结合我县的具体情况,笔者认为我县可开展的编程教育项目可按图1所示:
本文主要讨论高中信息学竞赛课程的开展,以及探索编程教学中的训练模型,以适应高中阶段的教学需求。由于大多数参加培训班的学生在高中之前并未接触过编程,属于零基础教学,因此在高中开展信息学竞赛培训会有以下几方面的问题:
1.消除学生对编程的恐惧心理。对于高中生来说,编程学习不同于其他学科的学习之处在于:编程并不像语数英等学科一样经过多年的学习,有了深厚的基础,就如语数英的学习是高屋建瓴,而编程则是平地起高楼,学习难度自然不言而喻。所以,大多数学生在学习编程之前就心生恐惧,这种心理不利于学习的开展,所以消除这种恐惧心理是开展好编程教学的基础。
2.中学编程教育不同于大学编程教育。大学里计算专业的编程课一般是在大二才开展简单的语言学习,到大二下学期开展数据结构和算法学习,而这些科目是建立在《计算机操作系统》《高等数学》《线性代数》《离散数学》等先修课程的基础之上。高中生不具备计算机专业相应的各种学科知识,如果按照大学里教编程语言的方法来开展编程教学的话,花费大量的时间和精力自不必说,也很难达到预期的效果。
3.可供练习的资源较少。传统的编程练习方式是根据教材课后习题自己编写程序,由于经验的局限性导致测试数据往往不能较为全面地覆盖所有的条件,导致程序的健壮性不高,经常只能得到部分分数。
4.消除学生赛前紧张情绪。由于不熟悉比赛环境和要求,学生在比赛前会有不同程度的紧张情绪,这往往导致学生在赛场出现不必要的失误。
四、探索适合的训练模型
大学计算机专业编程课程的教学模式并不适用于中学的编程教学,中学编程教学应该有自己的一套模式。针对以上所述问题,结合其他信息学竞赛名校的经验,笔者认为可以从下面几个方面进行探索,并结合实践加以完善:
1.日常教学
中小学生对枯燥的编程理论的重要性缺乏相应的认知,如果以理论作为切入点往往导致学生望而生畏,用不了几节课学生就会打退堂鼓。笔者认为可以效仿少儿编程,把课堂学习变成有趣的探索,让学生在不知不觉中学到知识。以故事或者学生较有认知共性的事情为外表来构建题目,学生在熟悉的背景中学习新的知识,降低了理解新知识的难度。
例1:在讲授递归算法的时候,以学生耳熟能详的“山上有座庙,庙里有个老和尚,老和尚在和小和尚讲故事:山上有座庙,庙里有个老和尚,老和尚在和小和尚讲故事……”——《山上有座庙》为背景来阐述递归算法“自己调用自己”的层层嵌套关系,进而引出如何终止递归——设定“递归边界”;
例2:在讲一维数组的时候,以《熊出没》的人物来设置题目:又到过年了,狗熊岭的动物们都忙碌起来,张灯结彩准备过年。李老板却要光头强砍一些百年美人松回去。美人松都是很高的,它们的高度不超过长整型。现在光头强看到丛林里有N棵美人松,当然每棵松的高度是已知的,李老板要问光头强:高度为K的美人松有多少棵?
2.课堂与课后练习
所有说“21天学好一门编程语言”的书都是在耍流氓。编程语言的学习来自于不断地练习和经验总结,没有足够的代码量是绝对不可能学得好的。编程学习不同于其他学科的“纸上谈兵”,程序写得好不好,拿到计算机上跑一跑就知道。因此,编程练习在整个教学活动中是非常重要的,针对不同的学习阶段可以做如下安排:
a)C++语法学习阶段——教材《信息学奥赛一本通》例题、一本通OJ、自建OJ;
b)基础算法学习阶段——一本通OJ、洛谷OJ、自建OJ;
c)数据结构学习阶段——一本通OJ、洛谷OJ、自建OJ;
d)进阶算法学习阶段——LOJ、UOJ
e)赛前一个月——举办模拟赛
3.模拟赛
OJ(在线测评系统)虽然可以为学生提供练习和反馈,但是和真正的比赛环境还存在一定的差别。因此,需要使用单机测评软件模拟真实比赛,让学生熟悉比赛机制,减少参加比赛时因不熟悉环境所产生的紧张和失误。
学生通过各种在线OJ进行练习,可以及时得到反馈,进而调试代码改正错误;通过自建OJ完成作业,老师可以掌握学生的学习情况,进而有针对性地调整教学方案。综合以上所述,形成图2所示的“编程教学训练模型”。这个模型形成编程学习的闭环,学生能够逐渐养成有效的自学行为,不断提高自身的编程能力和解题技巧。