Category Archives: Software

Software Programming, What to learn?

Current only in Chinese. However, you can try Bing Translator to read it in English: bing.com/Translator 本文讲讲编程学习的内容设计。 编程需要掌握的知识或技能,总的来说: 建模,机器,数学(依据某领域的数学来做新的软件),UI,工具,生态。 除了工具有必须熟能生巧的成分和各软件生态的熟悉需要一定时间外,其他都可以通过建模思维去快速学习,数学本来就是建模。 编程中的抽象建模的对比与运用 变量,函数和数据结构与抽象建模 编程中无处不是抽象建模。变量,函数和数据结构都是抽象建模,都是模块化的方法。 函数当然是在建模,把一些功能封装成指令,这样你有一层层的分层的指令。所以封装也不是随意的封装,如何封装的好,就是建模的思维,包括建模里分层的原则。 变量和数据结构也是建模。其实传统的教这两个概念的方法都不太对,都涉及机器了。其实他们的本质就是抽象建模。 “对比与运用” 好的教法,就是“对比与运用”,让学生去体验抽象建模带来的差异。 对比就是把无数的小的例子做出来,让学生自己去对比研究。并且要和实例结合起来,这样学生可以具体真实的感受到不同写法带来的变化。对比需要是有意义的对比。如果是对小孩子,那就对小孩子越有意义的对比越好。 这里的关键词是:实例,改变/对比,感知,探索,总结。总结就是创造自己的知识。 如果能够做好这些,其实学生甚至都可以自己去总结定义什么是变量,什么是数据结构,函数等等。因为这些说穿了,不过是软件编程里的封装或者说抽象建模的方法。 传统的编程教学与机器绑定的太紧密了。机器是编程学习里的一个大块,但是编程学习不是脱离了机器就不能学习。编程就是不同层次的封装,完全可以封装到与机器无关的层面。编程就是在建模,建模与机器无关,或者我们可以把机器当做一种特定的模型,用开放的眼光去看它。但很多人对机器不感兴趣的,就没有必要非要为了学编程就去学机器,并且一开始就涉及到机器的概念,所有编程的初始学习都摆脱不了机器的概念,所有的编程概念都要绑定着机器来讲,这其实也是对编程缺乏本质的认识造成的。 对编程有极大的热情,有志于成为编程的高手甚至大师的人,可以去熟悉了解机器,研究机器的模型是怎样的,甚至设计新的机器。 但编程学习与机器是可以脱离的。 自主探索的玩地而非盲目练习 传统的现代教育或者说旧教育范式里,强调大量的练习。往往强调练习而忽略了感知和探索。这其实反而是很多人成绩上不去的原因。(虽然我们认为应试教育从评估方法上是有根本的很严重的问题的。) 上面我们讲到的做出很多的可以对比的小例子,让学生去自主的探索,对比研究它们的代码的不同,效果的不同,自己去感知,去总结,这就成为了一个可以自主探索的玩地。有了这个基础,自己能感觉到什么是重要的,需要练习的,才会找地方去练习。这时候如果有可供练习的内容,才是有意义的,没有损害到自主学习的能力。 实际上,现代教育或者说旧教育范式了的很多方式,不是说其就一定不对或者说没用,我们要从是否损害了学生的自主学习能力上去评估。 基本指令的学习 建模是建立在已有指令基础上的。在以上建模学习中,都同时包含对相关指令的学习。 抽象建模思维之一,就是把大的东西分解成各个独立的个体,然后对这些独立的个体分别弄清楚。 … Continue reading

Posted in Software Education | Leave a comment

Variable and Data Structure are abstract modeling

编程里的变量,往往是初学者很难理解的概念。 我们说编程里最核心的是抽象建模的能力。实际上变量设置就是在抽象建模。通过变量的设置,我们就有了问题领域的抽象模型。 通过变量,我们把一个复杂领域分离出来了变化的部分和不变的部分,或者说我们识别出来了其中的生命中心。比如distance, speed这样的变量,就是这些领域的生命中心,代表那个不变的抽象模型,虽然它们的值是可以变化的。正是通过把变化中不变的部分识别出来,我们完成了对该领域或问题的抽象建模。 程序员写一个程序,要创造很多自己的变量。优秀的程序员往往在对这些变量的设计包括命名上有卓越的能力,也懂得花费心思做好变量的设计与命名工作。会起名字的都是高手! 不仅仅是在编程领域,可以说在很多领域都是如此,比如音乐领域里窦唯就是有名的会起名。命名的过程,其实就是感知和创造生命中心的过程。 编程里的不同数据类型,同样是在抽象建模。比如字符串代表了我们这个世界里各种物品的名字或者语句,而数字则代表了可以计算的数值。这就是在对我们这个世界进行建模。更复杂的数据结构,如列表,是进一步的对我们这个世界进行抽象建模。 编程,就是这样的在不同的层面进行抽象建模的工作。我们必须感知我们的世界,获得本质的认识,并把这些认识转化为抽象模型。 所谓的本质的认识,正是我们上面说的,找到变化的世界里那些不变的东西,也正是建模的过程。 所以我们经常说编程是什么,或者讨论所谓的编程思维,其实就是对空间的感知能力和探索能力,掌握建模的方法,如何通过实验的方式去验证获得反馈并进一步改进,从而达到对世界的本质的认识。 这其实,也就是学习的过程。 而知识,其实就是我们大脑里的抽象模型,我们每个人都在基于我们感知到的重要体验去总结我们自己的知识,创造我们自己的知识模型。 所以,编程的技能,与学习的能力是完全一体的。也是我们说“学会编程,学会学习!”的一个重要原因。

