3

编程课,到底在教些什么?

 2 years ago
source link: https://zhangshenjia.com/education/coding/what/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

编程课,到底在教些什么?

2019年11月9日,我应邀在郑州第三届全人之美教育论坛暨中小学博雅教育专题研讨会上做了题为「编程课,到底在教些什么?」的演讲。坦白说现场讲得并不好,有些准备好的内容居然忘了讲,因此根据演讲内容整理一篇文章,作为补充。

image-59-1024x576.png

我手里这个魔方,任何一个人都可以轻松地把它打乱,但要想把它复原,就不是每个人都能做到的了。我会还原魔方,而你不会,这能不能说明我比你聪明呢?并不能。

image-60.png

还原一个三阶魔方是有特定的步骤的,目前最流行的还原方法叫CFOP法,就是先在底部完成一个十字(Cross),再分四组完成前两层(F2L),然后复原顶层块的颜色(OLL),最后复原顶层块的位置(PLL)。至于高阶魔方,则可以通过合并中心块和棱块把它变成一个三阶魔方,然后再用上面的方法复原。

我会还原魔方,不过是因为我掌握了这套程序,而你还没有掌握,所以无法还原它,仅此而已。只要你愿意,完全可以通过各种渠道学到这套程序,把它装到你自己的脑子里,然后你就会还原魔方了。

现在国家在中小学大力推行编程和人工智能教育,有人可能会奇怪:写程序不应该是程序员的工作吗?为什么要让小学生来学呢?他们能学会吗?

接下来,我就尝试来回答这些问题。

为什么要开编程课?

image-61.png

顾名思义,编程课就是教学生怎么编写程序的。那么我们就要先搞明白一个问题:啥是程序?

image-62.png

程序,就是流程加顺序。以一首歌为例,歌词和乐谱其实都是程序,分别记录了歌曲的唱词和弹奏过程,音乐创作人把音乐写成歌词和乐谱,这就是程序。歌手按照歌词来唱,乐队根据乐谱来演奏,这就是在执行程序。而写歌词和记乐谱的过程,就是在编程。

同样,我们老师上课也是有一套程序的。以我的编程课为例,会先组织课前讨论活跃气氛,然后引入问题探讨,提出新概念和方法,再让学生上机实操,最后总结回顾,并让学生完成课堂作业,课后再留一个思考题让大家回味。如果把这套程序写下来,那就成了教案,按照教案上课,就是在执行这个程序。所以我们备课,也就是在编程。

image-63.png

当你按照别人设计好的流程在一步一步执行时,你就是在被编程。比如我们参加一个旅游团,只能严格按照人家规定好的行程来,每一步都不能更改,这是被编程。只有当程序是我们自己设计的时,这才是在编程,比如计划一次自由行,详细安排出行计划中的每一步,先去哪后去哪,决定在哪吃、吃什么、住哪里,这就是编程。

同样以上课为例,完全照教材章节和大纲准备内容,照着别人设计好的PPT和流程上课,这是被编程;把教材和他人的PPT当成素材,有机整合各种资源,设计出自己的一堂课来,这是编程。

我们开编程课,就是为了让孩子们以后都能成为编程的人,而不是被编程的人。

image-64.png

有人问:程序我自己知道就行了,干嘛要写出来呢?

首先,把程序写下来之后,你就不用再记忆整个流程中的全部细节了,只需要专注于执行。我们在学习一道新菜的做法时,都会先在网上或书本里找到食谱,然后照着流程一步步来做。只有非常熟悉的老手,才能只看一遍就掌握其中要点,然后不用看就能做。这样可以减轻我们大脑的压力,也会大大减少出错和遗忘的可能性。

把程序写下来后还有个好处,就是你可以把这项原本需要自己完成的工作交给别人去做,从而把自己解放出来。我有个习惯,就是在每个岗位上都把自己的常规工作流程写成文档,随时可以交接给别人,可以让自己随时离开,而组织依然能正常运转。相反,很多人认为自己在一个岗位上是不可或缺的存在,这样就能说明自己很厉害。但我可不这么认为,如果这个岗位离了你就不转了,那么你不得累死?没人能接手你的工作,那你还有机会跳槽或升职么?

