换个方式定义“失败”
在程序员的世界里,出错是一个再平常不过的词。遇到报错,debug 一番修复了就好。程序员花在修复 bug 上的时间比编写新程序的多,也是稀松平常。
原本我没觉得这有什么特别的,直到看了Papert的书才意识到,编程活动中鼓励研究自己的错误是多可贵。
《因计算机而强大》P94~95
有伙伴不服:“失败是成功之母”,咱们从小就听师长这么教导自己,现在面对考试考砸了的孩子也会这样说啊。面对失败的态度,真有什么不同吗?
ET群的伙伴培炎说得特别到位: “失败是成功之母”,着眼点仍是成功,而失败并不必然带来成功,因此失败仍是可畏的,使人想要逃避。人们内心并不真正尊重失败,我们真实的文化是高度功利的,是鄙视失败的,而这骗不了孩子。但debug跳出了成功|失败的二元划分,在debug语境下,失败的概念消失了,成功则变成一个行动过程,会促进迭代的行动。
另一位伙伴说得更直接明了:出错,不叫失败,叫“和预期不一致”;debug 就是对预期不一致的处理。如果出错了不研究错误不继续,那才叫失败。
培养 DEBUG 的习惯与技巧
可是,如果只是换个角度看“出错”,不就是自我安慰、很阿Q吗?又能有什么价值呢?这里的关键在于习惯。
培炎用《思考,快与慢》中的理论做出解释:
(系统1:自动运行的快思考;系统2需要刻意手动运行的慢思考)
我们本能的会厌恶失败,会有对失败的恐惧。它产生于系统1,是直觉或潜意识,来得非常迅速。而靠“失败是成功之母”来劝勉自己面对失败、克服对失败的恐惧时,其实是在用系统2,但这个系统慢,而且对行动说服力不大。
通过 debug 认识学习过程的孩子,遇到“和预期不一致”的问题时有去 debug 的习惯,其潜意识里不再有失败的概念,根本不需要去克服什么。
这,就是 debug 带给我们的价值。
除了习惯,还有技巧。
《因计算机而强大》的第四章讲了一个学习踩高跷的故事。如运动员般强壮的迈克练习方法是勇敢不怕摔,一次又一次尝试。内向、好学但身体并不结实的保罗一开始也采用同样的方法,但当他发现这么做没什么进展时,他便试图隔离和纠正造成麻烦的那部分“错误”过程。最终,保罗比迈克先学会踩高跷。
“隔离和纠正”,就是 debug。debug 并不容易,需要很多技巧。我去年给老师开计算思维工作坊,用了一个下午讲 Scratch 程序的 debug 技巧,多数老师都觉得新鲜,更别提孩子们了。
有老师说发现孩子如果编程出错了,喜欢推翻重来而不是仔细捉虫 debug。推翻重来就像迈克的反复尝试。对还没有掌握 debug 技巧的孩子来说,从零开始看起来会比在一团混乱的代码中找错误要更容易。但 debug 显然是更高效的方式,在项目复杂之后更是如此。
孩子们学习编程练习到的 debug 技能,迁移到其它领域中,会是非常有力的工具。从学习到日常生活中烧饭做菜,都能用上。
Productive Failure
让孩子们通过 “debug” 学习,还有一个名词,叫
Productive Failure
(启发性挫败)。它由新加坡南洋理工的 Manu Kapur 教授提出,现已被新加坡教育部纳入学校教学模式之中。
Kapur 教授认为,学生在学习过程中遇到的挫折和困境虽然暂时阻止了学习任务的顺利完成,但从长远学习效果来看,正是学习中的困难和学生在困难中“挣扎”的过程,促进了学生问题解决能力、知识迁移能力、创新能力的发展。
在 ET 群交流中有伙伴指出目前的教学,大多数传递方式过于轻巧,以至于学习者无法领会这些概念的创造者当时面临的困境、付出的各种努力。但这种逃离困境的努力,不仅能让人更好的理解并应用获得的概念,它本身也是种能力。
《因计算机而强大》P195
Papert 的书中还有个例子:肯认为 35+35=610,因为32+32=64。在老师的提醒下他意识到610太大了,就划掉了末尾的0,35+35=61。
ET 群的伙伴请教数学老师,说这样的错误很常见。数位制其实是比较成熟一种数学形态,孩子掌握起来会有点难。老师通常怎么教呢?直接提醒进位方法:“小猪头,看看位置对齐了没有呀?”
如果用 debug 思路该怎么教呢?也许不用指出错误,再给孩子出几道题就好:
5+5
10+10
15+15 (110?太大了;划掉个0,11?怎么会比15还小呢?不对呀)
30+30
31+31(62, 怎么反而比 35+35=61大呢?不对呀)
……
通过这一系列题目,孩子最终一定能 debug 出正确的答案,也能学会加法的进位算法。
记得以前看到过对探究式学习的批评,认为它太低效:“难道你想让孩子独立发明牛顿力学三大定律吗?”现在想起来,就明白这批评实在是误解了探究式学习。我们不是要让孩子像牛顿一样发明定律,而是要让孩子学会“调试”自己的思维,通过 Productive Failure 学到更多。
两个关键问题
在ET群《因计算机而强大》的第二场共读讨论“聊聊DEBUG”中,我提出了两个关键问题:
我们到底愿意给孩子多少时间,让他们自己debug出答案,而不是快捷的靠我们直接教方法?
让思维可见,能够提升思考能力。我们可以教孩子哪些让思维可见的方法,来提升他们的debug 能力?
这第二个问题,思维可见性,恰巧是今天开始的第三场共读讨论的主题。欢迎你一起参与。
领取专属 10元无门槛券
私享最新 技术干货