2016-03-26

从小学编程

大约两年以前, 我曾经在欧洲动态的一篇《不懂程式语言,21 世纪文盲》后面留言这样说:

……
对于这个问题:不懂程式语言,21世纪文盲?我的答案为,完全不是。 鼓励学生自幼就学习编程固然是好事,但是我觉得也没有必要把编程作为独立的一门课让中小学生来必修。 
个人感觉,教育中小学生,最关键在于培养他们的(自我)学习能力,保持他们对这个世界的好奇心,和激发他们对某些学问的兴趣。就理工方面的基础来说,数学和科学远比会两门编程语言重要得多。数学是最锻炼思维能力的学科,数学上学得扎实深远,再学习编程语言是比较轻而易举的事,上手应该很快的,似乎没必要在稚嫩的年纪作为必修课去学。其实,现代的数学教学,很多时候已经离不开电脑软件的配合。尤其是要处理海量数据的统计概率什么的,不用电脑编写程序真的难以想像。而这些作为工具的编程,可以渗透在数学和科学课上教授(Octave 或者 R),这样其实也就保证了每个学生多多少少会点 scripting。 除此之外,人各有天分志趣不同,我觉得还是尊重小孩自身的天分志趣,让他自己选择科目,帮他/她在那些方面打些基础,教他/她在那个领域怎样自己学习深造,比较好。任何科目,包括文学,音乐,美术,政治,或者计算机科学,等等等等,都有她内在的价值,学扎实了都可以实现个人自我价值兼服务社会。如果对某个科目或者手艺,比如编程,如果真的没有兴趣,不必勉强的。 
数学上除了基本的运算,更关键是要教授小孩子数学建模的思想,可以在中小学就开始教。 Model Thinking 可以作为必修课来教,编程就不要必修吧。今天教的编程语言说不定两年后就过时了。
……

现在,自己经历了一些优秀的机器学习 (Maching Learning) 的课程,以及体验了一下 Khan Academy 的一些数学课以后,想法有些改变。


现在我的意见是,不管是渗透在数学课或者科学课中教,还是作为一门独立的课程来教,小孩子越早掌握一些编程能力,就是越早获得能够大幅促进其它任何学科的学习能力。我现在觉得:从小学点编程是件好事,在今时今日甚至是必要。至于成年人,任何时候学编程都不会太迟,现在网上教学资源那么丰富,只要有心,一定可以学到。

为什么说从小学编程是好事,甚至必要呢?

首先,从工具理性层面来说,语文是人与人之间的沟通工具,而数学不光是人与人之间的沟通工具,而且也是人与自然之间的沟通工具。人们用数学来了解自然界的规律,以及用数学利用或者改变自然。 这两门基础课不可偏废。 就算某位小朋友更为偏好文科而不喜欢数学,我觉得中学程度内的数学真的不需要太大的天分,只要付出一定的努力就能很好掌握。而掌握一些简单的编程技能,则令小朋友在遇到复杂算法的时候,可以自己编程输出结果, 或者输出一些中间步骤的结果。这些电脑快速算得的结果,可以帮助小朋友对抽象的概念或者复杂的算法建立很好的直觉,加深对概念或者算法的理解,培养出所谓的数学 “感觉”。数学很抽象,越到高级程度越抽象。而合适的电脑程序则可以将抽象的数学形象化。 通过电脑生成的直观视图,很多人备感困难的数学学习可以变得简单。简而言之,电脑程序输出的中间步骤的数值,或者程序绘制的函数关系图像,可以帮助小朋友更快更轻松地理解抽象的数学定理或者复杂的数学算法。 有这样好的工具,何乐而不学。早学早受益。

其次,编程确实训练思维能力,令思维更有条理更清晰,逻辑更严密。在很多时候,编程甚至是激发创意的好途径。

现在那些用来写作新闻,或者作曲的人工智能系统好像正在侵蚀人的职业领域。假如你热爱写作或者作曲,了解一些那些系统怎样工作的原理,也容易想出对策,令你的艺术作品独具特色和人性光辉,帮助你在文艺界立于不败之地 (不败给人工智能)。 另外,你假如懂得编程,利用计算机生成的图像,音乐,或者文字,偶尔会有一些 “神来之笔” 可以给你借鉴。