人的价值,其实由他所掌握的程序决定。有的人装的程序多,有的人装得少;有的人装的程序高级,有的人装的程序低级。打个比方说,如果给你一台最新的顶配iPhone,但不允许安装任何APP,那这部手机就只能做类似打电话、发短信、看网页这样的简单功能,甚至还不如老式的功能机待机时间长、耐摔耐用,对吧?

人是不可被复制的,但程序是可以被复制的。人是不靠谱的,而程序是靠谱的。人是不可改变的,但程序是可以改变的。如果一件事出了问题,找原因找到人头上,只能解决人,却不能解决问题。任何问题的根源都在程序上,只有修改了程序里的漏洞,才能真正解决问题。

我们开编程课,就是要让孩子们理解上面这些道理。

image-65.png

如果能把程序用机器能理解的语言写出来,就可以让机器去完成原本需要人去做的重复性工作,从而突破人类的体能极限,做到原本做不到的事情。

再厉害的举重运动员,也不可能跟叉车比力气;再聪明的人类棋手,也不可能战胜充分训练过的人工智能。机器可以不吃不喝不睡24小时运转,不要工资不要福利不请假不偷懒不休息不发脾气,性能两三年就翻一倍,成本则降低一半,干活比人又快又便宜还靠谱。在跟机器竞争时,人类是永远处于劣势的。

在座的大多都是女老师,然而我们知道在一两百年前,教育可是男性的专利,近代著名的女性教育家除了蒙台梭利之外,几乎没有几个我们叫得出名字的。不止教育,各种专业领域都是如此。然而现在的老师,特别是小学老师,大比例都是女性。这是为什么呢?

女性开始大规模进入社会工作有很多原因,而其中一个重要因素就是以洗衣机为代表的各种家用电器的普及,大大减轻了女性在家务劳动中所花的时间。中世纪一个典型的家庭妇女每天平均要花4个半小时在洗衣服上,正是洗衣机等电器的普及解放了女性的双手,这才让女性有足够的时间来投入工作。

我们开编程课,就是要培养孩子们的计算思维,能发现哪些工作更适合让机器去做,也有能力写程序来完成这个任务。 同样的事情如果能让机器做,就最好不要让人去做。即便只是把工作中的一部分交给机器,也能大大提升工作的效率并降低成本。

image-66.png

有人又问:编程找专门的程序员不就行了吗?干嘛要让小学生学呢?学编程能给孩子带来什么?有必要在小学阶段就开展吗?

要知道,我们正生活在一个即将、甚至已经由程序支配的世界。股票交易、地铁运行早已由程序接管,因为没有人能处理如此大的数据量,没有人能作出如此精准的操作,更没有人可以承担出错的责任;全自动流水线和机器人已经席卷全世界的制造工厂;我们每天拿出手机轻轻一点,百度地图就帮助你规划好了路线,QQ音乐帮你识别出了马路上听到的音乐,今日头条推送了你最感兴趣的新闻,抖音刷出了你最爱看的视频……

在电器时代来临之前,那怕是手表这样复杂的机械结构只要拆开了慢慢研究,总能明白其中的道理;像台灯和电风扇这样的简单电器,具备简单的初中物理学基础后,观察电路板也可以理解原理;然而在集成电路出现之后,就出现了一个不可观察的黑盒;互联网时代的软件和APP,用户更是只能接触到操作交互界面,对界面后的服务器和运作逻辑完全一无所知;到了人工智能时代,我们会发现自己身边存在着无穷无尽的黑魔法,它们功能强大,简单易用……但是我们总是难以理解它们到底是怎么一回事。

如果你不能理解这个世界,又谈何去改变世界呢?

在英美国家流行的K12教育体系中,编程课在幼儿园阶段就已经开展了。而我们中国的孩子往往只有到了大学选择计算机专业,才能开始系统地学习编程。但非计算机专业的孩子们呢?等他们大学毕业之后,遭遇到来自那些从幼儿园就开始学习编程者的降维打击,他们用程序几分钟完成任务,而我们的孩子要加班加点好几天,这该怎么竞争?

我们开编程课,就是要教孩子们更好地理解并改造我们生活在其中的这个世界,让他们能够在未来更好地生存下去。

编程课应该教什么?

严格来说,编程只是计算机科学的一个分支罢了。我在学校带的编程课,其实全称应该叫计算机科学课。主要包括下面这三个方面的内容:

