民科一下:编程应该很好学-看本文前,估计没人信


所有跟贴·加跟贴·新语丝读书论坛

送交者: zeinstein 于 2006-10-15, 16:30:57:

http://bestwritings.spaces.live.com/

编程应该好学?大概没有几个人会说这不是疯话不是梦话,编程难学可是举世公认的常识呀!要是好学,程序员的工资会高?要是好学,电脑还叫高科技?… Google“编程好学”、“程序设计好学”、“编程语言好学”,根本就没有多少结果,因为编程好不好学是不言而喻的,压根就没有几个人这样问!

本文的读者都是上过学的,如果回忆一下自己的学习经历,就能总结出,难学的课程通常是那些抽象的课程,比如数学,包含太多“脱离”实际的概念术语,是最难学的,理化和工科因为可以做实验和使用仪器工具,和现实有些直接的联系,而比数学易于理解。对推理能力、想像力、创造力的高要求也是数理化和工科难学的一个原因。至于编程,几乎和数学一样,有自己的一套封闭的名词术语和运行机制,其抽象的特征使其也难学-这是“常识”,也是“现实”。

有的时候,人人都默认的“常识”不一定是真理,比如“重的东西比轻的东西落下得快”,就曾经是全世界千千万万人民坚信了几千年的“常识”,直到被一个叫伽利略的人、在一个斜塔上、扔下一大一小两块石头所打翻。

作者多年前开始研究编程(实际上是更广泛的电脑知识)难学的原因和解决方法,发现编程本质上一点不抽象,相反,它是很实际的知识,原因如下:
1.编程知识是人造产品
比如Java,是由Sun公司的人创造的。人造知识的特点之一,就是它是由人为创造的规则组成,而人造规则是“死板”的,即便有时候“灵活”一下,“灵活”也是由人造的规则约束的。比如Java中的一个概念是什么意思、能用在什么场合、和其他概念有什么关系、怎样改变它的特性、扩展它的功能,全都明明白白地规定了下来。根本没有不为人知的潜规则(如果有,那就叫bug),需要学习者像伽利略一样,自己推理、自己思考、或者自己去发现。学习这些明明白白全能写在纸上、无需想像力和创造力的死规则会难吗?
2. 编程知识是有限的
因为它是人造的知识,所以它是有限的。比如JDK1.4版本(就像windows 2000),你可以找到它所有的知识点(尽管很多),虽然你可能不会在一个本书或者一个文档中找到它所有的知识,但确实可以想像有这样一本书,它包含了所有的JDK1.4的知识,包括如何使用它们的知识,当然,这本书从来没有出版过。人造知识也会发展,比如JDK1.4发展到JDK1.5(就像Windows 2000到Windows XP),但这也是Sun公司又添加了些新规则而已,不关学习者的事。有限的知识也意味着能在有限的时间内学会,而对于数学、物理这样的知识、甚至是其中的一个小的分支,我们都不知道它到底是无限的还是有限的,因为它的知识(至少大部分)都不是人造的,天知道有多少知识、它们藏在什么地方、能被谁发现或者解决,比如对于自由落体规律,在伽利略之前,全世界的天才聪明人都没想到登高丢石头。
3. 编程知识可演示因此不抽象
大众认为编程难学的主要原因是它很抽象,比如它那琳琅满目的专业术语,实际上并非如此。因为绝大部分编程知识都要能用在程序中(否则就是废物),比如String(字符串)类;或者说,绝大部分知识点都能在程序中演示其作用和含义,比如字符串中的两个字符串相加是什么意思。本人用“绝大部分”这个词,是因为确实有少数知识点,例如Java的虚拟机和垃圾回收概念,很难用程序演示。如果能用程序演示绝大部分编程知识点,就像我们能作试验演示一个物理现象一样,编程就根本不抽象,所以编程应该不难学。其实,教师和学生已经发现例子在教学和学习中的作用,现在市场上很多书的书名(包括作者的书)都有“实例”一词,而这不仅仅限于编程领域。

编程实际上难学的原因是什么,或者反过来说,让它好学的原则是什么?作者的确发现了一个有高度概括性的教学原则,将其命名为“Know Unknown Through Known”,它是The best way to Know what is Unknown is Through what is Known(了解未知的最好方式是通过已知)的缩写,即人学会未知知识的最好方法是通过已知,你不可能用一个未知解释清楚另外一个未知。例如,如果孩子不知道什么是老虎和哺乳动物,那么教师说“老虎是一种哺乳动物”就是完全不可接受的,虽然这是正确的解释。善于教学的老师经常使用比喻和道具,把生活中学生已经了解的事物与要学习的新知识比较,比如如果小孩见过猫,说“老虎是一种大猫”就能给孩子一个形象的感觉,虽然“学术上”不太准确;或者给孩子看老虎的照片和电影,这就是“实例教学法”,更好的实例教学法也许就是带孩子到动物园看真老虎-照片、电影、真老虎都是很具体很容易看懂的。

