教新手入门的最佳方法?

原来的问题

我目前正在教我的哥哥编程。 他是一个初学者,但很聪明。 (而他实际上是想学习)。 我注意到,我们的一些会议已经陷入了一些细节,我不觉得自己组织得很好。 ( 但这个post的答案帮了很多。

我能更好地教他有效的方法吗? 有没有一个逻辑顺序,我可以用概念概念贯穿概念? 有没有复杂性,我应该避免以后?

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


如何帮助

如果你有好的,请在你的回答中join以下内容:

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

请描述资源和链接,以便我可以看看。 我希望每个人都知道我确实使用了这些想法。 您的意见将汇总在这个职位。


为初学者提供在线资源

  • 使用Python进行编程的简单介绍
  • 如何像电脑科学家一样思考
  • 爱丽丝:初学者的3D程序
  • Scratch(开发编程技巧的系统)
  • 如何devise程序
  • 计算机程序的结构和解释
  • 学会编程
  • 罗伯特·雷德如何成为一名程序员
  • 微软XNA
  • 产生下一代黑客
  • COMP1917由Richard Buckland 撰写的高等计算讲座 (需要iTunes)
  • 潜入Python
  • Python Wikibook
  • 欧拉项目 – 样本问题(主要是math)
  • pygame – 创build游戏的一个简单的python库
  • 用Python发明自己的电脑游戏
  • 编程的基础超越基础的下一步。
  • 例如吱吱作响
  • 蛇为孩子而战 (这不仅仅是为了孩子!)

推荐打印书籍教学初学者

  • 加速C ++
  • Python编程的绝对初学者
  • 由Charles Petzold编码
  • Python编程:计算机科学入门第2版

我不得不和几个初学者(从来没有写过一行代码)的程序员一起工作,今年秋天我会和高中生一起做一个课后工作坊。 这是我要logging的最接近的东西。 这仍然是一个正在进行的工作,但我希望它有帮助。

1) FizzBu​​zz。 从命令行程序开始。 您可以快速编写一些有趣的游戏或工具,并且可以快速学习所有语言function,而无需先学习GUI工具。 这些早期的应用程序应该足够简单,您不需要使用任何真正的debugging工具来使它们工作。

如果没有其他事情像FizzBu​​zz是好项目。 你的前几个应用程序不应该处理数据库,文件系统,configuration等。 这些概念只是混淆了大多数人,当你刚刚学习语法和基本框架特性时,你并不需要更多的复杂性。

一些项目:

  • 你好,世界!
  • 以我的出生年份,并计算我的年龄(只是(现在 – 然后)没有月份更正)。 (简单的math,input,输出)
  • 要求一个方向(上,下,左,右),然后告诉用户他们的命运(落在一个洞里,find一个蛋糕等)。 (布尔逻辑)
  • FizzBu​​zz,但是每秒钟计数一次。 (循环,定时器和更多的逻辑)
  • 根据他们的年龄,一些真的很喜欢一个应用程序,在一定的时间间隔内调用用户随机的侮辱。 (循环,数组,定时器和随机的,如果你使间隔随机)

2) 简单的项目一旦他们掌握了语言特征,你可以开始一个项目(简单,有趣的游戏工作良好)。 您应该尝试在6-12小时内完成第一个项目。 不要花时间去devise它。 让他们devise它,即使它吸。 如果分崩离析,请谈谈发生了什么事情,为什么会失败,然后select另一个话题,重新开始。

这是您开始引入工具debuggingfunction的地方。 即使你能通过阅读代码来看到问题,你应该教他们如何使用这些工具,然后告诉他们如何看待它。 这有助于教授debugging工具和教授如何在没有工具的情况下识别错误的双重目的。

一旦或者如果,项目变得function,你可以使用它来引入重构工具。 如果你可以用一些你从来没有计划过的简单function来扩展项目,那就太好了。 这通常意味着重构和重要的debugging,因为很less有人第一次写出一半体面的代码。

一些项目:

  • Hang子手游戏
  • 尝试机器人( Vex和Mindstorms是select)

3) 真正的项目启动一个真正的项目可能需要一些时间。 使用适当的源代码pipe理,并指出有一个时间表。 运行这个项目就像一个真正的项目,如果没有其他的好经验,必须处理这些工具。

显然你需要为每个人调整这个。 我发现的最重要的事情是甚至使第一个简单的应用程序适用于该人感兴趣的。

一些项目:

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

