陈英
[摘 要]高中开展编程教学是发展学生信息素养的客观需要,也是人工智能发展的客观需要。文章针对高中编程教学的问题,提出了植根生活、分析建模、迭代优化等有效教学措施,并以身份证项目研究为例,阐述了高中编程项目式学习的具体实践。
[关键词]项目式学习;身份证;编程教学
[中图分类号] G633.67 [文献标识码] A [文章编号] 1674-6058(2023)26-0088-04
一、高中开展编程教学的客观需要
2017年对编程教学来说很有意义。随着《普通高中信息技术课程标准(2017年版)》和《新一代人工智能发展规划》的出台,国家在教育层面吹响了在中小学开展编程教学的号角。
(一)高中开展编程教学是发展学生信息素养的客观需要
高中编程教学,围绕信息素养,将信息意识、计算思维、数字化学习与创新以及信息社会责任的培养作为教学要点,特别是对学生计算思维、数字化学习与创新素养的培养有关键作用。通过编程教学,可培养学生问题分解的意识和能力, 提升学生的计算思维水平,帮助学生适应信息社会的学习和生活,提升学生的数字化学习与创新能力。
(二)高中开展编程教学是人工智能发展的客观需要
2017 年颁布的《新一代人工智能发展规划》中提出了“全民智能教育”,同时明确了在中小学阶段开设人工智能相关教学内容,进一步推广编程教育。 编程是实现人工智能的基础要素,在中小学阶段开展编程教学,是实现人工智能教育培养目标的根本需要。
二、高中编程教学中存在的一些问题
编程教学,特别是算法教学是近几年信息技术一线教师谈论的热点话题,如何让编程教学深入浅出,值得信息技术一线教师持续探索。通过教学听评课等活动,笔者发现编程教学在实施中存在一些问题。
(一)教学目标未通达信息素养
高中信息技术教师对编程课程的教学理解不够深入,对编程教学目标的定位不够明确。编程是教学活动的载体,通过编程教学,我们要让学生获得什么?普通高中信息技术课程标准告诉我们,高中编程课程教学的核心是培养学生的计算思维,同时让学生学会如何分析与解决生活中遇到的实际问题。在某些课例的授课环节,教师将教学重点放在编程基础知识、代码、算法的传授上,而忽略了学生信息素养的培养,这样的教学是不完整、不全面的。编程教学不仅仅是代码,而是代码背后的“能力组合”:问题界定、特征抽象、建模组织,以此为基础判断、分析信息资源,科学合理地选择算法进行编程,最终解决问题。
(二)教学内容不易激发学生的学习兴趣
高中编程教学的主要内容为算法和简单数据结构,这部分内容比较抽象复杂,学生初学时会感觉比较困难。由于内容枯燥,与生活联系不够紧密,学生的有意义学习乃至深度学习不易发生。又由于课时的限制,丰富有效的教学也难以开展,如探究学习、项目学习等新型模式在编程教学中的运用也受到限制,教学内容与模式不易激发学生学习兴趣。因此,教师在教学设计中应避免复杂枯燥的教学内容,将复杂抽象的算法进行推演、解构和建构,并与实际生活相结合,这样才能激发学生的学习兴趣。项目问题的设计,也应侧重算法思想和方法的综合应用,并突出计算思维和创新意识的培养。
(三)教学过程未实现分层教学
高中编程教学较多的还是采用“讲—学—练”模式。一方面,是由于学生缺少编程学习的知识储备,不具备独立进行编程学习的能力;另一方面,编程学习,特别是算法学习难度大、要求高,学生在完成任务的过程中会遇到各种各样的困难,学习任务达成度较低。鉴于以上考虑,较多的教师倾向于“讲多一点,讲细一点”,留给学生自主学习和思考的时间和空间不够,也就很难实现分层学习,最终,能力较差的学生没学懂,能力强的学生没学好,因为最终的“作品”都一样,没有差异性和创造性,也不利于学生计算思维和创新能力的培养。高中编程教学必须坚持以学生为主体,发挥学生的主观能动性,让学生自主探索算法和简单数据结构等内容,掌握解决编程问题的方法和步骤,进而解构知识,形成概念,建立认知模型,架构学习方法,提升学习效率。
三、高中编程教学的有效实施
随着编程教学的日益普及,计算思维成为数字公民必备的核心素养,编程教学作为其主要培养载体引起广泛关注。算法是编程的灵魂,也是信息科技教学的核心,更是编程教学的重难点。要有效实施编程教学可从以下方面入手。
(一)植根生活,寻找编程教学的切入口
陶行知先生说:“生活即教育。”教育的素材应该源自社会生活,以社会生活以及在此基础上产生的经验为中心。教学做合一,以生活为中心,怎样做就怎样学,怎样学就怎样教。所有的问题,都是从生活中来,从生活中来的困难和疑问,才是实际的问题;用这种实际的问题来求解决才是实际的学问。
信息技术是一门技术学科,技术的根本目的是解决生活中的实际问题,所以笔者会将“技术服务于生活”的思想植根于课堂教学中。这与《普通高中信息技术课程标准(2017年版)》倡导的项目式教学不谋而合。教学的素材源自社会生活,对照我们的课堂教学,要关注以下几点:首先,学习的问题应该是学生身边的,对于他们来说,是有生活经验的问题。这样的问题才能更好地激发学生的学习兴趣,才能让他们体会到技术的价值。其次,我们的课堂教学要紧紧围绕这类生活问题,围绕认知冲突,将生活问题分解、解构,用技术手段逐一击破问题中的困难和疑问,让课堂具有生命力。我们应植根生活,发现生活中的真问题,围绕问题,解决生活中的真疑问,回归生活,寻找技术服务于生活的真价值。高中编程教学也必须遵循教育教学的基本规律,从生活中来,到生活中去。只有植根生活,从生活中汲取教育的灵感与养分,才能找到编程教学的切入口。
(二)分析建模,打通编程教学
高中编程教学的主要内容为算法和简单数据结构,这部分内容高度抽象,也相对枯燥。一方面,需要学生具备一定的数学功底,也需要具备较强的分析问题、抽象建模的能力。特别是算法模块,高一编程教学中涉及非数值计算:分治思想,其中包括二分查找、递归法等,数据结构中也涉及线性结构中的列表、字典和元组。这些内容,对于大学计算机专业的学生来说也绝非易事,因此在高一进行编程教学时教师不能照搬照抄大学模式,不能将其视为大学先修课,必须在教学内容的质和量上进行适度改造和创新,使其符合高一学生的认知规律、心理特点和生活经验。教师应在有趣、有用、有价值的基础上兼顾程序设计的科学性和严谨性,将教学重点从编写代码转移到分析建模上,让学生学会对生活中的实际问题进行分析、解构、建模,以及将问题抽象成数学模型。从编程解决问题的一般过程来看,首先是分析问题,其次是抽象建模,最后是编写代码。由此可见,抽象建模是编程学习的核心环节,起到承上启下的作用。具体来说,主要包括以下内容:1.分析问题(要解决什么问题?这个问题可以分解为哪些子问题?用什么工具来解决问题?);2.抽象建模(每個子问题如何解决?需要用到哪些算法和数据结构?);3.编写代码(在厘清算法的基础上使用合适的编程语言来实现项目的需求,解决实际问题)。
建模和编程的关系不可分割,互为表里。建模是从现实世界到数学抽象的过程。编程则是在模型的基础上用具体的编程语言来实现。如果说建模是艺术,那么编程就是技术,两者相互依托,不可分割。优秀的模型能够让编程简洁、高效,同理,离开了编程,建模也只能是空中楼阁,纸上谈兵。在高一编程教学中,教师要重视问题的解构和分解,教会学生如何分析建模,这样学生才能掌握打开编程之门的钥匙。在日常教学中,教师要有意识地引导学生开展抽象建模的实践,提供给学生抽象建模的时间和平台,这样才能打通编程教学。
(三)迭代优化,精进编程教学
高一编程教学受内容难度和学生基础参差不齐两方面因素的影响,必须坚持“小步子”的教学策略。“小步子”就是起点不要太高,从基本需求问题解决开始,让学生初步体会到解决问题的乐趣,接着,再逐步迭代优化,这也是程序设计的基本思想:自顶向下,逐步求精。解决了基本问题后,在此基础上,再提出新的需求,如界面优化、功能拓展、自动化及批处理等。学生在实现新需求的过程中,知识和技能得到了拓展和提升;在解决问题的过程中,问题解决策略和编程思想方法得到了验证,计算思维、创新能力也得到了升华。
在高中编程教学中,为了达到较好的教学效果,教师通常会选择融合各个知识点的经典例题进行教学。比如,在教学分支结构时,会选择BMI例题;在讲解循环结构时,会选用1加到100的案例,等等。虽然这些案例在单元教学中非常具有代表性,但是也存在现实问题,单元和单元之间彼此独立,关联度较差,不能形成案例联结,前后知识点之间的关联度差,案例不能体现知识点的综合应用,因此,高阶思维能力不能得到培养和提升。
AI的知识迭代,对人类社会产生了广泛而深远的影响,编程教学也是如此。为了解决上面的知识碎片问题,在编程教学中教师需引入优化迭代思想。将Python中的三种程序设计结构、简单算法、简单数据结构融合在一个小项目中,项目从最简单、最基本的功能开始,逐步求精,不断提出新问题,不断考虑新思路,不断实现新功能。这样就能将零散知识关联起来,使项目功能丰富起来,计算思维提升起来,学科思维拓展起来。这样学生才能体会到技术在解决生活中的实际问题上的价值,才能领悟技术服务于生活的学科思想。
四、高中编程项目式学习案例解析
下面,笔者以“身份证项目研究”为例,和大家一起探讨高中编程项目式学习。
【学情分析】在进行本项目前,学生已经学习了Python编程的基础知识(三种程序设计结构、函数、列表、字典),能够利用编程解决简单问题,但是这些问题涉及的知识点相对零散,很少触及单元间知识的整合,知识点之间没有形成从“点”到“面”的思考。考虑到本项目涉及的知识点较多,学生间编程素养存在较大差异,在项目要求层面分为普及版和提高版,学生可以根据自身的能力情况自主选择。同时,提供知识点微课(视频),帮助学生达成项目学习目标。
【课时安排】第1课时掌握自定义函数和字符串切片,第2、3课时涉及文件操作和字典运用。学生有3节课的时间完成该项目,能力较弱的学生可仅完成普及版。
植根生活,寻找项目素材——解密身份证。身份证是大家非常熟悉的、有生活经验的素材,而且,身份证在编码过程中有明确的规则,如地区、生日、性别等,这些可以通过Python的字符串操作轻松获得相关信息,对此可以身份证研究为项目主体,将 Python中的三种程序设计结构(顺序、分支、循环)、模块化编程(函数)、简单数据结构(字符串、列表、字典)、文件操作等融合其中。在完成这个案例的同时,相关知识点均得到了实际运用,这才是有意义的深度学习。在整个学习过程中,学生经历了“总—分—总”的逻辑思维过程,首先锻炼了分析、解构问题的能力,其次在完成子功能的过程中相关知识点得到了运用,最后将子模块整合在一起,最终实现项目的完整功能。
(一)植根生活,需求分析
本项目分为普及版和提高版,分别具有以下功能。
【普及版】输入一个18位身份证号,能够显示出生地、生日、性别。
【提高版】批量读取某年级学生的身份证信息,批量显示出生地、生日、性别、生肖、统计全年级男女生人数、江苏籍或非江苏籍人数、高一年级十大姓氏。
(二)分析建模,解构问题
要实现以上功能,需先进行问题分解和知识点运用梳理。
(三)迭代优化,逐步求精
身份证研究项目从最简单的单个身份证号处理开始,能够显示出生地、生日、性别,这是普及版的项目需求,在此基础上,逐步求精,拓展功能。
迭代优化1:处理单个身份证号—批处理身份证号
处理单个身份证:s=input("请输入你的身份证(18位)")
批处理身份证号:f=open("nstu.txt") #nstu.txt中存放单个学生信息01,114010101,王君鑫,物化生,32058520070517xx24
for s in f:
......
f.close()
迭代优化2:新增显示生肖功能
def sx(s):
l='鼠牛虎兔龙蛇马羊猴鸡狗猪' #将12生肖存储在字符串l中,也可以用列表存放
x=int(s[-13:-9])
r=(x-1900)%12
return(l[r])
迭代优化3:统计全年级男女生人数、统计全年级江苏籍/非江苏籍人数
nl={"男":0,"女":0} #nl男女字典初始化
d={"江苏":0,"非江苏":0} #d江蘇省非江苏省字典初始化
def xb(s):
x=int(s[-3:-2])
if x%2==0:
nl["女"]=nl["女"]+1 #女生加1
return "女"
else:
nl["男"]=nl["男"]+1 # 男生加1
return "男"
def dq(s):
p=s.rfind(',')
x=s[p+1:p+7]
f=open("shudi.txt") #出生地列表:110 000=北京市
for l in f:
if x in l:
if l[7:10]=="江苏省":
d["江苏"]=d["江苏"]+1 # 江苏省加1
else:
d["非江苏"]=d["非江苏"]+1 # 非江苏省加1
return(l[7:10])
break
f.close()
迭代优化4:统计高一年级十大姓氏
xs_reverse = sorted(xs.items(), key=lambda x: x[1], reverse=True)
print("高一十大姓氏:")
for x in xs_reverse[:10]:
print(x)
在此案例中,綜合运用了Python编程中的基础知识点,并将这些知识灵活整合到一个案例中,既具有趣味性,又具有技术性,学生的学习兴趣高涨,特别是能力比较强的学生,真切体会到了编程解决生活问题的乐趣。这个案例,随着我们学习内容的深入,还能继续迭代优化,进行功能拓展。
综上,编程学习是高一信息技术教学的难点,如何让编程教学优质高增效是一线教师一直探索的课题。在教学内容方面,教师要在科学性和趣味性之间寻找平衡点,要有大单元视角,从知识体系的全局出发,从生活中寻找主题和素材,让学生在解决生活问题的过程中掌握编程技巧,提升信息素养。