图显思维,开启编程教学新样态

2022-01-15 00:48洪勋
中国信息技术教育 2022年1期
关键词:流程图僵尸程序设计

洪勋

在人工智能、大数据等新技术迅猛发展的背景下,中小学信息技术课程改革不断推进,计算思维已成为信息技术学科核心素养之核心。在信息技术学科中,数据、算法、信息系统与信息社会这4个学科大概念所对应的课程内容其侧重点有所不同。其中,算法与程序设计课程教学是目前培养计算思维最主要的手段;抽象能力作为计算思维的本质之一,是加强计算思维培养的关键;程序流程图作为描述数据流程的工具,助力学生梳理程序设计思路,让思维过程可视化,在抽象能力培养过程中起到了重要作用。

● 计算思维与抽象能力的辩证关系

计算思维的本质可概括为抽象和自动化。笔者认为计算思维中的抽象需要用特定严格的符号去描述、表示并使其形式化,进而达到机械化执行即自动化的目的。自动化是抽象的目的,而抽象则是自动化的前提和基础。

抽象是指在对实际复杂问题求解过程中,通过获取关键特征、化简、降低复杂度等方式,构造出计算机能够处理的简单模型。例如,可以将超市里琳琅满目的商品抽象成只含有商品编号、生产日期、保质期、单价、折扣信息等若干符号化的属性对象,将每件商品的计价过程抽象成根据商品的单价和折扣进行自动化累加的过程。

从以上的诸多定义和特点可以发现,抽象作为计算思维中的一个维度,是计算思维不可或缺的环节。抽象能力对于塑造事务模型、重构事务处理流程起着关键的作用,培养学生的抽象能力和意识,是发展学生计算思维的重要体现,也是提高学生核心素养的关键能力之一。

● 探“寻”:程序设计之思维“盲区”

算法与程序设计教学需要从真实情境出发,通过引导学生经历发现问题→分析问题→抽象出核心问题→设计算法→编写程序→运行调试→问题解决等计算机解决问题的一般步骤来培养计算思维能力,并从计算机的基本工作原理出发,将具体的步骤抽象为一般的程序。因此,在程序设计学习过程中抽象能力的刚性要求会让学生陷入“盲区”,从而成为直接制约计算思维培养的重要因素。

盲区1:语法技能中的算法“模糊化”

很多教师过分注重对一成不变的程序语法结构和规则的机械式程序技能讲解,而忽略了对程序逻辑结构以及算法思想的深层次挖掘,学生学习仅限于掌握语法结构。由于抽象思维能力培养不够,学生很难将复杂问题进行分解建模,无法形成明确的算法思维。例如,在教学“Python枚举算法”时,列举“百钱买百鸡”“鸡兔同笼”等问题只是为了让学生掌握表达式、常用函数、循环语句等的基本语法和运行规则。在这些问题解决过程中由于学生受抽象能力限制,算法思维比较模糊,计算思维素养不能得到有效渗透。

盲区2:结果追求中的思维“碎片化”

在算法与程序设计教学过程中,多数情况只是让学生模仿教师给出的参考范例,却没有根据整体思维进行问题拆解,并分析每一个子模块的功能。例如,在“Python的模块”教学中,学生在处理《猜数字》游戏案例过程中,针对“random”模块调用、用户输入、程序循坏、判断是否正确等环节,只是独立、机械式地书写各个模块,最后进行简单的顺序调整,并未进行整体考虑与设计,不能形成一条清晰的程序设计解决问题的思维过程。

盲區3:语言转换中的支架“空白化”

在程序设计教学中,学生思维没有有效利用可视化工具做支撑,他们在面对一些较复杂的情境问题时,由自然语言直接过渡到程序语言普遍存在较大困难。例如,在《循环结构——for循环》一课中,笔者尝试以植物大战僵尸游戏为课堂情境,要求学生输出植物10次攻击的随机攻击值,并判断10次攻击的攻击总和能否阻挡该橄榄球僵尸(生命值为500)。但在引导学生将实际情景抽象成数学模型时,笔者只用了大量的自然语言简单描述,未直观呈现思维加工全过程,导致教学事倍功半,收效甚微。

● 巧借“支架”之灯,点亮“思维”之路

