这篇文章是“为孩子写一本编程书”连载中的第三篇文章。上一篇《学习编程从“玩”开始》中谈了如何引导孩子学习编程,以及开始之前的准备工作,有兴趣的读者可以参考。
我们已经做好了学习编程的所有准备,小Ian也早已跃跃欲试,迫不及待地想要去Playground中完成那些编程挑战了,你是否也准备好了呢?让我们就从认识命令开始吧。
认识命令
我们都知道,当你和一个英国人讲话时,需要说英语,而和日本人讲话时,就得说日语。我们也曾说过编程是人与计算机之间的交流方式,那么,计算机能够听懂的语言又是什么呢?我们把计算机能够听懂的语言称为命令,我们通过将一条一条的命令按一定的顺序组织起来,并且输入计算机来告诉它做什么以及如何去做。
- 命令:一条命令就是告诉计算机去完成一个具体的行动(任务),比如我们稍后就会用到的:moveFoward() 向前走命令,collectGem() 抓宝石命令。
- 顺序:命令的顺序则是告诉计算机这些行动(命令)执行的先后次序
如果命令写错了,那么计算机无法理解,也就不会去执行。而如果命令的顺序写错了,虽然计算机能够执行,却无法达到你想要的结果。因此,要写出正确的程序,就必须同时写对命令以及它们的执行顺序。
Tips: 对于初学者来说,学习编程的第一步,是学着像计算机一般思考和解决问题,而它的起点便是熟悉命令的使用与它们执行顺序的编排。未来我们还会学习更多编程有关的知识,但它们大部分都是围绕着命令(用于提供更丰富的功能)和顺序(用于提供更复杂的控制逻辑)去展开的。
从最简单的命令开始
终于到了我们可以一试身手的时候了,Playground中的每一小节都是由一个小游戏构成的编程挑战。而我们要完成的第一个挑战,便是帮助下面这个游戏中的主人公Byte,穿越迷宫抓到那颗闪着红光的奇异宝石。这里,你将需要使用moveFoward()向前走一格命令,和collectGem()抓宝石命令来完成这个挑战。
Tips:我将Playground中第一个挑战游戏翻译为中文,即使你英语不够好,只要你熟悉了那些简单的操作,以及Playground中的基本任务设置,便可以轻松地使用Playground来教孩子们或自学编程了。
小Ian很顺利地完成了第一次的编程挑战,并写下了他的第一段代码:(让Byte向前走三格,然后抓到宝石)
运行上面的命令,看看效果如何?太棒了,Byte抓到了那颗红色宝石,相信你的孩子(或你自己)也一定成功完成了这次挑战吧。让我们将Playground中弹出的提示信息,大声读出来吧,“祝贺你!你已经写出了自己的第一段Swift代码。Byte以正确的顺序准确执行了你所写的命令,并最终成功抓到了宝石!”
命令的命名
大家已经完成了自己的第一个编程挑战,让我们回顾一下所使用的那两条命令moveFoward()、collectGem,大家有没有发现我们总是会在一条命令后面加上一对括号 ()?让我们暂且记住这个命令的命名规则,因为再往后学,我们将能够通过在括号中加入更多参数,使命令变得更加强大和有趣。
另外你可能也注意到了,Palyground中那些预定义的命令moveFoward(),collectGem(),trunLeft()都是由一个动词+名词(或副词)组成的。由于命令是让计算机执行一个任务,因此,人们总是习惯使用一个动作来为一条命令命名。而当我们需要在一个命令中使用多个单词时,会将第一个单词的首字母小写,而后面单词的首字母大写,来给命令命名。这被称作是骆驼式命名法(Camel-Case)又称驼峰命名法。下面这些命令中大小写字母构成的高低起伏是不是像极了骆驼背上的驼峰呢?
虽然计算机并不在乎你给命令起什么名字,但作为一名编程者,我们不仅会不断地编写新的程序代码,也时常需要去维护和更新我们所写的那些旧代码,特别是当我们需要与同伴们一起去完成复杂的编程任务的时候,更需要让自己写的代码易于阅读,便于他人的理解和维护。因此,正确地为我们所写的命令命名,是每个优秀编程者从一开始就应该养成的习惯。
Tips:对于国内孩子,在对英语词汇掌握不足的情况下,可以使用拼音来代替英文命名,但切记使用能够清晰反应命令作用或目的的动词来进行命名,当包含多个单词时,使用驼峰命名法。
调试 Debugging
编程和很多创造性的工作一样,都是将头脑中的东西通过某种形式表现出来。比如,绘画时我们用线条和图形进行创作,写作时,我们则用文字来构成文章,而在编程的时侯,我们是用一行行的命令来写出程序。就像我们不太可能一笔不错地去完成一幅绘画或一篇文章一样,在编程时,也经常需要纠正或修改我们所写的代码,并使它最终能够按照我们的意愿去执行并解决问题。
我们将编程中发现与修复错误的过程叫做调试,程序员们也经常将它形象地称作抓Bug(虫)。即使那些最有经验的程序员也会在写代码时出错,所以当你写的程序出现问题(无法达到预期效果)时,不用着急,使用一些简单的调试技巧去找到问题,并修复它们就可以了。
我们最常用的调试方法,就是通过观察程序的运行效果与代码之间的关联,来找出问题。例如,在之前的那个编程挑战中,如果有人写了上面这段代码,你是否能通过运行它,很快发现错误的原因呢?——是的,最后两个命令之间漏掉了一个moveFoward()命令,Byte没有走到宝石所在的方格便去抓宝石了,当然会失败咯。让我们加上一条moveForward()命令,再次执行,这一回Byte成功抓到了宝石。你通过调试成功地修复了一个程序Bug,并让程序恢复了正确。
Playground中的调试选项
Playground中有一些非常实用的调试选项,点击动画演示区左下角的仪表盘图标,便能显示出来了。
- Run Fastest 以最快速度运行代码,一般用于快速验证代码执行结果
- Run Faster 以较快速度运行代码
- Run My Code 以一般的速度运行代码
- Step Through My Code 单步调试,命令的执行与动画演示中的步骤关联起来,非常有利于查找问题,或学习那些较复杂的控制逻辑。
- Step Slowly 非常缓慢地运行你所写的命令,让你在调试的每一步,都有时间进行思考
Tips:调试不仅仅是在帮助学习者写出正确的代码,它这也是一个加深印象、培养编程感觉、熟悉编程界面与键盘操作的良好机会。在这个过程中,我们需要检查自己的代码,删除或修改出错的命令,不断尝试,直到获得正确的结果。对孩子们来说,这种独立解决问题的方法对他们日后学习其他学科同样很有帮助,因此不要过早纠正孩子们编程中的错误,而是尝试着让他们自己去发现和解决问题。
小节
通过这一节的学习,我们认识了编程中的命令,通过将命令组合起来去解决问题(帮助Byte去完成Playground中设定的那些挑战)。而在出现问题时,我们也知道了如何通过调试,去发现和修正那些错误,并最终让程序的执行达到我们的预期。在下一节中我们将会学习编程中的另一个重要概念函数Function。
练习
请大家完成Playground中,Commands这一节中的其他编程挑战,它们包括:通过运用更多命令来解决复杂问题;通过调试,修复代码中的错误;找出解决问题的最短路径(用最少的代码解决问题)。完成这些练习后,你将会得到一个更熟悉和自然的编程体验,相信也会对后面的学习更加充满信心。