Software Programming, What to learn?

Current only in Chinese. However, you can try Bing Translator to read it in English: bing.com/Translator

本文讲讲编程学习的内容设计。

编程需要掌握的知识或技能,总的来说:

建模,机器,数学(依据某领域的数学来做新的软件),UI,工具,生态。 除了工具有必须熟能生巧的成分和各软件生态的熟悉需要一定时间外,其他都可以通过建模思维去快速学习,数学本来就是建模。

编程中的抽象建模的对比与运用

变量,函数和数据结构与抽象建模

编程中无处不是抽象建模。变量,函数和数据结构都是抽象建模,都是模块化的方法。

函数当然是在建模,把一些功能封装成指令,这样你有一层层的分层的指令。所以封装也不是随意的封装,如何封装的好,就是建模的思维,包括建模里分层的原则。

变量和数据结构也是建模。其实传统的教这两个概念的方法都不太对,都涉及机器了。其实他们的本质就是抽象建模。

“对比与运用”

好的教法,就是“对比与运用”,让学生去体验抽象建模带来的差异。

对比就是把无数的小的例子做出来,让学生自己去对比研究。并且要和实例结合起来,这样学生可以具体真实的感受到不同写法带来的变化。对比需要是有意义的对比。如果是对小孩子,那就对小孩子越有意义的对比越好。

这里的关键词是:实例,改变/对比,感知,探索,总结。总结就是创造自己的知识。

如果能够做好这些,其实学生甚至都可以自己去总结定义什么是变量,什么是数据结构,函数等等。因为这些说穿了,不过是软件编程里的封装或者说抽象建模的方法。

传统的编程教学与机器绑定的太紧密了。机器是编程学习里的一个大块,但是编程学习不是脱离了机器就不能学习。编程就是不同层次的封装,完全可以封装到与机器无关的层面。编程就是在建模,建模与机器无关,或者我们可以把机器当做一种特定的模型,用开放的眼光去看它。但很多人对机器不感兴趣的,就没有必要非要为了学编程就去学机器,并且一开始就涉及到机器的概念,所有编程的初始学习都摆脱不了机器的概念,所有的编程概念都要绑定着机器来讲,这其实也是对编程缺乏本质的认识造成的。

对编程有极大的热情,有志于成为编程的高手甚至大师的人,可以去熟悉了解机器,研究机器的模型是怎样的,甚至设计新的机器。

编程学习与机器是可以脱离的

自主探索的玩地而非盲目练习

传统的现代教育或者说旧教育范式里,强调大量的练习。往往强调练习而忽略了感知和探索。这其实反而是很多人成绩上不去的原因。(虽然我们认为应试教育从评估方法上是有根本的很严重的问题的。)

上面我们讲到的做出很多的可以对比的小例子,让学生去自主的探索,对比研究它们的代码的不同,效果的不同,自己去感知,去总结,这就成为了一个可以自主探索的玩地。有了这个基础,自己能感觉到什么是重要的,需要练习的,才会找地方去练习。这时候如果有可供练习的内容,才是有意义的,没有损害到自主学习的能力。

实际上,现代教育或者说旧教育范式了的很多方式,不是说其就一定不对或者说没用,我们要从是否损害了学生的自主学习能力上去评估。

基本指令的学习

建模是建立在已有指令基础上的。在以上建模学习中,都同时包含对相关指令的学习。

抽象建模思维之一,就是把大的东西分解成各个独立的个体,然后对这些独立的个体分别弄清楚。 基本指令,就是学习编程的初始的玩地。

在我们的教育实践中,我也发现很多孩子自然的就有这样的能力,不仅是对每个指令会利用我们在编辑器里提供的各种范例来了解这个指令的使用(我们并没有教他们去这样使用,完全都是他们自己到处点探索出来的。好的软件设计本身也应该是这样的,方便人的探索。) 另外,很多孩子还会单独创建一个代码方块自己写更多的例子来测试这个指令。很多孩子很喜欢改跑步或者走路等指令的参数,看看如果特别快或者特别慢会是什么效果。

所以这种做实验探索每个独立组件的抽象建模能力,是每个孩子自然有的能力,或者说是生命本有的能力,是我们数亿年进化而来的空间智能。

但很可惜的是,大一点的上过几年学的孩子这个能力就普遍的都有退化的现象,习惯了碰到问题就直接问老师,感觉已经丧失了玩和探索的兴趣,一切都已经变成了枯燥的(应试式)学习。

除了对指令的探索,对于方块,很多孩子,也是这样通过实验的方式来探索的。

当然,在我们的学习内容设计里,对于一些指令,比如比较重要的指令,参数多,或者功能复杂的,我们完全可以提供更多的实例来供学生去比较,感知和自我总结。

而导师在导学的时候,还是要通过这些实例去引导学生自己去多改变参数,去实验,去发现,体验这个过程。这个能力,对每个学生来讲,是非常重要的。教育不应该把注意力都放在具体知识的学习上,而应该放在自主探索能力上。

