教授编程初学者的最佳方法是什么?

324

原始问题

我目前正在教导我的兄弟编程。他是一个完全的初学者,但非常聪明。(而且他真的想学习)。我注意到我们的一些课程在细节上变得很困难,而且我觉得我没有很好地组织。(但是这篇文章的答案帮了很多。)

我应该怎么做才能更有效地教他?我可以使用逻辑顺序逐个概念地运行吗?有什么复杂性我应该避免直到以后?

我们使用的语言是Python,但欢迎任何语言的建议。


如何提供帮助

如果您有好的建议,请在回答中添加以下内容:

  • 初学者练习和项目想法
  • 教授初学者的资源
  • 屏幕录像/博客文章/免费电子书
  • 适合初学者的印刷图书

请使用链接描述资源,以便我可以查看。我希望每个人都知道我一定会使用这些想法。您的提交将被聚合在此帖子中。


针对初学者的在线资源


推荐的纸质书籍,适用于初学者教学


我不明白为什么这个问题应该被关闭。至少有295个用户发现这个问题(以及92个答案)足够有帮助,给它点了赞,其中290个甚至将其列为自己的收藏。这个问题导致了非常有用的教学资源的聚集。它并没有引起“争论”或“辩论”,而是提供了很多关于如何解决编程中困难的“人为因素”的宝贵建议。我认为关闭这样一个问题对StackOverflow社区来说是严厉和有害的。 - Justin Standard
@JustinStandard 你有没有考虑将你的编辑转换为对评论的几个答案?例如:这里这里这里 - Jason Plank
86个回答

118

我曾经和一些初学者(从未编写过代码)一起工作,今年秋季我将为高中学生开设课后研讨班。这是我拥有的最接近文档的东西。它仍然在不断完善中,但我希望它能够有所帮助。

1) FizzBuzz. 从命令行程序开始。你可以很快地编写一些有趣的游戏或工具,并且无需先学习 GUI 工具即可快速学习所有语言特性。这些早期应用程序应该足够简单,以至于您不需要使用任何真正的调试工具来使它们工作。

如果没有其他的事情,FizzBuzz 这样的项目是很好的。您的前几个应用程序不应该涉及数据库、文件系统、配置等。这些概念只会让大多数人感到困惑,当您刚刚学习语法和基本框架特性时,您确实不需要更多的复杂性。

一些项目:

  • Hello World!
  • 输入我的出生年份,计算我的年龄(只考虑年份,不考虑月份)。(简单的数学运算,输入和输出)
  • 询问一个方向(上、下、左、右),然后告诉用户他们的命运(掉进一个洞里,找到一个蛋糕等)。(布尔逻辑)
  • FizzBuzz 但每秒计数一次。 (循环、定时器以及更多的逻辑)
  • 根据他们的年龄,有些人喜欢一个应用程序在某个时间间隔内随机侮辱用户。 (循环、数组、定时器和随机数,如果你让间隔时间随机)

2) 简单项目 一旦他们对语言特性有了很好的理解,你可以开始一个项目(简单、有趣的游戏效果很好)。你应该尝试使第一个项目能够在6-12小时内完成。不要花时间提前设计它。让他们设计即使它很糟糕。如果它崩溃了,谈论发生了什么以及为什么失败,然后选择另一个主题重新开始。

这是介绍如何使用调试工具的起点。即使您可以通过阅读代码看到问题,您也应该教他们如何使用工具,然后展示如何看到问题所在。这有助于同时教授调试工具和不依赖工具识别错误的方法。

一旦项目功能得到确认,您可以使用它来介绍重构工具。如果您能够为项目添加一些未计划的简单功能,那就很好了。这通常意味着需要进行重构和大量调试,因为很少有人第一次写出甚至八九不离十的代码。

一些项目:

  • 猜词游戏
  • 尝试机器人技术(VexMindstorms 是可选方案)

3)真实项目 开始一个可能需要一些时间的真实项目。使用适当的源代码控制,并确保制定进度表。像真正的项目一样运行此项目,即使没有其他好处,它也是处理工具的好经验。

显然,您需要根据每个人进行调整。我发现最重要的事情是使即使是最简单的应用程序也与人们感兴趣的事情相关。

一些项目:

  • Tetris
  • 基于文本文件的博客引擎
  • 更高级的机器人技术工作

这是一份很棒的指南。就我个人而言,我无法编写任何代码(实际上,我很想看到有人在现实生活中做到这一点),因此这似乎是一个很好的自学指南。 - keyofnight
这是一个非常好的回答。我的唯一反对意见是Tetris不是一个好的第一或第二选择。在那个级别上,碰撞检测可能是一个难题——如果他们能解决它就很棒。 - phkahler
@phkahler 我理解你的观点,但我认为俄罗斯方块很有趣,因为在编写代码之前和之后,你可以分析许多开源/演示实现。 - Eric Haskins

30

您可以尝试使用Alice。它是一个为入门级编程课程设计的3D程序。

新手程序员面临的两个最大障碍通常是:

  • 语法错误
  • 动力(编写有意义且有趣的代码而非人为构造的代码)

Alice使用拖放界面构建程序,避免了可能出现的语法错误。Alice允许您构建3D世界,并使您的代码控制(简单的)3D角色和动画,这通常比实现链接列表更有趣。

有经验的程序员可能会将Alice视为玩具,并嘲笑拖放代码行,但研究表明这种方法是有效的。

