暑期《编程语言(初级)》课程第一期总结—青少编程(7)

饺子片汤儿2019-04-27 07:29:31

虽然大多数小同学还没放暑假,但暑期班第一期学员已经完成了课程1《编程语言(初级)》的学习(10个工作日,每天3小时)。跟感兴趣的读者分享一些感受。

一、兴趣

学习编程语言阶段相对枯燥,我尽可能地增加一些能吸引小同学兴趣的元素,用孩子喜闻乐见的形式吸引孩子的关注和兴趣。


第一天的课程一开场,我先把在课程2《3D游戏编程(初步)》我们会编制的游戏演示给小同学看,告诉他们这是我们的终极目标。小盆友们果然很兴奋。然后,我话锋一转,告诉小同学们,编游戏必须先学一门编程语言,学习编程语言略有些枯燥。先“望梅止渴”,埋下伏笔,让小同学们认同经过艰苦的努力,我们是能到达幸福的彼岸的!


二进制是计算机的最基础概念,如何讲好这一部分,也颇费思量。我采用了一位大师Charles Petzold经典著作中的一些讲解思路,尽可能将枯燥的概念讲得有趣些。讲解2进制,先从10进制说起:

1. 问小同学,人类为什么用10进制,小同学的回答五花八门,答案是这张PPT。



2. 讲完10进制,又问小同学,知道卡通人物有几个手指吗?回答又是五花八门,答案是这张(为什么这样?而且中外的卡通人物都一致,非常有趣,下次专门研究一下)。



然后我引入概念:人类是10个手指,用10进制,那么卡通人物都是8个手指,卡通人物的世界使用多少进制?小同学的答案都一致了:8进制。然后顺势讲解8进制的概念。


3. 讲完8进制,再给小同学新的问题:如果我们是海豚,只有两个鳍,我们怎么计数?顺势引入2进制。



通过这种对比的方式,让小同学知道不同的进制不仅是一个抽象的概念,而且在卡通人物和海豚的世界,还真可能用得到欧!


孩子们都喜欢干些出格的事情,总是问我:怎么能把计算机搞瘫?


然后,我设计了一个小程序,向小同学们展示数据的溢出。小同学在自己的电脑上输入了程序,看到了输出结果,都非常激动,纷纷表示,要学好计算机,去干类似的坏事


二、难度


关于编程语言,我特意上了些难度。虽然课程1《编程语言(初级)》主要目的是为课程2 《3D游戏开发(初级)》打基础,但既然单独列为一门课程,就应当将其内容讲足,所以我将课程1《编程语言(初级)》的难度设定得稍微有些高,难度相当于大学理科专业一般都要学的一门计算机编程语言课程的难度。这样,学员们学完这门课程后,无论是高中或大学阶段,学习同样的编程语言可以免修,如果是学习新的编程语言可以轻松应付。


课程中难度比较大的是两个常见算法或计算形式:冒泡算法和递归,其中递归更为抽象些。其实,许多大学生学习“递归”算法的时候都不一定学明白了。学员中最小的是6年级的学生,为了让每个学员学会,我花费了很多心思,分四个知识点和阶段,从易到难,讲解递归。


第一步,在课程的第5天,我引入了“栈和堆”(stack 和heap)的概念,用图解的方式把值类型和引用类型(相当于C语言里的指针)的概念给小同学讲解清楚。这部分的内容我找了许多参考书,最后在Daniel M. Solis的教程中找到了合适的图解。


在之后第6天和第7天每天半个小时的复习阶段,我都反复重复“栈和堆”的概念,同时,采用小同学们轮流上台讲的方式,确保每个学员都理解了。


第二步,在第7天,讲解函数的时候,我把参数调用的过程,也就是比较容易混淆的“形参”和“实参”的概念用图解的方式介绍给小同学,重点是把函数调用时参数的压栈过程讲解清楚。


第三步,第8天的时候,引入“栈帧”(stack frame)的概念,然后讲解了一个案例,用Main函数调用A函数,A函数调用B函数的方式,讲解不同函数间的递进调用时,每个函数的局部变量、参数、返回地址按照调用顺序挂起、进栈和出栈的过程,也用图解方式展示。这一部分比以前的稍难,但孩子也能理解。


最后,所有的基础准备工作都铺垫完了,才正式开始介绍“递归”,就是函数自己调用自己,其实这就是在第三步不同函数间的递进调用的基础上再推进一步。我没有找到太合适的参考文档,最后按照习大大的指示“撸起袖子自己干”,自己画了10页PPT的图解,将一个阶乘的递归调用程序从多个维度掰开了、揉碎了,解释清楚了。讲解的时候,小同学都表示明白了,然后我又留个一道递归的编程作业,第9天交。


