论文阅读笔记_002

CodeSpells: Embodying the Metaphor of Wizardry for Programming

Posted by     "Daveedo" on Sunday, April 18, 2021
6096 Words|Read in about 13 Min|Total Reading number of this article is times.

CodeSpells: Embodying the Metaphor of Wizardry for Programming

CodeSpells’ webpage, twitter, Steam link

Abstract

此文阐述了CodeSpells是如何通过一个内嵌API以及巫师(☆-v-)的比喻概念让用户/学生参与学习Java编程。把具体代码提供给新手程序员的这种学习方法其实是被鼓励的,且已经被证实可以帮助学生更容易地理解编程的概念。很多人也已经尝试了为他们提供:一种可视化的编程语言、一个硬件组件亦或是一个更容易上手的应用程序,从而改变学习者的学习体验。此项研究的优点是,可以让学生更好理解抽象代码是怎样影响整体环境的。

我们通过CodeSpells,且在这项研究的基础上,通过体现让新手沉浸在代码的抽象中,让他们理解复杂而抽象的编程问题,就像他们被自己所写的东西影响一样。在本文中,我们 提出了一种新的新手编程环境的方法,这种方法体现了用户,并鼓励快速掌握入门概念,然后通过探索深入理解。

1. Introduction

CodeSpells通过沉浸感来加强学习效果。市面上已知的可视化编程(如Alice, Scratch), 亦或是游戏化编程环境(如Kahn Academy, Codecademy),以及例如媒体计算的应用环境都不被作者认为是“沉浸式”学习环境,也就无法给学习者带来深层次的概念理解。

本篇论文的下部分,着重讨论了其他编程语言和编程环境与CodeSpells的对比。之后更深入的讨论了CodeSpells的API、作者在CodeSpells中为学习者打造的沉浸式学习环境与属性,以及以上内容对于学习者的帮助。

最后介绍了一项探索性研究的结果,并讨论该结果会如何影响未来的发展和开发。

2.1 Programming Languages

诸如Basic, Pascal的语言在早期以牺牲真实性的代价,来帮助新手编程。如今也有Alice, Scratch, Lego Mindstorms等,提供了无语法的编程界面,采用拖拽和释放方块的方式帮助新手编程。类似的,Toque和Tern系统允许用户通过模拟物理模块,在Wii前面做出烹饪的动作来编程。

然而,在学术界,至少对计算机科学专业的学生来说,已经出现了一种反潮流的行业标准语言教学。这导致了一场关于哪种行业标准语言能在可接受性真实性之间达到最佳平衡的最佳新手语言辩论(原文叫做Optimal Novice Language Debate)。

CodeSpells规避了这种非此即彼的权衡,重点依赖丰富的游戏玩法,来激发玩家去自发的参与关于编程概念与语法的挑战。CodeSpells的实现也同时包含了游戏引擎和编程引擎,使任何编程语言的应用都变得可行。

Guzdial将他的媒体编程教学法渗透到了CS1课程中,该教学法在Java和Python中增加了以新手为中心的库,以帮助对照片、音频片段和其他富媒体进行编程操作。 虽然学生不一定会沉浸在媒体计算中,但他们通过一个平易近人(已知)的应用:照片操作,来了解复杂的概念。即使学生没有使用Photoshop等程序的经验,他们也能理解摄影的基本效果(如灰度、绿屏效果)。

另一方面,Scratch, Alice, Logo family, Lego Mindstorms类的环境通过提供可观看和探索的场景来吸引用户(也就是俗称的可视化),使学习者能够完全控制自己影响的环境,从而也能更好地了解自己更改的代码所带来的改变的意义。但它们(指以上几种编程语言)都为“沉浸式”体验,牺牲了真实性。

而CodeSpells提高了参与度,从而提高了真实性。

2.2 Context of Programming

提供新工作领域可以使程序有新的意义,从而增强学习者的积极性和持久性。

最近加强的”How to Design Programs”为二维动画的编程提供了一种方案环境(scheme environment)。

但上述二者都需要外部的学习支持(比如文档/参考资料),且缺乏第一人称视频游戏的激励作用。

