欢迎大家来到「纸飞机烧脑大本营」的Scratch编程课堂。
在进入正式的课程前,我想首先来回答很多人,特别是很多家长和孩子们,都关心的两个问题,那就是:
- 编程究竟是什么?
- 编程到底难不难?
先来谈谈第一个问题。
编程究竟是什么?
在今天,“编程”已经成为了一个很多人都耳熟能详的名词了,或者你以前也接触过,或者你仅仅是听说过,并正准备通过Scratch来学习怎样编程。但无论如何,在进入到我们的正式的Scratch课程之前,稍微的关心一下,什么是编程,是不无裨益的。
当然,要想非常理论化的说清楚这个概念,既不容易,也不是我们这个课程的目标,更为重要的是,我向来觉得,编程和中国人之间,是天然亲和的。
因为,在我们从小所接受的那种系统化的教育 ,尤其是数学的教育中,所经过的种种训练,和习得的种种技巧,本身就有着一种非常强烈的,强调机械化和程式化的倾向,这一点,和西方数学强调以演绎为核心的思路截然不同,虽然近些年来,也一直因其相对显得刻板,为一些人诟病,将其视为是导致中国缺乏顶级创造力的原因之一(当然,我并不承认这点),但这确确实实是中国式教育的特质所在。
而且,更为重要的是,在这样耳濡目染下出来的中国人,几乎就可以无障碍的一步就跨进编程的世界中。
拿加法的学习来做例子。
我们先是在一年级,通过大量的反复的练习,死记硬背住了10以内所有的个位数和数的加法的结果(别怀疑,实际上你能不假思索的说出7+8=15,所依靠的就是死记硬背住所得来的“知识”,而不是什么逻辑);
之后,我们开始被教会使用“竖式”,来进行更为复杂的多位的运算,而全部的运算技巧,总起来,就是下面的这三句“口诀”:
每位对齐,从个位算起,逢10进1
而一些所谓的“速算”,则很多是在这个口诀上的一些修补和改变,比如,让你从高位算起,等等,但无论如何,其本质仍然是口诀,而当我们依据这些口诀,反复的进行着训练时,我们其实就已经开始了一次次非常完美的构建在头脑和笔头上的编程实践!
对的,你没有看错,这就是编程,你以前把他们叫做口诀,叫做套路,叫做规则,......,那么,从今天开始,你则可以开始,大声的把通过这些“知识 + 口诀”的方式,来解决问题的过程,叫做编程了。
你还是不信?好的,那么,不妨我们来根据这个规则,写个程序试试。
要稍微说一点的是,上面的这个演示,在个位数加法方面,我没有采用“记忆”的模式来实现,而是设计了一个看上去更加“演绎”一些的方法(或者叫更加愚蠢更合适?)即:
所谓a + b,就是在按序排列的整数列表中,找到a后,再往后数b个数,所对应的那个数
这貌似更加符合自然数中,关于加法的本来定义,但实际却并不高效。更为高效的,其实还是我们所熟悉的那种“记忆模式”,即:可以通过一张包含从0到9,每个数字和数字之间的加法和的“巨大”的“表格”,来代替我们在传统教学中,所要求学生熟练记住的那部分“知识”,然后,加法则演化成为了在这一表格中的一种检索过程,这在实际的编程中,其是是一个非常常见的提高效率的策略,我们在后续的Scratch,甚至其他编程的学习实践中,也会经常的碰到,即:
以空间换时间,用存储来替代运算
此外,还有一点也要在这里声明下,在以二进制为核心的计算机体系中,我们实际上是不会用这个方式来实现加法的,因此,这就仅仅是一个“正确”的演示,但却足以说明,我们从一年级开始,花了不少时间和精力,来学习加法,本质上并不仅仅是在习得一个技能,也是在不断的熟悉如何用一种非常机械化的方式,来按部就班的解决问题的方法。
不免稍微吐槽一下,现在的某些教育,天天在想着,如何让小孩子更快的度过这个阶段,因为觉得这个实在不够“素质”,不够“编程思维”,但究竟什么是“编程思维”?“编程思维”又仅仅是体现在上几门计算机编程课,甚至是上一些看上去高大上的课程上么?我倒觉得未必,有时候,“编程思维”,可能就隐藏在这一次次的看似简单的训练之中。
编程到底难不难?
那么,编程究竟难不难呢?这里的答案,就恐怕并不能让所有的“初学者”们感到满意了,因为:
编程真的很难!
那么,编程又难在哪儿呢?
大家听到最多的答案,可能会说是“算法”,也因为很多算法,确实的和数学密切相关,以至于很多人甚至会模糊编程和数学的界限,觉得编程 = 数学,将编程的难,等同于了数学的难。
数学之于编程,当然非常重要,要不然,我也不会把这一系列的课程,统一定名为:《游戏+数学+程序员=小学生也懂的Scratch》了。
但编程的难,却不仅仅体现在了数学上,之所以选用数学,纯粹是因为一些简单的编程,所涉及到的相关数学背景知识,也比较简单直接而已。事实上,如果我们要将背景知识这一项,也加进去,那么编程的难,几乎会是全方位的:开发一个包含碰撞的游戏时,我们能会遇到“力学”的难;开发一个光的演示程序时,又可能会遇到“光学”的难,等等等等。
因此,我觉得,有必要在这里,对这个“难”,稍微的作下限制,并以此作为相关后续课程的基础。在我看来,很多时候,编程本身的难,和我们学习任何一种语言,不管是古文,还是英语时,所感受到的难,是非常一致的,他主要体现在:
编程,自有其自身的范式和给定的软硬件限定条件,因此,编程难就难在,我们经常要像一个战士一样,和这些范式以及限定条件进行战斗!
这也导致了,在很多情况下,对于某些问题的表达和实现,哪怕你在“逻辑”上知道,应该怎么做,但在现实编程过程中,可能还是会觉得无从下手,有些,甚至需要通过一些“非常高级”的技巧去解决。
这实际上,也正是我的这一个系列的编程课程,所试图真正需要向大家传达的东西,即希望通过这样的课程,让所有学习者了解:
- 作为一种语言的Scratch,是怎样来表达问题的,即他的编程范式是什么
- 当我们在开发中,遇到因为环境的限制所导致的问题时,我们是在当前环境所允许的前提下,挖掘出相应的解决方案的
现在来说这些,好像有点“虚幻”,就以市场上,如汗牛充栋般的Scratch教程中,几乎都会在一开始所给出的一个程序为例吧。
这个程序很简单,就是让大家在舞台(至于什么是舞台等等概念,后面的课程会详细讲,这里就不展开了)上,放上一个角色,并且,循例的喊出:“你好,世界!”(当然,也可能是其他)
这有什么问题吗?对于这样的一个场景来说,当然没问题。但是,如果你现在不是这样的想法,而是希望像一般的文字冒险类的AVG游戏,或者一些MTV一样,直接在舞台上的某个区域,输出你想要显示的文字(比如,一些过场的文字),不想看起来很“Low”的,显示什么气泡,那我们又应该怎么做呢?
找遍Scratch所缺省提供的积木,我们只能非常遗憾的说一声:
这个缺省真的没有!
如果把这作为一个缺省环境所导致的限制,那么,在我们将这一功能构建出来的过程中,所需要的,就根本不是什么数学,不是什么算法,当然也不是什么物理,等等,而纯粹,就是一种:
基于当前环境所提供元素下的一种组合和创造
比如像这样:
这个当然不像想起来那么容易,而在后面的课程中,我们也会一而再再而三的遇到这些东西。但这就是编程,既是他的难度所在,也是他的乐趣所在。
最后,作为结语,我想引文史学家Douglas Bush曾说过的一句话,即:
在所有的课程中,现代教育的一个主要“罪行”是不要求学生们付出艰辛的努力。
在强调减负和快乐学习的今天,对于这样的一句话,我深以为然。
课后习题
1、 为什么在我们设计的加法中,按序的整数列表只包含0 ~ 18?
2、 在引入方程化问题解决方案之前,盈亏问题一直是小学应用题的一个重点,也是难点。那么,你能尝试整理出关于盈亏问题的机械化解决方案么?
3、 尝试第一次使用Scratch3(自己安装桌面版本或者是直接使用在线模式均可),编程的任务当然就是:在舞台上,显示一个角色,然后,在单击“开始”后,那个角色可以说出:“你好,Scratch”
想了解这3个问题的答案和更多的相关背景知识?关注并「私信」我,私信的内容是:s0,我已经准备好了,您还在等什么?