0 引 言
当今世界,新一轮科技革命和产业变革方兴未艾,带动数字技术快速发展[1]。在软件定义一切的新时代,国家制定了创新驱动发展和大力发展数字经济的战略决策,对软件人才有了新的要求。作为培养软件人才的核心专业,软件工程本身的特性要求软件工程师们能够管理不确定性、不断变化的技术和独特的项目[2],需要软件人才具备自主学习能力。同时,软件工程的整体工作环境需要软件人才具有自主学习能力,才能应对不断变化的工作环境、不断增长的创新和竞争压力[3]。此外,由于软件工程教育无法跟上软件工程领域变化的快速步伐和异质性[4],对自主学习能力的需求变得更加强烈。
针对如何培养学生的自主学习能力,美国顶石设计课程探索了通过顶石项目和指导学生来提升学生的自主学习能力[5-6],取得不错的效果。文献 [7] 通过对 17 次半结构化访谈的主题分析发现,计算机专业的学生自主学习的动机有 4 个:项目、社交和同伴互动、学习的乐趣与恐惧。Grow 提出的 SSDL 模型( Staged Self-Directed Learning )把学生分为 4 个等级:依赖的学习者、感兴趣的学习者、投入的学习者和自主学习者,面对全班具有不同等级自主性的学生,要实现教学目标,教师需要扮演的角色分别是权威专家、鼓动家、协调员、委托人[8]。本文以北京大学软件工程专业第二学士学位的软件工程课程中软件测试的部分内容为例,若要在 50 分钟的软件工程课堂教学中培养学生自主学习能力,可从以下几方面进行教学设计。
1 学习目标
(1)知识目标:理解软件测试的基本概念;理解软件测试 7 原则;掌握静态测试。
(2)能力目标:能够从整体和局部静态分析一个复杂的测试工程问题,给出解决方案;能够担任代码审查中的任何一个角色,高质量完成代码审查工作;面对一个新领域,能够自主查阅资料,寻求答案。
(3)素质目标:理解“对事不对人”的态度,学会批评和自我批评,理解团队协作精神的价值。
2 学情分析
(1)学习基础。通过之前内容的学习和部分学生的课前预习,学生大概知道了软件生命周期中的问题定义、可行性研究、需求分析、总体设计、详细设计、软件测试、软件维护等几个过程,并系统学习了软件测试之前的内容。
(2)内在动机。软件工程专业第二学士学位的学生都是从非软件工程专业转来的学生,他们本来就是真心想把专业知识学好,已经深刻认识到软件工程课程的重要性,通过北大教学网了解软件测试一章的学习目标和教师的教学设计,有对软件测试学习的内在动机。教师要保护和激发这种内在动机,并利用这种内在动机引导学生主动思考,落到实处。
(3)认知误区。软件工程学生对软件测试的认知存在诸多误区:软件开发完成后才开始进行软件测试;软件发布后如果发现质量问题,那是软件测试人员的错;软件测试要求不高,随便找个人都可以完成这项工作;项目进度吃紧时少做些测试,时间富裕时多做测试;自动测试将取代手工测试。这些都需要在学习过程中予以纠正。
3 教学设计原则
3.1 提高学生参与度
自主学习包括完全或部分在学生控制之下的活动,与学生的参与度直接相关[9]。学生参与度定义为学生在参与学习过程时表现出的注意力、兴趣和热情的程度[10-11],体现在行为参与(如出勤、回答问题、讨论、承担任务等)、情感参与(如对学习内容的兴趣或享受等情感体验)、认知参与(投入到对学习内容的理解中,寻求超越要求,并表现出对挑战的热情)3 个维度。
教师的主要作用是成为促进者和认知教练,旨在最大限度地发挥和促进学生的学习潜力。就学生而言,他们必须具备确定他们想学什么以及如何实现这一目标的能力[12]。
3.2 推动学生反思
反思是一项重要的人类活动,是一种将经验转化为知识的机制,也就是说,它帮助学生认识到他们是如何学习的,人们在其中“重新获取经验、思考、思考和评估” [13]。将可用信息转化为有组织且有意义的知识需要反思能力。学生的自主学习能力正是围绕着反思展开的[14]。课堂教学是培养思维方式的重要途径[15]。
3.3 让学生感知到“有意义”
教学活动的一项基本任务是让学生完全参与“有意义”的过程。教育不仅仅是传播信息;教学设计必须组织教学,以便学生能够理解他们所做的事情。如果学习活动没有意义,学生就不能重视学习的结果和过程[16]。北大教学网是一个重要的学习门户,其中有诸如教学目标、微课视频、学习方法、教学设计、参考文献等支持材料,让学生明确学习目标,感知到学习内容的有用性,进而享受学习过程,感知到学习有意义,提升满意度。
3.4 营造具有吸引力的学习情境
若要提高学生的认知驱力,使学习情境具有吸引力是最好的办法之一。学生学习过程中,教师积极理解学生,营造让学生感受到尊重和安全的学习情境。教师给予学生必要的自由,学生深度参与课堂活动,教师根据学生的表现,及时正面反馈,激发学生学习主动性。
3.5 重概念,重经典
基本概念是理论体系的基础。在课堂教学中要通过经典文献,让学生弄明白概念的来龙去脉、内涵外延和发展动态,增强学生对学习内容真实性的自信心,以培养学生的创新意识和科学精神,为学生的自主学习做示范。
4 教学过程
4.1 明确目标,自我设计目标
北大教学网发布了本次课程所有内容的介绍,包括学习目标、学习资料(教学 PPT 、微课视频、经典文献等)、教学方式、教学计划、考核评价方式、评价量规等,每个学生在课前就清楚本讲目标评价机制,有一种“控制感”,也就是一切都在我手心中的感觉,为自主学习营造了学习情境。在这种学习情境下,学生可以自主制订学习目标和学习计划,并自我监控,自我评价。
4.2 营造情境,激发兴趣
良好的师生互动和合理的课程设计能够很大程度上影响学生的自主学习。如果学生感觉与内容相关或参与其中,他们可能会在学习过程中使用自主学习策略[17]。
1)开场,营造学习情境。
通过课堂互动,引导学生回顾软件生命周期的 3 个阶段、8 个过程。让学生随心自愿回答,教师对学生的回答予以正面积极回应,把学生的回答结果写到黑板上或投影到屏幕上,让学生感受到被尊重,营造一种“大家都在参与”的氛围,建立良好的师生关系。对于这个问题,可能没有一个人能回答全面,但只要学生思考,总能回忆出其中的一两个内容,都能从教师的积极回应中找到存在感,都能快速地走入课堂教学内容的学习情境。然后引导学生思考各个过程的内涵,自然得出软件测试过程具有破坏性的结论,通过与其他过程的建设性形成强烈对比,激发学生对软件测试内容的好奇心,产生“饥饿感”。
2)热场,激发学习兴趣。
故事性激发趣味性。在 PPT 上展示马克 Ⅱ 号、霍普女士和霍普在马克 Ⅱ 号上发现的第一个 bug 等 3 张
,讲述世界上第一个 bug 的故事,让学生感受到 bug 一词来历的同时,又产生了对“软件错误”的兴趣,为介绍软件测试埋下伏笔。
3)趁热打铁,介绍基本概念。
趁学生对 bug 的兴趣度刚刚被激发出来的热度,详细介绍 4 个核心概念:软件错误、软件故障、软件缺陷、软件失效。深化学生对概念的认识,让学生体会到科学的严谨性。
4)真实案例,强化学习兴趣。
介绍美国在海湾战争中“飞毛腿”导弹防御系统软件故障导致的巨大损失的案例,用真实数据震撼学生内心,进一步强化学生对软件错误危害性的认识,学生内心会自发思考如何规避这些危害。
5)统计数据,再次造势。
展示软件测试工作量、成本的统计数据,使学生对软件测试的重视程度提到最高点。这个数据是教师“独家发布”,体现了权威性。
6)回顾历史,照亮现实。
知识 / 真理的动态性、演化性,需要学生进行批判性思考。通过 4 个时间点经典著作中关于软件测试的经典定义,介绍人类对软件测试的认识逐渐深入,辩证看待软件测试发展历程,加深对软件测试概念的认识和理解,同时提升学生的创新意识和科学精神。
1973 年,软件测试领域的先驱 Bill Hetzel 博士在其代表专著 The Complete Guide to Software Testing 中最早给出的软件测试定义体现了测试的目的性,同时也反映了对软件测试内容的认知局限性;1979 年,Glenford J.Myers 在其专著 The Art of Software Testing 中提出了软件测试规则,奠定了软件测试的基础,具有极高的历史地位;1983 年 Bill Hetzel 博士在其专著新版本中修订了其软件测试的定义,把对软件测试的认知提高到软件质量度量的高度,同时强调了用户需求的重要性;2018 年,中国出版的《计算机科学技术名词》(第三版)是中国人自己给软件测试的定义,该定义言简意赅,既指明了测试手段又明确了测试目的。
通过这一段关于软件测试概念发展史的简短回溯,给学生做了一个“示范”,让学生领会历史唯物主义思维和抽象思维,提升认知和元认知水平。
7)深入浅出,介绍软件测试 7 原则。
软件测试 7 原则是软件测试的重要思想,必须让学生深刻理解。采用“图文并茂+真实案例+师生互动”的方式讲解,既可帮助学生建立软件测试原则的直觉印象,又能加深学生的认知深度。比如关于“穷举测试是不可能的”这一原则,请学生计算一个输入字段的可能组合,并抽学生分享自己的思考,爆炸式的结果让学生意识到:不可能测试每个输入类型的所有组合。在师生互动中,教师善用“激励”手段,对学生的点滴成绩、优点及时给予正面反馈,同时鼓励学生互相激励,培养自主学习意识。
学生沉浸在软件测试 7 原则中,但课堂伊始带来的对软件测试的饥饿感并没有完全得到满足,迫切想知道如何进行测试,这时教师就顺其自然地开始讲解软件测试方法。告诉学生:按照是否需要计算机运行的原则,把软件测试分为静态测试和动态测试,我们先学习静态测试。
4.3 角色扮演,深度体验自主学习过程
给学生放权,让学生深度参与,自由思考,互相激励,从实践中体悟真理,让学生在不知不觉中提升了自主学习能力。这个过程中,教师扮演了协助者、激励者角色。
1)严肃讲授,轻松指导。
趁学生对软件测试的兴趣度还很高,介绍静态测试的权威定义,引出 4 种静态测试:代码审查、代码走查、桌面检查、静态分析等。通过介绍代码审查方法提出者引出代码审查的概念,以图文形式介绍代码审查的审查小组的组成,并分别介绍每个组员的工作。同时讲解审查的流程,并给出程序设计常见错误清单,为接下来的角色扮演提供指导。
2)角色扮演,深度体验。
精心设计一个案例,其中的程序错误都是教师根据常见错误清单精心插入的,有语法类的、有逻辑类的,为了提高测试难度,还加入了一个设计错误。
利用 10~15 分钟时间,从课堂上邀请 4 位学生,自主分配角色进行角色扮演,4 位学生分别扮演组长、代码作者、程序设计者、测试人员,严格按照代码审查的流程完成代码审查。在这个过程中,教师适当引导。其他学生作为旁观者,一直在观察4位学生的表现,同时自己也在思考如果是自己扮演那个角色会表现得怎么样。这个过程中,每个学生都有收获:角色扮演者亲身体会印象深刻,旁观者主动思考,感同身受,自身主动性不同,收获也不相同。
这个过程是“激励”法大显身手的好机会,教师的点评尤其重要,重点表扬角色扮演者表现出来的各种优秀素养,这种表扬比单纯的说教强百倍,感受到教师的肯定,学生会更加激发内在动力。
3)启发思考,吸引兴趣。
所有的形象思维最后都要提高到抽象思维,如果做不到这一条,就是失败的[15]。等角色扮演活动结束,每个学生都基本体验了代码审查,这个时候顺势引导学生总结代码审查的特点,提高学生的抽象思维能力。同时结合代码审查对比介绍代码走查、桌面检查和静态分析等其他静态测试方法,让学生通过归纳思维,对静态测试方法有一个更深刻的认识。为了激发学生对软件测试的研究兴趣,特别提出模型检测这一静态测试方法的提出者曾经获得图灵奖,激发学生深入探索软件测试领域的内在动机,在学生心里种下一颗种子。
4)升华主题,提升素养。
让学生树立一种“对事不对人”态度,面对软件静态测试,无论是测试过程还是测试结果,都要有一种积极和建设性的非自我本位的正确态度,静态测试的目标是发现程序中的错误,从而改进软件的质量,“有则改之、无则加勉”。对于管理人员,更应该注意对静态测试结果进行保密,仅限于参与者范围内部,千万不要想利用静态测试结果谋私利。
4.4 极限留白,展示自主学习能力
学习了静态测试之后,因为之前的伏笔,学生就会迫切想知道动态测试。此时,教师顺势给各小组布置课外学习任务:如何高效地做动态测试?这是一个挑战性学生能力极限的任务,在学生掌控范围内,教师彻底放手,完全由学生自主学习,让学生最终感到胜任和自主,将激发更大的活力、动机和幸福感,提升自主学习能力。
5 结 语
自主学习作为一种能力,其形成和发展要经历一个渐进的、相对漫长的过程。通过“饥饿”创设情境,吸引学生投入到课堂学习中。通过讲授,为学生自主学习提供“示范”“支架”。通过恰当适切的提问等师生互动以及具有诸多不确定性的生生互动,为学生提供自主思考的机会,让学生多颗粒度提升自主学习意识。通过角色扮演和课堂讨论,让学生在课堂环境下,在教师和学生的关注眼光下自主学习,教师的适时“激励”,让学生投入、享受学习过程,产生学习兴趣,激发内在动机。最后通过课后思考作业,“放飞”学生,学生完全彻底体验自主学习过程,挑战自己的“极限”,检验自主学习能力。
第一作者简介:朱郑州,男,北京大学副教授,研究方向为教育大数据,zhuzz@pku.edu.cn。
引文格式: 朱郑州, 张齐勋, 宋行健. 一种面向学生自主学习能力培养的软件工程课堂教学设计[J]. 计算机教育, 2023(5): 155-159.
转自:“计算机教育”微信公众号
如有侵权,请联系本站删除!