最近输入太少,周五准备物料的时候思考一个问题「海外的小朋友学习编程都是怎么学的呢?长期的编程学习规划是什么呢?」偶然看到这样一篇文章,仔细读了一遍觉得写的还不错,所以有了这篇翻译稿。
全文3554字,看完之后能够解答以下几个问题:
- 家长:如何选择一门少儿编程语言呢?
- 教师:挑选一门合适的教学语言有什么标准?
- 什么样的编程语言是好的?
**
不论是教师还是家长,咨询我最多的是下面这些问题:
教小朋友哪种编程语言呢?从scratch这样的图形化编程语言开始是必须的吗?学员应当从几岁过渡到代码语言的编程呢?在Python、Java或者JS之间我要如何选择呢?
从事编程教育已愈10年,也教过成百上千的学生。我经常出席各类研讨会或者针对计算机科学的新老师举行工作坊。许多教师都是初次在他们的学校尝试组建一个计算机科学小组,所以编程语言选择上的担忧也就不难理解了。除了考虑哪种语言最适合学生之外,教师们还要在是否容易教授以及管理者、父母和学生认同应该学习这种语言之间找到平衡。
所以,有一种“对”的编程入门语言吗?
相较于编程语言本身,编程概念才是更重要的
如你所猜测的那样,答案当然是“没有”——重要的不是语言本身,而是怎么教学生使用代码去解决问题。理解如何设计一项任务的处理算法(分步指令)、用代码书写出最优解,这才是最复杂的部分。
相较于学习一门实用的人类口语,学习一门特定编程语言要容易得多——为数不多的关键词、基本语法…这些都是相对简单的。不过,想要独立地编程,首先你必须了解诸如变量、数组(列表)、条件、循环和函数等编程中的基本概念;其次你还要了解在什么时候、什么位置、怎么把你的算法转换成代码。一旦学生掌握了这些编程概念并顺利地使用一种语言编程了一段时间,那么再换用另一种语言编程就很轻松了。语言转换不是一蹴而就的,但这是可以做到的。
或许你还会疑惑——第一门语言会改变你未来的思维方式和编码习惯吗?学习当下最流行的编程语言很重要吗?
编程语言变化多端,学会适应才是王道
编程语言的流行趋势是变化的,我们不能保证今天教给孩子的编程语言就是将来孩子就业时会用到的。正如我所学的第一门编程语言是Pascal(哈哈,现在你们看到这门语言估计要去百度一下才知道)。
这些年来,我学着在不同的机器上使用不同的语言,其中有一些太过晦涩难懂不提也罢。作为一名教育工作者,我在10年中学习了Logo、scratch、Processing、JavaScript、Arduino和Python,这些语言已经足以满足我课堂上的上课需求了。
六年前,我建议孩子们从Logo语言开始学起(Logo是最早的计算教学语言),当然我仍然坚信今天它也不失为一个很好的入门选择。那什么最重要呢?如果你能教会孩子编程基础概念,并且他们在一门编程语言上投入了足够的时间,那么他们就应该具备了日后切换编程语言所需的基础。
还有一个常见的问题:我们是否有必要让所有的孩子都从图形化编程学起而不是基于文本的编程语言呢?
图形化还是文本式?
十年前,我第一次在六年级的数字设计课上使用Scratch——可能是最流行、最适合孩子的图形化编程语言。并且我一直热衷于在各个年级使用它。我很高兴能使用刚刚发布的Scratch 3.0中的新功能,特别是文本转语音、语言翻译的扩展能力。
(译者注:Scratch 3.0在线编辑器发布时间为2018年8月)
对于青少年编程爱好者来说,图形化编程能够消除很多挫败感,不需要在意少了一个逗号或是忘记加括号了;初学者们可以将更多的时间投入到理解编程概念上。此外Scratch聚焦创造力,创建图形、编辑声音、分享和改编项目的门槛都极低,这些都使得它成为了完美适配所有年龄段的编程入门首选。自设计之初,它就被定位为一种创作艺术、动画、故事和游戏的工具,而不是一种“编程”语言;这一定位也是为了让Scratch更加接地气,而不是让成年人都望而生畏的代码。
我观察到,在使用了几年Scratch之后,学生们想要主动尝试文本式编码,因为他们会把这种编程方式同“成人”和工业界的“真正”编码联系在一起;我还观察到,有时候只需要改变语言就能够回顾变量和循环之类的基础概念。
我的中学生愿意投入额外的精力来学习文本式编程语言;为了能够留意拼写和语法(以免出错),他们在应对Python、JavaScript、Arduino和Processing编程难题时常常会放慢速度。但是一旦学生们能够跨过“我必须认真贯观察输入的内容”这一阶段后,他们通常会醉心于文本编码的灵活性和强大功能,特别是当他们领略了通过复制、粘贴、修改和协作文本代码来创建项目有多方便时。
每年夏天我都会在山麓学院教《计算机科学速成课》,我会教老师们Scratch和Python这两种语言,并且会用它们展示同一个项目。他们乐于看到两种语言间的相似之处,如果我们先从“伪代码”或流程图开始时,他们就更乐于寻找这种相似性了。下面是一个密码校验小项目的流程图和Scratch、Python代码。
(笔者注:B站有《计算机科学速成课》学习资源,感兴趣可看)
图1 密码确认流程图
图2 Scratch中的密码确认功能代码
# password checking program
password = input('输入密码:')
while password !='密钥':
print ('密码错误,请重试')
password = input('输入密码:')
print('密码正确,确认成功')
print('允许访问')
图3 Python中的密码确认功能代码
从未接触过图形化编程的师生们,在我的课上也能轻松地学习Python,这表明有正确的项目,用文本式编程开始也是可以的。
(笔者注:这里需要注意一下学生的年龄,小学阶段)
对于学生而言一款优秀的编程语言的决定性因素是什么?选择语言的标准又是什么?
虽然我们都知道编程教学更重要的是基础概念,你并不需要强调如何选择完美的入门语言,不过问题是:一门编程语言应该具备什么样的特点才能使其成为教孩子编程的好选择呢?编程语言通常会以运行速度、应用程序、可用库、工业支持等多因素进行评估…这里呢我也有一些重要的选择依据:
有强大的教学工作者团体吗?
我经常推荐Scratch和Python的一个重要原因就是有很多的教学工作者在他们的班级里使用这些语言。因为他们一直是免费、开放的,并且也是欢迎来自世界各地的广大用户的。拥有庞大的团体意味着你可以找到更多的资源,包括教学专用的项目、教案、视频和书籍。你也可以参加教育会议并能够给予你更多的指导建议。
容易习得吗?
有很多文本式编程语言可供选择——有些语言在当今的科技行业中更受欢迎;一些具有特定功能的编程语言在特定项目中更好用。然而许多高中生因为AP计算机课程而不得不学习Java,但它并不一定是最容易的入门语言。相比之下,Python简单易上手,在教学中也越来越受欢迎了。在计算机科学选修课上使用了三年的Python之后,我时常惊讶于——完成一件事情所需的时间如此之少、我的中学生能够如此迅速地学会使用Python编程。受到Python在编程教学方面的启发,我花了很多时间写了一本书。
背后的设计哲学是什么?是为这个年龄段设计的嘛?
提供适龄的工具至关重要,编程语言可以根据目标年龄群体隐藏或者展示对应的功能。Scratch的哲学植根于使用代码进行创造性表达,它对编程语言中的一些结构进行了简化。Scratch Jr.专为仍在学习阅读的幼儿设计,在该语言中去除了一些这个年龄段不太好理解的概念,如变量或条件语句等等。Python提供了支持多类型项目的扩展能力,不过这些拓展是只有在你使用他们之前才会特意去添加的。更高龄学生的编程语言必须支持调试这一基础能力(debug)。如果是教授面向对象的编程,那么Java就不失为一个好的选择。
容易安装吗?它是跨平台运行的?
如果学生要在家里编程,那么易安装和支持跨平台运行都是很重要的。有些语言只能在特定的环境下运行,比如苹果的Swift。如果学生使用的是Chromebook,那么拥有一个稳定的基于浏览器的工具是最重要的。另一个要素是:这门语言是免费的(方便学生在家学),或是有些隐藏的扩展模块是需要付费才能使用的?
(注:ChromeBook是Google退出的网络笔记本,搭载Chrome OS)
社区中分享作品有多容易?
Scratch中的一个基本理念是社区,让孩子分享和相互交流学习。社区对教师也是有益的。不过,分享也需要规划:包括学生分享、评论、重新使用、改编创作的时间和程度。尽管JavaScript可能并不是最适合作为第一门文本式编程语言,因而相较于Python可能难度更大。不过它的一大优势就是项目可展示性高。
在选择编程语言的,还要考虑一个因素:你要创作什么类型的项目?不同语言对于不同类型的项目都有对应的支持和扩展能力;比如,Processing和P5.js更适合创作多媒体项目,创建艺术和动画也更容易;Python更适合数据分析、机器学习项目。教师可能也需要强大的教室工具来管理作业、评分等,特别是小组项目。
最常见的一个问题是:这种语言现在是不是受欢迎?为了鼓励学生报名上课,受欢迎程度能够是编程语言选择的一个重要考虑因素。家长们想要老师教授工作中的技能知识是可以理解的。但培养良好的编程习惯胜过学习一门流行的语言。
当我们把精力都投入到找到一门“完美的”编程入门语言时,别忘了终极目标是让学生探索基础编程概念。课堂之外学生可能从来不会编程,你教的语言也可能会过时。但真正重要的是编程教学能够帮助学生理解计算机解决问题的机制、习得批判性思维、并且有希望从编程创作中感受到无限的乐趣。
本文写于2019年3月11日,作者Sheena Vaidyanathan 任教于LosAltos School District