教初学者编程的最佳方法?[关闭]


324

原始问题

我目前正在教我的兄弟编程。他是一个初学者,但非常聪明。(他实际上想学习)。我注意到我们的某些会议在次要细节上陷入了停滞,而且我感觉自己组织得不够好。(但是这篇文章的答案很有帮助。

我可以做些什么更好地有效地教他?我可以用逻辑顺序来逐个概念地进行研究吗?我应该避免复杂到以后吗?

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


如何帮助

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

  • 初学者练习和项目构想
  • 教学初学者的资源
  • 截屏视频/博客文章/免费电子书
  • 打印适合初学者的书籍

通过链接描述资源以便我看看。我希望每个人都知道我肯定已经使用了其中一些想法。您的意见将汇总在此帖子中。


面向初学者的在线资源


推荐给初学者的印刷书籍


我不明白为什么应该将其关闭。至少有295位用户发现此问题(和92个答案)足以帮助投票,有290位用户认为该问题是他们的最爱之一。这个问题导致了非常有用的教学资源集合。它并没有真正导致“争论”或“辩论”,但是确实有很多关于如何解决编程中困难的“人为因素”的好建议。我认为解决这样的问题是严峻的,而且对StackOverflow社区有害。
贾斯汀标准时间

@JustinStandard您是否考虑过将您的编辑转换为对评论的几个答案?例如,这里这里这里
Jason Plank

Answers:


118

我不得不和几个初学者(从来没有写过任何代码)程序员一起工作,今年秋天我将与高中生一起进行课后工作坊。这是我最接近文档的内容。这项工作仍在进行中,但希望对您有所帮助。

1)FizzBu​​zz。从命令行程序开始。您可以非常快速地编写一些有趣的游戏或工具,并且无需首先学习GUI工具即可非常快速地学习所有语言功能。这些早期的应用程序应该足够简单,您无需使用任何真正的调试工具即可使其运行。

如果没有别的,像FizzBu​​zz这样的项目都是好项目。您的前几个应用程序不必处理数据库,文件系统,配置等。这些概念使大多数人感到困惑,并且当您仅学习语法和基本框架功能时,您实际上并不需要更多的复杂性。

一些项目:

  • 你好,世界!
  • 以我的出生年份为基础,计算我的年龄(仅(现在-然后)没有月份修正)。(简单的数学,输入,输出)
  • 询问方向(上,下,左,右),然后告诉用户他们的命运(掉进洞里,找到蛋糕,等等)。(布尔逻辑)
  • FizzBu​​zz,但每秒计数一次。(循环,计时器和更多逻辑)
  • 根据他们的年龄,有些人真的很喜欢应用程序,该应用程序会在一定间隔内对用户进行随机侮辱。(如果将间隔设为随机,则循环,数组,计时器和随机)

2)简单项目一旦他们掌握了语言功能,就可以开始一个项目(简单,有趣的游戏效果很好。)。您应该尝试使第一个项目能够在6到12个小时内完成。不要花时间来架构它。让他们设计它,即使它很烂。如果失败了,请谈论发生的事情以及失败的原因,然后选择另一个主题并重新开始。

从这里开始介绍工具的调试功能。即使您通过阅读代码可以看到问题,也应该教他们如何使用工具,然后向他们展示如何看到它们。这具有教调试工具和教如何在没有工具的情况下识别错误的双重目的。

一旦项目开始运行,或者如果项目开始运行,则可以使用它来引入重构工具。如果您随后可以使用一些您从未计划过的简单功能来扩展项目,那就很好了。这通常意味着重构和大量的调试,因为很少有人会在第一次编写甚至一半不错的代码。

一些项目:

  • man子手游戏
  • 试验机器人(VexMindstorms是可选的)

3)真实项目开始一个实际项目可能需要一些时间。使用适当的源代码控制,并提出时间表。像实际项目一样运行此项目,如果没有其他必要的经验,则必须使用这些工具。

显然,您需要针对每个人进行调整。我发现的最重要的事情是,即使第一个简单的应用程序也可以应用于人们感兴趣的内容。

一些项目:

  • 俄罗斯方块
  • 基于文本文件的博客引擎
  • 更先进的机器人工作

这是一个很好的指南。就我个人而言,我无法从纸袋中编码出自己的方式(实际上,我希望看到有人这样做),因此,这也似乎是自学的好指南。
keyofnight

