正文

漫谈孩子学习编程和写软件

(2017-08-25 23:00:23) 下一个

漫谈孩子学习编程和写软件



应该是美国中小学即将开学的缘故,家长需要给孩子们选择周末兴趣班,这几天好多朋友问我,孩子们要不要学编程,更具体的说,要不要学习Python程序设计。孩子要不要学编程,的确是个好问题。就算没有朋友问,我自己也考过很多,也曾试过。在女儿读二三年级的时候,我教过她简单的Python和Java程序设计。很可惜,成效并不大,尽管我挑选了几个很有趣的简单数学问题,用计算机去求解,仍然不能引起孩子的兴趣。这就更让我进一步思考,到底该不该现在就教孩子写程序,如果教,该教哪一种程序设计语言,怎么教。

我自己不是计算机科班出身,但是靠着科学计算混饭吃,能够熟练地使用C,C++,FORTRAN,Java, Visual Basic,MATLAB,PYTHON,Bash, GrADS, NCL甚至是AML写程序。大学期间,我正经八本上的计算机课,也只有C语言程序设计。用了不到一个月时间,我就把谭浩强先生写的《C语言程序设计》自学完了。通过这本书,我学会面向过程的软件开发方法。学期末,我就用C语言给我们班写了一个奖学金评选的程序。当时是九十年代末,C++已经开始成为潮流。写程序的人如果不会C++,是不敢出去吹牛的。我很喜欢吹牛,所以买了本C++程序设计的教材。C++比C语言丰富多了,我用了两三个月才学明白什么叫做面向对象的软件开发方法。我大学毕业的时候,用C++开发了一套人工神经网路的程序。在2000年,在好多国内的书店里,如果你问有没有人工神经网络方面的书,店员大多会让你去医学门类去寻找。所以,我那时候,作为一个地质系的学生,用基于人工神经网络的人工智能,去研究矿山稳定性,也值得大吹特吹了。自吹自擂这么多,拉回到程序设计的话题上,其实哪种语言不重要,关键是学会软件开发的方法,比如前面提到的面向过程和面向对象软件开发。

当然,一个写程序的人必须要了解计算机的体系结构。我很幸运,从C语言开始学习编程。学过C语言的,很多人都很憎恨它,就算学过,一辈子也不会用C语言写一个超过100行的程序。C语言之所以招人厌恶,是因为它太接近计算机硬件了。作为一种强类型语言,也就是说,需要直接声明和定义变量的计算机语言,写程序的人必须了解,什么是整数,什么是实数,什么数有符号,什么数无符号。解决问题,我们必须搞清楚,实数需要小数点后几位的经度,整数需要几个字节。问题复杂了,需要分配内存,需要传递复杂变量,就要涉及地址和指针。把这些细节搞清楚,的确是需要花点时间学习计算机的硬件和原理。因为这个,和多人都望而却步打了退堂鼓。然而,对那些肯花时间钻研的人,一旦弄明白了底层细节,以后操作计算机就像是庖丁解牛一样,可以轻松玩耍。

通过C语言学习编程,起点高,的确有点难。对很多人来说,就像是撞墙一样痛苦。可是一旦把墙撞破了,就可以把头伸进计算机的内部世界,能够享受把自己的想法转变成计算机程序的自由,最终可以驱使计算机替你思考。在我上大学的时候,除了计算机系的学生,肯去研究C和C++程序设计的人非常少。多数人都去学习如BASIC这样的语言。BASIC很方便,方便到变量既可以声明,也可以不声明,总之是无所谓,关系不大。灵活带来方便,也带来混乱。BASIC的程序,大都是乱七八糟,就像一盆煮熟的方便面,顺着哪根面条,也捋不出一个头绪。很多人把这个问题归咎于BASIC程序中的GO TO语句。在我看来,这多少是冤枉了GO TO。问题的主要原因是,那些从BASIC学习计算机程序设计的人,没有学会正确的软件开发方法。他们大多是图简单,图方便,图快,最后把程序搞成了涂鸦。回想一下当年我的同学,热衷短平快学习BASIC和Visual Basic之类编程工具的人,大多没有在软件一行走下去深入发展。相反,好多学习C,C++和Visual C++的同学,成了软件业的精英,现在坐拥豪宅若干。

