思源 思径 思异 思辨:基于CDIO 的编程思维培养路径探索
——以中职计算机专业学生python 教学为例
2021-04-29刘晓梅张凤凤杭州市富阳区职业教育中心
刘晓梅 张凤凤 杭州市富阳区职业教育中心
一、编程思维培养是计算机语言教学的内核
编程语言只是一种在特定情境下让计算机执行某种操作的实现工具。随着时代的发展,编程语言不断涌现,计算机程序员需要具备不断学习新的编程语言的能力,而这种能力来源于程序员对计算机编程思想(俗称算法)的理解和掌握,即具备了编程思维。编程思维绝不是对算法的生搬硬套,而是对同一个问题提出多种解决方案,并构建最佳路径的能力。但在教学过程中,笔者发现中职学生缺少编程思维。面对程序,他们常常死记硬背代码,而不是理解算法的真正含义,于是题目稍加变动,就会无从下手。随着知识的增多,背代码显然会增加学生的学习负担,使其产生畏难情绪、抵触心理。更重要的是,随着时代发展,编程语言日新月异,没有形成编程思维的学生是无法完成知识的更新,难以适应计算机技术的飞速发展。
因此,笔者认为对程序语言的教学中,学生编程思维的培养是教学的重中之重。笔者在python 语言的教学过程中,积极思考编程思维培养的关键要素,尝试将CDIO 工程教育理念融入课堂,构建编程思维的培养路径,创新课堂教学方法,推动学生从学知识到用知识,帮助学生学会思考,善于思考,勇于思考,逐渐建立编程思维。
二、编程思维培养是以思维训练为核心的教学
(一)编程思维培养的要素分析
编程思维是指一种高效解决问题的思维方式。它并不是编写程序的技巧,而是一种能在头脑中快速分解问题,并用计算机语言来实现的思维过程。对《python 语言》的学习来说,编程思维主要体现在对排序、穷举、递归等基本算法的理解和运用。具体地,笔者将编程思维能力归纳为思源、思径、思异、思辨四个能力要素的体现,即理解算法来源,知道算法实现逻辑,会用不同途径的程序实现算法,能在不同场景下应用算法。
(二)编程思维培养的路径构建
依据编程思维能力要素,笔者在编程思维培养的路径构建过程中借鉴了CDIO 工程教育模式。CDIO 工程教育模式包含构思(Conceive)、设计(Design)、实现(Implement)和运作(Operate)四个方面的内容。把产品开发的整个过程融合成一个项目,强调项目完成过程中学生的主动参与性,课程体系之间的相关性。CDIO 教育模式符合中职计算机专业python 教学项目教学的基本思想。
基于CDIO 教育模式,以培养学生编程思维能力思源、思径、思异、思辨四要素为目标,在程序语言的教学过程中立足于对实际应用项目需求的解决,在项目实施过程中,通过知原理、建模型、调代码、试应用四个教学环节训练和建构学生编程思维。知原理即激活学生的思维,探究解决问题的本源;建模型即通过逻辑模型缕清解决问题路径;调代码即用编程语言实现逻辑模型,分析解决问题的方法,优化实现问题的过程;试应用即能够在不同使用场景中,快速辨别应用的算法,并整理解决问题的方案。
图1 编程思维培养的路径构建
三、编程思维培养是遵循知识内化规律的学习过程
培养编程思维的过程应该遵循学生认识和思维的发展规律,依托学生已有知识体系,逐步构建由抽象思维到程序化思维的转变,进而形成编程思维。基于CDIO 教学模式的编程思维培养路径,以活动激活旧知、以建模表述理论、以编码实现逻辑,以应用完成内化。四个环节一脉相承,紧密相连,即符合学生认知过程,也符合学生思维发展。
(一)思源-知原理:抽象原理具体化
学生对于编程的恐惧常是因为不理解算法的原理,对学生来说算法原理晦涩难懂,对教师来说难以表达,学生通常雾里看花,知其一却不知其二。笔者认为让学生能够知原理,是学习编程语言的基础和关键,过程中应基于学生原生认知,从生活中取材,采用游戏、动画、图片、软件、头脑风暴等多种形式的活动来直观展示算法的运行过程,帮助学生学习和理解。
案例1:游戏中学算法——二分查找算法之原理分析
环节一:玩游戏
此环节采用游戏活动,让学生通过玩猜数字游戏体会二分查找算法的原理。游戏玩法如下:两个同学一组,甲在0-100之间选择一个数字,请乙猜,每次给出大了或者小了的提示,直至乙猜到数字,用时最短的小组获胜。
环节二:描述游戏通关法宝
学生游戏过程中,会发现每次猜中给定范围区域内的中间值,通过中间值确定数字,猜数的次数最少,速度最快。
环节三:引入二分查找算法核心思想
教师在学生描述游戏通关法宝的基础上,总结二分查找算法的原理:通过查找范围的中间值与待查数字相比较以确定以一次查找范围。
教师再将学生游戏过程用赋值动画的形式展示给学生,此时学生对抽象的赋值动画一看即懂,为后面的建模做充分准备。
实践表明,游戏活动使抽象枯燥的原理变得立体易懂,激活了学生的学习热情,让学生感受到了沉浸式学习的乐趣。使过去很多教师认为只可意会不可言传的算法思想变为可玩、可思,大大降低了学生学习的难度。
(二)思径-建模型:具体原理逻辑化
通过上一环节的活动,学生已经能理解算法的原理,但此时,头脑中的原理是具体的、非程序化的,无法直接用程序化的语言代码表达出来,这就需要借助流程图或建模图等形式将文字化的原理转变成为程序化的思维。该环节教师需要引导学生将操作分块,转变为流程清晰的流程图或建模图,帮助学生建构逻辑思维。
案例2:沙盘流程图——二分查找算法之流程图建构
通过上一环节的学习,学生表述出二分查找算法的原理:在一个有序列表中,将表中间位置记录的值与查找值相比较,如果两者相等,则查找成功;否则利用中间位置将表分成前、后两个子表,如果中间位置记录的值大于查找值,则继续查找前一子表,否则查找后一子表。重复以上过程,直到找到满足条件的记录,即查找成功。当设定的下边界值大于上边界值时,则查找不成功。
环节四:沙盘模拟
流程图可以形象直观的展示算法实现的操作流程,帮助学生掌握分析问题和解决问题的方法,但是中职学生编程基础薄弱,直接让学生在纸上画出流程图,难度较大,笔者采用“拼流程图”的形式,让学生以贴代画、以选代答。
步骤1:教师首先需预先给出流程图所用符号的含义和功能表。引导学生快速记忆。
步骤2:引导学生将二分查找算法的步骤进行细化和拆分,提炼出若干个关键问题。
关键问题 解决方案确定查找范围 用条件判断确定上、下限范围用循环反复改变查找范围待查范围里中间值与待查结果值进行比较确定范围里的中间值中间值与待查数据进行比较结果输出中间值与待查数据相等,查找成功,输出相应位置上限值大于下限值,查找失败
步骤3:请学生利用教具,构建二分查找算法的沙盘化流程图。
图2 学生探究沙盘化流程图
案例3:建模流程图——运用递推算法求解爬楼梯问题
在活动阶段,通过动画形式帮助同学们理解爬楼梯问题的原理:到达第n 级台阶的方法种数=到达第n-1 级台阶的方法种数+到达第n-2 级台阶的方法种数。如何通过图示来表达层与层之间的关系,帮助学生建构算法的模型?教师利用建模图,帮助学生理清算法中各变量之间的关系。如图3所示。
图3 为爬楼梯问题建模图
虚线框①、虚线框②、虚线框③、虚线框④清晰地呈现了递推运算的过程,而且每一个虚线框内的图形结构完全相同,说明可以设计循环代码,实现自动重复每个虚线框内的运算过程。
建模环节有效修补了传统教学中从具体思维直接进入代码编程环节的思维断层,流程图和建模图可以帮助学生理清算法原理,使头脑中的经验思维可视化、流程化,降低了编码编写的难度,有效克服中职学生的代码编写的畏难心理。
(三)思异-调代码:逻辑建构程序化
通过构建模型图,学生已经进一步建立了结构化程序的基本概念,但把思维模型转换为具体的编码需要学生具备较扎实的语言知识基础。笔者在教学过程中,通过程序填空、程序改错等方法,由浅入深,由易到难引导学生建立语法的概念,逐步完善代码编写。程序填空聚焦知识难点,降低操作难度,重建学生自信。
案例4:程序填空识语法重点
根据二分查找算法流程图,让学生用该算法来解决实际问题,在有序列表中[2,4,8,13,14,15,18,20]中,查找在键盘上输入的任意数字,返回查找结果。
图4 根据流程图进行程序填空
案例5:大家来找茬探究运行过程
环节一:布置任务
学生构建了爬楼梯问题的建模图之后,笔者设计了“大家来找茬”竞赛环节,找出并修改程序中错误,使程序能够正常运行,并实现特定功能。
运用递推算法求解爬楼梯问题。假设一段楼梯共有6 级台阶,小明一步最多能上2 级台阶,那么小明走完这段楼梯一共有多少种方法?
环节二:修改代码
学生采用小组学习法,调试修改代码,并展示讲解代码修改的方法。教师根据学生答题情况给予指导。
程序思维的形成需要学生大量地阅读他人编写的优秀代码,但对初学编程的学生而言,阅读代码的难度较高,学生常望而却步,而“大家来找茬”的形式非常适合中职学生的学情,既能降低代码阅读难度,引领学生形式阅读代码的习惯。错误点的设置紧紧围绕学生的易错点,疑难点,通过代码订正,有效帮助学生加深理解和记忆,同时,培养学生自主调试程序的能力。
(四)思辨-试应用:程序表达能力化
知识的迁移是编程思维形成的重要体现。让学生能够本身触类旁通、由此及彼,构建出学科的知识链、问题链和方法链。笔者在教学中注重分析知识与知识之间的内在联系,培养学生举一反三的能力,并对接程序设计岗位需求,从实际应用出发,引入真实的案例,让学生尝试运用所学知识解决实际问题。
案例6:最值与排序
求最大值问题:在跳水比赛中,有5 个评委评分,通过程序求出5 个评委中的最高分,并将最高分放到最前面。
学生在学习最值算法后,可以用单层循环实现在列表中找到最大值,并存到列表中第一个位置。
教师引问:如何求其余4 个评委中的最高分,并将其放到前数第二个位置?此时学生可以模仿最值算法将第二大的值放到列表中第二个位置。
教师追问:以此依推,每次求出其余评委中的最高分,并将其放到相应的位置?观察程序之间的关系?能否将程序进行整合?
学生在完成教师提出的问题过程中,很容易发现程序的核心程序都是相同的,由于每次求最值的位置不同,所以循环控制变量不同。可以利用循环嵌套来整合程序,进而得出排序程序。
最值算法是选择排序算法的一次运行结果,此时由此及彼的讲解选择排序算法,学生更容易理解。循序渐进的完成代码编写,挖掘算法之间的内在联系,更有效地帮助学生形成知识体系,提高程序表达能力,实现知识迁移。
案例7:在python 中实现网站的用户登录界面功能
1.项目需求:运行登录界面程序,通过键盘上输入正确的用户名和密码,会显示“欢迎登录”提示;用户名输入错误,则会提示“用户名不存在,请重新输入”,如果用户名错误输入次数超过3 次,则程序结束;密码输入错误,会提示“密码输入错误,请重新输入”,如果输入错误密码次数超过3 次,则程序结束。
2.关键问题及解决方法分析:
学生在教师的引领下分解项目开发过程中需要解决的关键问题及解决方法。虽然学生已经基本掌握了二分查找算法原理和程序编写,但并不能灵活地应用到实际需求中,因此,笔者在教学过程中,注重对学生问题分解和寻找问题方法的能力培养。
3.分层实现
学生分别完成三个层次的任务,分别为“利用二分查找法在二维列表中查找用户名”“在二维列表中查找用户名对应的密码”“控制用户名和密码的查找次数”。三个任务均完成后即完成项目功能。
三个任务对应项目完成的三个阶段,逐层深入。同学们可以根据自己的能力选择完成任务,完成任务后,由各组派代表展示相应代码,并讲解代码编写方法和相关知识,力争每一个都学生都能在课堂上根据自己的能力学到尽量多的知识。
四、实践反思
编程思维培养是教师创新教学方式的切入点。计算机程序教学绝对不是单纯的知识点讲解,而是一种逻辑思维的构建和创新思维的培养。这需要教师首先要具有创新的教学理念,积极地运用数字化的教学资源、信息化教学手段、生活化的教学活动使抽象的原理、隐性的运行过程直观呈现。
编程思维培养是学生职业道路发展的奠基石。笔者通过编程思维培养路径的探索和尝试,激发了学生python 程序语言学习兴趣,不再谈编程而色变,学生通过参与活动,逐步构建编程思维,并涌现出一批python 程序设计的爱好者。在“2021年中等职业学校师生职业能力大赛”的“python 程序设计”项目中,所任教的学生中有4 人在市级竞赛中获奖,5 人在区级竞赛中获奖,为他们的专业发展建立良好的开端。
同时,编程思维的培养不是一蹴而就的,需要教师坚持以学生为主体,找准学生思维的卡点,精准施教,同时通过丰富的教学活动和有效的激励机制建设,让学生能够保持学习的热度。笔者将在教学实践中继续探索教学资源整合和开发,更好地服务于学生进行编程思维的训练。