Posted in Software, Software Education | Leave a comment

Properties of Life Centers

There is only Chinese version for now. 生命中心(Life Center)是克里斯多夫亚历山大(Christopher Alexander)的提出的概念。他是著名的建筑家,但对软件业的影响深远。 这里我们介绍生命中心的几个基本属性。这几个简单的属性,可以帮助大家在各个领域去识别各个生命中心。更重要的是,帮助大家去构造生命中心,不管是在哪个领域,如软件,组织管理,教育,甚至是体育运动。我们说所有可以被我们识别的都是生命。大家只要理解了这几个属性,就可以很好的理解不同领域的生命是如何组成的。 首先我们说生命中心应该是独立,有边界,强大,功能完备的,强感知的。当然作为生命中心能够被我们所识别,它一定是有边界的。好的生命中心也应该是独立的,强大的。在不同领域的生命中心,我们会有不同的词汇来表达这些。比如在软件开发里,我们就说模块化,每个模块干好自己的事情,自己那个领域的功能基本都有,其他模块需要那个方面的功能的时候只需要调用这个模块就可以了。这些有强大生命力的“中心”是可以被强感知的,同时它们被创造出来的过程本身也融入了创造者对生命中心的很强的感知。而在我们的学习中,如果我们把个体的人看作生命中心,则我们要求自己是有很强的感知能力的,能够感知自己大脑里的生命中心与外界的生命中心。 第二条属性则是自我阐释,界面友好,易于交互,好玩 。同样的,生命中心的概念是可以适用于所有有生命的生命体的,而生命中心的概念,认为凡是能够被人所识别的都是生命。所以生命中心是可以普遍运用于各个领域的。当运用于不同的领域时,我们相应的用那个领域的词汇去表述这个属性。比如在软件设计或者产品设计里,我们说要界面友好,易于交互。而对于作为生命中心的个体的人,我们说要能够很好的表达自己,让别人一看就知道你是做什么的,应该如何跟你交道,或者知道如何跟你玩。自我阐释,好玩,这样的词我们可以认为是比较根本的词,在各个领域里我们都可以去使用。所以你看,知识在不同的领域都会有呈现,但是会呈现出那个领域的一面。在不同领域工作的人,从自己个人的角度与这些知识进行互动,获得个人的体验,表达出来一定是带有个人的特殊角度的语言的。所以仅仅是学会书本上的语言,不能够自我表达的人,我们不认为对知识有自己的理解。而对知识有多领域的经验的人,能够获得对知识深层的理解,知道知识在不同领域变化的形式,可以变化着不同的语言去表达,并能够针对不同的人去用对方合适的语言去表述。我想,这些是不是让我们对知识是什么增加了一些了解呢?对“教”多了一些理解呢? 第三条属性是大中心包含几个小中心。要组成复杂的生命体,一定是大的中心里包含了更多的小中心。你也可以看作是多个小中心聚集成数个大的中心。比如树和巴黎圣母院的生命中心里,我们可以清晰的看到这点。这对于我们意义是当我们去了解一个生命体的时候,比如说学习一个生命体或者创造一个生命体,我们需要去感知其中的生命中心,并依次再去看每个生命中心里包含的生命中心,这些我们都可以一层层的去感知。各个生命中心组成更大的生命中心,这些作为组成成分的生命中心,它们之间一定是互相支持的,共同为大的生命中心这个整体服务的。所以一定会有上面那条属性,即自我阐释,界面友好,易于交互,好玩。 图:构成茶壶的生命中心 图:构成树的生命中心 图:构成巴黎圣母院的生命中心 第四条属性,复杂的生命体系往往是分层的,每层包含数个生命中心,并且各层相对独立。比如设计的好的软件系统,就应该有良好的分层。这样我们在了解低层的功能时,我们不用担心去看高层的功能,我们只需要在底层的生命中心间去玩即可。而我们对底层的生命中心有一定掌握后,我们可以上到更高的层面,去跟那个层面的生命中心去玩,以达到对那个层的理解。不好的分层,则会当我们了解低层的功能时,发现经常需要去看高层是做什么的。在了解高层的功能时,发现又经常要涉及低层的东西。这就是软件设计里很不好的意大利面条的设计(spaghetti code),一团糟的。在学习中,我们面对复杂的知识体系,也往往是通过逐层推进的方式来进行的。因为每层是相对独立的,我们不用担心我们不能对这些知识一下达到透彻的理解,我们可以放心的先达到某一层的整体理解,靠这个理解去指导我们的行动,在获得了更多的体验后或者在有了更好的资源后,我们再期待可以达到下一个层面的整体理解。同时,如果说对于一个领域,我们的兴趣或者我们主要要做的事情并不需要我们达到下一个层面的那种细节的认知程度时,我们就不用盲目进入下一层的学习。比如我对学习历史有业余爱好,对历史的学习往往能够帮助我理解我现在所处的社会。但是我不是专业搞历史研究的,当我发现我对历史的学习在某些地方已经可以进入到去看第一手的材料的时候,我并没有盲目的进入到那个层去。因为我知道进入那一层,获得那一层的技能和整体认知,需要投入的精力有多大。所以我满足于目前我对历史学的这一层,还是尽量的依靠史学大家的总结出来的知识,靠他们帮我去过滤,进一步丰富这一层的知识,有时间有好资源的时候就看一下。但我不会把大量的时间投入到历史的学习中去了。其他要学习的东西太多了。其实大中心里包含数个小中心也是分层,从抽象的角度看。 图:网络的七层结构 第五条属性是大量相似性重复和基本单元。对于相当复杂的生命体,除了分层,往往通过相似性重复来获得其庞大的规模。比如在“生命中心介绍”里面我们举例的大树和巴黎圣母院,都大量运用了相似性重复来达到其庞大的规模。除了相似性重复,另外一个复杂生命体经常运用的手段是“基本单元”。比如大树,是由许多的基本单元“细胞”组成的。巴黎圣母院这个宏伟的建筑,也可以认为是有基本单元的,就是那些基本的建筑材料:砖石。异常复杂的生物体,非常多样,千姿百态各不相同,但组成生物体的基本单元都是细胞。大量的各种细胞组成了身体的各个系统,器官。我们这个宇宙里各种物质,也有基本单元:原子或者更低层级的基本粒子。所以,如果你想构造的是非常复杂的生命体,你应该思考一下其基本单元是什么。 图:有大量相似性重复的树 图:有大量相似性重复的巴黎圣母院 第六条属性是平等的属性,就是虽然生命中心如上所述大中心里包含了小中心,或者说有分层,但是各个生命中心是完全平等的,只是因为功用的不同而有了分层而已。生命中心间的平等体现在两个方面,一个是流动性,一个是方面性。生命中心的形成是动态的,生命中心与生命中心间也是可以流动的。比如在教育里面,老师作为一个生命中心,是因为老师具备某个领域的经验和知识,并且学生认可这个老师在这个领域具备丰富的知识,值得向这个老师学习,这时候在这个领域的学与教的关系中,他成为了老师。但是随着学生的学习,也许某些学生对这个领域比老师有了更进一层的整体理解,这时这个学生可以成为老师。或者在另外一个领域,学生有更多的体验和知识,那么学生就在那个领域成为了老师,老师就变成了学生。在管理上,一个人数较多有多个团队的公司需要有一定的层级了,当然我们原则上希望层级越少越好,但是当一个公司足够大的时候就需要一点层级了。但是这种层级是动态的。首先我们要让在各个业务领域真正懂的人有能力的人能够成为大的生命中心,成为上层的生命中心。同时我们要让整个公司成为一个学习土壤和学习体系,让员工通过项目的实战来不断提升自己各方面的技能和知识水平。当达到一定水平的时候,就可以流动。而各个员工之间的关系也仅仅是基于业务能力上形成的生命中心间的关系,当离开公司或者非业务关系的时候,就不存在上下级的关系。所以我们看到生命中心虽然有不同,但仍然可以蕴含着平等在其中。方面性的意思,比如教育是一个方面,管理又是一个方面。生命中心在某一个方面以一定方式组成一个生命体,其位置和层级关系是为了让这个方面的生命度达到最高,但这种位置或层级关系不应该固化也不应该推而广之到所有的方面。比如在管理层面的位置关系不应该扩大到生活中去。所以,我们从生命中心和生命度的角度理解平等,应该表现在流动性和方面性两个方面。生命中心在各个领域包括抽象领域可以是不断流动的。 各生命中心为整体服务。虽然我们前面说各个生命中心要独立,强大,但各个生命中心是在为整体的生命体系服务的,通过自己的功用让整体更有生命力。后面我们会介绍生命度这个概念。从以上属性里我们可以看到,跟我们人文科学或者说跟我们每个人的生命密切相关的主题,比如个体与群体的关系,对平等的理解与践行,这些都是很深的需要每个人用一生去体会的主题,都可以从生命中心的属性里获得切实的感知。所以说对生命中心的感知是贯穿我们一生,融入我们所有体验与行动的学习。 以上生命中心的属性,其实核心的是前五条。第六条是可以从前五条里推出来的。 这几条生命中心的属性应该说是很简单的,但是存在于所有的生命体中,我们可以在所有的领域观察到这些生命现象。我们观察实践的领域越多,就越有助于我们更深的理解这几个属性。对这几个属性的了解,也更有助于我们面对任何复杂生命体的行动,比如解决问题,诊断,批判性思维,导学,创造。 任何复杂系统的处理,都可以简化为对生命中心的识别,或者说“看见”。