玩指令作为学习内容

“实例,改变,对比,看效果,感知,总结”,这几个关键字应该在导学的所有层面都广泛的运用。比如学生初学编程的,就让他们玩各种指令,让他们去改变这些指令的参数,甚至去组合一些指令,并考察不同的组合方式效果的不同。

这本身就是一大块的学习内容。并且这块内容往往是几乎所有的编程学习都欠缺的。

其实孩子所有的学习,包括学习算数,拼音,都是学会基本单元后的组合能力,也可以说是搭建能力,或者说抽象建模能力。

而我们的编程教育,普遍缺少让学生去首先了解这些基本组件,而是一上来就执着于教学所谓计算机科学的种种概念或术语。

其实如果有了对这些基本组件的灵活掌握,并且会一些简单的组合以后,再往上做更高复杂度的组合,孩子们是可以自然的去掌握的。

从指令到抽象建模

当然,指令的掌握,尤其是通过玩或者说实验的方式,本来就是抽象建模思维的一个方面。

在此基础上,就是本文开始所说的如何在组合这些指令的过程中去学习抽象建模的方法,具体的说,如何运用变量,函数,数据结构这些软件编程里的方法去做封装或模块化工作。

更多的建模学习

这里重复一下,其实孩子所有的学习,包括学习算数,拼音,都是学会基本单元后的组合能力,也可以说是搭建能力,或者说抽象建模能力。

写文章是如此,动画设计更是如此。这里不详述。

编程里更多的建模学习:

比如一个小游戏要把更多的交互UI设计出来,这就有着UI与数据结构之间的抽象模型的对应。并且可以把数据结构和UI看做是不同层面上抽象模型。

如何做好UI的交互,更是涉及了对多个层次的抽象建模或者说把握。比如:
– 与人交互最主要的大家最直觉的表层的抽象模型应该是什么?
– 然后这个抽象模型里的具体的每一个部分展开后有应该有什么样的细节的抽象模型?
– 需要分几个层次?

比较大的游戏的设计开发,涉及到软件的迭代开发和产品设计部分,也是抽象建模思维的学习:
– 首先应该开发出来的是什么?是否是一个完整的整体,人一看就能懂,就知道如何交互?
– 如何获得用户的反馈,确定后续迭代的重点?
– 同样的分层,需要分几层?
– 创造出来的游戏是否是富有生命的,“好玩”的?玩家在其中的有多大的自由可以去“玩”或者说在多底层可以去改变,甚至学习和创造?

我们要把建模的丰富内容做出来。让不同的学生在其中都可以用自己的路径,靠自己的感知和选择,去自主的完成这样丰富内容的学习。当然,我们的学习内容本身也是需要有好的模型,好的分层,好的组件的。这样学生才能够去快速的感知,快速的识别,自主的结合自己当前的兴趣与能力去组合不同的组件进行学习。而不会有传统教育里不同年级的学生很难都照顾到的情况。所以,关键还是基本的组件要找好,设计好。

学生有了这些丰富的建模体验以后,我们可以引导他们逐渐上升到理论层面,观察在各种复杂系统的处理里面,是否这些抽象建模思维都可以有效的帮助到他们,其中具体的能力,比如抽象模型的识别,拆解,聚合能力的运用,各种复杂系统比如对学习方法的总结,对社会的了解,对自己的了解,对人生的了解,如何学习语文,如何学习体育,如何学习画画等等,是否都可以用抽象建模的方式,通过自己的感知与玩的方式去学习?

引导他们自己总结,我们也有理论的知识供他们阅读。这样我们的学习内容,从实践到理论,从低级到高级,就很丰富扎实,涵盖的范围就可以很广。

我们是可以把建模贯穿在所有的编程和游戏设计学习中的,能够有非常丰富的内容。

不管是搭建,还是动画,编程还是写文案,只要复杂度提高上去,就需要更多更好的抽象建模技能。我们只要逐步的把复杂度升上去,学生就能够掌握逐步的更多的建模技能。这些都可以是很扎实的学习,是传统编程教育里最欠缺,最无法做到的。

三个层次的学习:实操,做得更好,理论

在学习内容划分上,感觉可以分成三个层次。

实操

目前我们的内容更多的是学操作。很多少儿编程教育机构更是停留在不过学一点控制语句以及变量函数上。

做得更好

在如何做的更好方面我们是缺乏学习内容的。搭建如何能够搭建的更好,动画如何做的更好,编程如何编的更好?

而这其实主要就是用建模的思维和相关能力去提高。

理论知识

到理论知识层面,尽量避免灌输方式,建议可以指出相关书籍,但更注重引导学生自己总结。

三者关系

三者间关系的把握:一定要有实物,要动手。不要只是阅读抽象的理论。 如果讲机器,就要有能接触到的机器,哪怕是虚拟的。

This entry was posted in Software Education. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


two × 8 =