少儿编程这么火, 究竟学哪一种语言最靠谱?这篇文章说透了!

网友投稿 2018-09-01 22:39

这几年,人工智能的发展速度与日俱增:AlphaGo赢了柯洁;百度无人巴士量产;Google的AI客服,用一个简单的“嗯哼”,征服了全世界;索尼也用AI创造了一首Beatles风单曲......

随之而来的,是教育风向的变化,除了语数外这“老三样”,一门新的学科正在迅猛崛起,且大有燎原之势——它就是“少儿编程”,加上政策的推动,家长们愈发认识到让孩子从小学编程的重要性,在北上广等一线城市,不让孩子学编程,都不敢说自己受的是精英教育。

然而,编程语言种类繁多,哪一种语言最靠谱?最适合孩子的认知水平?最能激发孩子的创造力?

少儿编程,选择哪种语言好?

这个提问就像有人在问你 “是穿婚纱好、正装好还是休闲装比较好?” 

这是一个无法回答的问题,因为问题缺少了重要的前提:“选什么样的衣服,取决于我们的目的”。

婚礼时穿婚纱很好,但是如果每天都穿着婚纱上班就很奇怪了。

每件衣服都有适用于它应有的场景。

编程语言也是一样的,每种编程语言都有属于它的应用场景

要回答 “少儿编程,选择哪种语言比较好?”

我的简单版答案是:Scratch!作为从7岁开始做电子设计,读过Linux 源代码,写过RTOS(实时操作系统),做过芯片编程FPGA/DSP,有20年编程龄,能熟练使用汇编/C/C++/C#/Perl/Objective-C/JAVA/Ruby/Python/Javascript/HTML/CSS 等大家熟悉的编程语言和大家不熟悉的设计芯片编程语言 Verilog 和 VHDL的我,推荐使用Scratch 。

那为什么是 Scratch 呢? 我在和西瓜创客教的近 10 万孩子的家长沟通过程中总结了家长们的常见困惑,详细解释如下:

QA&

Q:Scratch 是低级语言,太幼稚,什么时候可以转学高级语言(例如 C 和 Java)?

这是一个常见误区,主要是受“高级”二字翻译不准确的影响产生的误区。 高级语言的英文原文叫做 High-level programming language ,更准确的翻译应该是高层级编程语言。层级的高低不是语言的高级与否的划分,而是指语言离硬件指令的远近。越接近人类的自然语言的编程语言越叫高级语言(越容易读懂),越接近计算机指令的叫做低级语言(越难读懂)。

举个例子,汇编语言是离 CPU 指令最近的人还能勉强能读懂的语言。 用汇编来表达  1 + 2,是这样的:

https://cdn.china-scratch.com/timg/180903/2239363041-0.jpg

在其他语言里是这样表达的:

https://cdn.china-scratch.com/timg/180903/22393610R-1.jpg

显而易见,其他的语言更接近人更好理解的自然语言。

更令人发指的是,不同架构类型的 CPU,控制它的指令是不一样的。 也就是说,同样的是 1 + 2,不同的 CPU 上需要用不同的写法。 

https://cdn.china-scratch.com/timg/180903/22393B515-2.jpg

而所有的编程语言设计者,都在致力于做一件事情: 

让人们可以用人类能读懂的语言,优雅地编程,只需要把自己的想法告诉电脑,电脑就能自动把语言翻译成他能自己能执行的命令。

也就是说,无论我们用哪种高级语言写出来的代码,都有,也都需要一个翻译官,去编译(Compiler)或者解释(Interpreter)我们写的代码让电脑可以执行。

https://cdn.china-scratch.com/timg/180903/22393B427-3.jpg

BTW,从定义上来说,Scratch 是比 C 和 Java 更高级的语言。 

那既然编程语言的设计者都有同样的目标,那哪个语言是最好的编程语言呢?

这个问题就和“什么样的衣服是最好的衣服”类似了。 答案是在不同的场景和目标下,选择对应的编程语言,没有哪一种语言是最好的语言。

例如,C 语言更接近计算机硬件,编程语法中有很多莫名其妙的操作学习起来十分困难。 但它的优点恰好也是它特别接近硬件,对内存的申请和释放都得开发者自己来写,程序的执行效率能特别的高。(这里之所以说“能特别高”,而不是“会特别高”,是因为是否能执行高效,还取决于开发者的算法能力以及对 CPU 的指令是否熟悉)

但是如果谁想要用 C 语言来做网站,也许用 Javascript + CSS + HTML 组合起来花 5 分钟做出来的网页,用 C 语言可能 1 个月也写不出来。 

那为什么编程语言会有排行变化呢?