第9天交作业的时候,小同学都没有完成,因为看“懂”是一回事,能自己一个代码一个代码“编程”是另一件事。这也没出乎我意料,学员们已经理解了递归的概念,但对于将理解的概念如何转换成程序语言实现还不熟悉。我已经准备了新的几页PPT,将递归用程序的实现这个过程进行了进一步的讲解。讲解了10分钟,然后每个学员当场用计算机输入代码,完成了递归的编程作业。


这还没有完,第10天课程(也就是最后一天),我还抽了些时间将所有10天的课程重点复习了一遍,将递归又讲解了一遍。另外,我给小同学们讲解了一个稍微复杂的程序,展示如何利用数组实现一个“栈”的核心功能,包括进栈(push)、出栈(pop)、栈指针(stack pointer)等,从而将“栈”的概念进行了闭环。加深了栈的理解,对递归的概念又会理解深一步。


当然,课程的具体难度也要看学员的接受程度,这一期学员普遍素质不错,所以上了些难度,但不是每次都会挑战到这个程度。


曾经从一本经典的计算机著作里看到过一句话“递归会产生优雅的代码”,当我这句话介绍给小同学们时,小同学们都表示严重的不同意。


三、方法


理解一个概念的最好办法是实践。所以,上课形式上,每讲完一个新的知识点,马上让孩子当堂输入一个与这个知识点相关的程序,通过程序的运行结果来理解这个知识点。


小班的好处是可以照顾到每个学生,确保孩子学会一门知识的方法就是让孩子讲出来,如果孩子能将知识将给别人听,那么基本就能确定他学会了。所以,尤其是每天上课前半小时的复习阶段,有条件的话,我会让小同学轮流回顾前一天的上课内容。


同时,在孩子们上课输入范例程序的时候,我还鼓励孩子们互相帮助,我会让自己的程序已经运行成功的同学去帮助遇到问题的同学。如果一个孩子不仅能让自己的程序正常运行,还能找出别人输入程序中的问题,那么,水平就更高一步了。


四、激励


偶尔的“鸡血”也是必要的。


上课的第一天,我会自我介绍,我说我是XX大学毕业的,小同学都用崇拜的眼光看着我,我问他们:“听说过这所大学吗?”,他们用仰视的目光看着我:“当然听说过!”。然后,我一拍桌子:“你们认真跟我学编程,以后上的大学肯定都比我强!“小同学们面面相歔。我接着说:“为什么呢?因为我像你们这么大的时候,没有遇到这么优秀的老师!”


嗨!说了半天,还是夸自己!



讲解递归的时候,当小同学们参照例子,最终完成了“递归”的编程作业后,我站起来,向所有小盆友热烈鼓掌,小盆友们不知所措,我很严肃地说:“热烈祝贺小盆友们的编程能力在某个领域达到研究生水平!我向同学们表示热烈祝贺!”小盆友们都很激动!很兴奋!



我真是没有乱说,很多大学生学“递归”的时候都似懂非懂的。


说实话,“编程语言”学习阶段略有些枯燥,需要适时地打些“鸡血”!


五、结语


第一期,10天的编程语言学习很快就这样结束了。很高兴,所有的学员都坚持下来了,达到了教学目标。当我告诉小盆友,后续的课程就是编游戏时,小同学们都十分兴奋,都迫不及待。我告诉他们:“课程1《编程语言(初步)》略有些枯燥,但你们都坚持下来了,非常棒!下一个阶段,我们会用课程中学到的内容编一个游戏。我们使用编游戏的软件工具跟游戏公司使用的是完全一样的,大家跟着学下来,就会发现,编个游戏并不难!编程是很有趣的事情”。


很荣幸,能帮助到无论是自己有兴趣,还是被父母诱导过来学习的小同学,让他们体会到真正的编程是怎么回事,能帮助激发他们对编程和计算机的兴趣。


青少编程招生


学一门编程语言,编一款3D游戏!-暑期青少编程班火热招生



往期文章


  1.  到新学校真的挺顺利的,嗯…就是听不懂课、看不懂讲义、不会写作业!—国际学校(36)

  2. 13岁小盆友non-fiction英文读后感,让我三叹惊奇—青少编程(5)

  3. 管窥:6年级的excel作业,测试下是否做得出来?--国际学校(27)

  4. 提高英文阅读,怎么选到与我孩子水平相当的英文原版书?

  5. 书单:美国3-4年级学生“最爱读”的25部小说(2016版)