image-68.png

计算思维:解决问题、理解问题、创造(游戏、动画、工具……)
信息技术:原理探究、信息检索、具体使用
数字素养:数据思维(保存、分析、统计)、效率思维、安全意识(BUG、病毒、加密……)

image-69.png

现在大多数小学乃至初中阶段的信息技术课,其实是在培训学生使用几个典型的办公软件的使用,也就是office三件套、Flash、PS。说白了,就是把使用说明书往学生的脑子里装。然而,会按照教程使用软件,但并不理解其背后的原理,知其然不知其所以然,但这到底能有多大价值呢?每一个功能网上都有详细的资料和教程,搜索一下不就能学会了吗?真的值得开一门课吗?

而编程课则是要让学生明白:程序是怎么工作的?怎么编写程序来解决问题?程序出了问题怎么解决?

在没有经验且找不到可用资料的情况下,学生应该能独立作出理性的判断,找到解决问题的方法。而不是凡事都要问百度,离开了网络什么都不会干。不是我们教给学生可以用什么工具通过什么步骤来解决问题,而是他在面对具体问题时会想到「有可能对应的工具」并有意识地去寻找。可以在一堆工具中进行选择,并能理解它们背后的基本原理,知道它们能做什么,不能做什么。当工具出问题时,有能力找到问题的原因并加以解决。在找到的工具不能满足需求的时候,有能力基于开源软件或通过插件和配置进行二次开发,并在必要的时候创造一个新的工具来完成任务……

image-70.png

现在为了竞赛升学,很多家长送孩子去学c++之类的编程语言。然而我觉得在小学阶段就开始学c++和python之类的正规编程语言意义是不大的。因为他们的形式思维逻辑发育还不健全,对文字代码难以产生真正的理解,很容易走到死记硬背的歪路上去。

毕竟,大多数孩子未来不会靠编程吃饭,给他们上编程课的目的更偏重于培养编程思维,把编程中的概念和解决问题的方法论尽可能地应用到学习和生活中去。

我们采用了code.org这一相对系统的课程体系,通过模块化编程来给小学生进行基本的编程启蒙。在基础打好之后,再进入天花板更高的scratch体系进行创造。到了初中阶段,再开始接触python这样基于文本的专业编程语言,做一些实用性的项目。当然了,个别有天赋且有兴趣的孩子,可以在社团和兴趣班里提前进入文本编程语言的学习。

语言是死的,而思维是活的。 在打好编程思维的基础,掌握了用搜索引擎查找资料、阅读官方文档、在社区求助的能力之后,就完全可以去自学任何一门编程语言。

image-71.png

目前有不少编程课程,都把教学的重点放在了“记住解决这个问题的步骤”上,那么很可能最终学生记住了一堆题目的解法,但是遇到一个变种就不知道该怎么办了,因为他不知道这个解法是怎么得出来的,每个步骤为什么要这么做,而不能那么做。

我认为更重要的是教给孩子们一套解决问题的方法论,也就是“解法”的解法,比如逐步DEBUG找出程序的问题、通过“自底而上”和“自顶向下”两种思路把大问题分解成小问题来解决……这些方法都可以用来解决任何领域的问题。

未来需要的是拥抱变化、面向未来,能创造性地独立解决新的问题的人;只会按已有经验去解决旧问题的人,是没有竞争力的。我认为理想的编程教育,应该能培养出这样的人:

能系统性整理自己的逻辑,并有条理、无歧义地高效表达自己的想法;

能把一个复杂问题分解成简单的子问题,并分别解决;

能有效运用「试错、反思、迭代」循环,把失败与错误转化为成长的机会;

能认识到很多事不需要亲自去做,而是可以描述清楚之后交给别人去做;

能识别出哪些工作更适合由机器代替人来完成,并找出有效的解决方案;

能在不同的解决方案之间进行权衡,并找出最适合自己的那一种;

能理解日常所用软件和工具的基本原理,有能力判断它们能干什么、不能干什么;

我是怎么上编程课的?

这个话题恐怕要再给我一个小时,才能讲得清楚。然而我看了一下现场的倒计时,现在只剩下三十秒钟了。幸好我早就预料到了这一点,所以我准备了一段VCR来呈现课堂实况和学生们的作品,敬请欣赏:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK