acm-header
登录

ACM通信

BLOG@CACM

编程一小时:中学课堂的观察


今天下午,我在Meadowbrook学校这是波士顿郊外的一所私立中学小时的代码倡议。的组织者“编程一小时”项目的负责人想让这个国家的每个K-12年级的学生在这周尝试一小时的编程,这是一年一度的计算机科学教育周.这篇文章总结了我一天中与CS教育相关的一些观察。

物流

上周,中学的学生们填写了一份关于他们之前编程经验的在线调查,并被分为三组——初级、中级和高级。今天我们给每组在电脑室的一小时里做不同的活动:

  • 初学者(没有经验):Tynker特别为Hour of Code设计的练习,这是一种图形化的、基于块的编程语言,类似于刮伤
  • 中间(游戏邦注:基于之前玩过《Scratch》、《Lego Mindstorms》等游戏的经验):Codecademy JavaScript特别为《代码时间》设计的,然后Python提前完成的同学。
  • 先进的(有编程经验):CodingBat Python或者是一种定制的Tic Tac Toe游戏,尽管最后有几个学生玩了Codecademy Python相反,因为它提供了逐步的指导。

这些活动大多是自我引导的,像我这样的六个志愿者在房间里走来走去,根据需要提供帮助。因此,我们的教学不是传统意义上的“在教室前面讲课”。

结对编程

Margo苏打水(志愿者团队的一个头目)建议学生们在一台电脑前结对,这个想法非常成功!CS教育研究人员我知道这个事实很多年了,但它的效果非常好,所以值得一提。

以下是我注意到的主要好处:

  • 两人可以一起庆祝胜利,最著名的是在完成练习后大喊“耶!”和击掌,或者在成功调试错误后“哦!”我喜欢听到学生们克服障碍时偶尔迸发出的兴奋之情。如果每个人都坐在自己的电脑前,那么共享庆祝就不存在了。
  • 观察者(没有编程的学生)经常能在他们的搭档打字时发现打字错误和语法错误。这是非常有用的,因为初学者经常被拼写错误和语法错误卡住。
  • 观察者也可以观察他们的邻居在做什么,然后帮助他们,或者向他们寻求帮助。我看到有几对选手在帮助他们的邻居,或者至少和他们比赛,看谁能更快地完成当前的练习。
  • 成对的人会让彼此专注于任务,因为有一点社会压力让他们专注于手头的任务,而不是只是茫然地盯着屏幕或浏览网页。
  • 两人似乎更愿意向志愿者寻求帮助,因为他们好像是在自己先试图解决问题后一起被困在了什么东西上。独自学习的学生可能更不愿意承认自己被困住了,他们要么随意闲逛,要么完全脱离,开始上网。
  • 结对教学有效地将师生比例削减了一半。例如,6名志愿者在房间里漫游,可以很容易地对12对学生给予良好的关注,但要注意24个单独的学生就困难得多。

还有一些潜在的缺点:

  • 结对似乎很适合“完成任务”——即快速完成练习——但我没有看到学生停下来反思或内化他们刚刚学到的内容。这几乎就像他们在一起玩一个合作的两人游戏,所以他们有一些压力,要不停地移动。再次强调,结对对提高“生产力”是很好的,但也许一些单独反思的时间会帮助学生更好地内化知识。
  • 在极少数情况下,一个占主导地位的学生会霸占键盘/鼠标,做大部分的练习,而他们的同伴只是坐在那里被动地看着。我们试图推动学生们在每次练习后轮流使用键盘/鼠标。通常情况下,大多数配对都是以自然的方式关闭的。
  • 结对练习会让教室非常吵,所以需要安静时间集中注意力的学生可能会处于不利地位。
  • 内向的人可能在结对工作时表现不佳(见下文)。

自愿配对当前位置学生们选择自己的伴侣,这似乎是最佳选择,因为他们和对方在一起立刻感到舒服。我看到了很多玩笑,轻松的玩笑,和坦诚的来来回回,像“啊!你错过了这里的引用!看!!”,我认为,如果学生被随机分配搭档,这句话就不会存在了。

