Scratch,众所周知,是一款少儿“编程”软件。

“编程”这一个词,说实话,从我个人角度来说,我比较讨厌这个词。这个词在我看来是相对贬义的,在如今语言满天飞,竞赛高于一切,C++泛滥的时代,似乎你不会C++就是不会计算机。

哦?是吗?那你很强啊。我就不会。作为一个不会C++的人我觉得你很搞笑。

我想问一句:学会了C++,就是会计算机了?

我之前在学校机房遇到一牛人。那不可一世的样子我现在还记得。

“哇同志你在干什么?”“我在查分。”

“查什么分?”“编程大赛。”

“哦几分啊?!”“laozi都AK了3年(拿了3年满分)了你还问我几分?!

这也是我讨厌“编程”这个词的原因。C++,这就是编程?

 

我上小学的时候,也去参加过编程比赛。

那时我没有去比C++,我去了Scratch。(这一点我几乎没有和任何人说过)

编程似乎只有Scratch和C++,而且都有竞赛的色彩。

毕竟Linus Torvalds曾经说过自己极度讨厌C++,而鲁迅也曾经说过:“tmd。”

 

那么咱撇开竞赛,我们来看看这条鄙视链:

会Scratch的人鄙视不会的人。拿过奖的鄙视没拿过奖的。会Python的人鄙视会Scratch的。会C++的鄙视一切。这可以算目前人们学“编程”的普遍规律吧。

 

那群学了C++不可一世的朋友们,站在鄙视链的顶端,可能都不觉得Scratch是“编程”吧。

说对了,Scratch不是编程语言,但是是一种基于最基本的代码重用的模块化编程方式。Scratch这一类软件的出现是有划时代意义的。

 

但是(正题来了):Scratch真的有这么弱吗?

说明了这一点,上面关于C++高于一切的观点也就基本倒塌了。

 

昨天晚上,我在知乎上问了一个问题:一个完整的编程语言应该包含什么?

过了十几个小时,我在写这篇文章时有4个回答,我认为我需要的已经在里面了。

 

我们来看看 @Super桓 的回答:

首先,最基础的这个语言要是图灵完备的。也就是利用这个语言应该可以实现一个完整的图灵机(图灵完备不代表具有变量,函数等特性,具体可以参考BrainFuck)。图灵完备应该是一个语言的基础,但是和题目认为的那个完整应该还相差甚远。

其二,应该有方便使用的内置数据类型。针对语言面向的不同环境,应该有不同的内置数据类型。但是基础的一般有int,str等。(参考BrainFuck他就只有int这种数据类型,其他数据的表示得要自己实现)

其三,应该具有一些利于编写代码的特性。比如变量,函数或者类等。当然,没有变量一样可以编码(比如直接用内存地址)。但是拥有这些特性可以让编码更高效。

其四,应该具有一些常用的内置函数和内置函数库。

如果你以这个语言可以运转就算完整,那第一点满足后就算是一个完整的用于计算的编程语言了。其后的几点,是结合现代编程语言中找到的一些共性所总结的。

作者:Super桓
链接:https://www.zhihu.com/question/473562923/answer/2012464125
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

Scratch做到了吗?做到了。

 

第一,Scratch可以用来做一个图灵机。

什么是图灵机?我们再来看一下百度百科词条“图灵机”,这是图灵提出的一个抽象概念。

所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

说白了,就是一个牛得不行的机器,通过纸带上一堆0和1进行操作。这一点,Scratch做到了(聪明的你一定写得出来)。

 

第二,Scratch有数字,有字符串,有布尔值(即true或false),也有链表。

你可能会问:这些在哪里?

链表已经够明显了;数字、字符串和布尔值就是Scratch的圆框、方框和带六角框。

那么这些可以转换吗?可以。无论是什么都能放进方框;布尔值可以进圆框,而Scratch中数字和字符串是通用的。另外,它们都能储存在列表中。

 

第三,Scratch有变量,有函数,符合代码重用所需的条件。

变量和函数其实在Scratch中是存在的。你在Scratch中可以定义一个带有参数的函数(虽然很多人不知道这一点)。

 

第四,Scratch有内置的标准库。

有些人说,Scratch没有标准库,不算编程语言。

虽然Scratch没有我们所说的什么sys呀、<stdio.h>之类的东西,但是你但凡看看Scratch的各个栏目,你扪心自问一下:Scratch有10个栏目,除了两个黄颜色的,剩下8个不是标准库一样的存在吗?引用机器人、还有那个像红白机手柄一样的Makey Makey,不是Scratch的手动标准库吗?