这是一个很好的答案。我唯一的反对意见是《俄罗斯方块》不是第一局或第二局的好选择。在那个级别上,碰撞检测可能是一个困难的问题-如果他们能够解决,那就太好了。
phkahler 2010年

@phkahler我明白你的意思,但是我相信俄罗斯方块很有趣,因为在编写代码之前和之后都可以分析太多的OSS / demo实现。
埃里克·哈斯金斯

30

您可以尝试使用Alice。这是一个3D程序,专门用于入门编程课。

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

  • 语法错误
  • 动力(写一些有意义而有趣的东西,而不是做作)

爱丽丝使用拖放界面来构建程序,从而避免了语法错误的可能性。通过Alice,您可以构建3D世界,并具有代码控制(简单)的3D字符和动画,通常比实现链表更有趣。

经验丰富的程序员可能会视爱丽丝为玩具,嘲笑拖放代码行,但研究表明这种方法行之有效。

免责声明:我在Alice上工作。


我是在兰迪·保罗(Randy Pausch)的最后一次演讲中才知道的。这个项目背后的理由令我震惊。
Jesvin Jose

28

我推荐徽标(又名乌龟)来介绍基本概念。它提供了具有即时图形反馈的良好沙箱,并且您可以演示循环,变量,函数,条件等。此页面提供了出色的教程。

徽标后,移至Python或Ruby。我推荐Python,因为它基于ABC,它是为教学编程而发明的。

在教授编程时,我必须赞同EHaskins关于简单项目然后是复杂项目的建议。最好的学习方法是从确定的结果和可衡量的里程碑开始。它使课程保持重点,允许学生建立技能,然后再利用这些技能,并给学生一些向朋友炫耀的东西。不要低估了为自己的工作展示某些东西的力量。

从理论上讲,您可以坚持使用Python,因为Python几乎可以完成任何事情。这是教授面向对象的程序设计和(大多数)算法的好工具。您可以像命令行一样在交互式模式下运行Python,以了解其工作方式,或一次运行整个脚本。您可以动态运行解释的脚本,也可以将它们编译为二进制文件。有成千上万的模块可以扩展功能。您可以制作与Windows捆绑在一起的图形计算器一样的图形计算器,也可以制作IRC客户端或其他任何东西。

XKCD更好地描述了Python的功能: “你在飞!怎么样?”  “蟒蛇!”

之后,您可以迁移到C#或Java,尽管它们没有提供Python所没有的很多功能。这些方法的好处是它们使用C语言风格的语法,许多(我敢说最多吗?)语言都使用C语言风格的语法。您无需担心内存管理,但是您可以习惯使用语言解释器的更多自由和更少的处理。Python强制使用空格和缩进,这在大多数情况下是很好的,但并非总是如此。使用C#和Java,您可以在保持强类型的同时管理自己的空格。

从那里开始,标准就是C或C ++。这些语言的自由几乎是存在的。现在,您将负责自己的内存管理。没有垃圾收集可以帮助您。在这里,您可以教授真正的高级算法(例如mergesort和quicksort)。在这里,您可以了解为什么“细分错误”是一个诅咒词。在这里,您可以下载Linux内核的源代码并凝视Abyss。首先编写循环缓冲区和用于字符串操作的堆栈。然后继续前进。


实际上,您没有完全管理C中的内存。您将拥有malloc等,并免费为您管理它。您只需要告诉系统何时需要更多内存以及何时使用完已使用的内存即可。
compman 2011年


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

12

从Python中的Turtle图形开始。

我将使用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

在尝试完成最后两个任务时,他们将进行很多失败的尝试,但是这些失败在视觉上将是有趣的,并且他们将很快学会,因为他们试图弄清为什么它没有达到他们的期望。



11

关键是有问题的人需要解决一些问题。如果您没有要编写的程序(以及一些明智且定义明确的程序,而不是“我要编写下一本Quake!”),则您将无法学习编程,因为您没有动力去激励自己。 。我的意思是,您可以读一本书,并对语言的语法和语义有一个大概的了解,但是除非您拥有要编写的程序,否则您将永远无法理解。

如果存在这种推动力,那么其他所有内容都只是次要的细节。


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





4

如果他有兴趣,次要细节不是很好的部分吗?使用python,您已经将它的GUI切断了,这样混乱就消失了。为什么不选择一个项目,一个游戏之类的东西并实现它。经典的hi-lo数字猜谜游戏可以在命令行中以20-30行代码(具体取决于语言)简单地实现,并为您提供变量,条件,循环和用户输入。



