关于语言不可知论:我如何帮助那些在编程课上挣扎的同学?

How can I help fellow students struggling in programming classes?

我是一个计算机科学的学生,正在完成我第二学期的编程课程。我很喜欢它们,学到了很多东西,但似乎其他学生比我更难理解这些概念和作业。当任务到期时,不可避免的团队电子邮件会在前一两天发出,人们需要一些帮助,要么是在特定的问题部分,有时人们似乎很难知道从哪里开始。

我真的很想帮忙,但是我很难想出正确的方法来帮助他们而不给他们答案。当我无法理解一个概念时,代码片段可以帮助我,但同时如果它很有意义,就很难想出另一种方法来实现它。另外,每项任务的学术诚信部分总是迫在眉睫,警告不要与他人共享代码。我试过用伪代码来帮助别人了解程序流程,让他们知道如何实现它的某些方面,但是我没有得到太多的反馈,也不知道它到底帮助了他们多少,或者只是让他们更加困惑。

所以我基本上是想看看是否有人有这方面的经验,或者我能帮助其他学生朝着正确的方向前进,或者帮助他们以正确的方式思考问题的好方法。


让他们向你解释他们的代码。

这可以实现以下几点:

  • 首先,它演示了它们实际上有代码来显示您。如果他们还没有打开一个文本编辑器,他们怎么能不理解呢?
  • 接下来,它演示了他们在基本级别上理解代码。他们本可以从某个地方复制的。如果他们不知道他们拥有的代码的第一件事,那就是一个标志。(如果他们确实复制了代码,但仍然花了时间去理解代码,那么这在学术上仍然是不诚实的,但在大学毕业后使用它是一项很有价值的技能。)
  • 最后,现在我们到了他们可能真正得到它的地方,在你的帮助下(甚至可能没有!)如果他们到达了他们理解中的漏洞所在的地方(当他们向你解释他们的代码时),它就会跳出来攻击他们,那么他们就解决了自己的问题。如果他们不认识这个洞,那么你可以在这里给他们有针对性的提示。


我曾在助教和CS部门的服务台工作过(也帮助过朋友)。这就是我要做的……

把问题抽象出来,找出一个相关的问题,然后和他们一起解决相关的问题。如果他们不能建立联系,你就不能真正帮助他们。

编辑:如果他们在前一天或前一天寻求帮助的话,他们会拒绝提供超过基本语法的帮助。事情应该早在截止日期前就解决了。在某天拐骗别人对你来说不是个好习惯。