Logo程序允许用户调动屏幕上的 “乌龟”;Alice和Scratch程序允许用户创建3D和2D动画(分别);Lego Mindstorms程序允许用户影响嵌入在乐高仪器中的微控制器。

而CodeSpells的情景化隐喻的完整性,意味着既不需要像上述系统那样补充讲义,也不需要教科书。几乎所有学习资源都无缝地交织在游戏中,使游戏成为一个自成一体的学习环境,即使在没有正式教学的地方也可以使用。

任务为新手提供了与教学相关的任务。

编码结构是通过咒语书介绍的。坚持下去的理由来自于第一人称的故事情节、徽章和视觉刺激的3D环境。

同样,CodeSpells的方法也有别于许多流行的游戏构建环境,其中许多环境在课堂上使用:例如Greenfoot、NetLogo、Unreal Scripting、RPG创造者、星际争霸地图编辑器、Kodu、Spring RTS引擎和ToonTalk。CodeSpells是一款RPG(角色扮演游戏),它能让学生更充分地沉浸在游戏的玩法中,同时也能让学生参与到学习中。课堂上使用的大多数游戏都要求学生成为 “建造者 “或 “工程师”,但实际上并没有受到代码的影响。我们希望注重让学生 “感受 “到自己的修改和程序的效果,而不仅仅是 “见证”。

3. A New Programming Context 新的编程环境

3.1 An Immersive Video Game 沉浸式的电子游戏
3.1.1 The Metaphor 隐喻

此段的重点在“Magic”魔法的概念上。

把代码比喻成咒语,开发出的程序比喻成”咒语释放/法术”

通过读咒语->施放法术->解决遇到的问题这一流程,来模拟现实生活中的”写代码->开发功能/程序 -> 实现需求”。

法术书的存在,虽然也相当于“开发文档”,但不会过度降低沉浸感。

同时,游戏中IDE的存在也为代码测试提供了良好环境。

3.2 Designing for Embodiment 设计的体现

本节讨论了API,特别关注作者是如何设计 “类和方法” 来鼓励玩家从第一人称的角度来理解法术(程序)的效果。

3.2.1 An Innovative API 创新的API

作者设计的API类似于Java网络小程序(Java web applet),Applet被子类化,实现了run()方法,我们有一个超级类Spell和实现cast()方法的子类。

在玩家的法术书中,提供给玩家的第一个法术是火焰法术。玩家将这个咒语施放到一个易燃的物品上,然后这个物品就会被点燃。

public class Flame extends Spell{
    public void cast(){
        Enchanted thing = getTarget()
        thing.onFire(true)
    }
}

作者的第一个挑战是让法术足够强大,让玩家可以比较轻松地与环境互动,但又足够真实,让玩家可以参与CS1课程中呈现的典型概念。作者研究了Guzdial的Media Computation以及Alice和Scratch中的力量和真实性的平衡,并决定了一个接近现实的阈值,让玩家可以轻松完成在现实世界中很容易完成的任务(点火、前进),但让困难的任务被表现为复杂的法术,结合简单的API调用和典型的CS1级概念,如循环、条件和参数。

除了让复杂的魔法难以实现之外,作者还希望其他直观的平凡任务也能变得简单。作者的经验法则是,如果一个任务在现实世界中通常不需要经过太多的意识思考就能完成,那么它在幻想世界中应该只需要最少的代码。

其中一个这样的直观任务是指定和谈论作者周围世界的事物的能力。

作者通过各种指针、手势和命名的组合来实现这一点–所有这些都可以在几乎没有意识思考的情况下完成。作者认为,如果这种直观的任务需要编写大量的代码,那么玩家很快就会因为API缺乏表现力而感到沮丧。 作者用3个中级程序员(计算机专业的本科生)在3个月内尽可能多的制作复杂的法术,来测试其API的局限性。

在这个过程中,作者观察了他们,当他们因为一个最小的API而挣扎时,我们对API进行了改进。虽然一旦对CodeSpells及其学习效果进行更大规模的研究后,可能会进一步完善,但作者相信,他的咒语的具体程度(specificity)将促进对典型CS1学习目标的理解。

这个设计过程的两个关键成果是用于

(a)表达实体引用

(b)指定空间操作的直观机制。