这个完全是和工作和市场机会有关的。例如,在互联网大爆发的时候,做网站的人是最稀缺的,于是推动了JAVA、C# 和 Javascript + CSS + HTML 等语言的发展。那个时候,另一种叫做Objective-C 的语言就特别的冷门。直到苹果的 iPhone 出来后,移动互联网的春天来临,当时谁能做 App,谁的工作机会就比别人多呀。于是这种冷门的Objective-C 语言就迎来了他的春天。由于互联网和移动互联网的快速发展,大量的数据产生,机器学习和人工智能在坐了多年的冷板凳后,终于有了用武之地。大量的数据科学家使用 Python 来编写机器学习的程序(因为 Python 和 Python 大量的数据分析和处理相关的功能库是开源免费的),于是 Python 又成为近年的新宠。 

所以如果选编程语言是为了让孩子未来好找工作的话,亲,你确定现在选择的语言会在 15 年后还不衰落?

https://cdn.china-scratch.com/timg/180903/22393C511-4.jpg

QA&

Q:那选择 Scratch 的优势是什么呢?它会过时吗?

"如果我给你一支高级钢笔...

oh,不不不,你给我一支高级钢笔。

我能成为作家吗?"

“不能”https://cdn.china-scratch.com/timg/180903/22393A013-5.jpg

没错。 决定我是否能成为作家的,不是因为使用的是什么样的钢笔;决定是否能成为摄影师的,也不是昂贵的镜头和相机;

决定是否能成为好的开发者,也不是选择的语言,而是他是否能发现生活中的问题,找到解决问题的办法,然后用编程把解决方案做出来。

表达我们的情感和洞见、凝固时间记录故事、发现并解决问题 是我们的目标,用一支好的钢笔,好的相机,和选择一种编程语言是实现目标的手段。我们不应该错把手段当目标。

在文章刚开始,我提到了我能熟练使用汇编/C/C++/C#/Perl/Objective-C/JAVA/Ruby/Python/Javascript/HTML/CSS 等编程语言,这并非吹嘘。 事实上,一个成熟的开发者,基本都掌握多种编程语言,并且可以快速地学习和适应新的语言。这是因为编程语言是有规律可寻的。

举个例子,如果我们要用编程编写,如果天下雨,就带伞,否则就不带伞。 用不同的语言写出来是这样的

https://cdn.china-scratch.com/timg/180903/2239361003-6.jpg

我们可以看到,无论是哪种语言,他们都有一个类似的结构:

https://cdn.china-scratch.com/timg/180903/22393MW4-7.jpg

这就是编程中不变的部分,他们只是表达方式(编程的语法)有一点区别罢了。 这就像目前主流音乐,都是由 12 平均律切分的 12 个音(do 升do re 降mi mi fa....)构成的。

但是如果我们用葫芦丝吹婚礼进行曲,就总会觉得有一点过桥米线的感觉。 这是因为每个乐器有它独特的特性。程序语言也是一样的。 每种语言都有一些它十分独特的特性。例如,我们想判断菜单中是否包含宫保鸡丁,如果包含就输出“找到了”。C 语言, Python 和 Scratch 的写法分别如下。

https://cdn.china-scratch.com/timg/180903/22393K1a-8.jpg

你会发现,这时,Python 和 Scratch 的写法就比 C 语言直观多了。 这部分就是不同语言的特性部分。

也就是说,当精通了一种编程语言后,想学习另一种编程语言,只需要了解它的语法就能上手,会熟练使用它的特性就可以精通。编程的核心不在于语法,而是解决问题的思路和方法(算法)。 

而 Scratch 中包含了几乎所有编程语言共通的部分。无论未来语言如何变化,最基本的逻辑是不会变化的。而这些训练在 Scratch 中都能完成。

QA&

Q:听你这样说,也就是说学习其他语言也是一样的,因为只要精通一门,再学另一门语言就容易了?

是的,没错。和学好了 Scratch 转 C,Java 和 Python 是容易的类似。 学好了 C 转 Python 也是不难的。但是为什么依然还是推荐孩子学习 Scratch 而不是 C 的原因不是因为编程,而是因为认知科学

在认知科学中,人们是否能快速学习一样东西或者坚持学习一样东西和自我效能感(Self-efficacy )息息相关。自我效能感是指人们是否相信自己能达到一个目标,当相信的时候就会觉得做起来很带劲,一点也不枯燥;当不相信的时候就觉得自己在饱受煎熬。简单地理解就是成就感是让人学习产生快乐并且坚持学习的重要原因。

如果在学习任何一样东西的时候,例如数学,一旦我们意识到自己学起来有困难,就开始不相信自己能学好,并且给自己各种理由证明自己不能学好,甚至是让自己学不好合理化。例如会说 “学这个有什么用呀,买菜又不需要微积分”,或者说“我就是一个学文科的,这种理科的东西我不需要学” 甚至会说 “我就是一个学文科的料,理科在我的基因里就写着‘不擅长’三个字” 。 

类似的,如果我们希望孩子不会说自己“就不是一个编程的料”,最好的办法就是让孩子从第一步就产生成就感,从而产生自我效能感,也就是相信自己可以有能力达到目标,学好编程。