4

我只是让他写大量的代码。让他开车去做你们所做的一切,并且随时可以回答问题。

信不信由你,经过几个月的编写大量笨拙的代码之后,他将开始明白这个想法,并开始编写更好的程序。到那时,您可以陷入细节(内存等)的泥潭,还可以讨论一般的设计原则。

我听说,伟大的艺术家与平庸的艺术家之间的区别是,每一次练习,无论大小,他们都会有所进步。让您的兄弟练习一下,他每次坐在键盘上都会使他进步。

编辑:[贾斯汀标准]

埃斯特万,这让我想起最近的编码恐怖后,我认为你是对的。但是我认为仍然值得寻找方法来指导他的实践。没问题,我希望他编写尽可能多的代码。这就是我要样例项目的原因之一。


是的,我知道您在谈论贾斯汀。阅读它使我想起了我所学到的大多数东西是来自尝试和从我自己的错误中学到的东西。我真的无法强调边做边学的重要性!
Esteban Araya

2

首先,像其他所有人一样开始工作:使用Hello World程序。这很简单,并且给了他们基本的程序布局感觉。尝试回想起您第一次编程的时间以及其中一些概念的难易程度-从简单开始。

在Hello World之后,继续创建一些基本变量,算术,然后创建布尔逻辑和if / else语句。如果您有一本旧的编程教科书,请查看一些早期示例,并让他复习这些示例。只是不要尝试一次过多地介绍所有内容,否则将会使您感到困惑和困惑。


2

在教您的兄弟编程时,您应该谨记的一点是,不要太依赖您。通常,当我发现自己在帮助他人时,他们会开始将我视为所有问题的答案书,而不是尝试寻找答案,他们只是问我。通常最好的老师是实验,每当您的兄弟有一个问题,例如“如果我在字符串中加2,会发生什么?”。您应该告诉他尝试一下,亲自看看。我还注意到,当我无法将概念传达给某人时,这有助于查看一些示例代码,在这里我们可以分别查看每个段并逐个进行解释。附带说明一下,刚接触编程的人经常会遇到面向对象编程的想法,


2

我曾经教编程,与您想学习的大多数学生相比,您的兄弟有一个主要优势:)

如果您决定和C一起去,那么一个朋友的站点会提供一些程序,这些程序可以使用较早的一代记住的基本键入程序。他们中较复杂的人使用ncurses,这在某种程度上抵消了它们作为教学辅助工具的使用,但是其中一些是很小的小东西,您无需学习即可学习负载。

我个人认为Python和Ruby将成为出色的第一语言。

编辑: 一夜之间出现的初学者编程作业列表可能正是您想要的。


2

这确实取决于您兄弟的学习风格。许多人会变得肮脏,只有动手才能学得更快,随着他们的进步和积累知识,使概念和全局变得清晰。

我,我更喜欢从大局开始,深入研究细节。我想知道的第一件事是它们如何融合在一起,然后是所有面向对象的蠢事,然后是类和实例等等。在学习语法之前,我喜欢了解基本概念和一些理论。我有一个优势,因为20年前我用BASIC编写了一些游戏,但此后没什么。

在实际编写代码之前,通过总体任务说明,计划和/或流程图,然后详细说明一些伪代码(倾向于最终使用的语法)来掩盖生产过程,这可能是有用的。

这里的黄金法则是保持学生的学习风格。


2

如果您的兄弟可以使用iTunes,则可以下载新南威尔士大学的Richard Buckland开设的计算机科学入门课程的视频讲座。他是一位引人入胜的讲师,涵盖计算和C语言的基础知识。如果没有其他要求,请告诉您的兄弟在后台播放视频,某些概念可能会因渗透而陷入。:)

COMP1917高等计算-2008会话1 http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

如果链接不起作用,请使用以下路径:

主页-> iTunes U->工程-> COMP1917高等计算-2008第1节


2

有一本非常适合学习python的Wikibook

我不知道其他语言的Wikibook怎么样,但是我个人从Wikibook中学习了python,就像2007年2月一样

ps-如果您不熟悉Wikibook,则基本上是书籍创作的Wikipedia版本。这很难描述,但是如果您查看那里的几本书,就会知道它是如何工作的



