孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园

  本文来自微信公众号: 芥末堆看教育(ID:jiemoedu),作者:少儿编程之家,编辑:吉吉

  我最常被老师和家长所问到的一些问题是:我应该选择哪一种编程语言来教孩子编程呢?坚持选择像 Scratch 这样的图形化编程语言作为开端很重要吗?应该在什么年龄转换到学习代码编程呢?还有我应该如何在 Python,Java,还有 JavaScript 之间选择呢?

  经过将近 10 年,对成百上千个学生教授编程,我经常出席各种会议,或为刚接触计算机科学的老师举办讲习班。许多老师都是第一次尝试在他们学校里建立计算机科学课程,所以他们对于选择编程语言的谨慎,是可以理解的。除了试图找出最适合他们学生的东西外,教师讲授的内容还必须在授课舒适度,以及校园、学生、家长四者之间取得平衡。

  那“合适”的编程语言,真的存在吗?

  编程语言不是重点,编程中的概念才是!

  就像你猜的那样,答案自然是否定的。编程语言不是重点,但教导孩子如何利用编程去解决问题才是重点。理解如何一步一步地建立算法,从而搞定作业,再想出最佳的思路来编写代码,这可能才是最困难的部分。

  学习相当少量的关键词和特定编程语言的简单语法很简单——比学习一门真正的口语语言要容易得多!相比而言,为了独立完成编程,必须了解编程中变量、列表、条件、循环,还有函数中的基本概念,然后才能知道何时,何地,如何使用它们将算法转换为代码。

  一个学生一旦掌握了以上这些概念,并且以一种语言编程成功,这时再用另一种语言来编程就不难了。转换编程语言并非打个响指一样容易,但确实可以做到。

  话说回来,掌握的第一种编程语言会改变将来思考和编程的方式吗?学习当下行业里最流行的语言重要吗?

孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园
2018 年美国热门编程语言 Top10【图源: YoungWonks】

  编程语言变化不定,你终将适应

  编程语言的流行度会变,没有人敢保证我们今天教会孩子的东西,在他们进入职场的时候还适用。我学习的第一门编程语言是 Pascal(对,你可能得百度一下)。

  多年以来,我使用过不同的设备来学习不同的语言——其中不乏一些晦涩难懂的。在作为教育工作者的这 10 年里,我学习了 Logo,Scratch,Processing,JavaScript,Arduino 和 Python 的一大堆知识,好让我能在课堂上大展拳脚。

  6 年前,我建议孩子们从学习 Logo 开始,一门最早应用于计算机科学教育当中的编程语言,而我相信,它就算放在今天,也依然是一个颇具影响力的选项。划重点:如果你能教会孩子们基本的编程概念,他们也能在一门语言上花上足够的时间,他们理论上就已具备了日后转换语言的基本条件。

  这还有一条经常提到的问题:我们总是应该优先教会孩子图形化编程,而非代码编程吗?

  图形还是代码?

  差不多 10 年前,在一节六年级数字设计课上,我开始使用 Scratch,一门也许是最流行也是对孩子最友好的图形化编程语言。我随后将这门编程语言拓展到所有年级。我对不久前刚发布的 Scratch 3.0 中新功能感到兴奋——尤其是文字转语音和文字翻译这两个拓展功能。

  图形化编程的出现,极大减轻了青少年对编程的挫败感,诸如漏掉一个逗号或者忘了把右括号补上之类,反而让他们留有更多时间来理解当中的概念。另外,Scratch 对于创新的鼓励以及在图像创作、声音编辑、分享和项目混制方面的功能优化,让它在成为各年龄段孩子首选编程语言上变得理所当然。较之被称为“编程语言”,它更希望被定位为一个绘图工具,一个动画制作工具,或是一个故事与游戏创作工具,这些元素综合起来,让 Scratch 变得更友好而不唬人。

  我发现在使用 Scratch 几年后,学生更愿意去尝试代码编程,因为他们觉得那意味着长大,只有“真正的编程”才会被行业采纳。我还见证过语言的转换中,有时只需要给孩子们回顾一下例如变量和循环的概念。

  我的中学学生们愿意为学习代码编程付出额外的努力,通常他们会放慢速度,以保证在处理 Python,JavaScript,Arduino 和 Processing 挑战时不犯下拼写和语法错误。不过,学生一旦能够通过刚开始时“我得看着点有没有打错字”阶段,他们常会爱上代码编程的灵活性和可塑性,尤其是当他们发现复制、粘贴,协作和修改在代码编程中有多方便时,偶会发出“也没想象中那么糟嘛”类似的感慨。

  每年夏天,我在 Foothill College KCI 计算机科学合作课程上,都会分别用 Scratch 和 Python 两种语言,为教师展示同一个项目。他们爱看把两种语言放一起比较。我们甚至会以伪代码,或者叫流程图作为开始,把完整算法在开始编程前先写下来。

  这是一个检查密码的迷你项目,它在流程图,Scratch,和 Python 中,分别长这样:

孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园

密码检查器流程图

孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园

用 Scratch 展示的密码检查器

孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园

用 Python 展示的密码检查器

  我课堂中的老师和学生在没接触过图形化编程的前提下,都能轻松学习 Python,这说明好项目在前,从代码编程开始学习同样行得通。

  是什么让一门编程语言,变成适合孩子学习的编程语言?选择一门语言的标准是什么?

  虽然知道教授编程,更多是关于它的概念,你也知道不需要再为作出完美的第一次选择而慌乱,但问题依然没有得到解答:什么因素让一门编程语言成为孩子学习编程的好选择呢?通常由以下几点来衡量:速度,应用,可用的库,行业支持。下面我再来说说我认为重要的几个标准。

  它有强大的教育者社区吗?

  我频繁提到 Scratch 和 Python 的其中一个原因是他们都有附属的线上教育者社区。他们拥有如此庞大社区,背后的原因是他们总是以免费的形式,开放的姿态,接纳来自世界每个角落的用户。拥有庞大的社区,意味着你能找到更多资源,诸如项目、教案、教程、视频和书籍一系列为课堂而设的材料。

  学起来好上手吗?

  有许多代码式编程语言可供选择,一些在当今的科技行业中更吃香,一些有特别的功能方便他们创造特定的项目。虽然说许多高中生最终不得不为通过计算机科学进阶入学考试(AP Computer Science A)而学习 Java,但这一定不是最简单的语言。Python 目前看起来更简单,并且凭借着它简洁直白的逻辑,在教育界中越来越受欢迎。在我将 Python 用作计算机科学选修课语言 3 年后,我依旧会被它完成工作的效率,以及中学生用它编写代码的速度所震惊。受到 Python 在教育孩子编程方面的启发,我花时间写了一本关于它的书。

  它背后的设计理念是什么?它是为这个年龄段的用户所设计的吗?

  为用户设计适合其年龄的工具很重要,编程语言可以根据它不同年龄段的用户展示或者隐藏相应的功能。Scratch,扎根在培养孩子的创造力表达上,刻意将一些功能性代码以封装的形式呈现出来。ScratchJr. 是为还在识字的孩子而设计的,所以它没有变量和条件这些对这个年龄段孩子来说太难理解的功能。Python 为不同类型的项目提供扩展支持,但这些额外的扩展都需要你亲手把它们添加进来,这样它们就不会在你不需要的时候出来干扰视线。为更大的学生所用语言一定要含括对 debugging 的支持,基本操作了。如果讲授“面向对象”编程是重点环节,那使用 Java 教学就是一个好选择。

  容易安装吗?能跨平台运行吗?

  这些都是要记在心里的东西,尤其当学生需要回家编程时显得更为重要。一些语言只能在特定环境中工作,譬如 Apple 的 Swift 编程语言。如果学生在 Chromebook 上编程,那么有一个稳定的,基于浏览器的工具就更加关键。需要考虑的另一个问题:这个语言能让学生回到家中也免费使用吗?还是有一些隐藏的扩展需要付费方才解锁?

  能否轻松地在社区中分享项目?

  Scratch 背后其中一个基本元素就是社区,让孩子们互相分享,相互学习。这个社区对教师们来说也同样重要。不过,分享也要有计划:何时分享,允许学生分享多少内容,评论和修改他人的作品等。也许把 JavaScript 作为第一门代码式编程语言进行学习会让你大皱眉头,虽在易用性和上手难度上都不如 Python,但它的优势在于它是属于网络的脚本语言,只要把项目发布到校园网服务器上就能展示给大家看,方便又快捷。

孩子学编程,作为教育者该如何选择编程语言?-冯金伟博客园

撑起 Scratch 的一个重要基本元素——社区

  选择编程语言时要考虑的方面还有很多。这个项目能用到什么语言?不同的语言可能支持不同类型的项目。举例来说,Processing 和 P5.js 让制作动画变得更轻松;Python 把复杂的数据分析甚至是机器学习变为可能。老师们也可能更倾向一个强大的课堂工具,便于管理作业和批改成绩,尤其对小组项目而言。

  一个最经常被问到的问题是:“这门编程语言现在流行吗?”流行度对于学生选择学习一门编程语言来说有很深影响,也不难理解家长希望孩子能掌握对未来职业有利的技能那种心情。无论如何,教授良好的编程习惯胜过教授流行编程语言。

  虽然我们可以强调要找到“完美”的编程语言,但我们不要忘记,最终的目标是让学生探索基本的编程概念。他们或许在你的课后就不再插手编程,你教的语言在他们长大后也可能变得过时,重要的是,教授编程将会帮助学生理解计算机是如何解决问题,收获批判性思维技能,并希望他们有朝一日洞察到,用代码创造东西的乐趣。