模块化程序设计——算法与程序设计教学中的德育价值体现
上海市徐汇区位育中学 王卿
在信息化高度发展的现代社会,计算机软件已经被应用在政府机关,工农业,教育,医疗,交通等各个行业领域。软件的应用提高了人们的工作效率,促进了人类经济体系和社会的发展。
然而软件的诞生与发展并非一帆风顺。在上世纪60年代,由于开发及维护规范的不统一,软件的供需市场进入不平衡状态,软件危机爆发。在解决软件危机的过程中,人们发现必须对软件的开发及维护制定一系列的标准,从而衍生出了“软件工程学”和“程序设计方法学”两门学科。软件工程学主要是研究用工程开发的技术和方法来进行软件开发维护及管理的方法,属于工程与计算机的交叉学科。程序设计方法学是指用数学模型及思维方法来编制各种计算机程序,从而诞生了解决各类问题的经典算法,而结构化、模块化的程序设计的思想,也应运而生。
一、案例背景
党的十九大报告提出,创新是引领发展的第一动力。在习近平新时代中国特色社会主义思想引领下,中国正加快推进产业结构调整,“中国制造”正在转变为“中国智造”,其内容涉及五大工程,十大领域。在新一代信息技术产业领域中,中国政府提出了“开发自主可控的高端工业平台软件和重点领域应用软件,建立完善工业软件集成标准与安全测评体系”的要求,可以预见未来的五到十年内国家需要大批信息技术相关人才,在规范软件行业的标准,加强各行业软件的自主开发应用方面有很大需求,这也对高中阶段的信息技术教学提出了新的思考。教师在进行算法及程序设计课程时,要将软件工程学和程序设计方法学做有机的整合,将解决问题的算法和程序融入到具体的软件开发项目活动中去,做到双管齐下。因此,我使用一个模拟软件开发过程的项目活动来贯穿算法和程序设计单元教学内容,将程序设计的思维方式以及相关知识点落实到实际的项目应用中去。
二、德育价值
本单元从位育中学学生的生活实际问题出发,通过“黍育餐厅订餐系统”项目活动来创设问题情境,理解算法的特点、数据的类型、算法的基本结构,以及运用算法解决实际问题的一般步骤,揭示人机交互本质,和项目核心部分蕴含的算法思想。在运用数字化工具解决问题和完成任务的过程中,参与信息技术支持的沟通、共享、合作与协商,认识数字化学习环境的优势和局限性,养成数字化学习与创新的习惯,增强团队意识和合作精神。
三、教学实践
(一)以单元教学为依托,以项目活动为载体
算法是计算机科学的核心内容之一,用计算机解决问题都需要算法。基于《上海市高中信息科技学科教学基本要求》中“算法”部分的设计,将之划分成“算法基础”和“算法实例”两个单元。本课为“算法基础”单元的最后一阶段课程内容,学生将在本课中学习代码的归类优化方法,子程序的建立和调用,以及模块化程序设计的一般思想。
在项目进行的每个阶段都会有学案文档作为思维支撑,将学案文档整合起来就是程序开发过程的日志记录和文档资料,让学生能实际体会到软件开发过程中不仅有数字化的程序设计环境,书面文档的整理和规划也同样重要。
1. 课堂实录之一
在问题导入环节,教师与学生一起回顾项目开发过程中从“预备期”到“阶段四”的阶段性成果(如图1所示)。以开发过程中对冗余代码的优化需求作为开场,引发学生的共鸣与思考。
图1 黍育餐厅订餐系统的阶段性成果(界面与代码设计)
教师:在前期的课程中,各开发小组已经完成了“黍育餐厅订餐系统”项目程序中计算总价,满减优惠,密码登录等基本功能的编写,程序项目的代码量也变得越来越多。很多小组也许已经发现了,这些代码中存在着不少冗余重复的内容。在上阶段的开发文档中,有些小组就提出了希望能“减少重复代码的次数”(如图2所示)。那么今天这节课,我们就来看一下如何将代码“化繁为简”。
图2 学生在任务单上提出的程序改进设想
2. 德育价值分析
采用基于项目活动的教学方法,以开发者的视角出发,体验算法设计中需求分析、设计算法、编写程序、调试维护这四个环节。在解决实际问题的过程中,逐步学习算法单元的核心概念以及VB程序设计语言的使用方法,经由开发者在项目开发过程中对于程序设计需求的不断递进,来落实算法概念的融汇和贯通。在运用数字化工具解决问题和完成任务的过程中,参与信息技术支持的沟通、共享、合作与协商,认识数字化学习环境的优势和局限性,养成数字化学习与创新的习惯,增强团队意识和合作精神,体会合作学习的乐趣。
(二)正确理解数字化学习环境的优势和局限性
在“课堂活动一”中,学生需要学会对冗余代码进行功能模块的初步归类划分。所以在本活动中学生将使用剪刀剪切纸质的代码块,根据自己的理解进行归类并粘贴到代码框架的相应位置中去。
1. 课堂实录之二
教师:请各小组阅读并分析“附件2:代码”学案,将其中你认为冗余的代码,用剪刀剪下并贴入“附件1:框架”中相应的位置(如图3所示),以便作为子程序重复调用。完成的小组可以上台展示归类结果。
图3 通过课件演示操作的过程
学生组1:我们认为选择以下这段冗余代码就可以了。
学生组2:冗余代码的选择似乎还可以更为优化,计算总价和显示总价也需要在所有的按钮单击事件中被引用,加入这两段的话,代码的整体结构会变得更为精炼。
学生组1:那么干脆把第一行的显示餐品数量代码也加入进去吧。
学生组2:第一行代码具有个别性,显示餐品数量需要使用餐品数量的变量名,由于餐品名称的不同,餐品数量变量名也不同,所以这句代码不能被所有的按钮事件引用,加入这行代码反而会导致后期调用时出现错误。
2. 德育价值分析
数字化学习环境有其优势的地方,也有一定的局限性。从思维构建角度来讲,这个活动培养了学生初步分析,归纳,提炼代码功能模块的能力,并且能辨识出代码的冗余部分。代码的分析归类讨论问题看似应直接在代码编译器中完成,但是由于学生初次接触对冗余代码进行归类调整,必然会经历反复琢磨,推翻重来等现象。如果直接对虚拟的代码进行“剪切”“粘贴”等操作,一方面缺少对代码的摆弄,归类的认同感不强,另一方面也容易造成误操作而陷入困惑。用纸张剪贴的方式一方面能使代码具象化,便于思维体系的初步构建,另一方面也能让学生从繁杂的计算机代码中抽离出来,减少代码选择时的误操作。只有正确的认识数字化学习环境的优势和局限性,做到虚实结合,才能更好的落实教学目标。
(三)代码优化,勿忘以人为本
在“课堂活动二”中,学生以小组为单位,对“黍育餐厅”程序项目中功能重复的冗余代码建立子程序并调用,完成程序代码的优化。
1. 课堂实录之三
教师:请两个小组上台展示子程序的建立及调用成果。
学生组1:由于每种菜品的价格计算都需要进行“满减优惠”判断,所以我们把这部分的代码归类到子程序中,并取名为mjyh()。
学生组2:我们的子程序功能也是价格的“满减优惠”换算片段。为了方便起见,我们将子程序取名为a()。
教师:从程序的正确性角度来讲,这两组同学的代码都能正常运行,那么大家想一下,哪一组的做法更好呢。第一组同学的子程序命名为mjyh()可以看成是“满减优惠”的拼音缩写,这样只需在代码中做简单的注释即可大大提升代码的可读性。而第二组同学的子程序名称a()则很难让人与其功能联系在一起。我们学习模块化程序设计,最终目的不仅仅是让计算机的执行效率的到提升,更应该考虑到团队之间交流的便利性。
2. 德育价值分析
在大型程序的开发过程中,代码的可读性非常重要。对于学生在建立子程序时的命名规范性,教师应该加以说明。历史上软件危机的诞生,正是由于开发和维护规范不统一,代码的可读性差而引起的。模块化程序设计的思想,改善了代码的冗余度,其意义不止是对代码进行了优化,提升了机器的执行效率,更重要的是在项目开发团队间的交流时,能更为顺畅地进行沟通、共享、合作与协商。科技以人为本,任何机器执行效率的提升,最终都是为人服务的。而一个有意义的子程序名称,应该是做到这一点的第一步。
四、专家点评
在《中学信息科技学科德育研究建议(征求意见稿)》的高中学段部分,有一条建议为“在运用数字化工具解决问题和完成任务的过程中,参与信息技术支持的沟通、共享、合作与协商,认识数字化学习环境的优势和局限性,养成数字化学习与创新的习惯,增强团队意识和合作精神。” 王卿老师的《模块化程序设计》教学中,在强化德育教学策略层面有几处显著的体现。
首先,王老师从本校学生午餐排队时间过长,学生为了尽快用餐,不得不以百米冲刺的速度奔向食堂,因而被戏称为“跑饭”的生活实际问题出发,通过设计一个名为“黍育餐厅”的网上订餐系统,将算法与程序设计的相关知识技能融入其中,符合德育教育中的“将学科的知识与技能运用到真实的实际生活问题的解决过程中”的策略。
其次,随着“黍育餐厅订餐系统”项目的逐步推进,订餐系统的功能日渐完善,随之引发了“程序项目的代码量越来越多”“重复与冗余的代码多处出现”等问题,为此引发了对程序进行模块化设计的需求。学生学习的动因成为内在的真实需要,符合德育教育中的“真实”与“有效”的策略。
第三,在对“黍育餐厅”程序中的冗余代码,通过建立子程序、调用子程序等一系列操作,完成程序代码的优化后。王老师进一步引导学生将视角深入到子程序命名的问题上,启发学生思考模块化程序设计的目的,与程序运行效率、开发团队合作性等因素间的关系,符合德育教育中的“辩证”的策略。
(点评人:徐汇区教育学院中小学信息科技教研员 袁文铮)