我在必修的入门编程课程中有一些计算机科学专业的学生,​​他们将编程语言视为一组魔术,必须对其进行浇铸才能达到一定的效果(而不是将其视为表达自己语言的灵活手段)解决方案的想法)。

他们倾向于从以前相似的作业中复制粘贴代码,而不考虑问题的实质。

是否有一些练习或类推到使这些学生更加自信,他们能够并且应该理解他们编写的每段代码的结构和含义?

评论

评论者:请不要在评论中留下答案。写下您自己的答案。评论不是讨论问题的各种可能答案的场所:要么提出您的建议作为答案,要么先聊天以充实它。

每当学术界出现在这里时-我都会为我的未来感到担忧...我只是想象在波音7-28-7飞机上,涡轮机以200,000 RPM的转速旋转,由您一个刚过世的学生在用C编写的控制软件上运行。反正我离题了。

您是否考虑过几次失败,但并不是每个人都愿意从事软件开发!不是所有的特殊雪花!

SICP是否以编程类似于拼写转换而闻名?我的意思是,我怀疑您的学生是否在引用SICP甚至进行类似于Abelson和Sussman试图描绘的内容的比较,但我不认为有人将程序编写与咒语广播相提并论是天生的错误。在那里的计算机编程书籍在前几页中做的完全相同。

埃里克·利珀特(Eric Lippert)在这个问题上有很多话要说。并且以一种比我可能更优雅,更简洁的方式:blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx

#1 楼

您可以向他们介绍一系列练习,每个练习都在上一个练习的基础上进行,同时增加一些额外的元素或扭转问题,或者从不同的角度调查问题,这揭示了先前解决方案的弱点,需要一种新的,不同的方法。这迫使他们思考,分析,修改和试验每种解决方案,而不是仅仅复制粘贴现成的代码。
另一种可能性(尽管不是严格的编程任务)是要求他们估算各种各样的东西。例如。每秒有多少水流经密西西比河三角洲?这样的问题没有固定的答案,特别是因为一个人需要做出一些假设才能达到令人信服的(范围)值。而且-尽管确实可以查询许多“经典”答案的答案-您仍可以轻松地组成尚未在网上找到的新答案。
这两种练习的示例都可以被发现于乔恩·本特利(Jon Bentley)编写的《编程珍珠》。实用程序程序员也面临一些挑战。
第三种任务是向他们提供一些代码(其中包含(一个或多个)错误),他们必须找到并修复这些错误。这再次迫使他们使用他们的分析技能和程序实际工作方式的原因。更新
比利·奥尼尔(Billy ONeal)的评论提供反馈:

“系列问题”练习”是指那些对较早的练习有疑问的学生完全无法参加其余的练习。

您是对的,尽管我觉得这更多是关于将课程难度设置为正确的级别/将相似技能的学生分组在一起的普遍问题。而且,可以将学生分成小组,在其中他们需要讨论和辩论问题和解决方案,并共同解决问题。如果有人不了解,其他人可以提供帮助(此设置也将提高团队合作技能)。而且,如果某人试图变得懒惰,而让其他人去做所有的工作,那肯定会被老师注意到(他应该走来走去,监督和指导学生,而不是在角落里的笔记本电脑上玩《魔兽》 ;-)
还可以调整练习以适应不同技能水平的学生。初学者可以慢一些,有经验的可以更快一些。

评论


我想在这个很好的答案中添加一个指向简单网站的链接,即恕我直言应设置为课程的补充:http://projecteuler.net/这是激发他们对代码的兴趣的网站。难度越来越大,必须使用所需的语言来解决。首先,它会令人上瘾,并且还会刺激竞争:您可以通过他们的帐户跟踪他们的进度,他们也可以这样做。

– Nicolas C.
2012年3月17日在11:10



#2 楼

您正在与学生的平衡行为作斗争,以关心他们的学科和获得及格分数的需求。许多学生感到:
(弄错了||实验)==(成绩不及&浪费时间)
一旦学生感到自己的时间或成绩受到威胁,即使是有趣的科目,他们停止学习,直接跳到“我不在乎,只给老师正确的答案”。您的学生正在尝试通过尽可能少地思考问题并通过复制和粘贴来解决问题的方法(或他们认为的方法)。
这是我对如何处理此问题的建议:

使用Bob Ross方法:向他们证明,重新开始与复制和粘贴相比既可行又快速。在上课之前就在他们眼前创建新程序-确实向他们表明编程就像画一幅画。


提供需要创造力的作业。例如,让每个学生在纸上创建自己的数据结构(创建动物园,宠物商店,城镇,学院等所需的对象),以在整个课程中使用。作业2可以将这些结构转换为类或对象等。基本上,诱使它们进行抽象思考-奖励他们的创造力,然后奖励他们将其创造力转化为计算机程序。