在这样的前提下,你还会让孩子从学习例如 C 或者 Java 这样的工业级编程开始吗? 这样,他可能会面临的困难不仅仅是编程的困难,他还会遇到打字的困难,标点是否使用正确的困难,编程语言语法的困难,编译错误时莫名其妙的困难等等。 这些困难会消磨掉孩子学习编程的兴趣,自己找理由说“我不喜欢编程”,就和很多人找到无数理由说自己“不喜欢数学”一样。 这就是在没有形成自我效能感的情况下拔苗助长的结果。

https://cdn.china-scratch.com/timg/180903/22393JC2-9.jpg

这个就很像我在德国期间看到的德国音乐学习和中国的区别。德国在小时候学习音乐首先是学习鉴赏,再是学会玩,最后才是学音乐。例如,首先老师会给孩子们弹音乐,并且音乐是配合特定故事和场景,让孩子们能把声音和场景对应起来;然后让孩子们可以玩乐器,就是不计较指法是否正确,姿势是否正确的情况下,先和乐器做朋友,不恐惧音乐和乐器;最后才是学习如何驾驭一种乐器,才开始学习指法等等所谓的基本工。 而国内学习乐器恰好相反,首先让孩子练习的是指法,而忽略了让孩子对音乐的热爱。

这就是为什么西瓜创客以及我肖恩老师还是会推荐学习 Scratch 的原因: 先让孩子可以不恐惧编程,产生兴趣,并且用编程表达自己。 等到孩子们已经产生了自信和成就感,再提高难度。如果都要选择一门语言进入编程的世界,一定是选择能让孩子快速找到自信,找到成就感的语言。 那这种语言目前最好的就是 Scratch。

QA&

Q:那要是我的孩子就是想学除了 Scratch 外的语言,我应该怎么为他选择?

首先,让我们把编程语言分为两大类,一类是兴趣类编程,以图形化编程为主,目的是用编程实现自己的想法,不用担心程序执行效率不高,也不用考虑用户的使用场景和平台。另一类是工业类编程,以源码编程为主,除了考虑用编程来解决生活生产中的问题外,还需要考虑到用户会在什么样的场景下使用此软件,以及产品的易用性。 

如果是青少年学习编程,依然不推荐从工业类编程入手。 目前 Scratch 语言也在进化,能支持的功能已经远远大于把一个图形从这里移动到那里。 Scratch 现在已经可以对特定硬件进行编程了。和 Scratch 类似的图形化语言 Blocky ,已经可以完成很多很多远超过 Scratch 的功能了。 例如同是 Scratch 3 基于的 Blockly 开发的 App Inventor,已经可以让孩子用图形化编程制作一个手机 App。事实上,并不是图形化编程就弱鸡,现在西瓜创客的员工工资公式已经是用 Blocky 写的了,西瓜创客的后台各种工作流程规则也都是用图形化语言来写的。 

如果非要选择工业级编程语言,我们还是可以按目标来划分。 

如果目标是应试,首选是 Python,目前浙江等地区已经把 Python 列为了高考科目。 如果想通过 NOIP 加分的话,其次选择是 C/C++ 语言。(注,在应试层面上,选择 C 和选择 C++ 是一样的,因为 C++ 是基于 C 扩展增加了一些例如面向对象编程的特性,而在 NOIP 的赛题里,不会用到这些高级特性)

如果目标是编写控制硬件的程序,推荐语言是  Python 和 C。C 的原因是主流的硬件编程都是支持 C 的。而非工业级的硬件编程,例如,树莓派支持用 Python 编程。

如果目标是制作 App, 可以选择的语言是 Scratch 类似的 App Inventor、 Java(用于编写安卓的 App)或者 Objective-C/Swift (用于编写苹果系统 iOS 的 App)。另外 Java Script 也是一个不错的跨平台选择。现在大多数程序都是苹果安卓系统通用的。这类程序基本是基于某个框架,最常用的框架是 React Native,而 React Native 使用的就是 Javascript 语言。(注,Java 语言和 Javascript 是两个语言,类似但不相同)

如果目标是制作网页,可以选择的语言是 Javascript + CSS + HTML。其中 CSS 和 HTML 是决定网页长成什么样的。这两种语言学习起来很简单。推荐 Javascript 的原因是,网页编程的前端(用户能看到的部分)基本都是用 Javascript 来控制的。而且现在的 Node.JS 也是基于 Javascript 的语法来做的后端程序(也就是用户看不到的服务器部分)。也就是说,只要会 Javascript前端后端都能写。 

如果目标是做数据分析,首推的是 Python 语言。Python 语言里有大量关于数据处理的公共库可以使用。让我们可以站在巨人的肩膀上继续深入研究,而不是重造车轮。

综合各种因素,如果是针对 7-12岁的孩子学习编程,语言的推荐顺序为 Scratch > Python > Javascript > C 。


其他问题:

Q1:我想让孩子参加信奥赛NOIP,听说只有C语言可以参加,那学Scratch还有用么?

Q2:如果说,编程不是目的,而是手段。如果目的是让孩子有创造力的话,应该采取什么方式呢?

这些都是十分好的问题,十分值得我们再开一篇文章来详细讲解。请关注西瓜创客公众号,我会在未来和大家分享这些话题。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com