小阳日记 03-26 教学

我最近常常在想一件事,如果让我给一个零基础的人教编程,应该怎么教?

教和学,完全是两个不同的领域。优秀的运动员,并不一定是一个优秀的教练;而那些卓越的教练,也并不需要多么傲人的成绩。刘翔的教练孙海平,因刘翔出名;游泳运动员菲尔普斯,在11岁时被中学游泳教练鲍勃·鲍曼发现,才成就一番泳坛伟业。

以编程为例,让我讲的话,可能开课前就有一堆准备需要做。语言有哪些,不同语言有什么区别?什么是高级语言?什么是解释器?什么是编译器?等等。选好了语言,又涉及语法是什么意思,作用域的概念,形参和值参等等。说完语言,还要理解什么是面向对象,什么是封装继承多态?更进一步,什么是范式?什么是设计模式?后面还有数据库、操作系统、网络等一连串的知识体系不胜枚举。

每次想回答一个简单问题的时候,脑海中就涌出这么一大堆知识,堵在嘴边,涨红了脸、瞪大了眼,就是憋不出来。

越是对一项技能精通,越难以平实的语言描述出来。我称之为“知识的悖论”。

逻辑上很好说通。每一项技能的精通,都需要一点一滴积累知识。而且后面越是高级、抽象的知识,越是需要基于前面打好的基础。让一个小学生跳过中学数学,直接去学高数,光是各种陌生的符号就会让他们沮丧不已。写程序就是这样,编程语言就像数学里的数字和加减乘除,简单计算就够。但若真想解决实际问题,就需要再去了解平方、开根、幂指数等“高级符号”,以及求和、平均数、方差等一系列配套概念才行。

所以,如果要让一个高数老师去教一个完全没有数学背景的人,需要重新设计他的课程。在讲述过程中,他要做两件事情,一个是屏蔽掉(暂时)不必要的概念,一个是对依赖的基础概念作简单抽象。所谓不必要的概念,就是讲代数时先别提几何,讲数组时先别说堆栈。所谓依赖概念,就是讲三角函数时,只需知道sin/cos/tan可以用计算器得到即可,不必知道具体怎么计算。

通过这两步,屏蔽和抽象,就可以把教授的内容集中在一个具体的领域上。教的时候有的放矢,学的时候也不会太困惑。至于那些被屏蔽或者被抽象的概念,可以换个场景再教/学。每一个教学场景,就是一个学习的“线”。把所有学习过程中的线串在一起,就构成了整个知识体系的网。

所以,学习就是由点到线,再到面;而教学正好相反,从面里找出线,再细化到点。

You Might Also Like
发表评论