我最近写了一篇题为“ 如何教你的女朋友编程 ”的文章,与女朋友以及一些不懂的技术教学有关。

我被告知这也很有趣。

你可以尝试使用Alice 。 这是一个用于入门级编程课程的3D程序。

新程序员面临的两大障碍往往是:

  • 语法错误
  • 动机(写一些有意义而有趣的东西而不是人为的)

Alice使用拖放界面来构build程序,避免了语法错误的可能性。 Alice可以让你构build3D世界,让你的代码控制(简单的)3Dangular色和animation,这通常比实现链表更有趣。

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

免责声明:我曾在爱丽丝工作。

我推荐标志(又名乌龟)来了解基本概念。 它提供了一个很好的沙箱,可以直接显示graphics反馈,并且可以实现循环,variables,函数,条件等。 本页提供了一个很好的教程。

Logo之后,移动到Python或Ruby。 我推荐Python,因为它基于ABC,是为了编程教学而发明的。

在编程教学时,我必须先推荐EHaskins对简单项目和复杂项目的build议。 学习的最好方法是从一个确定的结果和一个可衡量的里程碑开始。 它保持了课程的重点,让学生build立技能,然后build立在这些技能,并给学生的东西炫耀给朋友。 不要低估为自己的工作展示自己的力量。

理论上,你可以坚持使用Python,因为Python几乎可以做任何事情。 这是教导面向对象编程和(大多数)algorithm的好工具。 你可以像命令行一样在交互模式下运行Python,以了解它是如何工作的,或者一次运行整个脚本。 您可以运行您的脚本解释,或编译成二进制文件。 有数千个模块来扩展function。 你可以制作一个像Windows捆绑的graphics计算器,或者你可以创build一个IRC客户端,或其他任何东西。

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

之后你可以转移到C#或者Java,尽pipe它们不提供Python所没有的东西。 这些好处是,他们使用C语言的语法,很多(我敢说最多?)语言使用。 你不需要担心内存pipe理,但是你可以习惯于更多的自由和更less的手语从语言翻译。 Python强制执行空格和缩进,这在大多数情况下都很好,但并不总是如此。 C#和Java让你pipe理自己的空白,同时保持强types。

从那里,标准是C或C ++。 这些语言的自由几乎是存在的。 你现在负责你自己的内存pipe理。 没有垃圾收集来帮助你。 这是你教真正先进的algorithm(如mergesort和quicksort)的地方。 这是你了解为什么“分段错误”是一个诅咒词。 这是你下载Linux内核的源代码并注视深渊的地方。 首先编写一个循环缓冲区和一个string操作的栈。 然后工作你的方式。

一个好的Python课程是麻省理工学院使用Python进行编程的简洁介绍 。 这是免费的在线,你不必是一个麻省理工学院的理解。

编辑[ Justin标准 ]

本课程使用这个免费的在线书籍: 如何像计算机科学家一样思考
我肯定觉得它非常有用。

Python软件包VPython – 普通人的3D编程( video教程 )。

代码示例:

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

从Python中的Turtlegraphics开始。

我将使用Python标准的龟graphics。 这是可视的,简单的,你可以使用这个环境来引入许多编程概念,如迭代和过程调用,在语法太过分之前。 在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' (IE CONCENTRIC SQUARES >>> #GETTING SMALLER AND SMALLER). >>> >>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING >>> #EACH SUCCESSIVE SQUARE TILTED 

为了完成最后的两个任务,他们将有许多失败的尝试,但失败将是视觉上有趣的,他们会很快学习,因为他们试图找出为什么没有画出他们所期望的。

关键是有问题的人需要解决一些问题。 如果你没有一个你想写的程序(还有一些明智的,明确的,而不是“我想写下一个地震!”),那么你不能学习编程,因为你没有什么可以激励你。 我的意思是,你可以阅读一本书,对语言的语法和语义有一个粗略的理解,但是直到你有一个你想写的程序,你永远不会掌握荨麻。

如果存在这种推动力,那么其他一切都只是小细节。

我不知道这里有没有人提到过,但是你可能想看看Zed Shaw的 “ 学习Python的艰辛之路”

希望这可以帮助

如何devise程序

计算机程序的结构和解释 。 video讲座http://www.swiss.ai.mit.edu/classes/6.001/abelson-sussman-lectures/

这是我的小兄弟们用来学习的一本很棒的书:

http://pine.fm/LearnToProgram/