Posted in Scientific Study, Software | Leave a comment

Introduction to Life Centers

Only the Chinese version is available now. 本文对生命中心这个概念做个简单的介绍。 生命中心(Life Center)是克里斯多夫亚历山大(Christopher Alexander)的提出的概念。他是著名的建筑家,但对软件业的影响深远。 没有生命之前,这个世界的原初是漆黑一片的,什么也没有。然后我们从这漆黑中,分离出来一个个有限的个体,有了生命。 比如我们可以识别下面这个生命体,它是个茶壶。我们认为茶壶也是有生命的,因为我们能够识别它。 我们说这个有生命的茶壶作为一个生命体,有多个生命中心组成的。有哪些生命中心呢?看下图。 我们看到有壶身,壶嘴,壶盖,和壶柄。首先你要有壶身,否则你根本就无法盛水。然后你要有壶盖,这样可以倒水进去,要有壶嘴,这样可以倒茶出来。然后有壶柄,一般茶水会很烫,有个柄倒茶会很方便。所以我们看到这几个生命中心有机的组成一个整体,每个中心相对独立,我们可以单独识别出来,但又都为整体的这个茶壶的生命体提供某一方面的功用。这样组成了茶壶这样一个生命体。 下面我们看到这些都是茶壶,都有这几个生命中心,但是通过对这些生命中心做一些不同的设计,我们就有不同的茶壶。你然后可以通过功用,比如泡某一类茶是否能泡出其味来,或者是否方便使用,或者从审美的角度看其外形是否有艺术性等等,我们可以对这些茶壶有一些不同的感觉。 以上对我们的启示是什么?我们的感知能力很重要:通过对环境的感知或者对应用场景的感知去感知生命中心,应该有哪些生命中心。并通过大量的运用去获得关于生命中心的及时丰富的反馈从而去改进我们的生命中心。如何去拆解,分成几个生命中心再如何综合,组合成一个整体,都需要我们学会如何去感知。虽然我这里说的很简单,但是如果你抓住这些基本的原则,是可以在我们的各种工作中比如软件设计产品设计以及管理等领域去广泛的运用的。这种生命识别能力在我们的学习和教育设计中是很核心的能力。 下面这棵树是个更加复杂的生命体。 我们来看看树有哪些生命中心。我们看到有树干,树枝,树根这些生命中心。每个生命中心发挥自己的特别的功用,来支撑树这样一个整体的生命体。比如树枝通过分叉能够支撑更多的树叶,而树叶通过光合作用,来提供树需要的糖和能量。根用来吸收土地里的养料包括水分矿物质氮等。树干起到支撑整棵大树让其能到高空去竞争阳光,并通过输送水分和养料来支撑树枝树叶的生长。所以每个生命中心都有自己明显的分工和用途。而我们看其中的树枝部分,我们能看到其中有很多的重复的结构和递归的结构。我们看树根,也可以看到同样的重复与递归。也就是说一个生命中心里又包含了很多的生命中心,并且这些生命中心通过重复和递归构成了大的生命中心。一棵大树通过这样的大量重复的结构,得以实现一个高度复杂的生命体。我们还没有分析其他的层级,比如细胞。所以这是一个相当复杂的生命体系。 以上对我们的启示是什么?就是我们可以通过生命中心的分组或者分层去构建高度复杂的生命体,其中重复和递归是可以广泛使用的结构。这点看似简单,但对我们的各种工作都有深远的意义。比如作为生命识别的我们的大脑是有限的,例如短期记忆能力有限,每次能够放在脑里的生命中心的数量是有限的,这就需要我们通过分组或分层的设计,去将复杂系统做分层的呈现。而大脑在复杂系统的认识过程中,就需要运用很多跟生命中心相关的能力,比如“整体观”,即在处理局部生命中心时,能够不时的回到这个局部生命中心所处的整体的生命中心去,看这个局部如何更好的为整体服务,或者说从整体的感知上,这个局部的生命中心应该如何更好的设计。这个能力也是在很多工作中都非常需要的,比如设计或管理。另外,我们在设计一个复杂的生命体,比如软件,或者介绍一个复杂的体系时,讲故事的能力就非常重要,因为大脑是通过过生命中心,也就是说通过自己可以感知的有意义的单元来认识事物的。很多软件开发者,会把代码写成一团乱麻的意大利面,就是因为不会在最上层去讲故事。 在产品设计中,我们其实也是在逐层探索的一个过程中的。不够好的产品经理往往缺乏的就是这种逐层探索的能力,不知道如何去首先在最大的层面确定一些比较根本的东西,然后通过最小可验证产品(MVP)去验证这些比较根本的假设是否正确,再逐步进入到更细的层面去逐步的细化。生命中心的概念,分组和分层的生命中心,能够帮助产品经理们很好的去认识自己的设计过程,目前在哪个层次,有哪些关键的生命中心,哪些已经得到验证,或者目前获得的反馈对哪个生命中心提供了更多的信息等等。 学习,其实就是在一个非常复杂的生命体系中逐层探索的过程。而缺乏自学经验的人,就会很缺乏这种逐层深入的能力。所以面试产品经理,我们需要特别关注候选人有没有丰富的自学经验,问一些相关的问题。没有丰富自学经验的人,创造能力也是很差的。 我们人类社会是相当复杂的生命体系,我们每天会面对社会里的海量的信息,如何去识别这些信息的可靠性,如何去伪存真,或者能够保持一个“过程”的态度,或者怀疑的态度,去逐层的在相当漫长的时间里去逐步的认识自己所处的社会,其实对于我们每个人的人生是至关重要的。 下面这个是我们人类的建筑巴黎圣母院。我们一眼看过去,我们知道这个建筑很复杂。但是我们并不觉得乱,而是感到很舒服。我们一眼就能看出整体的结构和大的生命中心。我们可以很舒服的接受这一层的东西。然后如果我们想看得更仔细一些,我们可以去看看每个大的生命中心,我们发现这些大的生命中心又是由很多的小的生命中心组成的,并且也由刚才我们看到的大树里的那种重复性的结构。比如我们看底部的这一排人像,图片不是很清楚,但可以看得出这些人像形成了一排重复的结构,但是每个人像又是彼此不同的,是相似性的重复。 从以上叙述,大家大概可以体会到生命中心的意思。我们看到这些生命中心通过一定的组合,甚至通过多个层次,比如树,我们可以简单的看做有两层,在最上层有树枝树干树根这些大的中心。那么这些从整体分离出来的生命中心,作为生命有什么性质呢?我们说作为生命,它们是部分,是有限的,动态的。但是它们同时包含了原初的整体的无限,静止与和平的属性。所有的我们可以识别的,都是生命,都有这些性质,包括我们自身。 所以我们说生命是本自具足的, 而不是所谓的一张白纸等着老师们在上面作画。这点也是我们同那些现代教育之父们根本不同的一点。也许他们并不完全认同人如白纸,但他们应该对生命的本自具足是没有很深的认识的。本自具足的意思是当有限的生命从虚空蹦出来的同时其本身就已经包含了虚空的一切,包括绝对静止和完美。也正是因为本自具足,我们说生命是平等的。所以虽然我们有知识上的不同,但在教育上我们不能因为知识上的不同而形成僵化的权威,而要通过我们对教育设施与组织方式的建设,去尽量的实现教育上的平等。所以我这里讲的教育平等是指学生和老师之间的平等。