使用尽可能少的语法。诸如创建类和语言语法之类的样板东西在编程的介绍中如此普遍,以至于常常误导学生以为所有编程都只是知道在哪里放置花括号-他们没有意识到花括号中间是什么大括号是创造力的来源。选择一种简单的语言,并为仍要复制和粘贴内容的学生提供示例文件(例如,空的班级文件)。随着课程的进行,您可以逐渐变得对语法和可编译赋值更加严格。


评论


应该是&&-尽管我怀疑它也可能会按位操作成功。

– tvanfosson
2011年11月30日20:39

我真的不知道数据是什么样子,但是是的,我想要的是按位操作。接得好 :-)

–凯文·麦考密克(Kevin McCormick)
2011-11-30 21:34

“花括号中间是创造力的源泉” ==>哎呀,他/她然后不会教他们Python了...

–奥利维尔·庞斯(Olivier Pons)
2011-12-05 7:55

仅仅给老师一个正确答案而不是学习的另一个问题是,人们常常认为这是学习。例如。 lesswrong.com/lw/iq/guessing_the_teachers_password

–威尔卡
2011年12月7日上午9:57

然后我要在这里添加一些快乐的分号...

– VirtuosiMedia
13年2月17日在10:42



#3 楼

我想到了几件事:


给他们分配作业,使他们实际上必须解释别人(您)编写的代码。理解先前的代码,或者更确切地说,缺乏代码既是造成货物崇拜编程的最大原因,也是最大的危险。要求他们使用注释,必要时逐行使用普通英语(或您使用的任何一种人类语言)解释您的程序。
只有在他们解释了代码之后,才要求他们对其进行修改以便一定的变化。例如,如果您给他们提供了一个对降序进行排序的排序功能,请让他们使其升序排序。或更苛刻的要求。但是请确保这是需要理解给定代码的内容。
如果愿意,可以在代码中放入一些复活节彩蛋。一两行根本没有用,甚至根本与问题无关。给他们一个暗示,指出存在这样的行,并为删除它们的人加分。
然后,只有这样,您才可以给他们一个任务,让他们自己从头开始编写一段代码。在这一点上,他们应该对什么是真正的代码有更好的理解。他们甚至可能会觉得自己做起来容易一些。

基本思想是编程不仅是编写代码,而且还在阅读代码。阅读代码也应该教。

评论


复活节彩蛋的想法似乎也将是教授测试/验证的好方法。遵循“可以在不破坏任何合同的情况下被删除?”的思路。

–尼尔N
2011年12月1日下午22:26

+1以读取代码。我看到很多人通过做出直观的猜测然后寻求证明来修正错误。我发现阅读代码可以为您提供正确的解决方案线索。听起来很明显,但我发现它被忽略了很多。

–克里斯
2011年12月4日21:25

#4 楼

用另一种方式看。这种狂热的现象是德雷福斯技能获取模型的新手阶段。这就是我们学习的方式。当我第一次学习编程时,我所做的只是从Compute的后面输入代码页面!杂志。重复是关键。婴儿通过复制父母听到的声音来学习说话。我们学到的一切都是通过模仿。我们只需要教我们如何从模仿变成精通。

您遇到的问题是您的学生没有在重复任何东西,而是从Internet复制它们。这样做有一些好处,但是收益很小。实际输入代码的行为使我进入了一个了解的领域。我开始看到键入内容的模式,并且对自己的工作有所了解。

一种选择是将您的实验室构建为代码dojo。让学生轮流对同一个问题进行配对。选择一个大约需要10到15分钟才能解决的问题。在几个实验中重复该问题,并随着班级水平的提高而对该问题进行新的调整。也许通过让学生看着您编写解决方案并让他们重复来开始实验。在每次迭代时切换对。

为您的测试提供一个代码kata,其中每个学生都在课堂上其余学期解决所有学期的问题。不仅要关注正确性,还要关注形式和创造力。我认为这比带回家作业更深入地了解如何编程。

评论


“当我第一次学习编程时,我所要做的只是在Compute!杂志的背面输入代码页。”:这是我使用Commodore Vic20来运行小型玩具程序的早期,后来很快就变成了很无聊。我很快就提出了相反的态度:甚至自己编写可以从其他地方复制的代码,否则您将永远无法确定代码中到底发生了什么。

–乔治
2011年12月1日上午8:29

我们的一位老师会给我们作业,以复制他给我们的汇编程序,他要求使用我们自己的笔迹进行复制。他还希望我们在他之前的第一页上写下我们的名字,以便他可以检查手写内容是否属于我们。这项作业花了我大约3个小时。

– sashoalm
2011年12月1日13:34



像Jon Jagger的Cyber​​dojo这样的无干扰的环境可能会非常出色,并且设置您自己的服务器就像从github下载虚拟机​​或源代码一样简单。

