去年我帮朋友带了一个信息学奥赛的暑期班,30个孩子,最小的四年级,最大的初二。第一天我让他们用Scratch做一个“自动点名器”,结果25个人能默写出冒泡排序的代码,但只有8个人能自己设计出一个能用的点名逻辑。剩下的22个孩子卡在同一个地方:他们不知道“点名”这件事该怎么拆成一步步的指令。有个孩子甚至问我:“老师,点名不是老师喊名字就行了吗?为什么要用电脑?”那一刻我才意识到,大部分人对计算思维的理解,从一开始就跑偏了。
计算思维这个词是周以真(Jeannette Wing)在2006年3月的《Communications of the ACM》上正式提出的,原文标题叫“Computational Thinking”,卷49,第3期,33-35页。她当时说得很清楚:计算思维是“利用计算机科学的基本概念来解决问题、设计系统和理解人类行为”。注意,是“利用概念”,不是“写代码”。后来美国计算机科学教师协会(CSTA)把它拆成五个要素:分解、模式识别、抽象、算法、调试。但我在实际教学里发现,最要命的是最后那个“调试”——因为调试意味着你要承认自己一开始想错了,然后反复改。这跟数学思维完全不一样。数学思维追求一步到位的证明,工程思维追求在成本和工期之间妥协,而计算思维追求的是“可执行的抽象”:先把问题变成一个能跑起来的东西,哪怕它很丑,然后再迭代。
我面试过50多个计算机专业的应届生,问过同一个问题:“设计一个判断用户是否可能流失的模型,你会怎么做?”其中47个人直接开始写代码,或者问我用什么算法。只有3个人先问:“流失的定义是什么?是7天不登录还是30天?数据里有哪些字段?时间窗口多长?”这3个人后来我都给了offer。为什么?因为写代码这件事,AI已经能帮你干得七七八八了——GitHub Copilot在2021年发布时,就能自动补全近40%的代码。但定义问题、拆解需求、抽象出关键变量,这些是AI替代不了的。计算思维不是让你像计算机一样思考,那是机器思维。它是让你学会把人类模糊的、带情绪的、充满歧义的需求,翻译成计算机能执行的精确指令,同时保留你对目标的判断。
那怎么培养?千万别一上来就学Python。我试过一个方法,效果不错:让孩子规划一次家庭旅行,给定条件是——预算5000元,3天时间,2个老人,1个6岁小孩。让他们分解任务(交通、住宿、餐饮、景点),找规律(老人走不动,每天最多2个景点;小孩要午睡,下午2点前必须回酒店),抽象(把“交通”抽象成“高铁+地铁+打车”三个模块),最后写出算法(第一天上午去哪里,下午去哪里,晚上吃什么)。10个孩子里,有7个做出来的方案比他们家长做的还合理。然后再让他们用Scratch做一个简单的模拟,看看如果堵车了怎么办。这就是计算思维——先有问题的框架,再考虑用不用计算机。
最后说句实在话。我花了差不多5年才真正搞明白,计算思维不是一门课,也不是一个技能,它更像是一种“提问的习惯”。遇到任何问题,先问:输入是什么?输出是什么?中间有哪些步骤可以重复?哪些可以抽象成一个函数?哪些边界情况我没想到?如果你只是刷算法题、背模板,那和背古诗没什么区别。真正有用的,是你在生活里碰到一个烂摊子时,能下意识地开始拆解它。反正我现在看到任何复杂的事情,第一反应都是:先画个流程图再说。