Posted in Scientific Study, Software | Leave a comment

Programming is to build

Paracraft的编程学习是从搭建开始的。很多人会纳闷,为什么学习编程要从搭建开始?我们的回答很简单,编程就是搭建! 编程其实就是用很多的指令搭建出一个很大的软件出来,就像在Paracraft里用方块搭建出一个大的建筑出来一样。大家看这段条块式编程的截图,就很形象的可以看出来许多的指令搭建出来一段程序。另一幅截图里则搭建出了两段代码,如同Paracraft世界里搭建了两个建筑一样。 图1:指令的搭建 图2:两个程序的搭建 熟悉Paracraft的小朋友都知道,如果有什么经常需要使用的建筑模块或者角色,可以使用方块进行建模,生成可以重复使用的BMAX模型。比如说建筑里的斗拱,或者屋顶的瓦片,可以用方块搭建出来可以复用的模型。房间里的桌椅也是一样,我们可以用方块搭建出来桌子或者椅子,然后重复的放置在不同的房间里。这跟编程里把重复使用的功能模块包装成指令或者函数是一样的,需要能够识别和提取通用的功能,并进行抽象建模生成可以重复使用的模块,这样的抽象建模能力正是编程里的核心能力。 图3:使用Paracraft制作的动物Bmax模型 图4:学生使用Paracraft方块搭建的坦克Bmax模型 指令的封装,也是一种模块化。其中有些指令是更底层的,被上层的指令反复调用。这就需要学生具有很强的抽象提取能力。而学生也可以去创造新的指令,可以是更底层的可以被很普遍的调用的通用指令,也可以是上层的更方便的做某些事情的指令。这些不正是搭建吗? 而这些底层的指令则代表了对那个层次的理解,或者说那个层次的抽象模型。就好像斗拱屋瓦等代表了对中国建筑的理解一样,或者说是中国建筑的抽象模型。你可以看到,从外在形式到内在实质,编程不就是搭建吗? 图5:使用Paracraft搭建的中国特色建筑 当孩子们需要去搭建一个相当大型的场景的时候,就需要学会如何拆解,如何抓住主要特征,如何迭代的分层的去完成,如何再组合不同的模块构成完整的作品,这些都是软件编程里的核心能力。 孩子们之所以热爱Paracraft,正是因为他们热爱搭建,通过搭建去创造复杂的生命。看看孩子们创造的各种过山车或者跑酷游戏,或者充满各种机关和故事的解密游戏,或者他们回忆校园生活的再现宏伟的校园建筑且饱含深情的动画电影,等等,无不是充满生命的作品。 图5:一个9岁孩子搭建的跑酷游戏 图6:一个9岁孩子搭建的跑酷游戏 而软件编程,正是创造生命。同物理世界的很多东西不同,没有哪个软件不是在创新。因为如果哪个软件不是在创新的话,我们可以直接复制之前的同样功能的软件即可。软件的复制/再生产的成本是0。所以软件一定是在创新的,不会重复的造轮子,程序员无时不刻不在创造新的生命,或者探索和思考可以创造什么样的生命,对他人有用的生命。所以创造完整的作品对于程序员来说,有着至关重要的意义。 Paracraft,正是以创造生命作品为核心,哪怕是年龄很小的孩子,也都有可以去创作的作品,并且在Paracraft里,孩子们可以创造完整的作品。随着技能的增长,他们可以逐渐创造更加复杂和有挑战性的作品。在创造复杂性和有挑战性作品方面,Paracraft可以说是没有上限的。 软件编程是通过搭建的方式去创造复杂的生命作品。 这就是我们对编程的理解。在软件行业里,我们发现优秀程序员应有的素质是普遍缺乏的,这些素质,简单的讲,其实就是搭建创造生命作品的能力,比如如何做抽象建模,如何拆解,如何抓住特征,如何分层,如何迭代,这些都需要很强的空间感知能力和与复杂空间交互的能力。这些素质的欠缺,正是我们传统的编程教育的狭隘片面造成的。传统的编程教育缺乏对软件编程的核心本质的理解。Paracraft编程教育,正是要解决这个问题,实现真正完整的编程教育。正如Alan Kay所说,认为软件编程就是逻辑是普通人对编程的严重误解。 所以,编程就是搭建!一切从搭建开始!