前面谈的都是历史,现在转到现实。现如今再没有人学习什么Basic和Visual Basic。短平快的软件开发,大家都选择Python。Python可以算最成功的解释型语言,没有之一,而是唯一。Python引人指出,大概有这么几点。第一就是,严格的程序书写规范。Python的作者深受Perl语言自由灵活书写风格之苦,要求Python的开发者,必须按照既定的规则,书写每一行程序,否则Python解释器跟你没完没了地抱怨,这样确保了Python代码有良好的可读性。因此,你上周写的程序,今天还能很容易地看懂。第二,Python程序既能面向过程,也能面向对象。什么是过程,什么是对象,如果你写不了200行的程序,没必要去敲破脑袋搞清楚。 第三,Python提供了丰富的基本数据结构,例如元组(tuple),列表(list),字典(dictionary)和集合(set)之类的的数据结构。对于C++的开发者,如果使用这些数据街头,需要学习复杂的标准模板库,要么自己去开发,总之是费时费力。而Python的用户,可以轻松使用这些数据结构带来丰富功能。 最后也是最重要的一点,Python有极其丰富的共享资源。对于一个应用Python的软件开发人员而言,一定要记住,你是在用Python而不是开发Python。对于任何一个常用的计算机操作,不管复杂与否,开发人员基本上都可以在网上找到免费的Python代码库。开发人员需要做的,就是开发尽可能简单的Python代码,调用这些代码库,完成自己的任务。

Python容易不容易学?Python强大不强大?我的答案是Python很强大,但是我不知道对于小孩子来说,到底容易不容易学。如果没有任何数据结构的基础,我不知道怎么给孩子讲明白列表的工作原理。那些现成的Python代码库,真的既丰富又强大。有大人帮忙,孩子们可以轻松用Python写一个收发电子邮件的程序。可是电子邮件里的文字和图片,到底是怎样从这台计算机到那台计算机的,孩子们要是问起来,Python程序员应该不是很容易回答。随手抓来的Python代码库,让我们不必关注细节,直奔主题地开发程序,完成我们的工作。可是,我总觉得,孩子们学习计算机程序设计,是需要了解细节的。教孩子学习写程序,不应该是简单的让他们学会怎样用别人的代码搭积木,而更应该让他们了解每块积木是怎么工作的。我们大人用Python写程序,是因为我们只看重结果。孩子们学习写程序,更应该侧重过程。如果没有计算机基础,上来就学习Python,孩子再聪明,怕也只能是浑沦吞枣式地学习。在大人的指引下,他们能够写出小程序,离开了大人指导,他们还能走多远?我不是很乐观。

我喜欢用Python,可是我心里总是隐隐约约觉得,Python不是一个给小孩子入门的计算机语言。当然,我也不想让一个孩子硬着头皮去学习C和C++。想来想去,程序设计可能是无法快速入门的。想靠着十节八节Python程序设计课程,就让孩子去研究人工智能,为申请大学加分的想法,是不切实际的。 在我看来,学习程序设计,还得从长计议。要是我列一个课程表。第一个必修课就是数学。理解程序设计的一个基本需求就是,孩子得理解数学中函数的定义。不管是面向对象还是面向过程,我们都会把相关的一组计算机操作组织到子程序(或者叫做函数)里。理解了数学中的函数,孩子们就可以学习面相过程的程序设计了。能写出几十个子程序(函数)构成的程序,才有学习面向对象程序设计的基础。有了一定的数学基础,第二个必修课就是计算机操作。好多孩子会在计算机上打游戏,却从来没有在计算机上发过一封电子邮件。编程的一个基础就是,计算机打字。孩子正确使用键盘和鼠标,也得点功夫。学会操作计算机,就可以真正接触程序设计了。好多老师,从集成开发环境(IDE)(比如说Eclipse)开始教授程序设计。不管学习Java还是Python,都是按照老师的指导,在IDE里输入程序,然后用鼠标按一下按钮,结果一下就跑出来了。一旦离开了IDE,孩子们一脸茫然不知道那里可以写程序,更不知道程序怎样变成可执行代码,并运行处结果。要是我来上课,一定从最简单的文本编辑工具开始。我会教孩子怎样打开命令行窗口(Terminal),怎样启动文字编辑器,怎样输入程序,怎样保存代码,然后怎样编译程序,最后怎样执行程序。

到底哪一种计算机语言最适合初学的孩子呢?我想我会选择Java。Java在语言要素和语法上,继承了C和C++,基本上就是一个C++的简化版。谈到课程设置,我想我会从数据类型,条件判断(IF语句),和循环结构开始,让孩子了解一个程序的基本构造:数据,判断,和循环。我不会着急让孩子学习类和面向对象的概念。相反,我会用半个学期,甚至一个学期的时间,让孩子学习面向过程的程序设计的理念。也就是说,怎样把一个复杂的问题分解成若干步骤,每一个步骤又通过一个Java的函数来实现。让孩子们学会,怎样把这些函数组织在一起,解决他们的问题。

