结对编程:中小学编程教育的首选教学组织形式*
2022-03-23刘敏汪琼
刘 敏 汪 琼
(北京大学 教育学院,北京 100871)
引言
最近十年,各国纷纷将开展中小学编程教育作为储备科技人才、增强国际竞争力的重要工作举措之一。自2013年英国率先提出小学生要学习编程以来,包括中国在内的许多国家也提出要普及中小学编程活动[1]。目前,国内不少中小学已经增加了编程教学课时,并肯定了编程教育的价值[2]。受益于经济发展,大多数编程课已可以保证学生人手一台设备,但是“独立编程”并不是编程教学的最佳组织形式,目前流行的项目式编程教学也不一定能让每个学生都发展编程能力,而在计算机行业盛行的“结对编程”则被证实是行之有效的编程能力提升路径。
结对编程(Pair Programming)是指两个程序员在一台计算机上协同开发同一个编程任务的工作方式。人们常用驾驶汽车时的角色分工来解释结对编程:控制键盘、鼠标并编写代码的人为驾驶员(Driver),而旁边持续观察、监控程序逻辑并提供辅助支持的人为领航员(Navigator)。一旦遇到问题,双方共同讨论解决。驾驶员和导航员可以根据工作内容自由地、周期性地交换角色,但在任何时候双方都应是平等参与并共享编程产出。1999年,Beck[3]提出包括结对编程在内的12项极限编程(Extreme Programming)实践,颠覆了原来软件工程领域主流的瀑布式开发模式和螺旋式迭代的原型开发模式,强调程序员借助同伴的力量即时解决问题、把控编程质量,以解决企业开发周期长、迭代成本高等问题。三种软件开发模式如图1所示,可以看出结对编程所属的极限编程模式是在并发地完成软件开发的基本步骤,即分析、设计、开发和测试四个步骤同时进行。
图1 三种软件开发模式(来自Beck)
结对编程在企业中的成功实践很快引起了计算机科学教育工作者的关注,他们认为结对编程也可以运用于教学场景中。目前,国外已经积累了丰富的结对编程教学经验,并且已有研究发现:结对编程在提高学生编程能力、计算思维、编程学习热情、元认知等方面有积极效果[4][5][6]。
但是在我们向一线老师推荐结对编程的时候,常会遇到挑战:“结对编程与独立编程或项目式编程相比有何特别之处?”“中小学生编写的程序都不长,有多大必要非要两人用一台设备结对编程?”“如何结对效果最好?”……为了有理、有据地解决一线教师的疑惑,本研究进行了较为广泛的文献搜集、分析并综述了国外有关结对编程的实证研究成果,据此剖析结对编程的学理价值和成功关键,以期推动结对编程在我国中小学的应用,进而开展更为有效的编程教育。
一 结对编程的独特优势
有效的教学组织形式需要与教学目标、教学内容相适应,学生要想独立学好编程并非易事。Winslow等[7]发现,计算机专业的学生在专业入门课程中往往会被挫败感压垮,导致学业表现不佳甚至直接退课或转专业;Simon等[8]也指出,学生在独立编程过程中是非常孤独的,并且学生在学习伊始很容易丧失信心和学习热情。
除了挫败感和孤独感外,学生在独立编程的过程中还需要克服很多其它障碍,如学生需要接触并掌握一种新的计算思维方式,“像程序员一样思考”,并且面对困惑和不确定性时能够及时反思[9],否则其编程学习很可能是低效的甚至是无效的[10]。缺少个性化的学习反馈也是学生面临的重要困难之一,当学生在编程过程中遇到困难而得不到即时反馈和解答时,学生的学习进度和信心都会受到影响[11]。此外,学生初学编程时往往需要花费很多时间才能定位错误代码,完成程序调试[12]。要想克服这些独立编程时常见的问题,需要学生有充分的自信、勇气和韧性。
项目式编程在一定程度上可以缓解或解决上述问题。与学生单独学习编程相比,项目式编程能够较为有效地提升学生的编程学习效果、学习动机和满意度。但是,目前流行的小组合作编程学习也存在一定不足,如实证研究发现小学生在合作编程学习活动中难以有效学习“事件”(Events)、“并行”(Parallelism)等较为复杂的计算思维概念,而且小学生的漏洞调试能力(Debugging)在小组合作中的提升也较为有限[13][14]。不过,项目式编程与结对编程并不冲突,因为项目式学习中的每段程序也是可以以结对编程的方式产出的。
与项目式编程中多人分工独自编程的组织形式相比,基于出声思维的双人协作结对编程规程简单,结对学生双方的对话让编程思维显性化,加快了即时反馈的频率和效率,有利于学习并掌握计算思维逻辑。有研究发现,结对编程能够强化学生对计算机科学知识的记忆和理解,同时显著提升学生的计算思维能力和推理技能[15]。结对编程为结对双方提供了在社会互动中建构意义的机会,学生在提出自身编程方案的同时,倾听与尊重对方的观点,这对于学生超越依靠自身努力可以企及的理解程度、开展深度的编程学习有重要作用[16]。而且,结对编程能够增强学生的编程学习动机并提升其面对挑战时的毅力,尤其是能显著提升女学生的自信心和编程学习兴趣,而同伴给予的帮助、支持、鼓励、关注也都对女学生的学习动机和效果有促进作用[17]。
此外,结对编程还能有效消解学生对计算机编程学习的恐惧。Bergin等[18]指出,很多新手学生会畏惧编程这一未知的知识领域,对编程学习缺乏信心,而让学生尤其是表现不佳或起始学习水平较低的学生单独学习编程更是会加剧其恐惧心理,进而导致其不愿意主动发起讨论或表现出其它消极的学习行为。也就是说,学生在学习编程时的自信程度和自我效能与其舒适度有关,且会通过学生的编程学习行为而最终影响其学习效果。Wilson等[19]的研究也发现,舒适度是影响新手编程学习效果的重要因素,学习者的恐惧情绪会导致其无法集中注意力、自我怀疑并开始厌恶编程学习。而在结对编程的过程中,结对双方轮流扮演纠错者的角色,并逐渐适应不断发现问题并调试代码的编程文化,这可在一定程度上消解学生对编程学习的恐惧。
基于丰富的实证研究结果,以及对独立编程、项目式编程和结对编程的比较,本研究认为结对编程是编程教育中卓有成效的教学活动组织形式。中小学阶段是培养学生编程兴趣和能力的初始阶段,采用结对编程教学组织形式,可以有效保护并保持学生学习编程的兴趣和自信,支持其在相互支持和鼓励中快速、扎实地掌握编程的基本技能。
二 结对方式的多视角研究
“如何结对最合适”,是初次接触结对编程的人常问的问题。以下多视角的研究发现能够给教师一定的参考和启发。
从互帮互助的角度来看,教师可能希望有编程经验的学生与没有编程经验的学生结对搭配。但是,有研究发现编程能力较强的学生在不匹配的结对编程中学习满意度较低,而能力较弱的学生满意度更高、编程能力提升速度也更快[20]。有研究揭示了造成这一现象的部分原因:经验较为丰富的学生往往对同伴缺乏耐心,认为向同伴解释编程概念并等待同伴理解是“浪费时间”,因而选择独立完成编程任务[21],中等和较低编程水平的学生则因为可以在合作中观察水平较高的学生解决问题而从中受益[22]。
有关结对规则影响结对编程学习效果的其它研究也表明:结对出现问题的关键可能不在于学生的年龄、性别、能力等特征,而在于结对同伴之间能否建立平等关系[23]。真正影响结对编程实施效果的,是学生感知到的结对匹配度[24]、与同伴的合作态度和意愿[25]等。这些研究发现提醒我们:结对双方各方面的差异不要太大,明确角色分工和合作规程将有利于消除或减少矛盾的发生。例如,Williams等[26]主张通过教学视频帮助学生理解“驾驶员”和“导航员”的角色、轮换角色的重要性,并强调结对编程中双方积极参与的价值。
一般来说,中小学学生编程能力差别不大,且适应能力强,有实证研究发现良好合作的结对双方其角色分工往往并不是泾渭分明的,而是可能在合作过程中自然出现“教师—学生”或“思考者—实干家”等有效且充满活力的学生角色分工变体[27]。多项调查研究结果显示,多数学生比较满意结对编程的学习过程。例如,Carver等[28]发现不管是根据个性特质还是根据编程成绩表现进行配对,学生对结对编程的满意度都较高;学生普遍认为结对编程过程中双方能够平等地交流和进行角色轮换,公平地承担工作量。
在编程教育领域,对女生和弱势群体学生的研究也对学生结对编程策略有所启发。例如,Kaur等[29]发现两个同性别的组员更倾向于民主协商,而异性成组更容易催生权威角色;Ruvalcaba等[30]指出,社会经济背景较差的学生和拉丁裔学生在结对编程过程中提出异议、提问质疑、解释、指明方向、对抗等行为的频率较低。可见,在编程教育中有意识地开展同性别结对或相似社会背景学生的结对,对于激发女生和弱势学生学习编程的兴趣将有所助益。
三 结对编程的常见问题
1 “独立编程+需要时讨论”与结对编程哪个学习效果更好?
前文介绍了结对编程的优势,说明了结对编程比独立编程更有助于初学者掌握计算思维,而且可以增强学生的编程自信。但是,仍有教师认为对初学者来说,结对编程并非必要,因为程序不长,独立编程的学习速度似乎更快——Shah等[31]的研究证实了这一点:与独立编程相比,结对编程的小学生需要更多时间才能完成编程任务,因为学生刚开展结对编程时,沟通与合作会占用相当一部分的时间。此外,中、小学生在结对编程的过程中可能会出现不平等的沟通与角色分工,这会影响结对编程的效果和学生的学习体验。
Lewis[32]比较了结对编程与“独立编程+间歇性合作讨论”(学生各自在电脑上独立完成同样的任务,每隔5分钟与同伴开展一次讨论)的学习效果,其研究结果表明:两种干预下六年级学生的成绩没有显著差异,但参与结对编程的学生个人成绩差距较大,其原因可能在于结对编程中可能出现的不愉快合作会削弱学生的掌控感和学习热情,异质结对模式下弱势学生会成为旁观者而缺乏参与,导致个人成绩差距拉大;接受独立编程+间歇性合作讨论干预的学生对待学习Scratch、参与编程课程以及未来从事相关职业的态度都更为积极,完成编程任务的速度更快,但这也可能是因为存在“对答案”的行为。
Lewis的研究发现似乎说明:结对编程并非最佳的教学组织形式,而在独立编程活动中增加定时讨论所取得的学习效果更好。这种间歇式合作讨论虽能在一定程度上确保学生的思维沟通基本处于同一个进度,但在现实中却很难让合作真实地发生,可能会出现学生认为没什么要讨论的而各自继续忙编程的情况,从而失去相互学习、相互启迪的机会。还有一些实验也有类似的研究结论,这是因为没有理解结对编程要求两人一台电脑的学理机制,或者说没有看到编程活动背后合作质量的重要性:相较于独立编程过程中随机出现的合作,结对编程的优势在于用合作规程强行让两人同步思维,学生可以更容易辨识出彼此想法的差异、更方便观察和模仿同伴,故更容易在此过程中提高自己的编程能力。可以说,结对编程创造了合作互学的“合法性”机制。
2 怎样有效地开展结对编程?
虽然结对编程有出声思维、合作学习等促进深度学习的基因,但在实施过程中如果学生不理解这些内涵,也难以达到理想的教学效果。例如,结对编程中常见的现象是双方都迫不及待想当“驾驶员”,而担任“领航员”时注意力往往不够集中,并且双方在交流上存在争吵、忽视同伴声音等问题,这多是因为学生还没有学会合作,需要教师为学生提供合作技能和冲突解决训练、向学生示范结对编程活动形式、帮助学生明确结对编程中的角色分工等[33],而不能因为学生不会合作就让他们回到低效且易孤独的独立学习模式。那么,怎样有效地开展结对编程呢?
针对上述问题,研究者纷纷展开了深入的研究。例如,Denner等[34]关注结对编程中的哪些同伴互动会影响学生的“无畏探索”(Intrepid Exploration,即在完成任务的过程中不惧挑战和挫折而勇于持续探索),为此他们对16名中学生的结对编程过程进行录像和编码分析,结果发现:在结对编程过程中同伴双方平等的意见交换、动态的角色分工、用语言或非语言方式互相鼓励等行为对学生的“无畏探索”有积极推动作用,而不平等的沟通乃至权力争夺、“领航员”注意力分散等行为会产生阻碍作用。Shannon等[35]招募了66名中学生开展基于Alice设计开发动画游戏的结对编程教学实验,运用扎根理论对结对编程视频录像进行分析后,发现学生在编程中出现了合作、破坏、探索三种行为模式:合作行为有学生双方通过语言或非语言的交流来分享观点和解决方案等;破坏行为有“驾驶员”独断专行、霸占电脑控制权以及毫无建设性的争吵或消极抵制对方想法等;探索行为强调结对双方批判性、建设性地进行观点交流,包括阐述、解释、辩论、倾听、反思等,为此他们建议:在开展中小学结对编程的过程中,教师应该密切关注结对双方的行为表现,及时处理不平等、具有破坏性的行为。上述两项研究发现有助于教师在开展结对编程前对学生进行合作话术培训,以及在结对编程的过程中辨识合作是否和谐。
此外,还有一些研究关注结对编程过程中角色轮换的时间间隔对学习满意度的影响。例如,Zhong等[36]将150名六年级学生分为四组,分别按照在结对编程过程中每5分钟轮换角色、每节课(20、30、40分钟)后轮换角色、每项任务(5~15分钟)后轮换角色、学生自主决定一节课内何时进行轮换操作,结果发现:自主决定何时轮换角色的小组和每5分钟轮换的小组更享受整个结对编程过程,其原因可能在于这两组学生的自主权得到了尊重;在半结构访谈中,有学生表示每5分钟轮换的方式更像“跷跷板”,这对学生来说更加平等、也更有趣味。
3 结对编程真的能培养学生的独立编程能力吗?
结对编程能否培养学生的独立编程能力是教师关注的重点问题之一,尤其是对于那些编程能力较弱的学生,教师十分担心他们在结对编程中会过度依赖同伴,等到需要他们自己独立编程时就很可能会面临失败。而对这一问题的相关研究证明,结对编程教学至少不会对后续学生独立完成编程产生负面影响:
①多项追踪研究的结果表明,结对编程学习经历能为学生后续的独立编程打下良好基础,使学生更有可能获得独立编程的成功。此外,与独立编程的学生相比,有结对编程学习经历的学生在增加任务难度时,其成绩下降幅度明显较小[37]。
②有研究通过访谈发现,学生也认为结对编程为其后续独立编程奠定了较为扎实的基础[38]。Smith等[39]以2468名参加“计算科学导论”课程(Introductory Computer Science Course)的学生为样本,追踪他们两年的学习成绩表现,发现结对编程能够显著提升学生长期的学习成绩,而且对初始成绩较差的学生影响最大。需要注意的是,已有的证实了结对编程具有长远影响的文献多以大学生为研究对象,而直接讨论中小学生结对编程长期影响的实证研究较少。
③现有的一些研究间接地论证了中小学结对编程的长期影响,认为结对编程有助于培养学生的元认知能力,这能间接地作用于学生后续开展资源分配、策略调适以及独立编程等任务情境,但前提是需要教师有意识、有策略地将元认知教学融入编程教学中。例如,Breed等[40]以南非贫困地区郊区学校的99名中学生为研究对象,发现在编程教育过程中学生的元认知能力发展并非自然发生,常见的情况是教师对元认知了解甚少,或是教师有意识地开展一些元认知练习活动但学生不愿意花时间参与其中,而是更愿意花时间完成编程作品,故提出应首先增强教师自身的元认知意识和价值感知,并为其提供教学设计指导,这从长远来看对于提升学生的元认知能力有积极作用。后续研究肯定了这种长期积极影响的存在,认同在结对编程过程中融入元认知会对学生的计划、信息管理、监控和评价等元认知策略的运用有显著的正向促进作用。
目前,虽然较大规模追踪中小学结对编程长期影响的研究成果较少,但上述研究发现也还是给出了一些积极答案。基于此,教师在一线教学中可以持续关注这一问题,并与研究者共同探索如何促进结对编程向独立编程顺利过渡、结对编程这种教学组织形式有何长期影响等问题。
四 总结与展望
结对编程利用“学习在交谈中发生”的学习发生机理,通过“出声思维”让结对双方共同发现问题、集思广益出对策,有助于学生形成计算思维、学会合作,建立编程自信,掌握编程能力,培养克服困难的韧性,理应成为中小学编程教育的首选教学组织形式。
梳理并分析上述研究发现,本研究归纳出在中小学阶段开展结对编程的四个要点:①告知学生出声思维的要求、价值和作用,强调在结对编程中双方即时交流思维的重要价值。②定时轮换角色,如5分钟一换。这不仅是让每个学生都有机会操作练习,也是为了防止“导航员”松懈走神,逼着他们同步思考以顺利接手。刚参加结对编程活动时,一些学生以为从“驾驶员”换到“导航员”就是休息,意识不到“导航员”角色其实更烧脑,如需要主动预判、系统化查漏补缺等,故在角色轮换方面还需教师予以点拨和指导。③教师要认识到不同结对模式下所需的教学支持和干预不同——在同质性分组中,教师需为能力较差的小组提供即时的支持和反馈;而在异质性分组中,教师更需关注组内学生平等的角色划分和学习参与,通过观察学生的话语和行为表现及时调节不平衡的学生关系。④教师在结对编程教学过程中应注重元认知能力的培养,帮助学生实现从结对编程向独立编程的顺利过渡。后续研究可进一步细化结对编程的作用路径和实施策略,并以此为切入点剖析合作学习对编程教育的影响。