第一章 启程:计算思维与编程世界初探 / Chapter 1: Embarkation: First Exploration of Computational Thinking and the Programming World
当你打开短视频APP,刷到感兴趣的美食、游戏、宠物内容时,你有没有想过,为什么平台总能精准推送你喜欢的内容?当你玩《我的世界》时,游戏里自动生成的村庄、随机出现的怪物,背后遵循着什么规律?当你用搜题APP拍一下题目,就能得到详细的解题步骤时,这背后又用到了什么技术?这些看似神奇的功能,本质上都是基于计算思维(Computational Thinking)设计的解决方案——而这就是我们要在本书中一起探索的奇妙世界。
很多人误以为“计算思维”只有程序员或者计算机专业的学生才需要学习,但实际上,它是一种普适的思维工具,能帮助任何人更高效地解决生活中、学习中的各类问题。2006年,美国卡内基梅隆大学(Carnegie Mellon University)的计算机科学家周以真(Jeannette Wing)教授在顶尖学术期刊《美国计算机协会通讯》(*Communications of the ACM*)上发表了一篇里程碑式的论文,首次正式提出了“计算思维”的学术定义。她在论文中指出:“计算思维是运用计算机科学的基础概念进行问题求解、系统设计、人类行为理解等的一系列思维活动,它应该成为每个人都具备的基础素养,就像读、写、算一样,是21世纪每个人都需要掌握的核心能力。” 周以真教授提出这个概念的核心目的,就是打破“编程只是计算机专业学生才需要学习的技能”的刻板印象:无论你未来想成为医生、教师、艺术家还是工程师,计算思维都能帮助你更高效地解决问题,更好地适应数字化时代的生活。<!-- 📱 电子版侧边栏:周以真教授目前担任卡内基梅隆大学副校长,是美国国家工程院院士,她还提出了“面向所有人的计算机科学”(*Computer Science for All*)的倡议,推动全球K12阶段计算机教育的普及,目前全球已有超过50个国家将计算思维纳入中小学必修课程。 -->
周以真教授将计算思维的核心概括为四个相互关联、层层递进的核心要素:分解(Decomposition)、模式识别(Pattern Recognition)、抽象(Abstraction)、算法(Algorithm)。这四个要素不是孤立存在的,而是构成了从“面对复杂问题”到“得到可落地解决方案”的完整思维链条,其逻辑关系可以用下图清晰展现:
```mermaid graph LR A[复杂现实问题] --> B[分解Decomposition:拆解为多个可独立处理的小问题] B --> C[模式识别Pattern Recognition:挖掘小问题中的共性规律] C --> D[抽象Abstraction:剥离非核心细节,提炼通用模型] D --> E[算法Algorithm:设计可复用的标准化解决步骤] E --> F[可落地、可复用的数字化解决方案] ```
1.1 分解(Decomposition):把大问题拆成小问题
分解是计算思维的第一步,指的是将一个复杂、庞大的大问题,拆解成若干个规模更小、逻辑更简单、更容易独立解决的小问题的过程。你可能会觉得这个概念很抽象,但实际上它早已融入你的日常生活:比如你要组织一场班级元旦联欢会,这个“大问题”看起来非常复杂,但你可以把它拆解成6个独立的小问题:① 确定联欢会的时间、地点和预算;② 邀请班主任和任课老师参加;③ 组织同学报名节目并彩排;④ 采购零食、装饰品和奖品;⑤ 安排主持人串场和游戏环节;⑥ 联欢会结束后组织同学打扫教室。每个小问题的解决难度都远低于整个联欢会的组织难度,把所有小问题都解决之后,组合起来就能顺利完成整个联欢会的组织工作。
在编程场景中,分解是解决复杂编程问题的第一步。比如你要用Scratch做一个“接苹果”的小游戏,这个“大问题”可以拆解成4个独立的小模块:① 苹果角色从屏幕顶部随机位置不断下落;② 篮子角色跟随鼠标左右移动;③ 接到苹果加10分,苹果碰到地面扣5分;④ 游戏时长60秒,结束后显示总分。你不需要一开始就想清楚整个游戏的所有逻辑,只需要逐个完成每个小模块,最后把它们组合起来,就能得到一个完整的可运行的游戏。如果你跳过分解的步骤,直接开始写整个游戏的代码,很容易陷入逻辑混乱,甚至写了一半发现根本跑不通,只能全部推翻重来。
1.2 模式识别(Pattern Recognition):找到重复的规律
模式识别是计算思维的第二步,指的是在分解出来的小问题中,找到重复出现的规律、共同的特征,把这些规律提炼出来,就能用同样的方法解决一类问题,不用每次都重新想解决办法,大幅提升解决问题的效率。
当你打开短视频APP,刷到感兴趣的美食、游戏、宠物内容时,你有没有想过,为什么平台总能精准推送你喜欢的内容?当你玩《我的世界》时,游戏里自动生成的村庄、随机出现的怪物,背后遵循着什么规律?当你用搜题APP拍一下题目,就能得到详细的解题步骤时,这背后又用到了什么技术?这些看似神奇的功能,本质上都是基于计算思维(Computational Thinking)设计的解决方案——而这就是我们要在本书中一起探索的奇妙世界。
很多人误以为“计算思维”只有程序员或者计算机专业的学生才需要学习,但实际上,它是一种普适的思维工具,能帮助任何人更高效地解决生活中、学习中的各类问题。2006年,美国卡内基梅隆大学(Carnegie Mellon University)的计算机科学家周以真(Jeannette Wing)教授在顶尖学术期刊《美国计算机协会通讯》(*Communications of the ACM*)上发表了一篇里程碑式的论文,首次正式提出了“计算思维”的学术定义。她在论文中指出:“计算思维是运用计算机科学的基础概念进行问题求解、系统设计、人类行为理解等的一系列思维活动,它应该成为每个人都具备的基础素养,就像读、写、算一样,是21世纪每个人都需要掌握的核心能力。” 周以真教授提出这个概念的核心目的,就是打破“编程只是计算机专业学生才需要学习的技能”的刻板印象:无论你未来想成为医生、教师、艺术家还是工程师,计算思维都能帮助你更高效地解决问题,更好地适应数字化时代的生活。<!-- 📱 电子版侧边栏:周以真教授目前担任卡内基梅隆大学副校长,是美国国家工程院院士,她还提出了“面向所有人的计算机科学”(*Computer Science for All*)的倡议,推动全球K12阶段计算机教育的普及,目前全球已有超过50个国家将计算思维纳入中小学必修课程。 点击此处可查看周以真教授2006年原始论文摘要 → [ACM论文链接](https://dl.acm.org/doi/10.1145/1118178.1118215) -->
周以真教授将计算思维的核心概括为四个相互关联、层层递进的核心要素:分解(Decomposition)、模式识别(Pattern Recognition)、抽象(Abstraction)、算法(Algorithm)。这四个要素不是孤立存在的,而是构成了从“面对复杂问题”到“得到可落地解决方案”的完整思维链条,其逻辑关系可以用下图清晰展现:
```mermaid graph LR A[复杂现实问题] --> B[分解Decomposition:拆解为多个可独立处理的小问题] B --> C[模式识别Pattern Recognition:挖掘小问题中的共性规律] C --> D[抽象Abstraction:剥离非核心细节,提炼通用模型] D --> E[算法Algorithm:设计可复用的标准化解决步骤] E --> F[可落地、可复用的数字化/非数字化解决方案] ```
1.1 分解(Decomposition):把大问题拆成小问题
分解是计算思维的第一步,指的是将一个复杂、庞大的大问题,拆解成若干个规模更小、逻辑更简单、更容易独立解决的小问题的过程。你可能会觉得这个概念很抽象,但实际上它早已融入你的日常生活:比如你要组织一场班级元旦联欢会,这个“大问题”看起来非常复杂,但你可以把它拆解成6个独立的小问题:① 确定联欢会的时间、地点和预算;② 邀请班主任和任课老师参加;③ 组织同学报名节目并彩排;④ 采购零食、装饰品和奖品;⑤ 安排主持人串场和游戏环节;⑥ 联欢会结束后组织同学打扫教室。每个小问题的解决难度都远低于整个联欢会的组织难度,把所有小问题都解决之后,组合起来就能顺利完成整个联欢会的组织工作。
再比如你玩竞技类游戏《英雄联盟》时,想要提升段位这个大目标,也可以拆解成四个可落地的小目标:① 练好1-2个自己擅长的英雄,熟练掌握技能连招;② 学习地图意识、兵线运营和视野布置的知识;③ 练习和队友的沟通技巧,学会配合;④ 每输掉一局比赛就复盘,找到自己的失误点并改进。如果你不把“上分”这个大目标拆解,而是盲目打排位,很容易陷入“赢了是运气好,输了是队友坑”的循环,永远无法进步。
在编程场景中,分解是解决复杂编程问题的第一步。比如你要用Scratch做一个“接苹果”的小游戏,这个“大问题”可以拆解成4个独立的小模块:① 苹果角色从屏幕顶部随机位置不断下落;② 篮子角色跟随鼠标左右移动;③ 接到苹果加10分,苹果碰到地面扣5分;④ 游戏时长60秒,结束后显示总分。你不需要一开始就想清楚整个游戏的所有逻辑,只需要逐个完成每个小模块,最后把它们组合起来,就能得到一个完整的可运行的游戏。如果你跳过分解的步骤,直接开始写整个游戏的代码,很容易陷入逻辑混乱,甚至写了一半发现根本跑不通,只能全部推翻重来。
<!-- 📱 电子版侧边栏:新手误区提示 很多同学在分解问题时容易犯两个错误:一是把问题拆得太碎,比如把“做接苹果游戏”拆成“打开Scratch”“新建角色”“设置背景”这种不需要思考的步骤,反而增加了负担;二是拆解后的小问题之间没有逻辑关联,比如把“苹果下落”和“篮子移动”拆成完全独立的两个部分,最后组合的时候发现逻辑不通。正确的分解方法是:每个小问题都是需要独立解决、有明确输出结果的,且小问题之间是相互关联、可以组合成完整解决方案的。 -->
1.2 模式识别(Pattern Recognition):找到重复的规律
模式识别是计算思维的第二步,指的是在分解出来的小问题中,找到重复出现的规律、共同的特征,把这些规律提炼出来,就能用同样的方法解决一类问题,不用每次都重新想解决办法,大幅提升解决问题的效率。
举个最简单的例子:你刚学加法的时候,1+2=3,2+3=5,3+4=7,你会发现所有的加法都有一个共同规律:两个数相加,和等于两个数的数值相加。这个规律就是模式,你识别出这个模式之后,不管给你哪两个数相加,都不用再一个个数手指,直接用规律就能算出结果。而九九乘法表本质上就是模式识别的产物:你不需要记住所有乘法算式,只要记住“几乘几等于几十几”的规律,就能快速算出所有乘法结果。
在编程场景中,模式识别是提升代码效率的核心。比如你要实现“让Scratch里的角色走一个正方形”的功能,你尝试操作几次就会发现:角色每次向前移动10步,然后右转90度,重复4次就能回到原点,走完整个正方形。这个“移动+右转90度”的动作就是重复出现的模式,你不需要写4次“移动10步,右转90度”的代码,只需要用Scratch里的“重复执行4次”积木,把“移动10步,右转90度”放进去,就能实现同样的效果。如果你没有识别出这个模式,写出来的代码会又长又容易出错。
再比如你玩《我的世界》建房子时,你会发现建任何建筑都有通用的模式:先打地基,再建墙,再建屋顶,最后做装修。你识别出这个模式之后,建任何房子都可以按照这个流程来,不用每次建房子都重新思考步骤,这就是模式识别在游戏中的实际应用。
1.3 抽象(Abstraction):抓住核心,忽略无关细节
抽象是计算思维的第三步,也是很多初学者觉得最难理解的部分,它的本质是:在面对问题时,有目的地忽略和当前问题无关的细节,只保留最核心的特征,从而提炼出通用的模型。抽象不是“想当然地简化”,而是有明确的目的性:你抽象时首先要明确“我要解决什么问题”,只保留和解决问题相关的细节,去掉不相关的细节。
举个生活中的例子:你要画一个“苹果”,如果是为了做“接苹果”游戏,你只需要画一个红色的圆形,不需要画苹果的柄、叶子、表面的斑点,因为这些细节和“接苹果”的游戏逻辑无关;如果是为了做“水果知识科普”游戏,你就需要把柄、叶子、果肉都画出来,因为这些细节和科普的目的相关。同样是画苹果,因为目的不同,抽象的程度和保留的细节也不同,这就是抽象的灵活性。
再举个编程中的例子:你要写一个“计算矩形面积”的功能,你不需要每次都写“长×宽”的代码,而是可以把“计算矩形面积”的逻辑抽象成一个通用的函数:输入是矩形的长和宽,输出是面积。以后不管你需要计算多少个矩形的面积,只要调用这个函数,传入长和宽就能得到结果,不用每次都重新写计算逻辑。在Scratch里,你可以把“计算矩形面积”的逻辑封装成“自制积木”,在Python里可以封装成函数,这就是高层次抽象的应用:把重复使用的逻辑封装成可复用的模块,以后需要的时候直接调用就行。
抽象的核心价值是复用:你抽象出的通用模型,可以用在无数个相似的问题里。比如你抽象出“角色下落”的通用模型:角色从顶部随机位置出现,y坐标不断减少,碰到边界就回到顶部,这个模型不仅可以用来做苹果下落,还可以用来做香蕉、橘子、炸弹等所有需要下落的角色,只要改一下初始位置、下落速度和外观就行,不用为每个角色都重新写一遍下落的代码。
1.4 算法(Algorithm):把思路变成可执行的步骤
算法是计算思维的最后一步,也是将抽象模型落地的关键:算法是解决特定问题的、有限步骤的明确集合,每一步都有明确的定义,没有歧义,按照步骤执行就能得到问题的答案。
很多人会把“算法”和“代码”混淆,其实两者有本质区别:算法是解决问题的思路,是通用的、和编程语言无关的;代码是把算法用具体的编程语言写出来的实现,同一个算法可以用Scratch写,也可以用Python写,甚至可以用中文、英文写。
算法有四个必须满足的特性: 1. 有穷性:算法必须在有限的步骤内结束,不能无限循环。比如“猜数字”游戏的算法,猜对之后就会结束,不会无限猜下去。 2. 确定性:算法的每一步都有明确的定义,不会有歧义。比如“把苹果往下移5步”是确定的,“把苹果移一点”就是不确定的,不是有效的算法步骤。 3. 输入输出:算法要有输入(比如苹果的初始位置、下落速度),要有输出(比如分数、游戏结束提示),没有输入输出的算法没有实际意义。 4. 可行性:算法的每一步都可以被实际执行,不能用“算一下分数”这种模糊的步骤。
举个生活中的算法例子:你做番茄炒蛋的菜谱就是标准的算法: > 输入:2个番茄、2个鸡蛋、