计算思维是什么?CMU的周以真教授说它是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等一系列思维活动。Google把它定义为一种问题解决的方式,有拆解问题、模式识别、抽象化、算法实现四个重要步骤。我国2017年高中信息技术课程标准也将计算思维添加了进来,并强调它早从计算机科学延伸到了所有学科领域,从生物、化学到文学、社会、艺术……
确实,计算思维远不只是计算机领域的事儿,而且早在计算机出现之前,人类的思维体系中就已经有它存在。那为什么,“问题拆解 > 识别模式 > 抽象化 > 算法实现”的过程会被称为“计算思维”(Computational Thinking),是 computational 而不是别的学科?
一眼就看到的原因,是如今各个领域的很多问题,不管是DNA序列分析还是莎士比亚作品的真伪判断,到“算法实现”这最后一步,光靠人力不行,必须要用到计算机。
但我认为更重要的原因是计算机领域思维的可见性强。开发稍复杂一些的程序,就少不了要画模块和交互图,定义接口,选择算法,再一点一点的把脑袋里的想法翻译成计算机能懂的语言。程序员的思维是需要“写”出来给机器用的,因此总是清晰可见的。让思维可见,能够非常有效的提升思考能力(哈佛大学的《Making Thinking Visible》专门就讲这件事)。所以,我猜想虽然计算思维在各个领域都会用到,但却是在计算机领域被首先提炼出来,思维可见性是非常重要的原因。
如何培养计算思维呢?
写程序当然可以,但未必是最好的途径。回想我自己从初中开始写程序,一直写到工作第二年,才意识到自己在进行“问题拆解>模式识别>抽象化”这样的思考。也直到那个时候,我的计算思维的能力才获得突破性的提高。当然这是我愚钝,缺乏元认知,但也从另一个方面反映出单纯通过学写程序来培养计算思维,效率不见得高。
相比而言,我更推荐不插电的方式。
最早接触不插电编程,是在 code.org 上看到教学建议:如果没有电脑,就组织孩子们玩游戏吧,在画着格子的场地上一方下指令前后左右走另一方执行,一样能学会 if...else... 和 repeat...until... 。
再后来我从 csunplugged.org 上看到了很多不需要电脑的课程,教二进制、编解码、搜索排序调度算法等等,公司年会时还学样玩过排序舞:
最近两年我在陪女儿成长的过程中,对不插电又有了新的理解。我意识到不插电不只是把计算机知识简化了、趣味化了以便教给低龄的孩子,更不是为了不用电子产品而把大脑变成机器模拟运算。不插电真正的好处,在于它的可见性比程序更强,也在于它去免去了计算机语言的技术细节,更关注计算思维的本质。因为不插电,我们在生活中随时随地都能进行计算思维的训练。也因为不插电,我们更可以突破实际技术能力的限制,把注意力集中在所思考的问题本身。
举个例子:我喜欢和女儿玩“教机器人做事”的游戏。某次上学路上,我让女儿假设我们开的是一辆还不够智能的无人驾驶车,女儿需要教它让它变得智能。于是,一堆堆的规则就从女儿嘴里冒了出来:
假如速度小于60,加速;
假如接近十字路口,减速;
假如前方有车且距离小于十米,减速;
假如前方有车且距离大于十米但距离在减小,减速;
……
我们生活环境中的万物,不管目前有没有智能,都可以做为“教机器人做事”的素材。从孩子罗列的一大堆规则起步,我们可以讨论某个规则的具体实现方法(算法),可以归类改进成可复用的规则(模式识别,抽象化),可以去了解特定规则所需要的传感器模块(拆分问题)。这,不就是用不插电的方法锻炼计算思维嘛。
再举个例子:引导孩子为闹钟画流程图。
传统的闹钟是怎么工作的?时针转到了闹铃针的位置,就触发闹铃。用简单的循环加条件判断就能画出它的工作流程图。
手机里的闹钟呢?除了设置几点钟响,还有重复的周期,响铃的音乐,还有 SNOOZE 功能。它的流程图就要复杂很多。
检测人浅睡眠的智能手环的闹钟是怎么工作的?在上一幅图的基础上要再增加一个“是否进入浅睡眠”的判断,以及孩子会意识到“进入浅睡眠”的判断本身,又是一个独立的模块。
最后让孩子设计她的高级闹钟的新功能。例如:根据当天日历判断是否需要早起,根据天气判断路况以及上学路上所需时间,根据之前的偏好选择晨起音乐…… 每一个功能,都是可以展开的细细分析的模块。
用插电(编程)的方式去实现孩子的奇思妙想或许太繁琐、有太多实际障碍,虽然写程序的人很擅长 mock,但也得让整体跑通,否则就不完整成就感会大打折扣。不插电,纸上涂涂画画,甚至光靠嘴说,同样也能锻炼计算思维。你需要的只是,在这样的游戏中,能有意识地让这些思维过程被看见。
领取专属 10元无门槛券
私享最新 技术干货