– Mark Booth
2011-12-04 14:01

@giorgio当时我8岁。我的技能水平是“输入此内容以获取免费游戏”

–迈克尔·布朗(Michael Brown)
13 Mar 10 '13 at 6:58

#5 楼

我过去曾经教过入门班,现在回想起来:

有些学生认为编程是出于不同的原因。我记得曾经有个好孩子,我经常做很多事


相信这不是一个孤立的问题,但是同班的其他学生可能会有类似的行为或接近对于这个问题而不是表达出来,我一直在向全班同学讲话。


花了一些时间来解释诸如确定性之类的东西,这对他们而言意味着在与相同的数据和代码,它们将具有相同的结果(消除“随机性”),
由于问题的解决取决于学生的行为,而不是其他任何事情,因此应该将注意力放在解决问题上,而不是寻找问题所在。正确的拼写
,它们处于教育环境中,因此精心设计问题以提供学习经验,结果是学习编程方法(在某些情况下,例如系统管理员的课程,程序的工作方式,这是不同的),而不是给我一个解决方案。 (“世界不需要另一个计算器,这是一种练习”),因此可以使用可用的材料(例如提供的注释)解决其问题,
我认为它已包含在代码完成中:“即使您进行复制粘贴,代码就是您的”。如果有人这样做,那它就不应是货船式的。每行都必须向我(单独)或向另一个学生(相同)或全班解释。


#6 楼

您的学生在课程开始时是否以正确的“抽象程度”开始?例如。一项无需编写任何代码即可将其介绍给主要编程结构(如循环和条件)的作业?

当我开始编程时,我们的第一个作业叫做“机器人的瑞克”。我们有一张纸,上面有一个城市的航空地图,上面有很多有趣的地方,例如银行,杂货店等。我们有一个叫做“里克”的家伙,并且有“迈出一步”,“向左看”, “看起来正确”,“过马路”,我们可以使用“重复”和“如果有的话就做某事”之类的东西。 (这不是100%,因为我找不到此任务。)想法是Rick只能使用他得到的东西,而他必须到达地图上的其他地方。

这是一个有趣的练习,它向您介绍了基础知识(有时对新手来说最难掌握)。没有一个很好的答案可以解决这个问题(它是一种游戏),也没有可以复制和粘贴的解决方案。这样的事情也许还可以让您更多地发挥他们的创造力,而不会用代码吓倒他们。

最后,我们的想法是从抽象开始,逐步走向具体。他们无法复制粘贴摘要。他们必须了解它才能解决问题。

评论


循环和条件?我将从变量,赋值和表达式开始。让他们从命令行读取两个数字并添加它们,然后打印结果。通常,做几乎痛苦的事情会使学生充满信心,使他们能够了解正在发生的事情,并鼓励他们进行实验。

– TMN
2011年11月30日13:44

@c_maker:您的作业看起来像是学龄前儿童的游戏。给学生太简单的任务只会降低他们对该学科的兴趣。

– Goran Jovic
2011-11-30 14:13

@c_maker:我认为您的答案是有道理的,我只是没有看到如何从不紧要一步一步地过渡到实际代码,而又没有“回填”变量和数据类型之类的东西。抱歉,我对反思的反应似乎有些苛刻。

– TMN
2011年11月30日15:01

我认为,Rick Robot背后的主要价值不是帮助理解循环,if语句等。主要价值在于帮助他们了解如何编写程序的一般过程。它可以帮助他们以特定的逐步算法方式查看问题。一旦他们用这样的例子理解了英语的编程过程,您就可以通过教他们代码的样子来填写细节。这是一个绝妙的主意。 +1

–菲尔
2011-11-30 17:21



让我想起了我的入门课程(30年前!),它是基于[Karel the Robot](en.wikipedia.org/wiki/Karel_(programming_language))的。(注意:该链接失败,因为实际的URL中有括号。 。单击页面上出现的第一个选项。)无论如何,Karel使用的是类似Pascal的语法,但并没有太多。

– JeffK
2011-12-21 21:44



#7 楼

您要他们做的是在Bloom的分类法的认知领域中演示分析和综合,而他们目前仅在演示应用。

不幸的是,这有点像“把马引上水了”情况类型。当您仍然难以理解时,分析和综合也非常困难。如果没有这种理解,分析和综合活动将比学习活动更像杂草。

我个人的看法是,除了在编程类入门中的应用之外,别无所求。这是学生们第一次接触到这些概念,因此就像在要求孩子写论文之前教孩子们阅读一样。这些更高阶的技能将在以后的课程中讲授。

评论


关于Bloom的分类法非常有趣的一点。我认为,让学生理解代码比在入门班中复制/粘贴代码更为重要。他们需要知道语句如何工作,并能够在继续之前从头开始编写自己的语句。使认知部分起作用,然后继续进行应用。