想想看,我们为什么要写程序?写程序的目的就是为了解决问题。在写程序之前,我们脑子里要形成一个解决方案。这个方案,往往包括多个前后衔接的步骤,甚至有条件判断,还有重复性的步骤。 这些步骤,都可以通过程序中的函数来实现。用计算机求解问题,真正的难点不是写程序的过程,而是开发问题的解决方案。计算机代码,只不过是解决方案的计算机实现。用上半个学期,甚至一个学期,教授孩子怎样去利用计算机,探讨问题的解决方案,所用时间其实并不长。家长呢,应该认识到这一点。教授孩子写程序,其实是教授孩子用计算机来解决问题。面对相抵复杂的问题,如果孩子们可以设计解决方案,可以写出包括十几个甚至更多的函数的代码,那说明孩子们可以进一步提高了。我们可以随后教授孩子,怎样以数据为中心,进行面型对象的程序设计,开发更大规模的软件了。 当然这是后话,对于初学者的父母,完全不需要上来就考虑面向对象。

Python要不要学?要!不过是在孩子们完全理解了面向过程程序设计理念之后。有了这样的基础,即便不用Python里面的“类”,孩子们也可以写出像模像样的Python程序。如果孩子有了面向对象的基础,那么就可以更加容易地理解Python中的元组,列表,字典,还有集合等数据结构以及相关的操作(或者说函数)了。如果孩子有兴趣,也完全有可能应用Python的类(class)的组织代码,开发出复杂的软件。有了程序设计基础,孩子们可以更加深入地理解并有效地利用共享的Python代码库。那时候,他们用共享代码开发出的电子邮件收发工具,不再是简单地模仿。孩子们可以设置甚至改造共享代码,把他们的有趣的想法实现到软件工具里。我相信,经历这样的过程,孩子们可以真正地了解计算机以及程序设计。深入掌握,必然帮助他们触类旁通,以后学习人工智能,自然会有坚实的基础。

最后一句话:Python便捷强大,适合急功近利式的软件开发,未必适合孩子们入门学习。

[ 打印 ]
阅读 ()评论 (8)
评论
折光 回复 悄悄话 谢谢大家的宝贵意见
tgmomtobe 回复 悄悄话 scratch相当好,非常适合小朋友入门。 这个阶段学习的是编程的逻辑思维,语言还是其次。 楼主虽然不赞成,但是我感觉以后的趋势是编程图像化,傻瓜化,内存数据类型等细节被功能模块封装或者由人工智能来调配,人类只需设计应用的场景和逻辑。
ali88 回复 悄悄话 我专业是电子工程,使用c已经有25+年的历史,使用Python也有五年以上。自我感觉在如何学计算机语言方面还能够说两句。首先你要选应用最广泛的,c,Java,Python,c++在任何调查统计中都是排名前五的,初学者应该从这里面选择。(不推荐孩子学language for kids之类为学习而创造的语言。) 这其中又以Python最接近自然语言,也最容易学习,各种资源、教程也很多,强烈推荐小孩学语言从Python学起。
可惜我不能同意楼主所言“Python便捷强大,适合急功近利式的软件开发,未必适合孩子们入门学习。”,Python是严肃的编程语言,可以写出非常复杂的应用,使用范围很广,何来急功近利之说?
也不能同意学习Python需要“在孩子们完全理解了面向过程程序设计理念之后”.为什么需要这个?学Python可以循序渐进,也不需要先学习任何理念。
折光 回复 悄悄话 哈哈,简单的教过小孩一段编程,就是用的这个网站。她也学的挺带劲。但是我不知道如何帮助她过度到正规的编程语言,对四五年级的小孩来说太抽象。
王有财 回复 悄悄话 回复 '折光' 的评论 : 我觉得挺好的。还有一个工具:SCRATCH。您可以看看。
折光 回复 悄悄话 有很多图形化编程的网站可以教授编程思维逻辑, 有财兄以为如何?
Tern 回复 悄悄话 家有四年级小学生跃跃欲试要学计算机语言。此文太有帮助了,多谢!
cn_abcd 回复 悄悄话 maybe Eiffel is a good choice
登录后才可评论.