免责声明:我参与了Alice的开发。


我是通过兰迪·波许的最后一堂演讲了解到这个项目的。这个项目背后的推理让我大开眼界。 - Jesvin Jose

28

我推荐使用Logo(也称为海龟绘图语言)来学习基本概念。它提供了一个良好的沙盒环境,能够立即获得图形反馈,并且您可以演示循环、变量、函数、条件语句等内容。 此页面 提供了一个优秀的教程。

完成Logo之后,可以进入Python或Ruby。我建议使用Python,因为它是基于ABC发明的,目的在于教授编程知识。

在教授编程时,我认同EHaskins关于先从简单项目开始再逐渐转向复杂项目的建议。最好的学习方法是以确定的结果和可衡量的里程碑为起点。这保持了课程的专注性,允许学生构建技能并在这些技能的基础上继续构建,同时给学生展示成果。不要低估有成果展示的力量。

理论上,您可以一直使用Python,因为Python几乎可以做任何事情。它是教授面向对象编程和大多数算法的良好工具。您可以像在命令行中一样在交互模式下运行Python,或者一次运行整个脚本。您可以实时解释运行脚本,也可以将其编译成二进制文件。有数千个模块可扩展功能。您可以制作像Windows捆绑的图形计算器,或您可以制作IRC客户端,或任何其他应用。

XKCD 更好地描述了Python的威力: "You're flying! How?" "Python!"

在此之后,您可以转而学习C#或Java,尽管它们并没有提供Python所没有的太多东西。这些语言的好处是它们使用C风格的语法,许多(我敢说大多数)语言都使用此语法。您无需担心内存管理,但可以逐渐适应具有更多自由和语言解释器少一些辅助功能的情况。Python强制执行空格和缩进,在大多数情况下很不错,但并非总是如此。C#和Java允许您保留自己的空格同时保持强类型。

从那里开始,标准是C或C++。这些语言中的自由几乎是存在感。现在您负责自己的内存管理。没有垃圾收集来帮助您。这就是您学习真正高级算法(如归并排序和快速排序)的地方。这是您了解为什么“分段错误”是一个坏词。这是您下载Linux内核源代码并凝视深渊的地方。从编写循环缓冲区和字符串操作堆栈开始。然后逐步升级。


实际上,在 C 语言中,你并不完全管理内存。你可以使用 malloc 等函数来分配内存,并使用 free 函数来释放内存。你只需要告诉系统何时需要更多的内存以及何时完成使用的内存即可。 - compman

15

12

从Python的海龟图形开始。

我会使用Python标准自带的海龟图形。它是可视化的、简单的,你可以在这个环境中介绍很多编程概念,比如迭代和过程调用,然后再深入语法。考虑下面的Python交互会话:

>>> from turtle import *
>>> setup()
>>> title("turtle test")
>>> clear()
>>>
>>> #DRAW A SQUARE
>>> down()        #pen down
>>> forward(50)   #move forward 50 units
>>> right(90)     #turn right 90 degrees
>>> forward(50)
>>> right(90)
>>> forward(50)
>>> right(90)
>>> forward(50)
>>>
>>> #INTRODUCE ITERATION TO SIMPLIFY SQUARE CODE
>>> clear()
>>> for i in range(4):
        forward(50)
        right(90)
>>>
>>> #INTRODUCE PROCEDURES   
>>> def square(length):
        down()
        for i in range(4):
            forward(length)
            right(90)
>>>
>>> #HAVE STUDENTS PREDICT WHAT THIS WILL DRAW
>>> for i in range(50):
        up()
        left(90)
        forward(25)
        square(i)
>>>
>>> #NOW HAVE THE STUDENTS WRITE CODE TO DRAW
>>> #A SQUARE 'TUNNEL' (I.E. CONCENTRIC SQUARES
>>> #GETTING SMALLER AND SMALLER).
>>>
>>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING
>>> #EACH SUCCESSIVE SQUARE TILTED

在尝试完成最后两个任务时,他们会有许多失败的尝试,但这些失败将是视觉上有趣的,而且当他们试图弄清为什么没有画出他们期望的东西时,他们会很快学习到。

http://us.pycon.org/media/2009/talkdata/PyCon2009/065/SevenWaysToUseTurtle-PyCon2007.pdf - jfs

12

Python包VPython——面向普通人的3D编程(视频教程)。

代码示例:

from visual import *

floor = box (pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)
ball = sphere (pos=(0,4,0), radius=1, color=color.red)
ball.velocity = vector(0,-1,0)
dt = 0.01

while 1:
    rate (100)
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < ball.radius:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

VPython反弹球 http://vpython.org/bounce.gif


刚学习完基本概念后非常适合。创建可视化内容是激励人们学习编程的好方法。 - phkahler

11
重要的是,这个人需要有一些问题需要解决。如果你没有想写的程序(而且是明智和明确定义的,而不是“我想写下一个 Quake!”),那么你就学不会编程,因为你没有动力。我的意思是,你可以读一本书,并大致了解语言的语法和语义,但在你有一个“想写的程序”之前,你永远无法掌握它。
如果有这样的推动力,则其他所有事情都只是细节问题。

我认为学习任何技术主题的最佳方法是通过学习解决小型、渐进式问题。 - cbednarski

8

7

http://tryruby.hobix.com/">在您的浏览器中尝试Ruby


不错!Ruby 看起来易用且功能强大。 - Luc M


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接