正如我们将看到的,出现的基本设计规则是使API的工作方式类似于人类在执行日常任务时的思考和工作方式。 也就是说,界面不仅要让平凡的任务变得简单,而且界面应该通过类比日常经验而易于理解。因此,在很多操作中都通过对人物的参考而设计了一定程度的体现。

下一节具体讨论了CodeSpells时如何对新手程序员产生影响的。

4. Embodiment 体现

4.1 引用对象
4.1.1 Entity Reference 实体引用

首先需要获得实体(为了选择魔法施放的对象),而且作者希望可以尽可能简化这一操作。于是便引用了上述的getTarget()函数来处理各种琐碎的情况。

然而开发过程中,很快出现了需要引用多个实体的情况(例如将实体A移动到实体B的位置)因此作者便增加了通过“名字”引用某些特殊实体的功能。

例如,玩家可以通过

Enchanted e = getByName("Me")

来获得对自己在游戏中人物的引用。

为了使这一功能变得实用,游戏中某些固定且永久存在的实体,都被赋予了永久(permanent) 的名字(例如,”Me”, “Rain”),名字都收录在咒语书中。下面的咒语(代码)示例,可以让名为”Rain”的local实体,雨云,跟随玩家的行动:

public class SummonRain extends Spell{
    public void cast(){
        Enchanted rain = getByName("Rain");
        Enchanted myself = getByName("Me");
        while(true){
            Direction toward_me =
                Direction.between(rain, myself);
            rain.move(toward_me, 5);
        }
    }
}

当然,不是所有实体都是特别的。如果玩家需要引用某个普通实体,可以选择为该实体命名,再使用getByName()来对其进行引用。

4.1.2 Referencing Groups of Entities 一组实体的引用

当然,在需要引用大量实体时,给每个实体起名字并声明20个Enchanted类型的变里是很冗长乏味的。

作者首先尝试了getWithinRadius(float)方法来查询一个实体周围半径内的所有实体,但遇到了很多问题。比如会获得比自己想要的数量更多/更少的岩石。这个问题的根源在于无法只管判断半径大小。

解决这个问题的方法是让“视觉”发挥直接作用,作者设计了一个可以用来指定静态效果区域的魔法仗,将该魔法杖放在地上会现实一个半径,此半径内的全部实体会被选中,并在该区域上方显示该区域的文字名称。当然,区域大小可以根据玩家需求调整。

下面的例子是用法杖创造名为“Fire Trap Area”(火力陷阱区):

public class FireTrap extends Spell{
    public void cast(){
        Enchanted area = 
            getByName("Fire Trap Area");
        while(true){
            EnchantedList List
                = area.getWithin();
            for(Enchanted e : List)
                e.onFire(true);
        }
    }
}
4.1.3 Vector Math 向量数学

在游戏中也需要玩家在3D空间中操控实体,但需要规避线性代数、几何学、三角学等数学概念。

因为CodeSpells是一款第一人称游戏,所以可以利用玩家现有的体现直觉(视觉)来简化API。通过轻松地移动和转动头像,并且能够根据投降的位置和旋转来编写代码,让玩家不需要高阶数学知识就可以做到在3D空间中操控实体。

在CodeSpells中,

有4个人物的参照方向: 前、后、左、右。

有6个世界参照方向:上、下、北、南、东、西。

下面示例的法术,使用“向前”的方向,让玩家站在法术的目标实体(例如魔毯)上面时可以飞行。因为“向前”取决于玩家当前所看到的方向,所以该法术的行为会受到玩家的动作和头部旋转的影响。

public class Flight extends Spell{
    public void cast(){
        while(true){
            target.move
                (Direction.forward(), 0.2)
        }
    }
}

除了这个使用API强大而直观的空间承受能力之外,上面唯一使用的 “神奇的”API调用是基本的move()操作。但它被封装在一个非终止的Java控制结构中,因此它将一直运行到玩家手动停止魔法为止。在这之前,玩家可以在她的虚拟3D环境中自由飞行,而不需要知道使这一切成为可能的底层矢量和四元组。

4.1.6 Emergent Pedagogical Properties of Embodiment 体现的新兴教育学特性

身临其境的RPG所灌输的体现体验,让CodeSpells程序(咒语)有可能比用Alice或Scratch编写的程序更具有个人意义。