任何学问手艺, 精进到一定程度,有她深刻广阔的美感。 编程给大多数人的印象是 “实用”, 但是行家懂得, 编程本身是很有美感的一件事。 在编程界, 同一件事, 可以用很多不同的方式去达成, 因此每个人写的代码也很体现他的性格。 善解人意, 注重合作的程序师倾向于在代码间写很多简单明了的注释, 以便人家读懂他的意图; 性格狂狷一点的, 写出来的代码一看之下有点费解, 但是看明白了以后就知是效率极高极聪明的一种写法。 对很多编程爱好者来说, 写代码就跟写诗写散文一样, 是他们表达自己思想感情的一种方式, 是一种深刻的美感体验。

不太容易理解的是,在今时今日,从事编程项目,确实也能提高人的沟通能力和团队合作能力。这我可以从三个方面来解释。

第一,在那些为生产生活中的具体问题做应用软件的项目里,你的客户通常不是编程专家,他们给你的问题描述和你的编程思想之间通常会有巨大的鸿沟。你作为程序师,需要不停跟他们沟通,帮助他们清楚设定待做软件的功能和要求,设定各种功能的优先级, 设定开发时限,计算成本, 等等。这些工作绝对训练人的沟通技能。就算你在一个大团队里做,有专门的所谓 business analyst 帮你做这些事,就我的项目经验来说,假如那个 business analyst 自己不懂编程,他或者她给你的 specification 最后也是很不好用,跟客户的实际要求和你熟知的软件工程界 best practice 有距离。到头来,你跟 business analyst 不停沟通, calibrate 各种 specification 也是免不了的事。 无论如何你都要不停跟别人沟通沟通再沟通。 (题外话:我向来是主张,程序师和客户直接交流,紧密合作。 当中的 communication 环节越少,需要 calibrate 的地方也就越少。 然后双方达成共识的东西, 写在简明的备忘录或者技术文档里)。 在几十年以前,软件界面对的还大多数是比较“面向机器” 的问题 (比如操作系统)时,确实很多程序师都是独自埋头做事。 但是今时今日,机器层的操作软件基本已经成熟, 绝大多数新开发的软件都是应用软件,程序师必须跟各行各业的客户沟通合作。

第二: 在类似 Kaggle 竞赛之类的软件创作活动中,团队很有可能是即兴组成,成员可能是分散在世界各地。 一起做事,毫无疑问是可以提升大家的沟通能力。 Kaggle 上确实有关于团队合作方面的指导文档,我的同学参加了 Kaggle 竞赛以后,说是学到很多沟通技能和高效的团队工作方法。

第三:现在很多软件都是所谓 “community driven”。什么意思呢?就是某个程序师,突然有某个很好的想法,他把最初的想法写成程序,放到开源软件社区,供全世界的程序师对它自由 “发现” 并进一步补充发展。那个最初发布项目的程序师,假如他不撰写简洁明了,内容充实且引人入胜的项目简介和方便好用的开发者文档,无论他的编程水平多么高超,他的项目多么绝顶聪明有价值,也不会有人去理会他的。所以真正要做大一个项目,哪怕是开源项目,对主力程序师的沟通技能有很高要求。做开源软件都锻炼沟通技能。那个 Linus Torvalds,不光写出全世界最流行的软件 Linux Kernel 和 Git,他跟人论战起来也是淋漓酣畅气势如虹,不知多厉害。

综上三点,大家应该可以看到,参加软件编写在今时今日是个很 social 的活动,是可以增进人的团队合作能力的。

我在另外的地方还有看到过有人因为重视或者喜欢文史哲而轻视编程数学之类,认为理工科不过是 “低级” 的工具理性。我看了只有笑笑。你去读读黄仁宇的历史专著,里面充满了科学严谨的研究方法。文科研究都是讲究条理讲究方法的好吗?至于说哲学,则须以一切学科的学问为基础。古代西方的很多大哲学家,能在大学里教授包括数学,物理在内的几乎任何课程。哲学里的形式逻辑学在我看来是属于离散数学的范畴。真的不必看轻理工科学生。就算要看轻,也必须在数学物理编程等各门功课上修炼到至少跟他们一样的水准才有资格去看轻人家。

还有人说,始终懂得奴役程序师的人才最厉害。首先我不认为人活在世上,去奴役别人,榨取别人的剩余价值才是成功。我对 “厉害” 或者 “成功” 的定义是,看他或者她对世界作出多大贡献,有从多大程度上推动人类的文明进步。 而这个作贡献的过程中, 不一定要奴役别人的。

谢谢阅读, 下次再见。

No comments:

Post a Comment