一些想法:

  • 做配对编程

    让学生(你正在帮助的人)坐在椅子上,编一些代码。可以是一个代码片段,可以是项目的一部分,任何东西,只要它代表了他们遇到的问题。当他们走的时候,指出(不是粗鲁的)他们可能做了错误的事情,或者一些可以改进的地方。

  • 检查已完成的工作

    对我帮助最大的事情之一就是让一个同伴(而不是老师或学生助手)检查我的代码。大多数时候,同伴可以指出他们可能做过不同事情的地方。

  • 让他们重复你的话。

    我经常让我帮助的人重复我刚才说的话,看看他们是否理解或者有什么问题。当人们不明白某件事时,你会惊讶地发现他们经常不说话。

  • 在项目到期之前提供帮助。

    试着在项目到期前一天晚上完成它是一个绝对有效的方法,至少,你不能像以前那样彻底地学习这些概念。

  • 不要自己编码

    如果你为同龄人做这件事,他们什么也学不到。

  • 查找其他资源

    一个助手,一个友好的教授,你的另一个同事,都是宝贵的资源。如果你发现你的教学风格与你的同龄人的学习风格不太吻合,就把他们指向可能能帮助他们更多的人。

  • 希望是最好的

    你只能在教导别人的时候走这么远,他们必须要学习。


  • 我认为你不应该帮助他们。我认为这在学术上是不诚实的。而且,让你给他们答案,甚至让你在身边回答问题,对他们也没有帮助,因为一旦他们参加考试(或现实世界),你就不会在他们身边了。他们不仅需要学习如何自己编程(这可能是你在帮助他们),而且还需要自己回答他们的问题。这意味着在StackOverflow等地方发布。你可能会建议他们制定一个特定的问题(总是一个很好的练习),并在这里贴上"家庭作业"标签。

    当我在大学上CS课的时候,有很多学生根本就不会编码或设计(我特别想上一个高级软件工程课)。他们也不知道如何去解决问题,在哪里查找问题,在哪里回答问题,或者问什么问题。他们完全无能为力,因为他们大部分的本科时间都是在小组中完成作业/项目,并且有更多有才华的小组成员来帮助他们。不要让这一切延续下去。行业最不需要的就是那些毕业成绩好的不称职的程序员们在简历上写上自己的简历。


    有一件事可能会对你的同学有所帮助,那就是在课堂讲稿中指出类似的代码(或者如果你没有得到课堂讲稿,在你自己的笔记中)。这样你只会向他们展示教授所说的话,但会有帮助。

    如果另一个学生愿意接受,问他们关于他们所尝试的一切以及为什么会有帮助的问题。

    最后,考虑去找你的教授,询问他或她对你可以做什么以及他们如何建议你帮助他人的意见。毕竟,教授们有多年的教学经验。更重要的是,在未来的几年里,作为一名大学生,你有机会成为助教吗?作为一名大学生,我获得了助教,这有助于我在不违反任何荣誉准则的情况下,有效地利用自己的冲动去帮助他人。如果你有这样的本科生就业机会,现在让教授们把你看作是有用的类型,将有助于你获得这些机会。


    以下是我给学生老师的建议:不要回答学生。相反,问他们问题。一定要问他们将来可以问自己的问题。对于我教的材料,我希望所有学生都能问自己一些问题:

    • 你的抽象是什么?

    • 什么是抽象应该如何表现的示例?你能给我举个例子吗?

    • 是否存在允许抽象失败的示例?在那个例子中它应该如何失败?

    • 你测试过这些例子吗?

    • 抽象的表示是什么?

    • 表示与抽象有什么关系?你能给我看张照片吗?你能教我数学吗?

    • 允许哪些函数查看表示?每个功能的契约是什么?表示是否满足函数可以假定的不变量?每个函数都确保不变量被保留吗?

    • Valgrind说什么?


    每当我试图教我女朋友如何编程时,我几乎什么也没做,只问了几个问题。(她在无聊之前听了.each的陈述)

    问他们代码是如何工作的,以及他们认为如何完成任务的。向正确的方向轻推它们。永远不要为他们打东西。如果你有另一台电脑,在上面输入代码来显示结果,这很好,但不要做得太过分。


    一般来说,在帮助同学方面,我一般都采用"玩傻子"的方法。我假装对他们的具体任务一无所知,我要求他们让我了解他们应该做什么。我还要求他们给我一个快速的总结,他们在课堂上学到的关于作业的任何概念的知识。这通常需要大约5分钟,大约95%的时间,其他学生在向我解释完他们自己的问题时已经回答了。如果他们还没有在这一点上解决问题,我请他们引导我完成他们的任务解决方案。在这样做的时候,他们通常会发现他们的解决方案偏离了他们在课堂上所学的内容。

    至于特定于编程的帮助,我有时会要求另一个学生向我发送他们的代码,然后通过我编写的一个简单的shell脚本运行它。这个脚本将代码文件中不是注释的所有内容都清空,我将结果交给其他学生阅读。生成的文件通常读起来像是其代码的概要,而且很多时候,他们可以通过排除代码的干扰来查看代码的错误之处。如果他们的方法是完全错误的,我会告诉他们使用注释来写一个代码应该做什么的大纲(在高级术语中);完成后,他们会用实现大纲步骤的代码来填充大纲的每个部分(在执行过程中测试每个"块")。这有助于许多人将代码与算法分离开来(我看到的许多常见问题源于缺乏系统或规范的问题解决方法,而这个练习有助于让他们走上正确的道路)。

    另一种方法是使用不同的编程语言回答问题。例如,我在Matlab项目中帮助了几个同学,用C、Ruby甚至伪代码(读起来更像是纯英语而不是代码)解释了这些概念。我知道他们在其他语言方面有更多的经验,所以我用他们最了解的来说明这些概念,并鼓励他们首先尝试用他们的"母语"来解决这个问题。一旦他们确信他们理解了这些概念,他们就可以研究如何在目标语言中实现它们。当你还在学习一门语言的时候,必须学习新的概念会使这两种语言更加困难。这种方法也有助于确定他们是否在理解如何解决问题或如何编写解决方案代码方面遇到困难。


    向他人解释事物的一般经验是先找出它们的位置。尽量避免给他们解决他们还没有解决的问题(即使你确信他们以后会遇到)。换言之,不要超过他们两步。如果它们在理解按值调用方面存在问题,请不要解释它们的递归。


    教学中最常见的问题之一就是确定学生是否理解你。确定你是否应该继续或重新措辞的一个简单有效的方法是让学生通过做一些密切相关但不相同的事情来证明他们的理解。

    另外,因为编程本质上是单词问题,所以学生将事情分解为步骤是很重要的。在我向他们展示任何东西之前,我会要求他们看到更高层次的进展。太多的人在句法上被挂断了线,在潜入其中之前从来没有真正确定过他们要做什么。


    心理学方法

    向他们展示一些流行的现实世界应用程序(作为一个例子),它们每天都在使用……用您试图教的相同编程语言编写……

  • 用背景解释每件事
  • 给予每个学生相当的重视
  • 总是使用颜色编码语法