CodeSpells的玩家不是在制作电影或游戏(就像在Alice或Scratch中一样),而是能够活出本质上体现的幻想。通过跳到一个无生命的物体上面,施展飞行法术,玩家可以活出飞行的幻想。很多网友都表示,这是一种享受。

因此,学习CodeSpells编程的情感回报率会很高。此外,由于我们将API设计得非常简单,一个只有几行字的咒语就能阻挡住新手和这些成就感和快乐的时刻。

学习者只需要达到少量的学习目标,就能得到积极的反馈。

5. Evaluation 评价

验证了API环境的可应用性之后,作者对新手程序员的能力进行了相关探索性研究。

  • 正确使用法术而不加修改
  • 正确修改法术,以达到预期的目标
  • 使用目前存在的API创建自己的法术
5.1 方法

每位受试者在参加研究前都完成了一份背景调查问卷。在研究开始之前,我们的研究小组成员会向每个受试者介绍游戏的机制。 然后,我们鼓励他们尝试解决游戏中的任务,但不提供任何其他指导或协助,除非他们要求。我们用标准的视频设备记录了每个环节。最后,我们进行了一次15分钟的半结构化的离职访谈,在访谈中我们询问了他们的沉浸式体验。

6. Results

作者首先讨论了被试者与程序的互动能力,然后讨论他们在游戏中的沉浸感。

6.1 Using Spells

每个受试者都能够成功地施放咒语书中的8个咒语中的至少6个(这意味着他们能够成功地执行8个小型Java程序中的6个)。魔法书中提供的文件不像教科书或教程那样详细,因此,在没有任何CodeSpells API或任何Java经验的情况下,在45分钟的时间内阅读和测试咒语,并正确理解这些咒语是令人震惊的。

6.2 Modifying Spells

每场45分钟的课程中平均有20次代码编辑。代码编辑被定义为对方法参数、循环迭代次数、整个API调用或移动/添加/删除整行代码的成功改变。这种与代码互动的程度让作者感到惊讶,尤其是每一次代码编辑都是朝着一个预期目标的积极变化。

6.3 Creating Spells

最后,只有2名受试者能够成功地完成向他们提出的所有8项挑战,并写出了自己的咒语。当他们完成挑战后,他们能够提出自己的挑战,并设计出自己的解决方案。其中一个被试设计了一个特别有趣的法术:一个传送门法术,利用法杖(在4.1.2节中介绍过,是用来引用许多物体的)在河的一边制造一个传送门,并将任何踏入传送门内的东西送到另一边。这个创新在如此短的时间内是非常积极的。

6.4 Physical Immersion and its Value System 物理沉浸效果与价值系统

此段描写了课程结束后的访谈中,有关沉浸式属性的效果信息。

Physical Immersion. 受试者在谈论游戏中发生的事情,都习惯用“我”来称呼自己操控的对象,与其他互动环境(如Alice)不同,Alice用户通常以第三人称的方式来谈论场景中的物体。

Value Immersion. 在游戏中遇到特别难的挑战时,大部分玩家都倾向于不放弃,寻找解决办法。这和新手程序员在学习编程时的情况不同,编程时遇到程序不能正常运行时,很多典型的新手程序员会有气馁感以及挫败感。但此游戏的沉浸感、与“电子游戏”的概念,使得受试者认为自己是”玩家“而不是”程序员“

7. Discussion and Future Work

这项研究对计算机科学教育界来说特别有意思,因为它已经开始解决两个主要的问题。

  1. 学生无法理解抽象程序对环境的影响;
  2. 学生在困难的编程挑战中取得成功的决心。

作者在3个月内也有更大规模的研究实验计划,此处不描写。

8. Conclusion

作者希望为新手程序员打造一个沉浸式编程环境。

此项研究(CodeSpells)对行业有2点贡献:

  1. 使程序员在45分钟内阅读、执行、理解、修改和编写CS1级别的Java程序变得可行
  2. 使新手程序员沉浸在他们的编程环境中,从而使其养成了解决问题的决心以及对编程挑战的积极态度。


Reference: CodeSpells: Embodying the Metaphor of Wizardry for Programming