1. 缘起
少儿编程这个概念在国内兴起,总有个三四年了。
2016 年,曾经有人问:“儿童学习编程是不是为了将来做'程序猿'?”。
我当时给的回答是:
编程说白了就是用一种简单的符号语言描述一种解决方案来解决实际问题。编出程序的效果取决于两个方面:1、对于实际业务问题的了解;2、对算法和数据的掌控。
这两者的基础是:语文、数学、英语。具体的编程语言和工具可以忽略不计。而现在的少儿编程就是灌输编程语言句法和工具使用,本末倒置。
因此,作为积年的老程序员,我反对在孩子没有自身意愿和兴趣的情况下要求他们学编程。
那个时候,并没有想到自己要去教少儿编程。
又过了一年多,少儿编程这个概念越炒越热,成了 STEM 教育的主要代表。身边越来越多的人提到这件事情,有人在讨论给孩子报哪个培训,有人则在考虑自己教课。
有一次正好和一个前同事(下面简称 G 先生)聊起这件事情。G 先生在家里开了个少儿编程培训班,教他自己的孩子和孩子的同学,总共两三个小学生。
问他讲什么内容,G 先生说有编程语言有算法还有二进制等基础原理知识,大体架构和大学初期阶段的计算机专业课程设置差不多。
听他这么一说,忽然激发了我办个类似“培训班”的愿望——当时真的就像是被点燃了一样,这个念头一下子就涌现出来了。
2. 学编程到底是学什么?
当然,一时热情是成不了事的,在念头产生之后,我开始正式考虑编程这件事情,分析利弊。
2.1 提给自己的问题
既然事关教育,那么最主要的利弊当然就是分析:小朋友学编程到底有什么用?// 问题-1
其实问题-1 之前还有一个问题:学编程到底是学什么?//问题-2
而要回答问题-2,还需要先回答另一个问题:怎么样就算学会了编程?//问题-3
2.2 怎样算是学会了编程?
对于 问题-3,我认为可以分为三个维度:学编程就是要学会 i)编程语言;ii)算法;iii)工具。
i)编程语言
编程语言是程序表述的形式,是编程这件事的表达手段。
怎么算学会了编程语言呢?很简单,学会了编程语言甲的标志就是,从今往后,再有编程语言乙、丙、丁、戊、己、庚、辛……,只要有足够的文档和样例代码,就能自学掌握。如此,则说明在学习编程语言甲时,已经掌握了“编程语言”这个东西的内涵、外延和重点。
ii)算法
广义的算法是一个很宽泛的概念,只要是有始有终有结果的过程,都可以被叫做算法。
狭义到仅限于计算机领域的算法也有很多,解决任何一个计算机执行的任务的过程,都可以被称作是一个算法。
不管在这万千算法中,有一些经典范例,它们解决了计算机领域一些非常基础的问题,同时又历经世代,经历了严格的检验、优化和度量。这些范例可谓是至今为止对应问题的最优解,我们称它们为经典算法。
学会算法自然是要从原理到细节全方位掌握经典算法。
iii)工具
此处的工具是指那些在编程时要用到的工具(例如 debug 工具,各类资源监控工具等)、支持库、程序包以及和业务相关的知识(比如要写网卡 driver 总要懂 TCP/IP 协议啊)的总和。
这部分,对于职业程序员而言是必不可少的,对孩子们而言,到未必。
如此将 问题-3 展开来分析一遍,不难发现:算法是编程的核心。
2.2 少儿学习编程的意义
既然 问题-3 有了结论,那么 问题-2 就好回答了:既然学编程的核心是学算法,那么 在非职业阶段,我们可以暂且把学编程等同于学算法。
再回到 问题-1 :小朋友学算法有什么用呢?
答案是:培养逻辑思维能力。
计算机领域的基础经典算法有点类似数学中的九九乘法表。后者把最常用的算术乘法计算过程浓缩总结成了规则,前者则是把另一些高度抽象后的常见问题的解决方案精炼成了执行过程。
学习这些算法,就是学习数学家、计算机科学家们几十数百年来的智慧积累。而且,算法的学习过程,也是一种思维训练和头脑体操。
以上是从一个程序员的角度出发,来看少年儿童学习编程的意义。
3. 是否应为孩子选择少儿编程培训?
下面再从一个家长的角度,说说让孩子学编程这件事。
3.1 “课外班”有必要吗?
作为家长,应不应该让孩子学编程呢?// 问题-4
这个问题也要依赖于另一个问题的答案:应不应该让孩子上课外班(进行常规课程之外的培训)?//问题-5
对 问题-5,我作为一名家长,给出的答案是:应该。
这里需要说明一下:我对于国家过去的和现在的公立教育体系没有不满。
八九十年代的中小学教育以“应试教育”之名而被各种诟病,但我觉得,在当时的历史社会环境之下(发展中国家全方位落后,各种教育资源极度稀缺),对于既要兼顾整个国家的大多数普通人,又属于义务范畴(免费)的公立教育,整体上无法更好了!
这么说可能因为我本人是那个时代公立教育的受益者。但反过来,如果我这样一个典型的普通工薪阶层出身的普通人都能够成为受益者,那么说明大多数人都能够从中受益!
也可能我这么认为是因为我现在从事的行业所需要的大多数技能都属于“书本知识”,都是可以在课堂上学到的。但这个行业——软件/互联网——是现在一个覆盖面很大且尚在发展期的行业,整体的入门门槛也并不很高,普通人只要具备了基本的教育基础,有心加入,大概率都是可以入行的。现存公立教育体系既然可以对这样的行业进行直接的支撑,那么可见其做少儿编程班的经验分享价值所在!
当然,如今的中小学公立教育也和二三十年前不同了,如今开始讲快乐教育,在小学不排名,进初中不考试。如今坊间舆论又有将 “快乐教育”职责为“阶级固化”工具的迹象。
对此,我的看法是:事易时移,社会环境变了,教育制度肯定是要变的,否则桎梏就必然大于支持。关键是怎么变。现在这种变法对于整体而言是好是坏,对社会会产生怎样的影响,不是当时可以显现的,也不是当代人能够评价的。要想平心而论,可能需要几十上百年的时间。
固然,打开朋友圈、微博随处可见的是对当前教育改革的各种问题的讨伐。但是,任何领域的任何变革好像并没有哪一个被民间叫过好的。有些被骂的变革很快消失了,也有些也一直持续下来了,还有些后来又经历了别的变化,社会终究是在发展的。
3.2 与环境良性互动
不管何种情况,作为普罗大众中的一员,靠谩骂和发牢骚是无法迎来任何好转的。要么适应要么改变。
无论如何先闭上嘴,然后动动脑,想想在当前的情况下自己能做些什么来改变自己和周围人的状况,与环境、大势进行良性互动。
之前的“应试教育”阶段,小学生们不是每天回家做作业就要做到睡觉,很多家长们叫苦不迭,认为孩子完全没时间玩,而且不同的孩子偏偏要写同样的作业,做了太多无用功吗?
当前的快乐教育减轻了学习压力,让学生拥有了更多的时间,不是正好给了家长机会可以针对自己的孩子进行个性化定制的辅助教育的机会吗?
当前的教育格局赋予了孩子课外自由支配的时间可以用于学习,作为家长不应该将其浪费。因此,针对自己孩子的情况,选择与之相应的课外培训,则是应该的——我就是这么想的。
3.3 有用 vs 无用
现在又有一种趋势—— 一干家长上赶着把钱交给各色辅导班,然后再叫苦不迭,说什么“月薪三万养不起一个孩子”。
谁也没规定那些辅导班全都非要去上吧?你自己没有选择吗?
如果你说别人都上了你家孩子不上就输在起跑线上了,那么请问你 能确定那些辅导班真的有效吗? 确实不是在浪费时间、金钱和精力吗?
说起来,我本人也送孩子上过完全没用的辅导班:
上学前上了两年多某知名培训机构的线下英语,花了好几万,但是孩子什!么!都!没!学!到!
不过说实话,作为家长,也不是最后才知道没效果的。早在进行过程中其实自己就知道了。那为什么还送孩子去呢?因为能够 买到点属于自己的时间。
其实很多家长送孩子去辅导班的目的不过就是在保证孩子人身安全的前提下,让 TA 有个地方呆着,然后自己能放松几个小时。
至于“培训效果”,只要孩子不受伤害,能学到点东西更好,学不到也没什么。
为了这样的目的,有的是人愿意花一两百一个小时的“学费”。如今异常蓬勃的学前教育市场,有相当部分比例是分给了这样预期的家长。
不过家长的这种预期,基本停留在孩子学龄前。
孩子上学后就不同了,那时候他们的业余时间变得很有限,就算现在不排名,未来的学业也等在那里。小学生的时间已经不容再浪费!学龄儿童再学什么,都不得不考虑是否真有效果。
3.4 确定课外班的有效性
怎么才能确定课外班是否有用呢?
这里就要分两种请况了:
- 家长对于这门课程教授的内容非常熟悉,足够精通。自己就可以凭借专业知识和经验对培训机构或个人培训教师的教育理念、课程设计、教材内容、师资水平进行第一方专业评估,直接得出是否有用的结论。
- 家长对于课程完全是门外汉。
这时候要确定有效性,就比较难了。比如:
我家小朋友学钢琴。我家除了她都是音盲,只好请了在线陪练陪她练琴。
对于那些指出她错误的陪练助教,她总说人家专业有问题,不是音准不对就是节奏不对,要么都不对。
按照她的说法我打了几次差评之后开始有点心虚,隐隐怀疑她可能在忽悠我。因为她说好的都是那些让她随便弹不挑错的助教。
问题是:我自己完全判断不了助教们的业务水平!万一我家小朋友说得对呢?如果真的是那些助教的水平有问题呢?总不能老往错了教她吧。
所以我只好继续按照她的意愿给她约老师,约的都是甜甜的小姐姐,从来不说她不好。
外行领导内行,真是痛苦啊!
好在钢琴还有主课老师能每周回课一次。另外还有个权威机构的考级等在那里,主课老师也是有 KPI 的,不可能随意放任她——依靠第三方评价体系,虽然不能很高效,好在总不至于无效。
3.5 确定编程培训的有效性
而编程这件事:
- 一则我已经想好了它是有用的;
- 二则,我自己是这方面的行家,我可以完全掌控教学过程并评估效用。
既然如此,问题-4 (作为家长,应不应该让孩子学编程呢?)的答案也是:作为一个拥有专业编程知识的家长,应该让孩子学编程。
顺便提一句,现在小学的数学课的规定内容确实有点太容易了,需要额外加加码锻炼一下小学生们的小脑袋。
4. 少儿编程教育市场调研
在决定了要让孩子学编程之后,也不是 100%肯定就要自己教,也有考虑过是否报班性价比更高。
为此,我调研了市场上的儿童编程和少儿编程课程。
4.1 课程体系
现在少儿编程的辅导班、培训班很多,线上线下都有。这些课程大致可以分为两大流派:i(软)硬件编程和 ii(纯)软件编程。
i)(软)硬件编程
这类课程一般都会提供一套专属的硬件。
很多时候这套硬件以“机器人”的形式出现,要么是一个很 cue 的类人形机器人,要么是通过简单拼装可以搭建成车辆等形态的零件,课程一般叫做“机器人编程课”或“机器人课”。
还有的课程提供一套电路板和单片机、led 灯等零件的套件(采用 arduino 系统的为多),这种一般直接就叫“硬件编程”。
还有的和智能家居、智能家电等结合,扯 IoT 或 AI 的大旗。
不管硬件是哪种,既然要编程就不可能没有软件。这前两种(机器人和硬件)的配套软件多以 arduino 开发套件为主,也有部分是对 arduino 做了封装。
硬件编程比较常用语言是 C,也有外接了图形化界面的 Scratch 等积木块式编程系统。
PS:乐高机器人也可以算作是硬件编程,不过它自成体系,有历史有 IP 有成套的教学系统和比赛系统,但是相对封闭。
硬件编程虽然也有机器人比赛和等级考试,但毕竟其社会认知度和对于升学的支持程度还很低。总体而言,硬件编程还是偏“玩”,适用范围也更低幼化。
相对于硬件编程,软件编程市场占比更大一些。这当然和设备、场地要求更低,课程可复制性更强有关。少儿编程的“大头”,在软件。
ii)(纯)软件编程
从“有用”角度来讲,软件领域的 OI,NOI,NOIP 已经有了相当的社会知名度,而且 NOI 如果真的打得好,很多高校(以北清为代表)都有对应的招生渠道,因此在软件编程教育中,有专门的针对 NOIP 的培训班。
NOTE:就在作者写作本文的这几天里,NOIP 竞赛体系忽然被中止了,取而代之的是一套考级体系。
具体的前因后果,变更细则,长期影响还未来得及研究。不过可以肯定的是,这是少儿编程教育扩大化的征兆。因为竞赛毕竟是少数精英的游戏,考级却有可能走向全民。
不过又因为现在有些省市并不支持小学生参与 NOIP,中学生参赛报名又基本上以学校为单位。因此这类培训要么是某些中学内部的训练营,要么是半官方性质的“少年宫”培训,要么就是一些有过参赛经历者自己开设的小班,规模都不大。
再加上现在的变化,一时间竞赛考级的培训受到了较为严重的短期影响。
目前来看,能做大的,至少到目前为止,还是属于“兴趣为主”型的培训。
4.2 在线软件编程培训的套路
与硬件编程“线下课、卖硬件,快速回本”的模式不同,软件编程更容易套用互联网模式——“在线课,录播+助教,病毒式分销”。现在做大的几家少儿编程在线教育平台,都是软件编程。
各机构的软件编程套路大致相同:把课程分成若干 level,不同 level 对应不同类型的课程。一般入门和中低阶以积木式拖拽工具"编程"为主(主流是 Scratch,也有机构推出了自己的积木式编程工具,但基本大同小异);高中阶为 Python;有些还有更高阶的,安排 Java 或者 C/C++。
在线少儿编程现在大致有三家做得比较知名的:核桃编程、西瓜创客和糖果(傲梦)编程:
它们课程主体都在 Scratch 和 Python。引流思路也差不多,先用极便宜的 Scratch 入门小课引流,再在学员群推广正式课程(正式课程从两三千到一两万不等)。
核桃和糖果都有 9.9 元的入门课,我就顺手买了进去看了看。
两家大致内容也差不多:每节课教几个 Scratch 操作,然后作业就是运用这几个操作制作一个“程序”或者“动画”。彩色动图声光电,人物能走能跑,确实对小朋友有吸引力。
西瓜创客最便宜的课程也要 159,我就没买。看看了他家官网的课程设置,估计和前两家类似。
这些培训机构已经开设的课程基本上是官网宣传的一个子集,很多课程还在开发中,并未正式上线。
4.3 软件编程两条路
软件编程机构正是万马奔腾,特具特色。不过,整体而言教学方向上两条路:
- 竞赛班专注竞赛训练刷题。
- 没有考级或者比赛针对性的培训基本的立足点在于“作品”,力求每节课都有输出。
既然输出是买点,“卖相”就肯定不容忽视,因此对作品观感上的要求比较高。从现在能看到的课程设置体系而言,没能看出很明显的系统性理论体系。
授课方式也是两种:
- 线上
- 线下
和线上培训比较,线下相对内容更杂乱一些。比如:
我家附近的一家少儿编程培训机构,在 Scratch 和 Python 中间加入了一个 JavaScript。不知道是怎么想的。也许是和线下编程都是真人授课,课程和教师的绑定更紧密有关?
以上是课程设置和内容部分,还有一个问题是师资。
4.3 教育机构的师资
本人在工作单位承担的工作是人工智能的行业应用,也就是针对具体行业开发人工智能产品。碰巧去年一直在做教育领域的人工智能应用,由此对教育市场,尤其是公立教育体系之外的培训类学课教育和各种素质教育都略有调研。
曾接洽过一些教育行业的企业;也曾参加过素质教育大会之类的教育行业会议。不光是少儿编程,对当前这类校外补充式少儿培训还是有一个整体上的了解的。
有一次参加行业会议的时候,本人还以“培训学校校长“的身份去聊了几个少儿编程或者少儿 STEM 教育的实体店加盟项目。
几个项目的要求和指导都很一致:首先十几万加盟费不能少,然后就指导如何选址开店和招生。至于教师资质和培训则是优先级相对较低的部分。
几个科技类教育品牌负责人都讲,线下店的培训教师其实很好找,一般大专毕业生就行了。反正就是按照他们开发的课件讲,辅以配套道具,总不会太差。
至于教师培训,一般都在一周左右时间,最长的也就是半个月——这是线下店的教师。
线上教师因为传播面更广,整体而言,比线下教师的资历高一些。
不过无论线上线下,全部从业者都是以年轻人为主。核桃、西瓜、傲梦这三家的创始人都是 90 后或准 90 后。线下加盟店里的"标兵店",也基本是 90 后团队在运营的。
5. 决定自己在家教
考察一圈之后最终的结论是:不送孩子去上外面的班,我在家里自己教。
原因很简单:我相信自己可以教的比那些培训班更好。
这当然不是说我个人的编程水平超级无敌——本人普通码农一枚,在职业领域并不敢自诩优秀。
但是在教授编程这件事情上,我是要教自己的孩子,我有的是百分百的诚意:
- 我知道什么是核心关键,不会被那些表面的花里胡哨所迷惑;
- 我求的是长期的效果,真正的作用,愿意投入精力和时间在短期看不到效果的地方
——这就是那些对外招生的商业编程培训班不能比的。
无论那些培训班的创始人最初的出发点多么理想主义,一旦商业运营就需要维持运营费用,就必然要考虑到招生、收费、盈利。
就算拿着投资的钱,也得有用户量、增长率等各种指标去交代给投资人。
这样就不能不扩大生源;就不得不面对许多自己不了解编程又特别担心没有效果的家长;就不得不提供立刻的效果……最后,要么走向打竞赛,要么追求一节课就能做出个漂亮炫酷的作品秀给家长看。
这些都是商业运营的必然和无奈,如同工业化生产的食品必须加防腐剂一样。
而自己在家教,就是在家庭厨房中烹饪,虽然没有什么山珍海味,总归是真材实料,卫生安全。
6. 教学计划
6.1 课程内容设置
决定了自己在家教之后,就是课程设置问题了。
教自己的孩子是为了追求长期效果,而且也没有具体的考级或竞赛压力,那么自然可以完全按照自己认为对的思路设计课程。
最骨干的内容,确定得特别容易——
因为之前已经想清楚了编程的核心是算法,那么当然课程设置就以算法为主。
大学里学过的计算机专业课和算法关系最紧密的就是数据结构了。
恰好,大学里给我印象最深刻的一门计算机类课程就是数据结构!
课程提纲,每部分的主要概念,做过的练习,考试的难点,包括老师上课时的某些细节,至今仍然历历在目。
课本保留至今,已经快碎了:
给孩子上的算法课,大体结构上就参照数据结构课了。
当然,给小学生讲总要比大学生简单一些。最简单顺序查找、二分查找,几种简单排序和快排,有这几种算法,就够讲一阵子了。
为了讲明白算法,控制流程和数据结构是不能回避的。
好在基础的控制流程就三种。
这几种算法都是用线性数据结构(数组或链表)就可以搞定的。数据结构部分也可以尽量简化,以数组为主,链表、树和图仅作介绍。
6.2 编程语言的选择
6.2.1 要不要学编程语言
最初也设想了一下,能不能只讲算法不讲编程?这样就不用学编程语言了,也不用真的写代码。
但是稍多考虑一下就把这种想法否决了。
毕竟,既然要学算法,就务必基础扎实,不求多,但求深。
要想真正了解一个算法,不是大概讲个原理就可以的,一定要掌握每一个细节,使学生能够自己实现。
虽然理论上,所有的细节都可以用自然语言描述。但是自然语言的歧义性导致要说清楚一句代码干的事情要唠叨半天,尤其是用自然语言要说清楚控制流程、数据结构等就更费劲了。
据此考虑,自然还是要讲编程语言,并要求孩子动手编程的。
6.2.2 学习哪种编程语言
讲哪种编程语言好呢?
虽然 Scratch 是几乎所有培训机构的必选,但个人感觉:Scratch 用来引起兴趣尚可,UI 界面太热闹反而有些喧宾夺主,让孩子更不容易理解程序是什么东西。
更何况,用 Scratch 实现算法实在是自找不痛快。
因此 Scratch 从一开始就不在考虑范畴。
在选取语言的时候,本人首先回顾了一下自己学习编程语言的经历——
上大学的时候,第一门和编程相关的课程就是 PASCAL 语言。那时候 C 已经很流行了,PASACAL 则根本没人听说过。
班里同学提出反对意见:为什么不讲 C?
老师解释说:因为 PASCAL 是教学语言,语法非常规范统一,所以作为入门语言很合适。
同学们又问:那以后还讲不讲 C?
老师说:以后不讲 C 了,学会了 PASCAL 你们应该就能自学 C 了。
同学们再问:那为什么现在非要讲 PASCAL 不直接讲 C 呢?
老师说:系里就是这么安排的,有本事你们必修课学分别要!
同学们就不问了……
就这样,PSACAL 成了迄今为止我唯一在课堂上学习的编程语言(后来报了一门 Java 选修,因为第一节就没抢到位子所以直接放弃了)。
但是这门课到底讲了什么?PASACAL 这门语言本身是怎么回事?当时用它写了哪些程序?……如此种种,我已经全忘了,忘得干干净净。
不过之后在工作中用到的所有语言(Java,Python,C/C++,C#),也确实都是自学的。这份自学能力,应该还是跟当初上过 PASCAL 课有关系吧。
从我本人的经历来看,一开始学习具体哪种语言,其实并不是那么关键。
语言的意义在于表达,编程语言是用来写算法的,我们学习的重点也是算法而非语言本身。
既然如此,不如学一种:
- 好上手(开发成本低),
- 应用广(用户多、支持库多)
的主流语言。
于是,就选择了 Python。
究其原因:
- 一则它符合前述好上手、应用广原则;
- 二则参考了各种培训机构的语言选择;
- 三则还考虑到目前各大厂都有人工智能 API 对外开放。用 Python 发送 Http Request 和解析 json 或 xml 都非常方便。学了 Python 就可以用几行代码调用 AI 接口,以后可以带孩子一起做点有意思的小项目。
6.3 教学大纲
主体内容和选用语言已定,课程大纲也就有了:
- 控制流程
- 数据结构
- 什么是算法以及如何度量算法
- 几种具体算法:
4.1. 顺序查找;
4.2. 二分查找;
4.3. 选择排序;
4.4. 起泡排序;
4.5. 插入排序;
4.6. 快速排序
除了理论讲述,对每种算法都要编程实现,所用语言是 Python。
上面最初版本的教学大纲。
在之后一年的教学实践中,讲述的内容也是以上述部分为主干的。不过在讲述的过程中,发现:
- 既然讲了算法,就不能不讲策略,至少递归是少不了的,相应的分治和动态规划也要对比讲解;
- 要想讲清楚数据结构和计算,就不得不讲计算机原理:二进制、冯诺依曼结构、逻辑电路(与或非门)、内存分配和内存寻址等,于是加入了这部分内容;
- 在到了实践的时候,又发现 Bug/Debug/Fix Bug 不能不讲,于是又涉及到了软件测试和软件工程;
- 而 Python 语言虽然易上手,对于小白而言还要能从变量、赋值、函数等基本内容讲起,于是又加入了这部分内容……
各种内容越来越多,最后,差不多把大学前两年的计算机专业课都涉及到了。
这些内容整理出来,就写成了一门课在网上发布:《编程算法同步学》 :
教学过程中也有不少教训和对既往认知的更新,这些稍后细说。
日程确定比较简单,因为当时刚开学,所以决定就是每周一次课,每次 2 小时,跟着学期走。
因为现在小学生的假期都安排了许多活动,所以假期学校放假我们也跟着放假,所有上课时间都在学期过程中。
7. 教学场地和学生
7.1 招生
课程大纲和日程确定下来了,具体的授课内容准备一边教一边整理。这样,当务之急是要开始上课了。
要上课就得场地和有学生。在这两方面,我套用了 G 先生的套路:在家里授课,学生就在孩子的同学中找。
虽然对于自己的编程能力和计算机基础知识还是蛮自信的,之前也给同行做过一些技术分享,但是毕竟没有教育儿童的经验;课程也不对接竞赛;又不打算用 Scratch,没有漂亮的作品(Python 写基础算法,能看到的输入输出都很简陋)。
在这种情况下,不仅对于肯来上课的小朋友肯定是完全免费的,而且还要和对方家长沟通好,让人家理解课程的意义和目前正在尝试中的现况。
毕竟如今小学生的时间实在是太宝贵了——同班两个同学,要一起玩一会儿都得提前预约——在这样紧张的日程里,肯来上我这样的实验性课程,非得是熟悉信任的家长不可。
很幸运,我家小朋友的同班好友小 A 同学和我家住得很近,又正好能和我家小 E 凑上上课的时间,小 A 同学自己也愿意学学试试,她妈妈也支持,因此在招生环节没费什么力气。
7.2 教室
既然在家上课,那教室也没什么可选的,只能在我家客厅了。
为了在家里上课,我还买了一个投影仪(直接投影到白墙上)和一个白板及配套的马克笔。
后来家里换了一个屏幕较大的电视,投影被完全取代了,但是白板确实非常有用。
8. 第一学期:理论教学
8.1 计划和变化
《编程算法同步学》的内容最初计划一学期讲完,但最后总共讲了一年。
上下两个学期的学习内容偏重方面不太一样,绝大部分知识部分在第一学期就已经讲完了,第二学期主要用在编程实践(练习 coding)上。
这样的安排并非刻意,而开始的时候对于学习速度的估计有些过于乐观,觉得一个学期把理论讲完的同时还可以同步实践。那么到了第二学习就可以学一些更复杂的算法,比如树和图的遍历等。
但是真的讲起来才发现,时间不够,每周只有两个小时,就算拖拖堂也就两个半小时,只是理论讲解都够呛,根本不够再加上实践的。
其实,一年之后回头想想,如果当时能够了解这样的进展速度,把讲授内容拆成两半,真正做到讲一节、练一节是不是更好呢?
也许吧。不过第一学期时脑子里想的就是要把六个算法都讲完,等于给自己设了 KPI。结果一个学期之内把准备讲的都紧赶慢赶讲完了。
为了讲解赶上进度,就牺牲了事件部分,第一学期实践时间总共也就两三课时,只好第二学期再回头补。
8.2 第一学期课程安排
第一学期总共上了十四次课,最后两次用来总复习和考试,前面十二次我总共做了 6 个 ppt 课件,把控制流程、数据结构、Python 编程基础、六个基础算法、算法策略、算法的时空复杂度计算等知识塞进了这 6 个课件。
这些课件并不是一次制作完成的,而是讲着前面的,再做后面的。虽然不甚精致,总归是每个课件都在讲到相应内容之前做出来了。
这些 PPT 在课堂上起到的作用并不大。刚开始还好,色彩丰富卡通风格的 ppt 还能吸引学生们,但是上了一两次课之后,这些就不再是吸引了,倒不如直接在白板上写更有意思。
不过虽然如此,把要讲的内容写成 ppt 还是很有必要的:
- 一则籍此在框架基础上设计具体的课程内容;
- 二则讲的时候对自己是个提示,也更利于时间控制;
- 三则可以在上课之前发给小 A 同学的家长,也让人家了解一下所讲授的内容。
8.3 第一学期授课情况
整个课程的讲解从控制流程和数据结构开始,在讲授控制流程的同时教授流程图——本人认为这样安排是本次实践的成功之处。
其实,无论会不会编程,如果能把事务的流程搞清楚——在一件事拿来之后能够对其进行拆解和组织,让一件原本千头万绪,令人不知何处着手的事情分解成每一块都有明确界限并易于解决的“小块“,再按照一定的过程、顺序将它们连缀起来,构造出一条可以各个击破的”流水线“——只要有了这种本事,作为一个人,便不用担心没有用武之地。
让学生们了解“流程”这个概念,总要直观体验一次流程,简单说就是要从头到尾做过一件事情,然后再抽象出这件事情的流程,并用流程图展现出来。
回顾我自己学计算机的历程,感觉在开始那几年总是特别困惑于一些看似高深实则停留在理论层面的术语,对于它们指的是什么根本就没有直观感受。
有些非常基本的概念,在刚认识的时候,如果能有直观的感受,会容易接受得多。
因此我非常确定,要在认识流程之前先做一件事,这件事需要满足如下条件:
- 简单可行,在家里完全可以完成且安全。
- 能够分出若干步骤,不太复杂但又有可以讲述条件和循环结构的空间。
- 有趣,能引起学生们的兴趣。
基于这几个条件,选中了烤蛋糕作为流程初体验的实践活动。
这个实践活动蛮成功的。两个学生都很喜欢烤蛋糕。在 happy beginning 之后,她们也愿意配合把实践过的流程用图形画出来,特别还是边吃蛋糕边画的。
8.4 保留节目:烤蛋糕
后来课程进行中,她们经常提要求:“这节课要烤蛋糕”。
于是烤蛋糕成了我们课程的一个保留节目,有时允许她们上课前烤上,课间吃;有时候会让她们课后再烤。
在第一个学期里,我们尝试烘培了:戚风蛋糕、海绵蛋糕、黄油蛋糕、红薯蛋糕、蛋糕卷、巧克力布朗尼,以及红糖饼干等。
第一学期快结束的时候,小 A 同学一边吃着蛋糕一边问我:“阿姨,你去蛋糕店一定能找到工作吧?”
我:(……&……%¥%……#%¥#%%……%&……
平静一下之后还是要跟她们解释:我烤蛋糕的水平很差,没有蛋糕店会录取我的。不过我编程的水平还可以,我靠着编程都工作了十多年了。
不过反过来想想,小 A 同学这么说是对烤蛋糕活动的肯定。
8.5 教具的使用
在讲数据结构的时候,我制做了简易教具:糊了一排粗糙的纸盒粘在一起,用来解释数组;把几个笔筒用绳子连起来表示链表。
看似简单,但是后来我请她们回顾对于课堂印象的时候,她们除了烤蛋糕,印象最深的就是数组和链表的道具。
讲排序步骤的时候,告诉了她们算法原理和步骤之后,让她们以扑克牌为道具直接“人肉排序”:
可是说来有意思,用扑克牌的效果并不好,可能是因为她们之前已经学会了几个扑克牌游戏,一拿起来扑克牌就想玩。
后来改成了学而思给的数字教具(下图中绿色小磁铁块,上有白色数字),效果好了很多:
8.6 教学过程中的惊喜
第一学期整体而言很顺利,因为都是知识讲解,两个四年级的小学生经历了三年的正规学校教育,已经熟悉了书本知识的学习方法,记忆力又好,把列出来的内容记住还是没问题的。
有些特别初级的纸面推演的实践,进行也很顺利。比如:
讲二叉树遍历的时候,我就给她们先讲了一遍先序、中序、后序的定义。
然后画了一个二叉树,手动推了一遍中序遍历的过程。
之后又画了一棵简单点儿的二叉树,问她们中序遍历的过程应该是怎么样的。当时就那么一问,以为她们会说没学会让我再讲一边。
然而,小 A 同学直接给出了中序遍历正确结果——此前我总共就讲了一遍啊!
二叉树是我本人在大学的时候学的,潜意识上认为这属于大学的知识。但是拿到实践中来才发现,原来小学生掌握起来也并不困难。
那么,是不是有可能很多计算机专业知识其实难度都不大,完全是小学生可以理解的,而之所以大学才教是因为小学没有计算机老师,要等到大学才有呢?
我们这代人小时候很少有人学习过计算机知识,但那是因为我们比现在的孩子笨吗?恐怕是因为那个时代的教师资源太稀缺了吧。
如果我 10 岁的时候有人教我二叉树,想来也是可以学会的。
8.7 学习算法
后面教她们的几个算法,在课上看起来都是学会了的。至少在课上复述原理,以及用一些数据按照所学的算法进行查找或者排序操作也都是能够完成的,过程也基本正确。
到了第一学期后半程,我会让她们在每节课的课前把上节课学的算法流程图重画一遍作为课前测试。
因为每节课之间至少相隔一个星期,而这一周中她们在本课上的投入为 0,所以每次都要和遗忘作斗争。最后能够确定连续几次都基本做对的就只有一个二分查找算法了。
经过反复测试,二分查找算法两都人都确实记住了。第一学期期末进行了考试,成绩尚可。
为了表彰两位学生顺利完成第一学期任务,我们还特意去一家刺猬做店长的店里吃了网红兔子蛋糕。
8.8 能背诵 =/= 懂
第一学期虽然确实灌输了不少知识,不过同时也暴露了严重的问题:对于学到的知识,她们基本上停留在记忆阶段,无法应用。
最直接的体现就是:学了一个学期了,还无法自己编写哪怕是非常简单的程序。
通过实践认识到:如何通过考核确定学生学会了,是一件高难度的事情。
小孩子们“强行硬记”的能力非大人可比,很多东西,只要给他们灌输,都能灌进去,让他们复述也都能说出来。
这个时候就很容造成他们都已经学会了的感觉。而事实上,他们很可能只是在背诵自己根本不理解的东西。
当然了,前面已经说了,这种结果很大程度上是因为实践机会太少造成的。
9. 第二学期:加强实践!
9.1 打字问题
实践少一方面是因为讲理论的东西占用了较多事件,另一方面也是因为遇到了一个很客观的问题:她们 不会打字!
虽然 26 个英语字母她们都认识的,很多关键字也认识,不过这 26 个字母到底在键盘上的什么位置,每次都要现找。
打个“def“都要先找一遍 d,然后再找一遍 e,再 f,打一个关键字都要一分钟/半分钟的时间,实在是太费劲了。
一星期总共才 2 个小时上课时间,如果真写代码的话,写一个小程序就要半个小时,过于 time-consuming——这是第一学期就已经发现的问题。
也是因为这个问题的发现,是我认识到了 Scratch 等积木式编程工具存在的合理性。用 Scratch 的话,完全不需要会打字,甚至不需要认识字,只要识数就行了。
那种面向低龄儿童的体验性、单次编程活动,本着引起小朋友兴趣为目的,采用 Scratch 作为体验的编程工具,是很不错的选择。
不过,即使发现了这个问题,也并没有打算放弃 Python 转而使用 Scratch。
之前用 Python 的原因都已经想好了。现在虽然遇到了不会打字的问题,但是这个问题是可以克服,而且基本可以肯定必然会被克服的——我们这代人都没人不会打字了,何况是她们这代。
第一学期发现这个问题的时候,因为后面的教学计划都做好了,所以就先跳过了实践问题。
到了第二个学期,是下定决心一定要在实践上有所突破。于是,在正式开始编程练习之前,先加入了一节打字指法课:
为了引起她们的兴趣,特地找了一个可爱的小黄鸭键盘,顺便讲了讲打字机的历史。
打字的“理论“实在是太简单了,确实一学就会。但是打字这件事情,主要不是靠“学”,而是要靠“练”的。
可惜她们除了课上,完全没有时间练习,课上又不可能都用来练打字。因此,在后续的代码编写课上,也就任用她们继续有人一指禅有人二指禅地乱打一气了。
好在毕竟对键盘越来越熟悉,找字母的速度快多了。还学会了 copy & paste 代码,很多东西也就不用非敲键盘不可了。
9.2 理论为辅
第二学期的知识类讲授少了很多。总共十五次课,只有三四次用来讲计算机原理和体系结构的知识,其他时间都花在了实践编程上。
知识部分主要讲了二进制、基础逻辑电路和冯诺依曼结构等。
在讲逻辑电路的时候曾经试图借鉴《三体 I》中用人类组成逻辑门的方法,由我和两个学生一起组成基本逻辑门来体验数字电路的运行。
但是因为人实在太少,只够组成一个最简单的与/或/非门,连个两位的累加器都组不成,因此也只是传达了与或非的含义。
不过用到了自己亲身体会就是不同,第二学期让她们回顾本学期学到的东西时,她们还记得总共体验了不到半个小时的“人肉逻辑门“。
9.3 实践为主
编程实践课程进行得比预想还困难。
有些 Python 语言的基本语法,虽然在第一学期讲算法的过程中都穿插着讲了,但是因为当时没有落实到 coding 上,因此她们是全无印象。只好从头开始讲,从最简单的开始练。
编程这件事,应该是一学九练。没有足够的实践,根本什么都写不出来。
而我们的问题始终是: 练习时间太少。
这也没办法,就算给她们留作业也做不了,别说小 A 同学家里没人指导,就算是小 E,我平时也没功夫盯着她编程。
再说日常各种班已经很多了,也没有时间放在这样短期之内没有明确成果的课上。唯一的选择就是尽量利用上课时间。
通过这半年发现,coding 这件事,还真是不能急——
coding 的过程需要学生全程主动动手操作,和她们习以为常的以听为主的学习习惯不甚一致。代码这种东西,会写了自然觉得简单,但刚开始写的时候,却是要适应一套全新的表述符号——这一难度很容易被已经熟悉了编程的人忽视。
难者不会,会者不难。不能因为会了,就去否认从不会到会的过程中必要的练习时间的积累。
9.4 教学计划调整
有鉴于此,第二学期取消了原本计划讲的新算法,而是把大部分时间投入了 coding 实践。而且下调了预期,从要求会编写所有已经学过的算法,下调到能做到:
- 特别简单的代码学生能够自己实践;
- 相对有一定难度的算法,学生对照流程图可以独立实现编程。
在课程进行的过程中,对小朋友而言,总是写这些逻辑简单但表达“别扭”(毕竟是完全不熟悉的符号体系)的代码也比较枯燥。
在这个过程中她们主动要求被考试,至少是被考察。因此,在此期间间或地出逻辑推理等题目给她们。为了让她们看着有兴趣,题目还要包上《小马宝莉》的糖衣【累啊】:
9.5 代替烘培的课后活动
第二学期的课后项目少了一些,没再烤过一次蛋糕。不过因为她们一再要求喝奶茶,因此让她们自己动手制作了珍珠奶茶——珍珠都是自己做的:
另有结合节气或者传统佳节进行的手工制作活动,比如:入夏做香包,端午包粽子等。
9.6 第一阶段结业考试
经过反复讲基础语法和反复的练习,终于在第二学期结束时达到了前述两个编程目标。之前讲的全部知识,也囫囵吞枣地复习了一遍。
第二学期期末给她们出了一份理论+实践的卷子,结果差强人意。不过想想投入的时间如此少,能取得如此成绩也不错了。
至此,第一阶段的理论和实践基本上达到了目标。
9.7 下阶段规划
下一步准备一边实践之前的经典算法,一边继续讲授新的算法。
可以讲讲堆栈、队列以及树和图的算法了,另外也准备用编程方式解决一点实际问题。
10. 课堂纪律!纪律!!纪律!!!
下一个学年的教学计划,具体讲授内容和教学目标都还比较好定,实在不行就再临时调整嘛。
比较头疼的一件事是课堂纪律!没错,就是纪律纪律纪律!
10.1 课堂纪律的必要性和重要性
在许多抨击中国“应试教育”的网文中,对学生课堂纪律的要求也成了一大罪状,甚至被上纲上线成了泯灭中国人对自由追求的“实锤”。也不知道发转这些文的人自己上过学没有。
如果一个课堂上没有纪律,老师在上面讲,学生在下面嬉戏打闹,所有人的注意力都不在老师讲什么,而是在有什么好玩好笑的,有什么可是开心解闷儿的,那还学个毛啊?!
有些人也许会说:有学生不听也没关系,不影响别人不就行了。
如果一个几十人的课堂真的能够达到有些人不听讲的同时不去影响其他想听的人,那些不听讲的人的行为必须要被限制在不制造噪音、不骚扰他人、不吸引群体注意力的范围之内。而要达到此种效果,靠的恰恰就是课堂纪律!
10.2 课堂纪律日益松懈
本课刚开始的时候,小 A 和我还不太熟,因此比较矜持。小 E 是看着小 A 行事的,也被带得比较老实。
靠着那份“生”,以及课程本身的新鲜劲儿——第一学期几乎每次都学不同的知识,还有课前课后烤蛋糕活动比较多,能有个盼头,她们还能大致绷得住。
到了第二学期,相处得越来越熟,coding 的形式相对比较单一——虽然每次都有想不起来该怎么做的细节,但总体却感觉早就见识过了。而且第二学期因为她们晚上又安排了其他课,时间受限,课后手做项目变少了。
种种原因,课堂纪律在第二学期迅速恶化。
虽然课堂里只有两个学生,到了第二学期后半部分,每节课都要反复强调让她们不要随意玩笑,注意听讲。到了期末,已经是靠吼在上课了!
真是无法想象,大中小学的老师们,面对几十一百人的课堂,讲个一年两年五六年居然还能镇得住这帮学生。
老师们的严厉也是被逼出来的,稍微缓和一点儿那群孩子是真蹬鼻子上脸啊!
10.3 课堂纪律的维护
下个学年怎么维护课堂纪律绝对是个大问题。
目前能想到的方法有:
- 开始讲新知识(吸引注意力);
- 课堂上多提问,让她们不能闲着;
- 把上课的环境都收拾好,绝不能遗留任何玩具在现场;
- 课前课后许诺一些有意思的活动作为“吊在前面的胡萝卜”来引导她们认真听课。
具体效果如何还要看实际结果。
另外也考虑是不是让她们去参加个竞赛或者考级?一则有明确的输出,二则有一个准备目标,增加点学习压力。
不过目前正是少儿计算机教育的战国时期,各种比赛、考级种类繁多,基本上能找到点资源就能拉起一支队伍竖起一杆大旗,现有的这些赛事和等级考试哪个能笑到最后还不一定。
大局虽然明确了,但具体的项目选择还有待进一步研究。这部分等有了研究结果再另行发文吧。
11. 实践教学一年后,给其他家长的建议
11.1 要鼓励不要强制
现在我想给其他家长,特别是自己不懂编程的家长关于是否要让孩子进行少儿编程培训的建议如下:
如果有相关的体验活动,特别是亲子类,家长和孩子一起去参加一下挺好。如果碰巧孩子感兴趣,愿意学,就学。如果孩子体验后不想学,就不要强求!
原因两条:
- 虽然少儿编程日益火爆,但至少至今为止,编程或者更广义的计算机教育对于当前我国的中小学生并不是必选项。
它不是语文数学英语——学不好直接影响升学。
- 如今的少儿编程教育市场远未成熟,各色机构良莠不齐,又没有权威的第三方机构能够验证学习成果。
如果家长自己无法判断教学的有效性,则很大概率有可能导致时间、精力和金钱的浪费。
11.2 警惕:把编程培训变成了『背诵强化营』
11.2.1 死记硬背学习法?
任何知识、技能的学习都离不开记忆,这一点是肯定的。
虽然真正能够应用的记忆一定是基于理解的。但由于理解所需的必要条件和经历,有时在理解之前先将理论、知识或者方法背诵下来,等到日后有了经历在对照之前理论提炼解决方案,在一定的客观条件下,也许是一种学习方法。
中古传统教育很大程度上从根本上就主张给小孩强行灌输,无论理解与否先反复背诵,直到终生不忘,然后再在以后的生活中逐渐去理解之前背诵的东西——认为但凡小孩子学东西,就应该像佛子读经一样“先求根本智,无相无分别。次求后得智,能分别一切法。”
传统的经书(诗书礼乐春秋等),有许多“圣人”的经验总结和哲学层面“大道理”在里面,确实不是能给小孩子解释清楚的。而这些道理在当时社会相对恒定单一,先背下来再反刍,或许尤其合理性。
11.2.2 值得背诵的东西
传统的东西姑且不多讨论。
我认为:现在学校中学到的这些东西,除了符号系统本身不得不基于纯记忆之外,其他学习内容,还是要立足于理解的。
当然,在传授知识的过程中,由于客观上优质教育资源(主要是教师)的缺失,导致很多应该从原理层面讲清楚、推导明白的东西,在实际传授中变成了背诵和记忆——这实在是没有办法的事情。
应试教育真正应该被批判的点其实在于此处:它迫使一些资源稀缺的地区或者人群将顺应客观现实,了解世界真相的过程退化成了背题和机械训练。
如果实在是没得选没得挑,只能承受这要的基础教育,也没什么办法。
但是相信现在能够看到这篇文章的人,在“育儿”这件事情并非绝对没得选没得挑。即使不能随心所欲的选学校选老师,总归还是可以利用很多辅助手段来提升自己孩子教育资源的质量的——最起码可以自己学了然后再教给孩子呀。
在如此的前提之下,再把额外提供的“改善性资源”变成“背诵强化集中营”未免得不偿失。
11.3 判断学习过程的有效性
在为孩子选择课外班、辅导班、家教这些资源的时候,核心关注点应当是放在孩子真的掌握了什么技能或者提升了什么能力上。
可是,说到这一点,又回退到悖论了:要能明白一个人是否学会了某样技能,需要该技能的行家里手才能通过全面权衡给出一个相对靠谱的结论。
除非家长是全面手,什么都会,否则如果孩子学了一样自己原本不会的东西,不就判断不了了吗?
技能尚且如此,遑论能力。
对于这个问题,说起来也不是没有解:
【1】理想的方法:家长和孩子一起学。
这样至少家长能知道自己真的学会了没有,反过来无论通过直接考核还是间接旁观,对于孩子的状态应该能有所掌握。
但是家长也不是人人都全职当家长的,就算全职也得料理家务,总不可能把所有孩子学的都学了吧。
【2】在自己不懂的前提下,退而求其次,可以请自己信任的对应领域的内行帮忙鉴定孩子的学习情况。
但是也很少人能够把所有领域的专家都认识个遍。
【3】再退一步,还可以依靠社会公认的第三方考核体系来评判结果,常见的就是竞赛和考级。
相对而言,艺术类的考级已经经历了几十年的博弈,相对更靠谱一点。计算机在这个方面没有那么突出的考核体系。就连之前最多拥趸的 NOIP 现在也忽然改制了,一切都在大幅度变更中,还没有相对稳定的依据。
【4】退到最后,如自己对于编程完全不懂的家长,想让孩子学编程,也只能通过选择培训机构的品牌来进行质量控制了。
或者选择线上课程,每节课都能看到输出;或者是线下课程,通过和培训学校老师的直接接触通过常识判断其是否值得信赖。
11.4 兴趣需要时间发现
在读中小学的孩子不愿意学计算机,也不是什么罪过,也许仅仅是当时没有足够的环境激发兴趣而已。
作者第一次接触编程是在小学时期,那是上世纪 80 年代了。
有一天我和我妈去宋庆龄儿童活动中心(玉渊潭那个)玩,正好赶上那里有个编程体验活动。游客可以排队进入,一批若干人,分时体验。
具体的体验内容是照着前面黑白上写的代码在现场的机器上敲一遍,然后运行。具体什么程序已经记不得了,按时间和当时的环境推断应该是 Basic 程序。
我当时既不知道什么是编程,也不会打字。摸索着似是而非地敲了一遍完全不明含义的字符块,然后按照说明运行,但是毫无动静(记得是这样)。
现场有个工作人员在巡场,问他他也不知道是什么问题。然后体验时间就到了—— 一次很不成功的体验。
体验活动结束了,也就过去了。无论我自己还是家长都没有就计算机编程这件事再提起来。毕竟,当时电子计算机对于普通家庭根本是不可想象能拥有的。
再接触编程就是高中的事了(时间到了 90 年代),当时学校有计算机课,老师教了一点 Basic 语言,大概能写个 a + b = c 之类的程序然后运行得出结果。
因为初中英语课教了打字,再到敲程序代码就自然顺畅多了。当时的结课考试考得还不错,但即使得了个不错得分数,实际上对于编程是什么,计算机能干什么这些问题,完全还是一团浆糊。
后来上大学之后,上了若干计算机的专业课程,慢慢积累了一些专业知识,也有机会去做一些结合实际的项目。到了那个时候,才算是对于“编程”有了些体会。大学毕业设计时,才第一次觉得编程是件有意思的事情,才觉得“我喜欢编程”。
如果小学时那次不成功的体验后作者被强行逼迫去学编程,很可能就是另外一个结果了。
让孩子体验一下编程是怎么回事,挺好。但是,别把一个可以发展成兴趣的加分项逼成一场噩梦——这是最基本的底线了。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@.com
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjyfx/162.html