关于语言不可知:如何让编程课程变得有趣?

How to keep a programming course interesting?

我想,以下是每个学校或大学的标准问题:

教授编程是你的工作。不幸的是,一些学生是半专业人士,有多年的经验,而其他人甚至不知道基本概念,例如概念"类型变量"。

据我所知,这会导致以下情况之一:

  • 程序设计从根本上讲是困难的。经验丰富的学生感到厌烦,不再去听讲座。结果,他们甚至会错过那些他们还不知道的东西。
  • 教师和教授声称他们需要基础知识(无论这意味着什么)。没有经验的学生不能听课,他们中的很多人会把注意力放在不重要的事情上(例如,理解复杂例子的每一个细节,而不是从例子中获得概念)。他们中的一些人会放弃。
  • 大学发明了一种人工编程语言,让经验丰富的程序员和新手"机会均等"。大多数学生会对"无用的语言"感到沮丧。
  • 是否有第四种解决方案,比上述方案更好?


    在我看来,这是一个以学生的位置为基础的问题,而不是你作为一名教师应该有兴趣去处理的问题。

    如果本课程是计算机编程入门,那么您真的需要从基础知识开始。如果你的教室里满是专业人士,他们都知道如何编程,但他们没有展示出来,那么这要么是你的课程描述有问题,要么是学校强迫他们在不允许他们考试的情况下把课程作为先决条件。

    你的工作应该是在课程描述中描述你想教的东西,并教它。如果学生入学资格过高,那就是他们的问题。我认为你真正需要避免的是,如果你的课程真的是针对初学者的话,那就让这门课程对初学者来说太高级了。


    我认为保持它有趣的最好方法是沿着理论提出实用而有趣的练习。采用问题解决方法是很好的(有有趣的、有趣的、令人兴奋的、真实的问题)。这就要求教授自己有实际操作经验,使用新技术并非常了解它们,而不仅仅是教授他几十年前学到的东西。

    问题是,编程应该通过实践来学习。教员应该集中精力激励学生编码,并努力自己解决问题。这可以通过在课程开始时分配一个类似生命周期的完整项目,并通过类中项目中出现的子问题来完成。这样,学生们就知道了为什么在编程语言中存在某些特定的特性,以及它在哪里可能有用。

    不过只是个想法。没试过!;)


    我最近参加了一个课程,在这个课程中,学生们在编程方面有着广泛的经验。他们仍然设法让班上有经验的程序员感兴趣,他们制定了一个练习计划,在其中对练习的实际部分(编程部分)进行计时,并将结果发布在高分表中。每堂课结束时,教授都会给我们一些建议,告诉我们怎样才能更有效地改善我们的时代。我们都知道,所有的工程师都喜欢竞争排名第一,所以我们不断出现,甚至学到了一两件新东西。没有经验的学生也设法完成了练习,即使他们不太关心自己的时间。

    不知道您的课程是否可以实现此解决方案,但如果可以,您应该认真考虑它。


    不要过分假设;尽量选择没有太多智力负担的编程环境。您可能认为C"hello world"程序很简单,但这需要理解源文件、编译、静态类型和块结构。对于初学者来说,没有简单的概念。相比之下,在python shell中键入"print‘hello world’"可以避免这些操作。声明、复合类型、对象定向、指针、浮点、递归、模块化、线程、回调、模块化、网络化、数据库等都是需要努力学习的主要概念。而且,没有它们还有很多有趣的事情要做。你的目标应该是让小组中的每个人尽快做编程练习。

    混合能力教学很难,如果可以的话,可以通过分组来进行教学。也许可以发布一个基本概念的测验,并为那些没有100%的人提供一个可选的基本概念部分。有些人认为他们是有经验的程序员,但他们误解了基本的想法。

    如果可用的课程时间太短,不能让人们尝试大量的练习,那么在我放弃实际工作之前,我会放弃更先进的材料。


    我认为,如果你能做一些事情来帮助弥合高级和初级学生之间的鸿沟,让每个人都对这门课程感兴趣和参与其中,那就有两种。

    高级研讨会

    如果可以安排(使用博士生等)每周举办一次可选的讲习班,任何人都可以参加,但这是针对经验更丰富的学生。每周设置一个代码任务/challange,然后在研讨会上讨论问题的各种解决方案,并讨论不同选择背后的含义和理论。

    这为经验丰富的编码人员提供了一个有趣的挑战,因为他们有东西可以让他们的牙齿进入。它开启了一些争论,可以帮助中间人掌握有趣的概念,如果你让人们提出更多的解决方案,它会引入一种开放的审查风格,这是有益的。它也有助于初学者,因为您不必在主系列讲座中向他们介绍真正先进的概念,只需让有经验的人感兴趣。

    学生参与

    有经验的人通常是有经验的,因为他们喜欢编码等,很多人喜欢分享他们的知识。一个很好的方法来使用这个,并帮助初学者和高级学生是让更高级的学生参与教学。如果你在学生完成练习的课堂/实验室中进行,试着让更有经验的学生的志愿者担任实验室的导师/主管。当初学者挣扎时,他们可以通过解释细节或微妙之处等来帮助他们。

    这真的可以帮助初学者,因为通常没有足够的工作人员让每个人都能够提出个人问题。它也能真正造福更先进的人,因为必须解释你"知道"的概念,这是一个很好的方式来强化他们在你自己的头脑,甚至发现你有微妙的误解在你自己的知识。


    最好是用一些人所说的"入门性编程"来打破一些关注领域:

    1)个人计算机和现代计算概论。假设课程的软件在Windows上运行,可能有一些需要涵盖计算机的基础知识,例如什么是硬盘、键盘、鼠标、监视器、CPU、主板等。请注意,这与一行代码没有任何关系,除了潜在地命名操作系统。对某些人来说,这可能是他们的新事物,因此开设一门涵盖基础知识的课程可能是值得的。在本课程中,还将介绍如何使用鼠标及其所有按钮、人们拥有的各种电缆和连接、驱动程序是什么、补丁是什么、网络的组成部分是什么,例如防火墙、路由器、负载均衡器等。这里的想法不在于如何完美地配置防火墙,而是在于on了解各种硬件组件的用途以及如何将家庭无线网络配置为最复杂的概念。

    2)编程原理。这将从执行一系列命令的步骤开始。像打印和执行数学运算(例如从英制转换为公制)之类的事情,可能会涉及到排序这一最复杂的例子,从各种不同的算法和对大O符号基本层次的理解来看。

    3)介绍数据结构和高级编程。现在,让我们介绍一个关系数据库的概念,以及数据库一般是如何工作的,以及在现实世界中有应用程序的项目,例如让每个学生列出他们拥有的东西,如DVD或CD,并将它们放入数据库模式中,以有效地存储所有这些数据。另外,浮点运算的概念及其局限性,例如,计算机不存储pi的整个值,而是一个在大多数情况下足够好的近似值。

    4)并行编程和操作系统介绍。在这里,您将在构建操作系统、处理如何编写可以并发或并行运行的代码以及不同情况下不同程序的效率方面做一些深入的工作。

    这就是为什么我可以看到有人中断了程序设计,以至于一周内没有人可以学习到足够的东西来通过期末考试而不看其他东西。


    我曾经做过一个安排噩梦,结果在同一个教室里同时教了一个初学者班和一个高级班。我所做的是将我的时间分为两个级别,一开始给高级组一个作业,在我和初学者一起工作的时候在课堂上做,然后在我和高级组一起工作的时候给初学者一个作业。你可以做一些类似的事情(只让小组自己选择他们想加入的小组)。为更高级的比赛准备一些额外的材料,你就可以参加比赛了。

    另一个策略是把所有的事情都保持在初学者的水平上,但是为更高级的学生提供一些其他的材料来获得额外的学分(甚至代替初学者需要的一些简单的任务)。在课堂外或单独讨论更高级的作业,同时在实验室进行实际工作。

    通过大量的实际例子保持讲座的趣味性也很有帮助。不过,我倾向于尽可能少地讲课,通过课堂讨论和实践练习以及提出引导性问题来更多地展示材料。让他们找到回答你问题的信息(课堂参与是分数的一部分)会让他们更加关注。

    我还以一个课程项目结束了每个学期,我只描述了他们为了获得B所必须做的事情。A包括在课堂上没有涉及的领域做一些超出这一范围的工作。然后,更高级的学生可以通过寻找真正酷的新事物来真正发光,甚至初学者通常也会找到一种方法来做课程中没有介绍的事情。令人惊讶的是,当他们不知道还要做多少工作才能获得A时,他们会付出多少额外的努力。其他的导师会对我所获得的课程结束项目的质量感到惊讶,其中一些老师也开始使用相同的方法。


    以体育或电影为中心进行编程练习。


    我经常遇到这种情况,首先是学生方面的事情,然后是教学方面的事情。

    大多数学校强制推行这些课程和课程。这是愚蠢的,但生活就是这样。如果你的学校允许的话,我建议如果学生通过一个早期的筛选测试,我会给他们提供出勤豁免。这符合你的兴趣和新生的兴趣,不要坐在一个很大一部分人感到无聊的班级里。即使是在一个房间里,一大堆人从笔记本电脑开始,也会损害谈话。每个人都必须参加考试并提交作业,但他们至少不必出现。

    一旦你和新手一起工作,就要弄清楚他们是主修还是非主修。非专业的学生会讨厌上CS课程,你必须努力让他们能够接近。例如,使用物理、化学或数学中的示例,而不是构建交互式图形用户界面系统。

    如果他们是CS专业的学生,最好他妈的感兴趣:)


    我的观点是,对于大多数人来说,教学样本程序是非常无聊的。搜索、排序、7位ASCII输入分类、使用unix&make、打开文件、写入文件…

    这些都是无聊的问题。不管它们的重要性/有用性如何,它们都是工具。不幸的是,工具是介绍课程中所教的,而不是问题。

    但你需要工具来解决问题。所以这是一种鸡蛋问题。


    坐在椅子上看别人说话很无聊(即使你说得很好)。

    如果你能有所成就,当你能操纵世界并有一个成功的时刻,事情就是有趣的。因此,尽可能多地增加实践练习,并确保他们能够及时完成,并且能够及时成功完成。

    没有什么比听到更让人沮丧的了:"嗯,很抱歉你不能完成。你可以在这里找到解决办法。让我们复制它,假装它起了作用,然后继续说:"在一个课程中,例子很简单,你面前的人都知道这一点。所以如果他们甚至不能解决你为他们带来的简单例子,他们会怎么想?


    我想你可以干杯了。

    过了一段时间,差别就大了。初学者需要一整年的时间才能达到这样的程度:他们甚至可以理解那些不会让更高级的人感到厌烦的东西。

    然而,这显然取决于主题和设置。对于这些方法的某些组合,解决方案是将课程讲授到收费的级别。那些要前进的人将得到董事会和辞职,那些没有经验的人将落后和辞职。别担心,反正也不该上这门课。另一方面,如果他们需要上这门课,那么就有人在梯子上乱爬。


    真实世界的代码例子,学生可以想象自己在空闲时间之外做的事情。我记得有个老师告诉我用常量值,这是一种税。我只需要在两个地方使用这个值。她问我是否需要改变它,我只说了两个地方,我会手工改变它,我也无法想象政府会改变税率。

    我想不出一个非复杂的例子,在这个例子中我会使用const,所以我不会教他们使用const,但是对于数组,我会简单地写一个猜测游戏,然后当玩家赢得游戏时,它会以相同的顺序对他们回放所有的猜测。没有一种简单的方法可以实现w/o数组,而且我可以看到跟踪某些步骤/猜测是如何有用的(吹牛的权利,一个人有多快的猜测)。


    如果你有很多经验丰富的学生,或者这是一门高级的课程,你应该把重点放在融入现有的生态系统上。能够理解并融入到现有的项目中,而不是总是从头开始工作,这是你能给予那些学生的最重要的技能。

    因此,编程任务应该来自现实场景。例如,在开源项目中为他们分配任务。这也可以使它更有趣,尤其是因为他们的工作可能成为现实世界项目的一部分。

    如果真的是初学者,运气不好,你必须坚持基础知识。但是如果学生不是CS专业的学生,你可以从他们自己的领域(如工程、化学等)创造问题。


    在我选修的一门课程中,课程成绩的很大一部分来自期末项目,该项目提前宣布,并为各种附加组件和装饰物提供额外学分。有足够经验的学生可以在他们准备不充分的兄弟们学习基础知识的时候开始学习。

    但是正如戴夫·马克尔所说,这其中的一部分是让合适的学生进入你的班级:你真的想要一个一开始就完全匹配的团队。


    在第一天给出教学大纲(他们将学到什么),并要求掌握基本知识(你必须知道或不参加这门课的东西),然后坚持下去。在这些之后,你所能做的就是好好地教学(好好地解释事情,回答问题,偶尔开一两个玩笑等等)。关心谁上课,不管这个领域是否枯燥,不管学生是否对先决条件撒了谎,谁听了,其他的雅达雅达是你无法控制的。此外,你应该期望成年人成为成年人。如果学生不去上课,不去参加ACE考试,那对他们来说也许是最好的。如果他们逃课和炸弹测试,那么他们可能在错误的地方。

    我讨厌大学时教授们有这种心态。现在作为一名职业工作者,我明白了。


    我一直认为最好是通过实践来学习。在课程开始的时候,尤其是在课堂上教授语言句法是非常无聊的。最好要求你的学生自己完成一些工作,或者在实验室和助手一起完成。这使得更有经验的学生能很快完成这项工作。

    完成后,您可以进行一次讲座,讨论一些问题的解决方案。为什么他们是好的,为什么他们是坏的。

    如果你的课程结构让学生们总是以他们以前的工作为基础,那么这一点尤其有效。第一周可以是一个简单的事情,比如计算我从生日算起有几天大。一个数学上相对简单但有一些奇怪情况的问题。对于没有经验的人来说,这可能需要几个小时。尤其是当他们同时学习语法的时候。但这给了他们一个简单的目标。

    在这之后你可以在上面花费。用"持续数周"程序并添加允许它批量处理文件的功能。这教会人们重组和重构的重要性,并且可以一周又一周地扩展。你甚至可能想把前一周的好作品分发给那些落后于使用的人。很明显,你需要确保人们不会落后太多,但这是一个很好的方法,以确保每个人都觉得他们有一个公平的机会,即使他们上周的工作不是太好。做得好的人会结束的

    关键是要保持你的讲座水平相对较高,让人们自己或与实验室助理一起学习语法。你可以教他们不同的思考问题的方法,但是编写代码的实际行为更容易从中学习。