在程序设计教学中,程序是结果,而算法设计才是灵魂。流程图是有效的可视化工具之一,从问题情境中抽取的对象、指令、模式等通过流程框、输入输出框等加以表征,然后使用顺序、选择、循环等结构建构它们之间的关系,实现对同类型问题的抽象与提炼。通过可视化流程图的绘制、解读、修改等环节,建立自然语言与程序语句之间的桥梁,将学生隐性的思维过程清晰地呈现出来,帮助学生分析问题、抽象核心问题,建构解决问题的模型,从而能够顺利地设计算法和编写程序,实现问题的解决,让思维在编程中可见。

1.抽象问题图形化,思维聚合 “关联”性

在程序设计抽象环节,需要分析并找到问题的关键。在真实情境问题分析之后,帮助学生将复杂的问题进行分解、简化,即将现有的问题关联学生原有的认知结构,找到解决问题的关键点,明确解决问题的核心。

例如,在Python中的for循环遍历应用教学中,采用《读心术》游戏作为问题情境,依次出示4张卡片,对方只需根据自己的真实生肖情况回答“在”或者“不在”卡片上,就能准确预判出对方生肖。

该问题属于模拟类游戏,对“抽象”的要求非常高。学生要用程序实现这个读心游戏,就必须弄清楚该游戏系统中的卡片(抽象出要素)、这些卡片之间有怎样的关系(要素之间的关系)等问题,通过程序性的思维聚合,与学生已积累的知识和技能(二进制)建立相关认知关联,明确该问题的核心问题,用可视化方式抽象出模型,形成流程化的问题解决的逻辑序列。

2.抽象语言图形化,思维理解“简约”性

随着学生认知能力的不断发展,图形化的方式更加符合学生的认知偏好。因此,学生在问题的分析和解决过程中,将抽象语言图形化,会使问题的解决更加简练和准确。程序流程图在排除多义性和广义性的同时,能简洁、浓缩逻辑思维的推理步骤,准确而清晰地表达解决问题的思维,从而实现以简约的思维理解获得最佳效果的目标。

例如,在《循环结构——for循环》一课的案例中,一个僵尸穿过院子到达戴夫家会受到植物10次攻击,攻击力随机生成,试问僵尸能否攻入?笔者这样引导学生建立初步模型:设置一个变量sum记录10次攻击的总和;用for循环语句表述10次攻击,循环变量代表攻击次数;思考sum的计算应该在循环体内部还是外部进行?判断僵尸是否死亡又应该在循环体的内部还是外部执行?思考sum的初始值0应该在循环体的内部还是外部赋予?如下页图1所示。

问题进一步复杂:每天晚上有12个僵尸试图进攻戴夫的家,试问是否会攻克?笔者在上一个案例所展示流程图的基础上,逐个设问,让学生逐步完善流程图:每个僵尸执行流程图中哪些环节?在哪里判断僵尸总数超过12?死亡僵尸数在哪里累加?Death的初始值在哪里赋值?从而完成了如图2所示的流程图。

3.抽象过程图形化,思维呈现“动态”性

程序流程图在运行时体现的是动态可视化,在程序不断运行过程中,流程图可以非常清晰地用图的形式将各种变量值及其逻辑关系呈现给学生。通过抽象过程的动态呈现,学生可以很清楚地了解当前指令的执行状态,让计算思维更深入。

例如,在《while循环应用实例》的教学中,笔者采用“五猴分桃”案例,结合学生的学情,大多数会采用一般性解法,即采用变量a作为最后的桃子数,x作为原始的桃子数,通过问题分析得到逻辑表达式:a=((((((x-1)*4/5-1)*4/5)-1)

*4/5-1)*4/5-1)*4/5。对x进行遍历,同时a也随着动态变化。若a为整数,则x,a为所求。

然而对于计算机的解决思路,则采用自顶向下的分治策略。

主问题过程思路:①变量x=1;②循环,如果x不能被5个猴子分掉,则执行③;③x=x+1,转②;④输出x;⑤结束。

子问题过程思路(x个桃子能否被5个猴子分掉):①循环(5次),每次执行x=x-1,如果x能被5整除,则执行x=x/5*4,否则转②;②程序结束,返回“假”;③程序成功(5次循环成功结束),返回“真”。

很显然,基于这样的文字描述,很难直观感受整个问题解决的思维过程。而通过流程图支架则更便于整个过程动态化呈现出来(如图3)。

在程序动态运行时,可视化思维培养方式非常重要。多重循环又是课程的难点,流程图使两重循环的抽象过程完全图形化,每一个设问都可以作为一个独立的思维框架添加到流程图的相应位置。在用流程图抽象实际问题、构建数学模型时,课堂效果显著提升,教学目标容易达成,学生在思考程序的动态运行过程时不容易出错,一举突破了循环作用的范围、变量的初始化等重难点。