Posted in selflearning, Software, Software Education, Uncategorized | Leave a comment

Paracraft, Software Education 3.0

关键词: Paracraft,编程教育,青少年编程教育,Logo小海龟编程语言,Scratch,终身幼儿园,Alan Kay,皮亚杰,建构主义教育,克里斯多夫亚历山大,生命中心,探索式学习,抽象建模,复杂系统,空间感知,空间思维,理解,创造,艺术与科技的交融,生命教育,生命发现,生命表达,走向未来的人工智能 简介 本文介绍编程教育的历史发展脉络,计算机软件先驱们对编程和编程教育的本质的思考,介绍Paracraft帕拉卡作为编程教育3.0的平台给编程教育带来的革命性改变,以及编程教育对教育的普遍意义,中国编程教育的现状和我们希望做出的改变。 注:本文行文高度浓缩,信息量很大,其中很多地方,一段话其实就是一篇文章。阅读时建议放慢速度,仔细体会前后句之间的逻辑。 编程教育 LOGO(小海龟)编程语言是编程教育的1.0,Seymour Papert发明的LOGO语言,承载了计算机先驱们关于编程教育的理念和期望。 图:Seymour Papert与LOGO语言 Scratch是编程教育的2.0,作为Seymour Papert的学生和思想的继承者,Mitch Resnick创造的Scratch以图形化编程的方式让编程对儿童更形象有趣,其提出的终身幼儿园让计算机先驱们关于编程教育的理念更容易为大众所理解。 图:Scratch创始人Mitch Resnick Paracraft则是编程教育的3.0。Paracraft的3D动画编程通过空间的搭建和丰富好玩的作品的创造,让青少年们真正接触到编程的核心思维,真正做到了丰富的玩,丰富的学,学会高效的思考,高效的学习。 编程教育的意义:学会编程,学会学习! 从1.0到3.0,其一以贯之的核心思想都是“学会编程,学会学习!”。这里包含了两个层面的理解: 1. 软件编程是思想的工具,是通过编程去操作个人对世界的感知。 1. 编程与学习有高度一致性。 软件的先驱,Small Talk的作者Alan Kay认为编程是去操作个人对世界的感知。注意,这里Alan用了感知这个词,而不是思想。用感知这个词是非常准确的,说明Alan是把编程看作是根本的思考,而不是一般的思考。在编程里,基于对世界的感知而形成的抽象模型是思考的基础。 图:Small Talk作者,软件先驱Alan Kay 小海龟(LOGO)编程语言的作者Seymour Papert,与Alan Kay有很多的合作,也有着非常类似的理解。他认为计算机或者软件编程的核心力量来自于两个方面,其一是表达(representational capacity)世界的能力(在Paracraft教育里,我们把这个能力理解为建模的能力),其二是即时改变这种表达的能力(responsiveness )(在Paracraft教育里,我们理解为验证模型,获得反馈,并改变模型的能力,也就是debug的过程)。 由此,我们看到编程的的两个特征,一是编程一定是基于理解的,再就是编程一定是导向创造的。 基于理解,是因为编程首先的就是要对某个领域进行抽象建模。抽象模型代表了我们对那个领域的理解。并且编程提供了做实验来验证这个理解或者说抽象模型的方式,可以快速获得反馈,形成更好的理解,进行改进。 另外,软件总是在创造的。软件创造的本质是对每一个新的领域进行数字化。数字化以后,就能够突破自然的物理局限,比如时空的局限,造成连接。所以新的软件总是带来根本的突破性的创新,让整个行业突然发生巨变。这就是为什么技术能够改变世界推动历史进步的背后的原因。比如我们看到的软件对商业的改变,对新闻的改变等等。这就是数字化进程。所以,我们看到今天软件无处不在,并且以更快的速度渗透到我们生活的方方面面,其实这背后在进行的就是数字化过程,其核心,这里再重复一遍,就是对更多的领域进行数字化建模,变成数字化的软件,人们可以通过软件去操作这些数字化模型,从而实现了人与人之间基于这些模型的连接与交互。 比如现在我们大家都熟悉的电商网站,各种商品被数字化,并且按照不同的类别展示在网站上,每个商品都有可以详细查看的细节,包括图片。还有其他客户的点评也被数字化并展示在相关商品下面。商家也被数字化,可以查看商家的其他商品,向商家咨询。自己购买下单的过程,被数字化成了订单,商家与买家通过订单进行各种交互,如退换货退款等等。买家下单后库存数减少。商家可以进货增加更多的商品。买家还可以查看自己所有的历史订单。这些是大家现在都已经很熟悉的电商网站。我们看到电商软件需要对商品买卖做数字化,这个数字化就是要对商品买卖有好的理解并且用模型表达出来,比如商家模型,买家模型,商品模型(如sku,名字,描述,库存等),订单模型等等。通过这些模型连接到各方的人,通过这些模型进行交互。 不光这些我们平常生活中比较熟悉的具体的实体可以被抽象建模,就是抽象的事物也可以被建模。比如电商订单里商家与买家间的交互,其中的退换货退款的申请和处理是相当复杂的过程。单看这些行为的结果,不过是改变订单的状态,也就是说改变订单这个抽象模型里的相关数值。一般来说对模型的值的改变,程序员都是直接封装成指令,但是因为这些交互非常复杂,并且这些交互的方式可能因为业务的更改而经常更改,由程序员直接写在代码里是很容易出错的,也不方便更新。面对这样的复杂性,虽然是抽象的对订单的交互行为,也可以进行抽象建模,用模型来规范和简化操作。 所以可以看到对于简单的系统,我们可以直接的用一些指令的顺序执行去完成,不太需要额外的抽象模型。但是对于复杂的系统,我们往往需要设计更多的抽象模型,这些抽象模型就成为新的生命中心,之前看似很复杂甚至杂乱无章的交互可以围绕这些生命中心来进行。因为这些生命中心的出现,如果用信息系统里熵的概念,可以说复杂的无序的系统变得更有序,实现了熵减,但我们更倾向于使用生命这个词,因为这并不是简单的一般人认为的“顺序”的有序。 … Continue reading