当然,最重要的是在完成本书之后立即开始一个真正有用的程序。

如果他有兴趣,是不是细节的好的部分? 使用python,你已经把它关掉了,所以混乱就消失了。 为什么不select一个项目,一个游戏什么的,并且实现它。 经典的hi-lo猜谜游戏可以通过20-30行代码(取决于当然的语言)从命令行简单实现,并为您提供variables,条件,循环和用户input。

我只是让他写了大量的代码。 让他驾驶你们所做的一切,随时回答问题。

不pipe你信不信,经过几个月的写作蹩脚的代码,他会开始得到的想法,并开始写更好的scheme。 在这一点上,你可能会陷入细节(记忆等),也谈到一般的devise原则。

我听说,伟大的艺术家和平庸的艺术家是分开的,每次他们练习时,他们都会改进一些东西,不pipe多小。 让你的弟弟练习,每当他坐在键盘上,他都会好起来的。

编辑:[贾斯汀标准]

埃斯特class,这让我想起最近的编码恐怖事件 ,而且我认为你是对的。 但是我认为还是值得find方法来指导他的实践。 毋庸置疑,我想要他写出尽可能多的代码,因为他知道该怎么做。 这就是我要求提供示例项目的一个原因。

首先,像其他人那样开始:用Hello World程序。 这很简单,它给了他们一个程序布局的基本感受。 尝试并记住,当你第一次编程时,一些概念是多么困难 – 从简单的开始。

在Hello World之后,继续创build一些基本variables,算术,然后转换为布尔逻辑和if / else语句。 如果你有一本旧的编程教科书,查看一些早期的例子,并让他解决这些问题。 不要一下子把所有的东西都介绍一遍,否则会令人难以置信。

在教你的兄弟进行编程时,你应该非常注意的一点是,他不要太依赖你。 通常当我发现自己帮助别人时,他们会开始把我当作答案来回答他们所有的问题,而不是试着find答案,他们只是问我。 通常最好的老师是实验,每次你的兄弟有一个问题,如“如果我加2串会发生什么? 你应该告诉他尝试一下,自己去看看。 另外我注意到,当我不能把概念传达给某个人时,可以看到一些示例代码,我们可以分别查看每个片段并逐一解释它。 作为一个侧面提示,新编程的人往往对于面向对象编程的思想有困难,当他们教给他们时,他们会说他们理解它,但是直到实际执行它才会得到一个清晰的概念。

我曾经教过编程,你的兄弟比我想要学习的大多math生有一个主要的优势:)

如果你决定和C一起走, 一个朋友有一个网站 ,有一个程序的那些从老一代的使用记住作为基本的input。 他们中较为复杂的一些人使用ncurses,它们有些否定了它们作为辅助教具的用途,但其中有些是小小的东西,你可以在没有被教导的情况下学习装载。

就我个人而言,我认为Python和Ruby会成为优秀的第一语言。

编辑: 初学者编程作业列表在一夜之间出现可能正是你正在寻找。

这真的取决于你哥哥的学习风格。 许多人通过让自己的手变得脏兮兮,学习得更快,在进步和build立自己的知识的过程中,概念和大局都得到了体现。

我,我更喜欢从大局开始,深入细致地研究。 我想知道的第一件事就是如何把所有这些面向对象的gobbledygook,然后关于类和实例等。 在学习语法之前,我想知道底层概念和一些理论。 我有一些优势,因为20年前我在BASIC写了一些游戏,但是没有什么。

也许从实际的任务说明开始,然后制定计划和/或stream程图,然后在实际编写代码之前详细阐述一些伪代码(倾向于最终将使用的语法)来制作生产stream程是非常有用的。

这里的黄金法则是把你学生的学习风格弄清楚。

如果你的兄弟可以访问iTunes,他可以下载由新南威尔士大学的理查德·巴克兰(Richard Buckland)提供的计算机科学入门课程的video讲座。 他是一个有吸引力的讲师,涵盖了计算机基础和C语言。 如果没有别的,告诉你的兄弟在背景中玩vids,一些概念可能通过渗透沉入水中。 🙂

COMP1917 Higher Computing – 2008 Session 1 http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

如果链接不起作用,这里有一个path:

首页 – > iTunes U – >工程 – > COMP1917高级计算 – 2008年第一部分

有一个很好的学习python的wikibook 。

我不知道wikibooks是如何用于其他语言的,但是我个人是从2007年2月的wikibook那里学到Python的