4.抽象思路图形化,思维形成“直观”性

算法与程序设计课程注重培养学生利用计算机解决实际问题的能力,程序流程图的构建,意味着学生已经从实际问题中提取了有效信息,将问题抽象成了特定符号,建立了一般化的数学模型,找到了解决问题的方法。程序流程图能够帮助他们梳理思路,明确解决方案,减少复杂问题所带来的盲目性,也为后续实现方案的具体程序设计提供指导。

例如,在“Python程序结构while循环”教学模块中,笔者以绘制多彩的精美图形为教学情境案例,根据绘制目标,抽象分析案例中背景色、线条的颜色、粗细等要素,形成绘制思路(包含循环体内的思路步骤)。

通过引导学生针对图形案例直观分析,形成解决思路。

任务1思路:定义海龟模块,设置线条属性及背景;

任务2思路:循环体分别为四种颜色的线条绘制:①i%4==0,绘制紫色;②i%4==1,绘制黄色;③i%4==2,绘制红色;④i%4==3,绘制蓝色。(如图4)

当程序代码调试出现错误时,又可借助直观的流程图来修改代码编写中的错误,避免了学生漫无目的地做尝试。

● 行动实践:人人卷入,“图”育素养

基于《循环结构——for循环》一课的教学内容,笔者给出例题1的标准代码,要求学生编写应用型例题2和提高练习的程序。将流程图融入到课堂中,让学生围绕真实情境进行抽象、建模,引导学生用流程图对抽象内容进行设计、实现、验证和迁移,以此来探究流程图对程序设计学习的影响。

例题1:一个僵尸穿过院子到达戴夫家会受到植物10次攻击,攻击力随机生成,试问僵尸能否攻入?例题2:问题进一步复杂,每天晚上有12个僵尸试图进攻戴夫的家,试问是否会攻克?提高练习:一周有7天,每天都有12个僵尸来袭,每个僵尸会受到10次植物的攻击,试问戴夫的后院一周有几天会被僵尸攻克?

1.横向对比,区分抽象能力

笔者在两个平行班分别采用不同的方式教学实践,A班采用正常流程图进行授课,B班采用自然语言简单描述作为铺垫。通过采集学生用编程解决问题的过程,得出结论:受限于代码调试能力,两个班级能编写代码并调试完成例題2的学生并不多;但是统计前两项“逻辑正确”的人数,用流程图教学的A班有30人,远远超过用自然语言教学的B班。A班中甚至还有5位学生在完成了例题2之后,继续修改例2的流程图,并利用该流程图完成了提高练习,可见流程图对于提升学生的抽象能力、提高解决问题的速度都大有裨益。

2.纵向对比,重现抽象能力

鉴于B班的教学效果不佳,笔者在B语言描述的铺垫基础上,也采用了流程图对学生进行抽象能力训练。通过评价量规,发现学生在问题解决和思维迁移上都有了很大的提升。课后要求学生填写调查问卷并统计了结果,得出学生在理解程序逻辑结构过程中,抽象能力、建模能力都得到了充分体现。由此可知,程序流程图对学生进一步理解for循环语句作用显著。

通过教学实践,课堂体验解决实际问题的方法和思维,进一步验证了基于可视化程序流程图的计算思维培养教学方式的有效性,学生计算思维能力得到发展,解决问题能力有所增强。

● 实践总结

笔者通过实践明确,借助流程图的可视化方式能有效地加强学生对程序设计解决问题的思维理解,在提升学生抽象思维能力的同时展现了问题解决过程中主题元素之间的逻辑关系和演绎过程。学生在真实情境下复杂的程序设计变得有迹可循,程序思维可见。

在中学的算法与程序设计课程体系中,教师对知识点的传授、程序语法的讲解相对比较到位,但容易忽略对学生求解问题能力的培养,而这恰好是提升学生核心素养的关键点之一。程序设计课程不应该为了编程而编程,而应该重视将实际问题概括、抽象成特定符号,建立一般化的数学模型,再利用计算机具备的强大运算、存储能力找到解决办法的能力。在这个过程中,程序流程图确实能够起到事半功倍的效果,引导学生以计算思维的视角认识和思考日新月异的信息社会,并做出更加信息化的判断,有效提升计算思维水平,提升学生的信息技术核心素养。

猜你喜欢
流程图僵尸程序设计
云的识别指南
基于OBE的Java程序设计个性化教学研究
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
僵大变尸身
流程图学习指南
僵尸来袭