有时学生(尤其是女孩)想要三个亲密的朋友聚在一起,所以我们允许他们。有些孩子没有同伴,所以他们独自编程。我一定要多检查几个独来独往的孩子,以确保他们没有被困住;在大多数情况下,他们看起来都是内向的人,能够自己进步。(有人研究过对内向者进行结对编程的好处吗?)

戳屏幕另一个有趣的现象是,学生们经常戳屏幕,向他们的同伴暗示什么。有时他们使劲戳屏幕,屏幕就会倾斜。如果他们有一个可以记录戳痕的触摸屏显示器呢?那么,我们能否基于这种普遍观察到的行为为教育创建更好的结对编程UI呢?

基于web的实时编程环境

Codecademy's提供的基于web的实时编程环境JavaScript练习将IDE与图形输出的实时预览结合起来,学生每次更改代码时,图形输出都会更新。在下面的练习中,drawName()函数以颜色打印myName字符串变量的内容。学生们尽情地输入各种各样的昵称,调整颜色和形状。

这种环境非常吸引人,因为:

  • 学生可以立即开始通过访问一个没有文件下载或安装的URL。相比之下,一些高级学生试图破解一款Tic Tac Toe游戏,但他们不得不下载一些Python文件,在他们的电脑上找到它们,找到终端应用程序,学习使用命令行界面,cd到适当的目录,设置权限,执行Python,最烦人的是,弄清楚使用哪个文本编辑器,以及如何使用它……这一切都没有语法高亮显示的好处。
  • 语法高亮显示非常非常非常有帮助。相比之下,高级学生使用的CodingBat和纯文本编辑器没有语法高亮显示功能,因此学生犯的错误要多得多,比如忘记在字符串上加上结束引号。
  • 学生有一个实时预览不需要点击“运行”,就可以看到他们的代码编辑的效果,所以他们可以立即看到他们调整的结果。这个接口感到如此自然学生们甚至从未质疑过它;他们只是假设所有的代码都是这样工作的。我预测这些学生以后会问,为什么他们在将来用Python编程时需要一个单独的“运行”步骤,或者更糟的是,为什么他们在c++或Java中需要两个单独的“编译”和“运行”步骤。

Codecademy Python界面没有图形或实时编程(例如,有一个单独的“运行”按钮),但它仍然有无需安装和语法高亮显示的好处。总的来说,它感觉没有JavaScript界面那么精致,有很多小问题。(例如,它总是在执行结束时打印出额外的“None”,大概是因为隐式用户定义函数返回None。)

默认的错误消息是无用的(但会被忽略)

任何教过编程的人都知道,系统生成的错误和警告消息对初学者来说几乎毫无用处。一般来说,针对运行时错误的消息要比针对编译时错误的消息好一些,因为它们更具体。语法错误是最糟糕的,这是由于解析器行为的变化无常。警告可能看起来有帮助,但通常是神秘的,与初学者需要知道的无关。例如,Codecademy的一个JavaScript练习以以下代码开始:

文档。写(“yourName”);

学生应该把“你的名字”换成自己的名字。然而,IDE可能与一些类似lint的静态分析挂钩,生成警告,因为在那一行立即弹出一个警告,说“文档”。写作可以是一种评价的形式。”哇,这不仅完全没用,而且如果这是我第一次接触JavaScript的话,我会感到非常困惑。我甚至还没有写任何代码,就已经看到一个警告!

我建议不要直接将底层编译器/解释器的错误和警告传输到教育IDE中。至少,开发人员应该过滤掉像上面这样无用的警告,并尝试将其他警告翻译成人类可读的英语。

讽刺的是,我注意到的对学生有帮助的唯一警告——在JavaScript中使用未定义的变量——并没有提供。当学生拼错了变量名(这通常导致使用了未定义的变量),Codecademy IDE就会让代码执行,然后悄无声息地失败,而不做任何解释。学生们都被弄糊涂了,直到我帮助他们查找拼写错误(有时涉及到大小写敏感——例如,Name vs. Name)。

好在学生们很快就学会了忽略所有警告和错误消息.所以我想如果你留下无用的信息也没有那么糟糕;学生们只是忽略他们。这让我有点吃惊,因为当我观察的时候成人初学者学习编程这是第一次,他们更多地是在试图理解那些神秘的信息。也许孩子们对垃圾短信更“免疫”,没有那么大的欲望去理解他们在屏幕上看到的一切。开展一项研究,对比儿童和成人对这类电脑生成信息的看法,这将是一件很有趣的事情。