2

我认为Python是个好主意。我会给他一些基本任务,让他自己做,并告诉他,他遇到的任何死胡同都可以通过去Google来解决。至少对我来说,独自解决一个问题总是比别人告诉我解决方案更好。

一些可能的项目(无特定顺序):

  • 硬币翻转模拟器。让用户输入所需的硬币投掷次数。执行它并显示结果以及正面或反面的百分比。

  • 使用带有菜单的温度转换器,该菜单需要用户输入以选择用户想要执行的转换类型。选择转换并完成转换后,应返回主菜单。

    这是具有相同概念的扩展转换器的示例:http : //pastebin.org/6541

  • 编写一个使用数字输入并显示要转换为的字母等级的程序。最终将根据if和elif语句评估输入,以找到适合的位置。

  • 进行一次简单的测验,以进行多项选择或填写空白问题。最后,它将显示用户的操作方式。他可以选择任何想要的问题。

  • 输入一些(可能很大)的便士,并将其转换成更大的面额。例如,149便士= 1美元,1个季度,2个角钱和4个便士。

  • 创建一个简单的列表管理器。能够添加/删除列表以及在这些列表中添加/删除条目。这是圣诞节清单管理器的示例:http : //pastebin.org/6543

  • 创建一个将生成的程序,然后测试输入的数字是否形成一个魔方(带有2D数组)。这是一些示例代码,但实际上应该在每个步骤中打印出正方形,以显示用户在正方形上的位置:http : //pastebin.org/6544

我还建议使用xTurtle或其他图形模块做一些事情,以使事情变得混乱,并避免他变得无聊。当然,这是非常实际的编程,而不是很多人真正会使用python的脚本,但是我给出的示例几乎直接取自于我通过python学习时,并且对我来说非常有用。祝好运!



2

如果您的兄弟喜欢拼图,我建议您使用Python Challenge。在一对一的教程中,我不会将其用作正式的教学工具,但是当您不在一起挑战自己并享受一些乐趣时,他可以做这件事。



2

在浏览了几本免费的电子书之后,我发现最适合学习编程的书是O'Reily Press出版的Head First Programming。它使用Python作为语言,并从一开始就为您提供要处理的程序。他们比“ Hello World”更有趣。我花在上面的钱很值得,而且由于花了一点时间,您也许可以在Ebay或Amazon上找到更便宜的二手书。


1

如果您想教编程的基础知识,而又不特定于语言,则有一个名为 在MIT中创建 Scratch。它旨在帮助人们发展编程技能。用户创建Scratch项目时,他们会学习创建条件,循环等。还有一个Scratch项目社区,可以下载项目的表单-这样,您就可以浏览其他人的程序并查看其构建方式。


1

我认为,一旦他掌握了基础知识(变量,循环等),就应该尝试帮助他找到他感兴趣的特定事物,并帮助他了解实现它的必要性。我知道,如果我感兴趣的话,我会更倾向于做某事。另外,确保让他为一些棘手的问题而奋斗,没有什么比自己解决这个问题更令人满意的了。


1

通过学习如何使用流程图和PDL以与语言无关的方式解决问题,使我受到了教育(程序设计语言)。几周后,我学会了将编写的PDL转换为语言。我很高兴能以这种方式学习,因为我花了大部分时间来编程,解决了各种问题,而又不受语言的束缚。我使用的语言一直是实现细节,而不是设计的一部分。

必须通过将问题分解为基本步骤来解决问题是一项关键技能。我认为这是将那些可以编程的人与那些不能编程的人分开的事情之一。

就如何处理语言概念的顺序而言,我认为最简单的方法是决定要考虑一个项目并根据需要解决这些概念。这样,您就可以根据需要将它们应用到您感兴趣的事情上。学习语言时,最好记住几个简单的项目,而一些项目要具有渐进的复杂性。确定这些内容将帮助您确定所需的概念及其顺序。


1

我还建议您观看一些截屏视频-它们通常是在特定技术而非语言的背景下创建的,尽管如果显示Python代码,则可以:)。关键是-它们是由一些优秀的程序员创建的,看着优秀的程序员编程是一件好事。您和您的兄弟也可以进行一些对等编程,这可能是一个更好的主意。只是别忘了解释为什么您要以这种方式而不是那样的方式做事。我认为学习编程的最好方法是从好的例子中去,甚至不要去看坏的例子。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.