说白了,Know Unknown Through Known其实就是由简到繁、由浅入深、由具体到抽象这些显而易见的老生常谈。可惜的是,这个显而易见的教学原则显而易见在电脑(包括编程)教学中没有“常谈”过,在作者网站的中英文文章中,举了很多违反这一“大白话”原则的例子,包括一些知名国外作者。本人认为,这是编程(包括其他电脑知识)难学的原因。而与此相对照的是,作者自从1999年开始电脑写作以来,已经出版了包括10本Java程序设计著作的电脑书,也作过长时间的Java教师,几乎没有人抱怨作者的书难看、课难懂,因为作者严格地在写作和教学中应用了Know Unknown Through Known原则。

那么,作者是怎样应用Know Unknown Through Known的呢?具体的教学技巧如下:
1.详细地列举学习一门课程的预备知识。比如,会不会循环语句?很多编程书只是用很概括的描述,例如“有Java的基础知识”、“初级”、“中级”等。对预备知识的详细描述,可避免学生选择太浅或者太深的课程。
2.总是用学生已经学过或者容易理解的东西,来解释新的知识点。例如作者每当提到一个名词、概念或者其它知识点,问自己三个问题:“读者可能学过吗?前面讲过吗?应该在这里讲吗?”,尽量保证每一句话、每一个段落的知识只涉及前面的内容而不涉及后面的内容,使读者从第一页看起,基本没有看不懂的地方,这就是不用未知解释另外一个未知。比喻、示例、图片、动画等也是学生已经了解或者很容易理解的“东西”。比如,如果教师打算用“老虎是一种大猫”来解释老虎,那么要先确认孩子见过猫。
3.尽量在新的知识点第一次出现时,将它解释清楚。因为知识点经常互相交叉,万一要提及后面才能详细讲解的知识,就使用这样的说法:“先不管XXX的含义,后面还要详细讲解”,以避免读者产生没有讲清楚的错觉。仅此一点,就可保证读者看得不累,不会卡在不理解的地方长久地流连忘返。因为读者在学习时,倾向于尽力理解每个字,如果碰到没有解释清楚的术语,就会停下来长时间地乱琢磨,直至怀疑自己是不是笨、或者书太难-大多不会认为是老师的错。
4. 在教编程语言时,尽量用程序例子来演示每个知识点:概念、名词、框架等,这是所谓的“实例教学法“。前面说过,编程语言的几乎所有知识点都是可以用程序演示的。虽然很多电脑书作者和教师也了解到了例子的重要性,可似乎仍然停留在不太清晰的潜意识中,没有有意识地在教学中使用程序演示每个(注意是“每个”)知识点-如果很多教师遵循了这个原则,编程好学就是常识了。很多编程书,例如作者网站上提到的那些,大谈所谓的体系、结构、层次、优势等等,绵延数页全是“理论”式的文字,没有几行代码或者实例。这相当于说一堆美女标准的“理论”:口脸鼻该长的什么样、身材比例多少、皮肤质地如何…却舍不得出示美女照片或者带学生站在大街上看美女。像编程知识一样,“美女”是很实用具体的知识,谁愿意光钻研“美女”的理论,却见不到美女的“实例”?
5. 对数据库、服务器、开发环境的教学,尽量用“怎么做XXX”的方式,列举详细的步骤。例如“怎样在JBuilder中设置JDBC的驱动”、“怎样部署程序到服务器中”等,这也是一种“实例”教学形式。要避免字典式的讲解,比如逐条讲解File菜单的Open、New、Save,却不演示从新建文件到编辑和保存文件的完整过程。
6.尽量避免大和复杂的程序实例,如果短小的例子能达到同样效果的话。一些作者和教师喜欢采用复杂的示例,虽然苦了学生,却显示了其专业技术水平,学生甚至还因此崇拜他们!
7. 教学过程应该一点一点地前进,一次只讲一个尽量小的知识点,避免涉及其他知识点,并且步骤尽量详尽到这种程度:即便一个人不理解你讲的知识,按照你的步骤也能得到最后的结果。
8.所有的代码应该是可运行的。很多书中的代码是代码片断或者伪代码,这会令学生花费额外的时间编写可运行的程序,而不一定能成功,这就增加了学习的难度。
9.只有当相当的知识点已经完成讲解后,才是使用综合复杂例子的合适时间。对开发人员来说,综合性强的例子绝对是需要的,就像要全面掌握美女知识,一定要观看各国美女云集的环球小姐选美赛一样。

写作本文的目的,一是让广大读者和学生坚信,在编程学习方面,“没有笨学生,只有笨先生”(该说法来自作者的另外一篇文章),如果学不会编程中的什么东西,千万不要以为是自己笨!二是介绍作者的教育观点包括教学技巧,供其他教师借鉴参考。三是告诉读者,作者的所有将出版和已出版的著作,全是按照Know Unknown Through Known原则编写的,甚至本文也是按照这一思想写作的-比如上面的那些示例和比喻。

关于Know Unknown Through Known更严谨的论述,见作者网站的英文文章:An Effective Methodology of Teaching Programming Knowledge,网站上的其他文章中,还列举了很多正反两方面的例子,阅读起来更生动有趣。




所有跟贴:


加跟贴

笔名: 密码: 注册笔名请按这里

标题:

内容: (BBCode使用说明)