初学者很难创建好的错误消息

一般来说,为初学者创建更好的错误和警告消息是一个非常困难的问题,因为您需要一个健壮的模型来描述初学者常见的错误概念。例如,有一次我看到一个学生需要把两个变量相加,a和b,然后乘以2。那么他写了什么?

2 (a + b)

这就是数学上的写法。但是Python给出了什么错误呢?不,不是语法错误。代码实际运行,它尝试对2字面量进行函数调用,所以它给出"TypeError: 'int'对象不可调用" WTF?!?(Codecademy JavaScript显示“糟糕的调用”,这听起来像一个很酷的朋克专辑名,但不是一个有用的错误消息。)当然,正确答案是:

2 * (a + b)

但是一个刚上完数学课的学生怎么可能知道这些呢?2(a+b)在数学语法中看起来完全正确。

特定于问题的错误消息更好,但过于迂腐

学生唯一注意的错误消息是针对每个问题定制的错误消息。学生们似乎理解并注意到这些错误,并迅速纠正他们的代码以消除它们。

我不知道问题创建者用于生成这些消息的确切接口,但我假设存在一些基于正则表达式或运行时值跟踪的模板。ast匹配的模板语言会更强大,但也更难设计和使用;另外,处理有语法错误的代码也很棘手。

不过,这些错误中更多的细微差别会有所帮助。例如,一个问题要求学生创建一个my_int变量并将其设置为7。正确答案是:

Var my_int = 7;

这名学生写道:

Var my_int = 3;

因为他喜欢3号胜过7号。然而,IDE用红色大字对他大喊,说他错了,错了,错了,错了,错了,他需要将my_int设置为7。他问我:“为什么我要把它设置为7?”他说得很有道理;7只是一个任意的数字,没有任何意义。他的代码是完全正确的;这并不是说他有语法错误或将my_int设置为字符串。出于所有的意图和目的,他理解了将变量设置为整数字面量的概念,但却受到了一条错误消息的惩罚,就像那些写垃圾的学生一样严重:

var my_int hl2n3laf89uao3nl2n3sd9f34l

毕竟,两个字符串都匹配"var my_int",所以系统大概会触发问题创建者指定的错误消息“如果学生声明了my_int但没有将其设置为7,那么打印'你需要将my_int设置为7'”。

我们如何为问题创建者提供更健壮的方法来指定自定义错误消息?

好玩的娱乐活动

当学生们把注意力从问题陈述转移到现场编程环境时,他们似乎能学到最多的东西。例如,一些问题打印出明亮的颜色的文本使用变量,如:

Var orange = [40, 100, 60];

一些好奇的学生开始摆弄这些数字,看看它们会如何改变结果的颜色。其他学生想通过复制和粘贴现有的颜色变量并修改它来创建自己的颜色(粉色是常见的要求),比如:

Var粉色= [40,100,60];

学生们首先假设这些值是RGB(红、绿、蓝),因为它们是原色。但他们试图调整数字,发现它的行为不像RGB。事实上,这是另一种奇怪的编码方案。一名志愿者经过时喊道:“酷,这些值是RGB”,试图提供帮助,但他错了。学生们知道得更多,因为他们实际上玩过代码!

最后,学生们算出最后一个数字的范围是0到100,0代表黑,100代表白。然而,他们不知道如何正确地调整前两个数字,并感到沮丧。事实上,数据已经出来了HSV格式,这一点都不直观。但对于学生来说,尝试失败总比直接从老师那里得到答案要好(老师的假设很可能是错误的)。此外,实时编码环境在促进这种探索方面帮助很大。

完全无所畏惧

让我印象深刻的是,学生们在修改代码时是多么无畏——毫不犹豫地调整、调优、添加和删除代码行。相比之下,成人初学者我8月份在一个类似的环境中教过的学生(如下图所示)在摆弄他们的代码时要犹豫得多,并且尽可能严格地按照指导去做。