–菲尔
2011年11月30日17:14



我最近参加了Richard Felder的一门很棒的教学相关课程。他的意见是,在加紧工作之前,无需“掌握”较低级别的Bloom分类法。例如,他告诉幼儿园的孩子,当他们被要求比较哪个电视节目更好–芝麻街或[...]时,他们是如何进行分析的。

–爱华
2011-11-30 18:53

#8 楼

您是否考虑过为他们提供一些代码?不管需要哪种简单的脚手架,例如一个空的main函数(我都不知道您使用的是哪种语言)。可以编译,运行并且什么都不做的东西。然后他们可以放心地添加其代码,以确保至少部分代码可以正常工作。

这实际上在“现实世界”中很常见;许多IDE和其他工具都会使用典型的库/模板/配置文件来创建空项目。

评论


提供代码的另一种方法是要求它们与您编写的类进行交互(这与先前的代码不兼容),并要求分配的代码不能更改,并且必须修改自己的代码代码以完成分配工作。

–动物园
2011年11月30日在16:25

甚至提供代码使其以一种方式工作,并进行分配以更改/添加行为。这样,他们就专注于特定的行为,而不是基本的行为。

– JohnMcG
2011年12月1日17:42

对于第一语言,请尝试使用不需要任何样板的语言。 Python在这方面是好的,例如C / C ++ / Java是不好的。

– Lie Ryan
2011-12-4 7:05



如果有的话,IDE,代码补全和模板可以提高人们对货色的心态。如果学生花时间了解为什么需要该模板代码,那么他们将学到更多知识,而不是盲目地遵循食谱。

– Mark Booth
2011-12-4 14:09

#9 楼

任何形式的“货物崇拜”心态(包括“货物崇拜”本身)都是由于对所涉技术缺乏基本了解。

“货物崇拜”编程不应被视为有问题的习惯,而是程序员所面临的潜在混乱的症状。

更重要的是,从根本上来说,认为学生缺乏理解只是缺乏自信的产物,这在根本上是错误的,不能解决根本的问题。

,该学生的复制粘贴编程风格应该是一个危险信号,告诉您该学生对他所期望做的事情的复杂性感到不知所措。

他本能地将过去的工作用作构建当前项目的基础,并试图以先前解决的问题为基础来构建解决方案。我们都在一定程度上做到了这一点,但是我们大多数人都是通过使用从过去的工作中获得的知识作为我们的基本组成部分来做到这一点的。相反,这位学生正在使用作品本身,这意味着他并不真正了解自己正在使用的模块。在他的理解范围内,他分解了工作,并且将大代码块视为原子单元,因为他不了解它们的工作方式。他只知道他们在做什么。

评论


谢谢!你给了我很多思考的机会。最初,我认为也许他们只是无法想象在一段代码中有某种结构和组成意义。现在我在想,也许他们实际上确实很难理解它,但是失败了,并使用复制粘贴作为最后的手段。

–爱华
2011年12月1日13:41



#10 楼

改变您对项目的想法!
在编程世界中,我们很少真正为出现的每个解决方案创建新项目。大多数时候,我们会修改旧的解决方案。
将您对项目的想法从每个作业的一个解决方案更改为整个学期的一个解决方案。每个作业都基于先前的作业。
示例
项目:构建电梯系统

作业1:打印出当前楼层
作业2:创建数据结构电梯类,并根据电梯打印出地板
作业3:创建“移动电梯”的代码,打印出地板。接受键盘输入(>进入楼层:)
任务4:处理多部电梯

要点是,您要在先前的任务上进行构建,而不是将旧任务分配给新任务。

评论


好吧,复制粘贴不是问题,问题在于他们不了解要复制的内容。

–爱华
2011年11月30日19:03

增量作业的一个问题是,如果学生搞砸了早期的作业,那么他们将为其余的作业陷入无用的代码中。许多讲师会提供有用的工作代码,作为后续任务的基础,但是他们又回到了原来的问题:修改他们不理解的其他人的代码。

–巴里·布朗(Barry Brown)
2011年12月1日20:52



真?如果教师的帮助不足以帮助学生使代码正常工作,那么他们真的在做自己的工作吗?

–理查德
2011年12月1日21:09

并非每个人都会在截止日期前完成他们的作业。

–巴里·布朗(Barry Brown)
2011年12月4日在6:20

@Barry,在整个课程中逻辑上建立的每个主题不是这样吗?例如,如果您从未学习过集合和和相交,那么您在完成离散数学课程的其余部分时都会感到困惑。或者,如果您从未学习过元素周期表,那么您在剩余的化学课程中将处于s.o.l。这样做的目的是迫使学生以正确的顺序掌握概念,并努力工作直到掌握为止。如果他们不能整夜花一个星期的时间来准备好适合第二天上课的课程,那么他们就不需要从事软件开发工作。