ps – 如果你对wikibooks不熟悉,那么它基本上就是书本创作的维基百科版本。 这是很难描述,但如果你看看那里的几本书,你会看到它是如何工作的

Python编程的绝对初学者

Python编程的绝对初学者封面http://safari.oreilly.comhttp://img.dovov.com1592000738/1592000738_xs.jpg

我认为Python是一个好主意。 我会给他一些基本的任务,自己去做,并告诉他,他打的任何死angular都可以通过谷歌之旅来解决。 至less对我来说,自己解决问题总是比别人告诉我解决办法更好。

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

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

  • 用一个菜单来制作一个温度转换器,用户可以通过它来select用户想要做的转换。 select转换后,应该返回到主菜单。

    下面是一个扩展转换器的例子,具有相同的想法: http : //pastebin.org/6541

  • 制作一个采用数字input的程序,并显示它将转换成的字母等级。 它最终将评估对if和elif语句的input以find它适合的位置。

  • 做一个简单的测验,通过几个select或填补空白的问题。 最后它会显示用户如何做。 他可以select他想要的任何问题。

  • 采取一些(可能是大数目)便士的投入,并将其转换成更大的面值。 例如,149便士= 1美元,1个季度,2个angular钱和4个便士。

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

  • 创build一个程序,将build立,然后testinginput的数字是否形成一个幻方(二维数组)。 下面是一些示例代码,但是它应该在每一步中真正地打印出广场,以便显示用户在build立广场方面的用处: http : //pastebin.org/6544

我也build议用xTurtle或其他graphics模块做一些东西混合起来,防止他变得无聊。 当然,这是非常多的练习编程,而不是很多人真正使用python的脚本,但是我通过python学习的例子非常直接,而且对我来说非常有用。 祝你好运!

只是让它开心!

令人惊讶的是,如果你尝试Kojo, Scala可能是最简单的

如果你的兄弟喜欢谜题,我会推荐Python挑战 。 我不会把它作为一对一教程中的一个正式的教学工具,但是当你不在一起挑战自己并获得一些乐趣的时候,这是他可以做的事情。

Python的挑战

在阅读了几本免费的电子书之后,我发现最好的学习编程书是由O'Reily出版社出版的Head First Programming。 它使用Python作为语言,并为您提供从一开始就可以使用的程序。 他们都更有趣,“你好世界”。 这是非常值得花在我上面的钱,因为它已经出了一点,你可能能够find一个便宜的使用副本上易趣或亚马逊。

如果你想教授编程的基础知识,而不是特定的语言,那么在麻省理工学院创build一个名为Scratch的应用程序。 它旨在帮助人们发展编程技能。 当用户创buildScratch项目时,他们学习创build条件,循环等。还有一个临时项目社区,可以下载项目的forms – 这样您就可以探索其他人的项目,看看他们是如何构build的。

我认为,一旦他掌握了基本知识(variables,循环等),就应该帮助他find自己感兴趣的东西,并帮助他学习实现它的必要性。 我知道,如果我感兴趣的话,我更倾向于和有动力做一些事情。 另外,要确保让他在一些更棘手的问题上挣扎,没有什么比你自己想象出来更令人满意的了。

我通过学习如何使用stream程图和PDL (程序devise语言)来以语言不可知的方式解决问题。 几个星期后,我学会了将我写的PDL转换成一种语言。 我很高兴我学会了这样的方式,因为我已经花了大部分时间编程,解决问题而不被绑定到一种语言。 我使用的语言一直是实现细节,而不是devise的一部分。

把它分解成基本步骤来解决问题是一个关键技巧。 我认为这是把那些可以编程和不能编程的东西分开的东西之一。

至于如何处理语言概念的顺序,我认为最简单的方法就是决定是否有一个项目,并根据需要处理概念。 这可以让你根据需要将它们应用到你感兴趣的事情上。 学习一门语言的时候,最好有几个简单的项目,还有一些渐进的复杂性。 决定这些将帮助您绘制出所需的概念和顺序。

我build议也看一些屏幕录像 – 他们通常是在特定的技术而不是语言的背景下创build的,但是如果显示的是Python代码,那么会做:)。 关键是 – 他们是由一些优秀的程序员创build的,观察程序员如何编程是一件好事。 你和你的兄弟也可以做一些同行编程,这可能是一个更好的主意。 只是不要忘记解释为什么你这样做,而不是这样。 我认为学习编程的最好方法是从好的例子,甚至不要看到坏的例子。