Posted in Software Education | Leave a comment

Software, Life, and Education

我们说软件的数字化,其实就是在数字化生命,是一个不断识别生命创造生命的过程。所有的我们能够识别的东西都可以数字化。所有的我们能够识别的东西都是生命。 软件就是生命,软件不断的创造生命。不光最终的软件或者产品是生命,软件开发中的建模本身就是识别生命创造生命的过程,建好的抽象模型就是数字化的生命,这个生命是动态的,还会继续的变化,根据实践中获得的反馈不断的改进,甚至演化出更多的层次。 所以软件编程可以说是一个识别我们物理世界或人类社会中的生命并将这些生命数字化的过程。软件就是数字化的生命。 那么什么是人工智能呢?人工智能是能够识别生命创造生命的数字化生命。这就是我认为人工智能应该有的定义。如今的人工智能还只是计算,谈不上对生命的识别。所以,人工智能的发展,首先应该是对生命或者说对生命中心的识别。有了这个最基础的能力,其他复杂的能力如解决问题能力,思辨能力,复杂系统诊断能力,学习能力,甚至创造能力都能发展出来。 我常说人生/每天只有三件事可做:玩,学习,创造!这就是生命的过程。可以说生命只做这三件事情。 正是因为软件编程就是这样的一个生命过程,我们可以看到编程其实就是一个玩,学习和创造的过程。编程中的抽象建模,就是要找到一个领域里的基本的积木或者说组件,让人们可以去搭建出来各种复杂的建筑或者其他的复杂生命体,如各种网页或者各种电商平台等等。找到基本的单元(学习),让人们可以玩起来(玩),用来搭建各种复杂的东西(创造),这个过程就正是学习,玩,和创造的过程。 真正的玩,一定是同时包含学习和创造的,我们小时候不管玩什么总是期待能学到新的东西,如果学不到了,我们就会换一个东西玩。我们在玩的过程中也总是在尝试去创造,能够让我们大量创造的东西我们会觉得太神奇太好玩了。编程正是这样一个不断的学习新东西,去创造好玩的大家都可以用来创造的东西。并且这是一个实践,交互,获得反馈,不断改进的循环迭代的过程。这就是生命的过程,和我们每一个人的成长是一样的,必然包含了玩,学习和创造! 所以,编程教育从来就不应该是只教编程的教育。程序员都需要大量的学习,学习许多不同的领域。并且编程里的学习,必须是非常高效的学习。编程教育就是要教大家如何学习,实际上是引导大家回归小时候每个人或者说每个生命都有的学习能力,也就是在玩中自然学习的能力,并通过编程对这样的学习形成抽象的系统的认识且能有意识的高效的运用。所以编程教育是重建人类教育的教育,编程教育必然是生命教育。下面这段我们还会继续阐述这点。 编程教育也是重建艺术与科技的桥梁的教育,因为软件编程就是艺术与科技的桥梁,是人文学科与自然学科的桥梁,是人类世界与物理世界的桥梁。由机械化生产和机器大生产催化的现代化进程,也是人类逐渐变得机械化和机器化的进程,为机器化大生产服务的教育尤其如此。 当你只需要在某个行业做操作性的工作时,你是不需要学习的,你只需要存储一些记忆,比机器高级一些,能够记住该行业很多的术语和操作步骤,成为高级的机器就可以了。我不是只指工厂里的工作,那个时代大部分的工作都是如此。但是软件编程这样的需要对人类生活和物理世界的方方面面进行数字化的工作,需要不断的进行新的领域的学习或者做更底层的抽象的理解,是需要很强的学习能力的。由软件催生出来的人类的数字化时代,创新成为重要的生产力来源,所以学习重新成为人类社会的重要需求。 被现代化教育人为割裂以方便人们记忆的分门别类的学科重新需要互联互通。艺术与科技也绝不是鸿沟,更不应该让科技发展压制艺术与人文的发展,那是非常危险的进程。通过生命空间的感知,我们让科技成为艺术和人文的一部分,已经停滞多年没有重大突破的科学也会重新迎来发展的春天。 人类逐渐机械化机器化,不光是我们的教育深受影响,我们的科研也深受其害。这一方面是因为现代化进程中形成的现代教育扼杀人的学习能力和创造能力(用剥夺玩的方式,以所谓的“学习”的名义。名为学习,实为培训,培训高级机器人。),连爱因斯坦也说很庆幸自己没有被现代教育给扼杀掉。当然,爱因斯坦受教育时还在现代教育形成之初。到了今天已经相当成形的现代教育可能已经把所有的爱因斯坦扼杀光了。另一方面是因为催生现代化的人类近代自然科学,在当时可谓是光芒四射,取得了巨大的突破。人文科学开始普遍的采用自然科学的研究方法,尤其是非常生硬的要把所谓的人的主观完全排除出去,这样其实也就把人类的感知也排除掉了。提出生命中心的克里斯多夫亚历山大指出笛卡尔的主客观分离是现代科学发展的基础,也造成了现代科学的缺陷。他提出生命中心,正是要重建主客观的正确关系,在新的科学里将它们重新统一起来。作为建筑师的亚历山大对软件编程的发展影响极大,他对软件业的期待也非常大,认为程序员是真正能够实现他的思想的人。其实现代科学的发端,来自于文艺复兴里对艺术和人文的全面的追求和探索,科学作为这个探索的有机组成也蓬勃发展起来。但人类的进程,资本逐利的力量,在现代化进程中,让艺术人文与科技逐渐割裂开来,对生命的感知被广泛的忽视,在各个不同的领域,我们都可以看到生命的感知是如何被忽略的。比如大家普遍的把数学,物理,甚至编程这样的学科认为是需要很强“逻辑思维能力”的学科,所以很多人会很快的认为自己不擅长这些学科是因为自己的“逻辑思维”不强,自己更擅长艺术方面的学习。我最近看一本满是逻辑思维题的书,翻下来发现所有的题其实都是建立在空间感知基础上的,空间感知解决了80%甚至90%以上程度,然后最后一点就是他们说的所谓的那种线性的“逻辑思维”。这本书讲解的解题答案基本上是最后那百分之十几的逻辑部分,搞得好像这个思维很难,但是如果被忽略的空间感知和思维被采用,所有的题目都很容易。这种艺术与科技的分裂,正是现代科学的发展逐渐变得停滞多年缺少重大突破的一个重要原因。改变这个状况,就需要重新把对生命的感知带回来,重新建立艺术与科技之间的桥梁。软件作为数字化的生命,作为关于生命中心的科学,正是被亚历山大赋予厚望的原因。科学的进一步的飞跃,必须回到文艺复兴时期那样的艺术与科学的充分融合,我们需要我们这个时代的诸多的达芬奇。 当然,诞生于机器化大生产时代的计算机科学自身也深受其害。发明最短路径算法的Dijkstra说:太糟糕了,我们取了个这么糟糕的名字,计算机科学,就好像把脑科学叫做刀子的科学一样。所以今天的大学的计算机科学专业培养出来的大量的是不合格的程序员。在软件日益进入我们生活的方方面面的今天,对优秀的程序员的需求是个巨大的缺口。大学计算机专业培养的学生大多只能像普通工人一样完成些比较小的既定的任务,探索能力,设计能力,创造能力都很差。大量的行业需要的产品设计,项目管理人员竟然不是计算机科学专业毕业的,几乎没有写过一点代码,遑论对软件有好的理解。现代化教育的学科割裂在软件行业也制造了无数的灾难。 所以,编程教育首先要改变的是自己。而改变的路,就是向更广大的普通人群普及编程的教育。编程教育本身应该是素质教育,在向普罗大众科普编程的过程中,我们才能改变它被命名为计算机科学以后带来的种种错误的公众形象,找到它真正的实质。首先,编程的学习可以很简单。 只要让人们能够玩起来。现在的编程学习是人为的被弄的太难了。其次,每个人都需要学习编程,但不是每个人都需要成为职业的程序员,每天大量的写代码。软件行业有大量的职位,产品,设计,管理,学点编程都能帮助你1000倍的更好的做这些事情。 我们前面说软件就是生命,催生了以大量创造生命为特征的人类数字化时代,从而带来了改变现代教育的社会基础时代基础,现代化进程中形成的教室教材教师三位一体的现代教育到了不得不改变的时候。本身需要大量学习的编程,通过编程教育,也将开启重建人类教育的进程。从改变编程教育开始,人类百年来的自主教育积累下来的丰富经验,将会被数字化,形成更为本质和系统的理解,这些软件会成为未来教育的基础设施。这些才是我们需要的教育软件!在编程教育中,人们将接触到学习的实质,如何通过抽象建模去学习,并将学习获得的理解变成可以用于搭建的好玩的抽象模型,甚至编程本身就是学习本身,通过编程去学习各个领域的知识,学科的隔阂都会被打破。 对生命大量数字化的编程,也让我们对生命有了更本质的理解。这些理解,会帮助我们做好编程教育,在理论上和软件基础上,成为未来教育的基石,帮助教育回归生命本身! 对生命大量数字化的编程,逐渐让人类走进以丰富生命为目标的时代。现在我们还只是在数字化普通的生命,还未能数字化出来能够识别生命的生命能够创造生命的生命,那将真正开启人类的人工智能时代。今天我们做的编程教育,就是在为之做的大量的准备工作。让教育回归生命,构建关于生命的理论体系,都是基础的准备工作。当人工智能能够识别生命创造生命时,人类创造生命的进程会大大加速,我们可以去探索宇宙的一切奥妙。作为逆熵而生的生命,从一开始我们就开始了对抗宇宙熵增的进程。这场抗争,发展到高级生命的人类的今天,似乎仍然是无可避免的走向失败的宿命,宇宙最终还是会毁灭的。除非我们创造生命的能力,已经可以创造宇宙!谁说那又是不可能的呢?也许生命能够逃避最终归于混沌的宿命,成功的完成对抗宇宙的使命!