–乔纳森·汉森(Jonathan Henson)
2011年12月18日,下午1:31

#11 楼

考虑使用需要最少样板代码的高级语言。

对我来说,通常是大型框架或冗长的语言中的样板代码,感觉像魔术咒语并妨碍理解。

我在CS入门编程课程中亲自教过ML。 。多年以来,Lisp在麻省理工学院被教授为编程入门。两者都是绝佳的选择。他们拥有的一些好处是


交互式解释器。非常重要,因为它可以进行探索。
非常简洁。完全没有样板。它使学生​​可以专注于他们要表达的思想。
比较模糊和陌生(至少与学生可能已经有一定经验的Java,C或其他主流语言相比)。是的,我将其列为专家。它为学生提供了一个公平的竞争环境,因为很可能没人会拥有以前的经验。而且这使得他们不太可能仅通过网络将粘贴的解决方案粘贴到家庭作业中。


评论


ML将是不错的选择!但是Python也适合您的前两点,并且易于使用(意味着没有太大的技术麻烦)。

–爱华
2011年11月30日19:24



我也强烈建议使用Python,尤其是与Wing IDE等出色的IDE结合使用时。

–肯
2011年12月5日,下午2:22

#12 楼

我对80年代的新手程序员的问题做了一些研究。根据我今天与新手程序员的经验,并没有太大改变。新手对计算机的实际功能没有一个有用的思维模型。他们诉诸魔咒,因为机器本身就是魔术。

编程需要将自然简单的任务分解为不自然的小步骤。由于新手在日常生活中不会处理如此精细的粒度,因此他们很难弄清楚应该采用哪些小步骤,尤其是在不清楚机器可以使用哪些小步骤时。但是,即使他们设法弄清楚了这一点,他们仍然面临着通过远程控制神秘机的编程语言(一种伪装成准自然语言的非自然语言)的语法和有限的语义。 >
由于无法将问题的逻辑解决方案与机器的功能联系起来,因此他们专注于满足语言的要求。第一个目标是写一些可以编译的东西。第二个是调整该程序-不管它实际做什么-防止它崩溃。然后,如果他们有时间,精力和兴趣,他们将尝试使程序产生类似于问题所需结果的结果。一路走来,他们可能会意外地编写出编写良好的代码。

很有可能学习编程的新手成功的原因是,他们推断出了有用的计算机思维模型,而不是因为他们已经故意给一个并内化它。

#13 楼

您可以问他们有关需要书面答复的代码段的问题吗?就像“这段代码在做什么?” “程序员为什么要这样解决?” “还有更好的方法吗?”等等?

这实际上将使他们思考问题,这是他们甚至无需接触代码即可完成的事情。

#14 楼


要求他们为问题创建最短的解决方案。
奖励更简洁的解决方案。
创建完全围绕重构代码的练习
让学生进行作业分配,并为效率和代码清洁度进行模拟评分,并使用一些效率最低的示例作为示例在高架投影仪上。


评论


重构对于实践而言非常重要。但是,最好记住最短的解决方案不一定是最干净的解决方案,也不是最有效的解决方案(还取决于这些术语的定义)。

–彼得·托克(PéterTörök)
2011年11月30日在21:09

在学校里,我尝试编写字符长度比朋友的解决方案短的解决方案。这意味着要使用简短的变量名,并且通常会编写不好的代码。

–基督徒
13年11月27日在15:00

@Christian简而言之,我并不是说字符长度很短,因为编译器并不真正在乎变量名。我说的是代码复杂性。

– Lynn粉碎
2013年11月27日15:57



#15 楼

与JoelFans想法类似,是让他们使用您创建的伪代码(语言)在纸上进行初始分配。您可以添加合适的结构,而不必担心魔术盒。

#16 楼

我要假设“货运邪教”是指他们插入了认为必要的内容,但实际上并没有解决问题。

如果是这样,您总是可以在基于简洁的评分中添加一些因素-将来在程序中留下不必要的代码或多余的代码可能会出现问题,因为它可能会中断或使其变得更难维护。

在英语课堂上的写作练习中,对他们的评价也差不多。没人会想要那些随机切线出现的东西,或者只是粗鲁而没讲到重点的东西。

当我参加了一个组装班,如果他要我们编写速度,大小或内存使用量的代码,则老师会告诉我们每次练习,如果您没有接近优化他所要求的内容,他会打勾。

...