造成这些差异的原因有以下几种:

  • 孩子们,尤其是那些伴随着电脑和电子产品长大的孩子,比成年人更习惯于摆弄科技产品。
  • 学生们使用的是学校发放的电脑,而成年人使用的是他们自己的笔记本电脑。因此,学生们可能并不在乎他们是否意外地崩溃或搞砸了学校的电脑,因为他们自己的数据并不在电脑上。
  • 学生们使用的是基于网络的环境,而成年人使用的是安装在他们自己电脑上的本地软件。如果网站死机了,学生只需关闭浏览器并重新启动即可。人们凭直觉就知道,浏览器内部发生的事情是“在其他地方”的远程Internet服务器上,而不是在自己的计算机上。因此,他们知道即使浏览器崩溃(除非是极端恶意软件),他们也不会把电脑搞砸。

我们如何将这种无畏的精神注入到来自更多不同人口结构的学习者中?

性别和种族

另一个显著的观察结果是,高级班的女生(以及其他人数不足的少数民族)是如此之少。中级班有相当数量的女孩和(非亚裔)少数民族学生;虽然我没有观察初级班,但那里肯定有更多的女生,因为学校的性别应该是平衡的,所有的学生都必须参加。

好吧,这个事实本身并不令人惊讶,因为有大量的研究是关于这个国家的男孩(尤其是白人和亚洲男孩)如何更积极和鼓励儿童早期接触电脑,所以很可能他们会有更多的编程经验。

但更有趣的是:我不认为高级班的许多男孩都有那么高的水平。一种假设是,男孩们夸大了他们之前的编程经验(例如,在一个显示他们用X语言编程的方框上打钩,尽管他们只短暂地看到过一次)。当然,也有一些异常值,他们是真正的高级,但在大多数情况下,中级和高级学生之间没有明显的区别。

我没有做过正式的研究,但女孩(和少数族裔学生)可能会下意识地自我选择自己的中级水平,而男孩(主要是白人和亚洲人)对调查中一些更高级的问题毫无顾虑地回答“是”。(一个半相关的趣闻:我认识的一些技术女性不会在她们的简历上声称她们会编程语言X,除非她们真的而男人只会说他们知道X,即使他们只是简单地用了一下。)社会科学家和教育研究人员都知道这种少数民族自我选择向下的现象,但亲眼看到它仍然令人震惊。

此外,请注意,这是一所排名靠前的私立学校,所以这里的学生在自我效能方面的得分应该比这个国家的大多数没有机会进入这样一所优秀学校的孩子要高得多。如果这里的女孩和代表性不足的少数民族可能低估了自己的能力,我无法想象这个国家的其他地方(更不用说世界上了)这个问题有多糟糕。在每个有潜力并热爱编程的人都有机会做到这一点之前,我们还有很长的路要走。

随机的花絮

以下是一些有趣的观察:

  • 有些学生以前从未输入过“[”和“]”字符,在键盘上找不到它们。他们甚至问:“这些叫什么?”这完全说得通,因为人们在写英语时通常不会输入这些字符。
  • 一些学生认为“布尔”和“布尔”听起来很有趣。
  • “漂浮?你是说像冰淇淋花车那样吗?”
  • “我以为蟒蛇只是一条大蛇。”
  • 很酷的问题:“这和你在Tumblr上写代码的方式一样吗?”(Tumblr指的是博客文章风格的标记语言)
  • 更深层的问题:“这像数学吗?这和数学有什么不同?我以后做编程需要学微积分吗?”

分开的想法

对我来说,衡量成功的关键指标是,大多数学生在上课时间到了,不得不离开电脑的时候,仍在痴迷地编程。很少有学生在上课时间走神。大家的参与度都很高,这在很大程度上要归功于志愿者团队,他们帮助学生们在关键时刻摆脱困境。

愤世嫉俗的人可能会说,学生们并不是真正的“学习编程”——他们只是走过场,敲击键盘,遵循指示,让屏幕上出现颜色。当然,没有人能指望学生在一个小时的编程中深入学习或记住任何东西!但这个活动的目的只是让学生们对编程有一个初步的了解,并希望激励他们中的一些人继续前进。考虑到这些目标,我认为这是一个令人振奋的成功!


没有发现记录

登录为完全访问
»忘记密码? »创建ACM Web帐号
Baidu
map