Posted in selflearning, Software Education | Leave a comment

Knowledge and Action as one in Software Programming

知与行的关系,大师们你来我往讨论争辩了几千年都没说清楚,成为中国哲学的一大命题,在软件编程里,却像天上的明月一样一清二楚一目了然:我们对一个领域通过观察和实践,快速的形成理解模型,并根据该模型搭出初始的原型,用这个原型去快速的实践和交互,根据获得的反馈不断的改进和丰富我们的模型。 学而不思则罔思而不学则殆,孔子老人家老学究的这句话,在编程中也是清清楚楚无需多言的。 大家现在是不是对编程的实质有一些了解了?为什么我们说编程是最好的思考最好的学习? 当年编程最吸引我的就是,文人们表达自己的思想,你说你的我说我的,文人相轻,谁也不能说服谁。用编程表达思想,代码必须能在机器上跑,必须给千万人使用,直接就是验证,直接就是行动和改变! 所以,我们有句行话:用代码说话!

Posted in Software | Leave a comment

Paracraft for Self-Directed Education

This is the slides we use to give workshops at Hong Kong last December and this January. Here we share it with the public. You can view and download it. After downloading it, you can view the notes in it … Continue reading

Posted in selflearning, Software Education | Leave a comment

From Agile to Life Centers (Draft)

Dijkstra said in the 70s that the irreversible damage is done once we have named this subject “Computer Science”. “…the topic became —primarily in the USA— prematurely known as “computer science” —which,actually is like referring to surgery as “knife science”— … Continue reading

Posted in Software | Leave a comment