如果它们是从以前的类似作业中复制并粘贴代码,则实际上是解决新产品的问题障碍...好吧,那只是代码的重用,除非他们对代码的重用性做出错误的假设,否则我认为这样做是完全合理的。 (例如,从文件中读取内容,作为输入的支撑……所有可重复使用的模块化部件。如果您不希望它们这样做,则需要使练习变得不同。

评论


问题在于他们在粘贴粘贴时没有看到代码的结构,他们只是认为这种模式上次有用,因此希望它也适用于此。他们希望并尝试而不是自信。

–爱华
2011年11月30日19:02

#17 楼

不幸的是,这就是很多人大脑运作的方式。因此,请您了解一下,有些人您无法“治愈”这一点。有很多人无法在编程所需的心理精​​度水平上工作。有些人根本不是为此设计的。我并不是说要放弃学生,而是要假设如果不是每个人都接受了,那就算您失败了。

如果不对课堂背景有更多了解,我会说重点这些问题的学生将学习非常基本的结构-简单的if / thens,循环等。简单的例程可以打印出奇数,十分之一的数字,等等。每行最多不超过10行代码。如果他们是“魔术思维”,他们显然还没有掌握这些基础知识。让他们执行许多不同的简单例程,直到他们掌握正在发生的事情。有人提到将代码写在纸上-我认为这也是执行这些简单例程的好方法。

您还可以考虑让他们学习流程图。对于某些人来说,能够看到算法的流程以及如何将其连接到代码,可能对他们将代码连接到流程有所帮助。

#18 楼

理想情况下,在第一堂课中,从完全抽象的内容开始:让他们(作为一个小组,由您作为领导者)从清单中写出有关如何进行杂货店购物的说明,并逐步分解高级说明直到他们得到启发。

告诉他们这些指令将由字面意义上的机器人执行,该机器人不知道如何推断事物。不过,这必须是一个非常动手的活动,您需要负责指导它们。

评论


好点子!我已经做到了,我相信这已经引导了许多学生走上正确的道路。但不是所有的。

–爱华
2011年11月30日19:06



#19 楼

Alistair Cockburn在http://alistair.cockburn.us/Shu+Ha+Ri上讨论了Shu-Ha-Ri的概念及其在编程中的应用。我认为牢记您的学生在这个连续体中的位置可能很重要。首先,这将有助于减轻您的一些挫败感。当您第一次开始学习某些东西时,复制/模仿是一种很自然的反应和接受的方式。其次,它可以帮助您获得一些有关如何前进的想法。例如,您可能要考虑选择可以以多种方式解决的问题(循环与递归,控制台与Web / gui),然后明确让他们首先以一种方式解决它,然后以另一种方式解决-他们可以学习的好处关于合法的代码重用,组件化,创建可重用的库等。

我见过的另一种成功的方法是使一系列项目相互构建,从而提供默认的工作版本交完作业后的每一步,以防止人们落后。该过程的每个步骤都应引入一些新内容。我会告诉您,这在设计类中比在编程类中做起来容易,但是仍然应该可行。一件好事是,您明确地给了他们一个良好的(希望)实现,以便在每个步骤中与他们进行比较。将此比较作为一项任务公开,即对照自己的努力对自己的代码进行迷你代码审查。您可能希望将其作为几个额外的学分选项之一。

虽然我通常对“注释”并不了解,但是您可能希望使代码文档成为成绩项目之一。让他们为每个项目生成一个“操作理论”文档,其中描述了他们的方法,每个组件的安装方式以及它们如何共同解决问题。通常,我希望代码自己完成很多工作,但这会促使他们放下思想上的限制,并将其付诸实践。

最后,您可能想发挥创造力,让学生们互相检查对方的代码并进行评估。施加同伴压力为您工作。允许它成为评分最高的代码(和文档)的等级或额外学分的一部分。

#20 楼

只是一个快速的建议。每当遇到需要解决或调试的编程问题时,我都喜欢看代码和“玩计算机”,在我的脑海中,我会跟踪变量及其值以及每行运行时的期望值。因此,如果我从某个地方复制了一些代码,除非它本身是完整的,而我只需要引用它,我喜欢一行一行地去了解到底发生了什么。本质上就是玩电脑。 VBA调试器从本质上使此任务更容易,但让学生在纸上完成它可能会给他们一些基础知识。这行实际上是做什么的?

评论


我建议他们这样做,但是我猜对于某些过程来说它太慢且容易出错,因此他们决定跳过它。

–爱华
2011年12月1日下午13:58

您是否尝试过使用标记在投影仪上在他们面前进行此操作?如果我还记得我的高中编程班,那位老师是这样做的,尽管其他大多数学生都不在乎,但我认为这是一项有用的技能。 (即将出现的总体警告)很难为我们这一代及以下年龄段的学生创造动力,我们学会了不问问题。

–锦葵
2011-12-5 18:20

#21 楼

我在大学阶段教授入门编程。
这是一门简陋的课程,所有的老师都做到了,而且我认为我们做得很好。考试,但是我们每个人都有自己的课堂教学方法。
从那以后已经很长时间了,但是偶尔我会教一些孩子编程,整个过程是差不多的。

我的方法是从底部开始,尽可能具体。
学生所知道的是一种结构。
他们已经有很多概念。
我正在建造在这些概念之上的其他概念,我正在修剪它们可能形成的适得其反的概念。
同时,我让他们边做边学。

我建立了一个装有Intel 8008芯片,一些EPROM和一些电路的小型计算机。
当I / O芯片连接到一对扬声器时,我对其进行了编程以起到一点二重奏的作用。
我将解释如何这个小程序奏效了循环以递减计数器。
这将起到延迟的作用。
然后它将切换输出位并再次执行。
将执行一段时间,然后切换到另一个延迟,给另一个音调,依此类推。等等。
存储芯片上有一个计时器,如果我在一个计时器输入的下面塞了一条电容引线,程序将缓慢地运行veeeeery。
该类可以听到扬声器发出的咔嗒声……
我想让班级的学生理解计算机一次只做一件非常简单的事情。
然后我要摘下电容器引线,“音乐”就会爆发。 (鼓掌)

然后,我为一个非常简单的十进制计算机构建了一个模拟器,该计算机具有1000个存储单元,每个单元都有一个带符号的4位十进制数字。
它具有非常简单的操作码,例如“添加到累加器”,“如果为负则跳转”,依此类推。
我会让他们用这种“机器语言”写一些小程序,比如加两个数字,或者加一个数字列表。
然后他们可以单步观看,或者按住Enter键观看它以“快速”的方式运行。

这样做的目的是将计算机只能执行很少数量的不同基本操作的概念付诸实践,并且它们一次只能执行一次。
这是为了抵消人们对计算机的印象,即计算机很复杂,并且它们同时执行所有操作,并以低廉的价格朗读您的想法。

从那里开始从“简单”但有趣的程序开始,通过条件,循环,数组,文件,合并等开始,以“真实”语言进行编程。
对象是放置一个足够的技能,以便他们可以自己选择一个项目,因为那是使编程有趣的唯一事情-您可以使用它的用途。
我我会提出一些项目想法,然后从那里接受。
我会要求书面想法,然后提出进度报告,以免它们推迟到最后一分钟再出现恐慌。
我认为这些项目是最好的部分,因为它们是在自己的力量下进行的学习。

最初的基础是对计算机的功能的非常具体的了解,这使得以后更容易讲授概念。
我们倾向于赞美“抽象”的概念,因为这是一件了不起的事情,但它需要建立在一个具体的基础上,而不是建立在空气。

#22 楼

一位程序员,我相信动画在了解代码在做什么方面是最具挑战性的。当程序包含执行抽象操作的算法和数学转换时,了解数学在任何给定时间点(除非您是天才)的唯一方法是需要理解代码本身的执行。

如果我的天真想法不正确,请纠正我。您想做的是阻止学生使用“设计模式”,而是找到一种方法来确保他们了解自己的CnP吗?然后挑战学生操作动画。为了调整动画中的输出,必须了解每个步骤中发生的情况。出于您所说的关注,我想一个精心构思的动画项目会在学生“明白”后以明显的方式体现出来-当他们意识到您所不期望的转换或调整了某些相关的,相互依赖的变量时。

在不了解您所从事的教学限制和目标的情况下,我不能说动画是完整的答案。我应该冒昧地猜出,动画专业以外的整个动画课程都是不可能的。少数项目可能仍会带来一些巧妙而美妙的事情,这还不错。

在另一个注释上,我读了一篇报纸文章(是的,是纸!),关于高中水平的编码奥林匹克竞赛-竞猜-竞猜大学预科程序员。关于他们所面临挑战的描述是我曾经读过的最清晰的纯编码。根据良好实践标准对竞争对手进行评判。对于这些比赛,学生必须既要计划解决方案,又要手工编写问题需要在时限内完成的基本“设计模式”。因此,解决您对CnP编程所关心的问题的方法是测试学生是否可以编写与CnP'n相同的“代码块”!

我确定这是在《纽约时报》上。快速搜索未找到它。 ACM的国际大学编程竞赛就是一个类似的例子。该竞赛强调快速编程:“团队竞赛中的快速编程是一项非常古怪的技能,并不是很多求职者都将其放在简历的顶端。”因此,我建议从实际问题中抽象出来才是答案。

此外,

HP Code Wars

#23 楼

使用技术上不错的编程语言来授课,但这种语言太晦涩难懂,以至于找不到任何要复制的现有代码。

评论


我不用担心他们会复制别人的作品,而是担心他们自己的作品或某些示例片段,这些片段在特定情况下不可用。

–爱华
2011年11月30日13:15

#24 楼

您也可以用困难的方式对待他们。

找到一种使复制粘贴对他们有害的方法。我没有确切的例子,但是如果您进行第一次练习,然后将其解决方案(粘贴在外观类似的第二次练习中),则会使那些热衷于货物的学生陷入一个非常漫长而痛苦的“不稳定状态”或“静默数据损坏”错误中。同时,一个“非货神教徒”的200万思考将为最差的学生带来一个显而易见的解决方案(他没有看到第一个练习解决方案)。然后,也许他们可以学习该课程,并三思而后行,然后再将粘贴代码复制到第三次练习中。

#25 楼

我怀疑这种行为是因为人们相信程序是魔术,因为它很可能是懒惰和缺乏动力。

所以,我认为您作为老师的工作是为了激励学生-没有学生愿意真正有动机的人会剪切并粘贴一个解决方案(仅适用于有期限和底线要求的工作程序员。)

评论


对于其中一些学生来说,懒惰和/或截止日期无疑是原因。但是有些人真的很努力...

–爱华
2011年11月30日在19:09

@Aivar-作为一名讲师,您可能对学生的长处和短处更加了解。出于好奇,您认为那些“努力工作”的学生的障碍是什么?

– eigh
2011年12月1日,0:25

@Leigh-我认为他们对大脑的分析部分还没有足够的训练,他们正在用蛮力接近任务-他们的工作方法离详尽的搜索不远。并且很难解释它们的替代方法。

–爱华
2011-12-12 13:46



@Aivar-也许在早期阶段应该更加关注分析。例如设计两个部分的练习。第一部分专注于代码的构建块。在第二个解构时,调试并分析了相同的示例。即询问“为什么”问题,并讨论通过与不同方法(强力等)的实际关联来改进代码的方法。尽早而经常这样做将有助于巩固他们的知识,并鼓励他们将编程视为不仅仅是在特定语言中构造正确的语法。

– eigh
2011年12月1日19:52

#26 楼

教子程序。让他们采用以前分配的代码,然后将其转换为子例程。教给他们有关函数文档的知识,以帮助他们了解子例程的实际作用。

评论


这并不能真正解决问题。

– Pubby
2011-11-30 23:37

我认为是的。货运崇拜是包含了无用的代码。如果他们将代码分解为子例程并记录这些子例程的工作,那么这将有所帮助。分析是学习的重要组成部分,分析需要将事物分解成若干部分。

–托尼·托珀(Tony Topper)
2011年12月1日下午13:16

#27 楼

在不提供互联网访问的情况下,让他们在教室里做您面前的作业(学校已将其切断,上课时也不允许使用电话)。至少要进行测试。完全没有理由他们应该使用Internet进行基本编程。这本书应该是入门练习的足够资源。一旦您上了高级班并且他们已经学会了如何思考,就可以使用Internet。

#28 楼

永远不要给他们类似的任务。

,或更疯狂的是,从一开始就学习TDD。它推动编写(而不是复制,编写)大量代码(即测试),这些代码实际上有助于表述要解决的问题。

评论


编写测试通常比首先编写代码难。我建议也许老师写测验,然后把它们交给学生,以应对他们的作业。

– TMN
2011年11月30日13:59

@TMN:这可能适得其反。会暗中鼓励学生随机更改代码,直到测试通过。

– Goran Jovic
2011-11-30 14:04

@GoranJovic:不确定我是否同意“暗中鼓励”,但是我确实承认,没有简单的方法可以区分意图意图编写的代码和仅通过测试的被黑代码。当然,这个问题也不仅仅限于学术界;

– TMN
2011-11-30 14:43

@TMN:增量“一次(如开发人员所需要的那样容易)一步”将消失。

–老公
2011-11-30 15:13

解决方案:提供最少的学生可以在编写程序时使用的测试集,但要警告他们,他们的程序将根据更为全面的测试集进行评分,并且将根据学生编写的测试来运行。

–巴里·布朗(Barry Brown)
2011年12月1日于20:47

#29 楼

我发现对班上的人有很大帮助的事情是在他们自己的主题上写一个小项目,让他们自己选择。

当我开始编程时,对我来说也很困难,我在课堂上确实做了很多抄写。然后在家里,因为我想成为一名游戏程序员,所以我开始制作一些小游戏,并且发现它们变得更容易制作。即使它们比我们在课堂上看到的要难得多。只是因为它引起了我的兴趣。

我班上其他一些人的考试比例从40-50%上升到90-100%,因为他们做的完全一样。

#30 楼

当我在入门编程课程中时,讲师要求每个人都用英语编写一个算法,然后打印出来并上交,然后再开始编写代码。然后,我们将不得不添加大量注释,例如创建变量,从用户获取输入,执行计算,打印输出等。当我认为有足够注释时,由于没有足够注释而停泊了几次,因此我开始添加更多。这迫使我考虑自己在做什么,编写解决方案,并不断在英语和Java之间来回翻译。