还有很多语言没有标准库呢hhh :-D

 

根据上面的内容,综上所述,我认为Scratch完全符合而且超出了“一个完整的编程语言”的标准,尽管它不属于编程语言的范畴。

但是问题就结束了吗?为什么看完这篇文章,我们的Scratch水平还是这么烂呢?

在这里我们再有请 搜狐 @独角基地 的一篇文章 《Scratch到底好不好?写给对Scratch一无所知的家长们》

 

在一些家长眼中,Scratch这种编程语言,是给小孩子过家家的玩具。

“Scratch就是做点简简单单的小游戏、小动画,不写代码,也没法实现复杂的算法,因此实用价值不大。”

博士觉得,说这话的人,可能编程也只懂了点皮毛。

小学生学不会真正的编程吗?

很多人的认知里,编程=敲代码,学编程=学编程语言。

很多人认为学校应该教学生写代码,其实,学校应该教学生的是“计算机科学”这门学科。

因为,逻辑能力、问题解决能力和创造力,这三种能力才是编程初学者真正应该学会的。

那个说小学生学不会编程的人,很明显,他们误解了小学生学习编程的本质——他们学的不是写代码,而是编程背后的基础能力

图形化编程是毒瘤?

说实话,Scratch还真不是哪个小公司胡乱搞出来的语言,它是麻省理工的“终身幼稚园组”开发出来的。

这个“终身幼稚园组”的主持人,是拥有麻省理工大学资讯工程博士和普林斯顿大学物理系学士授位的密契尔.瑞斯尼克教授。

Scratch开发出来到现在,发展了十多年,经过了很多次改版,已有数百万孩子和成年人用户,被视为少儿编程教育的范本。

所以,真的不是我们“吹”Scratch,而是Scratch这种图形化编程语言,它本身就经过了时间的洗礼,得到了市场的认可。

很多家长看到孩子做出了一个游戏,会觉得孩子就已经掌握了编程知识。实际上很多孩子使用Scratch的时候,只是胡乱嵌套If…else…语句,碰巧代码可以运行,但逻辑混乱不清。

我们前面说到,低龄的孩子学的应该是编程思维,而不是代码。但实际上是,Scratch也是需要基础的代码常识,编程思维最后要靠代码和作品来同时体现。

再简单的代码,也要严丝合缝、逻辑严谨。

 

这也是一个看起来就不怎么专业但其实很专业的Scratch给人带来的问题。

下面的每个问题,如果你用过Scratch,请将分数相加并打在评论区里。

Scratch有函数,你用过吗?(用过2,没有-2

Scratch的链表是不是你眼里的输入框?(是0,不是1

你考虑过简化代码吗?(有3,没有0

你是不是有过多次复制自己的代码的经历?(有0,没有1

你是不是有过“如果1=1”这一类的东西?(有-3,没有1

 

当你的分数小于等于7时,我认为“Scratch垃圾”不是它的问题。

Scratch社区里也有30岁的程序员,有8岁的大佬,也有数百人的开发团队,他们的产品似乎也能匹敌某些编程语言的产物。

 

那些大佬,可能也学了你引以为傲的位运算、哈希搜索、二分查找,他们还可能学了机器学习、神经网络、外部设备输入等等,而C++呢?终究只是一些过于冷门,甚至平时你根本用不到的浮云。

 

所以,即使你是一个C++大佬,像前文一样有过“AK”的经历,也请你不要太过自信,也不要搭建你的鄙视链。你对计算机的了解,甚至没有服里一些8岁Scratch大佬强。

 

我的分享到这里,谢谢朋友们!(不喜勿喷!!) :-)

This post belongs to Column 「rice0208跳坑记」 .

2 comments
latest

  • Deleted Flog User

    我印象中TIOBE里有Scratch

  • wind

    我是正好七分……(复制代码那一个我经常做)

    确实,scratch在有些人看来是一个游戏,但是实际上它的逻辑性强度其实不亚于C,那些鄙视链上端的人只是觉的“满满的英文字母”看上去很高大上罢了。(不是我,别瞎想)

    如果学一个编程,你将竞赛搞了出来,那是你自己的实力,我心服口服。但是如果你将学编程的意义当成竞赛,那我就要给你列一个万字长文了。

    确实,scratch竞赛是有点少(我参加过好像是杨浦区少年宫的一个)。

    我作为C++和scratch都会的一个人,我会负责任的说:scratch真的是一个逻辑性很强并且很完备的编程语言。

    问:<iostream>是什么?

    上面那道题做出来的带路党欢迎对线