《用程序进行数据模拟》教学案例
2023-04-18崔艳丽李宇翔
崔艳丽 李宇翔
课程核心素养目标
①结合数据信息情境觀察并识别均匀、正态和幂律三种数据分布形态。(信息意识)
②分析信息情境,提取问题关键特征,用适当的数据结构进行抽象建模,设计合理算法继而编程解决。(计算思维)
③在学习过程中,评估数字化学习资源并根据需要合理选择。(数字化学习与创新)
④在用程序解决问题的过程中熟悉列表、列表遍历,区分循环和分支适用的问题情境。(计算思维)
⑤通过课堂实践和数据实验,直观感受计算机强大算力对数据处理的价值。(计算思维、信息社会责任)
学业要求
《普通高中信息技术课程标准(2017年版)》中关于必修《模块1 数据与算法》中的内容要求是:“1.7 掌握一种程序设计语言的基本知识,使用程序设计语言实现简单算法。通过解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序调试与运行的方法。”
教学内容分析
本教学案例是“用程序进行数据模拟”单元教学的第2课时。单元总体设计思路是紧扣“数据、算法”的学科大概念,以用程序解决问题的基本知识和能力为主线,包含呈递进关系的4个课时,如图1所示。
学情分析
本单元的教学对象是高一学生,他们每周有一次信息技术课,两节连堂进行,因此笔者尝试设计微型项目和单元教学,在同一主题下,使每周的学习内容相对完整而又逐层推进。他们大都对信息技术课有兴趣,并初步具备良好的逻辑推导和问题解决能力,愿意主动思考问题,有较好的自学习惯,能根据需要查阅资料支持学习过程。学生已经掌握程序的一些基础知识,能理解并基本正确使用三种程序结构,初步学习过列表和字典数据类型,对函数封装有一定了解,对程序解决问题的过程有一定认识。但面对复杂信息情境,他们无法将学过的知识有效整合来抽象建模设计算法并编程解决。
教学难点
①针对复杂的数据模拟情境,提取问题关键特征,继而确立数据结构与算法编程模拟。
②列表遍历(列表中元素的逐一读取及修改)的方法。
③循环和分支适用的不同情况。
教学过程
1.明确单元主题
通过单元第1课时的学习,学生对程序模拟问题情境预估结果有了一定认识。本节课从计算机发明的最初目的(完成大量复杂的计算)说起,提示学生计算机帮助人类解决了很多人力难以解决的问题,途径之一就是用计算机为现实问题甚至假想问题建模,通过改变一些变量值和条件,借助计算机的强大算力来进行研究预测。继而明确本单元主题:结合问题用计算机程序进行数据模拟。
2.提出本节课的问题情境,引发悬念
利用计算机教室的局域网环境,笔者在课前设计了问题情境浏览网页和预估结果投票网页。问题情境来源于一个与经济学相关的模拟人类财富流动的项目,项目所得的结论是人类财富经过多次即使接近于均等机会的分配后总是会出现所谓的马太效应。为贴合单元设计主题和实际教学情况,笔者对项目进行改良,将情境预设为学生感兴趣的游戏平台(如图2),并以网页形式发布,要求学生先阅读分析问题并进行预测,同时以在线投票方式迅速反馈学生预测结果,引发课堂悬念。该问题的复杂度,使得学生无法靠现有的数学知识推导结论,凸显了程序解决问题的必要性。
3.师生讨论,明晰问题,抽象建模,确立算法
在完成问题浏览和结果预测后,结合问题情境,师生共同讨论后提取问题关键信息“每启动一轮分配机制,会依次让每个成员拿出1个能量值随机赠送给其他成员”。基于此,引导学生结合程序知识进行抽象建模及算法思路的梳理。这个教学环节至关重要,明确清晰的分析对学生的实践过程起到决定性作用。因此,笔者借助表1所示的问题串,以师生讨论的方式,突破问题情境和算法与程序之间的屏障。
4.学生实践环节
受课堂教学的多种客观因素制约,再清晰的思路引导都可能无法帮助学生克服因语法代码不熟悉导致的学习障碍。笔者认为,突破此学习难点可采用以下教学方法:其一,提供条理清晰的学习资料,供学生有疑问时查询使用;其二,请学生以代码接力的方式在教师电脑上合作完成。代码接力活动顺利进行的前提是课前要对问题科学分析,课上进行思路明晰,并辅以代码提示。下页图3所示是本节课的思路引导和代码简要提示。
在实践过程中,笔者随时观察学生的完成状况,并设计了如下页表2所示的五个接力环节,其中学生3和学生4完成的是本节的程序难点。参与课堂代码接力活动的学生既需明了自己要完成的部分,也要理解之前的代码,这除了能帮助他们更好地把握程序,还起到了很好的同伴示范作用,一定程度上实现了协作式学习。
以学生3完成的难点为例,在实际上课时,参与接力的学生所编的程序片段如图4所示,这显然不符合情境要求。突破该难点的方式是结合之前所学的抽取不重复学号的问题,辅以如图5所示的流程图引导。
课堂中的问题五花八门,作为一个实践导向明显的学科,再精心的设计也无法完全帮助学生实现旧知和新问题情境的准确链接。因此需要教师灵活把握课堂节奏,用课堂生成性问题来动态推进学习进程。例如,在编程实践中,有一个学生所编的代码片段如图6所示,执行结果显示,输出的数据是呈正态分布的。教师用此代码与学生讨论了两个问题:①while条件是否能保证赠予的是其他人?②如果某成员的能量值变成0,其暂时不参与赠送在程序中有体现吗?此前,学生已经弄清楚了程序如何体现赠送的含义,经过讨论,学生修改和完善了代码,输出了如下页图7所示的直方图。
5.以立体式课堂总结串联前后学习内容
课堂总结环节分为三个层面:知识总结、拓展思考和项目展望。知识总结是引导学生对本节用到的知识进行提炼,同时是对算法与程序实现的主要基础知识的回顾。拓展思考部分会提示学生改变程序中的关键变量,观察输出结果的变化并分析原因。项目展望是对单元后两课时的项目——基于数据模拟探究乒乓球赛制做简要说明和展望,希望学生能做相关思考。
教学反思
笔者设计这个单元教学的初衷是既希望能够聚焦计算思维的提升,紧扣数据与计算的学科大概念,又希望能贴合大部分学生的实际能力和教学的基本情况。同时笔者还考虑在学完必修1中关于算法与程序实现的基础知识后,除了按照教材上的思路进行词频分析外,有无可能设计一系列的问题情境,带领学生更深层次理解计算机程序解决问题的方法,同时承接后续的数据处理单元。在明确单元教学目标后,笔者以《计算机模拟》作为单元课程开发的主体内容,通过用程序模拟一系列具体问题下的数据,将计算思维的形式化(如抽象出算法解决问题的一般过程)、模型化(如用结构化程序表示算法)、自动化特征渗透到课程内容中。单元设计路线是从生活实例出发,结合学生基本情况和学习兴趣,逐渐延伸到数据模拟实验。单元学习的归并路径是对问题情境关键信息的提取,抽象量化问题的核心特征,继而确立算法和数据结构编程解决。贯穿单元的教学策略是合作式学习策略。
在完成教學实践后,笔者也发现了其中的不足:①课堂教学进行了明确的算法思路引导,但事实上程序解决同样问题的算法常常不唯一。②该单元部分问题情境显得真实性不够,是否引发了学生的深度学习值得商榷,同时也没能充分关联学科的前沿知识。笔者希望能在后续的数据处理学习中开展小组合作式的基于真实数据的项目式学习,对这些问题进行弥补和改进。
点 评
《普通高中信息技术课程标准(2017年版)》提出了学科大概念和学科核心素养,并建议以项目教学方式设计单元教学,最终实现提升学生学科核心素养的目标。
从整体内容安排看,在本教学案例中教师充分考虑学生基本情况,并根据课时安排特点设计了单元的教学内容,不拘泥于整体单元项目,而是利用可在连续课时中完成的、层次递进的、学生熟悉的情境中的若干问题展开,从而达成单元教学目标。这使得单元内容既围绕一个直接指向学科大概念和学科核心素养的核心主题,又便于教学实施,并且使学生的学科素养水平达到递进提升的目标。
从单元教学逻辑看,本教学案例聚焦计算思维培养,设计了一连串学生力所能及的程序模拟情境,从简单有趣的概率问题开始,明确计算机模拟的意义,继而创设了一个相对复杂的问题情境,完成思维建构,在此基础上引入实践中真实情境下的程序模拟。在微观问题解决的过程中映射宏观的学科大概念和思维特点,实现了问题与程序的有机链接,能够促进学习的高通路迁移。在复杂度逐渐提升的问题解决过程中持续引领学生理解计算机模拟的基本要点,包括明晰问题的关键特征、建立模型、明确问题的算法和数据结构等等。学生经历了从具体问题到抽象原理再到具体问题的学习过程,逐渐形成持续性的理解,实现计算思维的提升。
从教学实施策略看,在本教学案例中教师采用多种教学策略助力学生突破学习难点。首先,在关键核心问题的分析上通过精心设计问题链,以提问及追问的方式引导学生思考,突破算法设计的难点。其次,在编程实践中,尊重学生个体差异,设计“编程接力”环节,由多位学生合力完成编程任务,既帮助学生树立信心,又锻炼其协作意识及能力,突破编程验证算法的难点。最后,在学生学习的全过程中,教师提供较为全面的学习资源作为学习支架,助力学生个性化自主学习,突破学生个性化学习难点。
(点评人:北京市东城区教育科学研究院信息技术教研员 李宇翔)