第1关:闯入代码世界——编程思维到底是什么?
期末考的最后一声铃响落下时,林晓(Lin Xiao)正把最后一本数学课本塞进书包侧袋,指节因为用力攥着下周编程竞赛的准考证而微微发白。作为初二(8)班的编程课代表,他上周刚在模拟赛里拿了三等奖,满心想着这次要冲一等奖,却在收拾书包时不小心把准考证滑进了书包最底层那本爸爸送的旧编程书里——那是本封皮磨得发白的《Python入门到实践》,他翻了两次都没找到,索性蹲在教室后门的花架边,把书包倒过来抖。
原本贴着白色瓷砖的地面突然变成了发光的绿色像素块,花架上的绿萝变成了长着代码叶子的荧光树,风里飘着0和1的细碎声响,他还没反应过来,就听见一个蹦蹦跳跳的声音:“欢迎来到代码冒险岛!我是你的引导NPC码灵(Code Spirit),编号CT-001,专门负责引导新手冒险者入门编程思维哒!”
林晓抬头,看见一个淡蓝色发光的小方块,头上戴着个像素眼镜,手里攥着个像游戏手柄一样的发光物体,正歪头看他。他第一反应是最近刷编程视频刷多了出现幻觉,结果码灵伸手戳了戳他手里刚捡出来的准考证,那准考证居然瞬间变成了个发光的铜色钥匙:“你看,你刚才因为想搞清楚‘编程到底是什么’而产生的好奇心,就是打开代码冒险岛的密钥哦。”
“我?好奇心?”林晓愣了愣,“我以为编程就是写代码啊,我上次模拟赛就是敲代码的时候把冒号打成了分号,扣了好多分,我根本学不会,哪有什么好奇心。” 码灵闻言笑得方块身体都抖了抖,掉了一串闪着光的代码碎屑:“哈哈,这是最最常见的误解啦!很多新手一提到编程,就觉得是要背一堆语法、敲一堆看不懂的字母,其实编程的核心从来不是代码本身,而是编程思维(Computational Thinking)——简单来说,就是用结构化、逻辑化的方式解决问题的能力。你刚才收拾书包的时候,其实已经用过好几次编程思维啦!”
“收拾书包也算?”林晓更懵了,“我不过就是把东西塞进去而已啊。” “怎么会是随便塞呢?”码灵拉他走到旁边的像素长椅边坐下,递给他一个装着发光蓝色液体的水杯,“我们来复盘一下你刚才的动作:你是不是先想了一遍今天要带的所有东西,在脑子里列了个小清单?然后把语文、数学这些重的课本放在书包最下层,笔记本放中间,常用的水杯、雨伞放在外侧口袋,充电宝放在小夹层里?整个过程你是不是先做了规划,再分类,最后按规则摆放,最后得到了一个整齐的书包?这个过程的本质,就是编程思维的核心逻辑哦。”
<aside class="sidebar" markdown="1"> 📖 纸书边栏提示:你可以拿出自己的书包,试着回忆刚才整理的过程,对应一下码灵说的步骤,你会发现整理书包原来不是“随便塞”,而是一套有逻辑的流程。 </aside>
一、编程思维的第一个核心:把大问题拆成小任务
码灵指了指长椅旁边一棵长着代码叶子的树,树叶上闪着“Problem Decomposition”的字样:“你看那棵树,是不是由树根、树干、树枝、树叶组成的?如果让你画一棵树,你不会一下子就把整棵树画出来,而是会先画树干,再画树枝,最后画树叶,把‘画树’这个大任务拆成一个个小步骤,每个步骤都很简单,最后合起来就是一棵完整的树。这个过程就是我们说的分解问题(Problem Decomposition),是编程思维的第一个核心能力。”
他挥了挥手,面前的空气里立刻浮现出林晓刚才收拾书包的流程动画:首先是“列出要带的物品清单”,然后是“按类别/重量给物品分组”,最后是“按位置摆放物品”,三个步骤依次完成,最后输出一个整齐的书包。 “你把‘收拾书包’这个大任务,拆成了三个可执行的小任务,每个小任务都有明确的输入和输出:比如‘列清单’的输入是你今天的课表和出门需求,输出是你要带的物品列表;‘分组’的输入是物品列表,输出是分好类的物品组;‘摆放’的输入是分好类的物品组,输出是整理好的书包。每个小任务都不难完成,最后合起来就完成了整个大任务,这就是分解问题的用处呀。”
林晓恍然大悟:“哦!我想起来了,我上次规划周末行程的时候就是这么做的!我周末要上钢琴课、买文具、写作业、玩半小时游戏,我不会一下子就说‘我周末要忙死了’,而是先把大任务‘过周末’拆成四个小任务,然后给每个任务分配时间:比如上午9点到10点半上钢琴课,10点半到11点去买文具,下午2点到4点写作业,4点到4点半玩游戏,中间留20分钟吃午饭,这样安排下来,我既能把所有事做完,又不会累,还能有时间玩。”
“没错!”码灵打了个响指,周围的像素树都闪了闪,“不管是收拾书包、规划行程,还是以后做更大的项目,比如办班级晚会、做科创作品,第一步都是把大问题拆成一个个能解决的小任务,不然面对一个大问题,你肯定会觉得无从下手呀。”
<aside class="sidebar" markdown="1"> 💡 电子版互动提示:点击这里观看「1分钟看懂问题分解」的动画视频,看看游戏设计师是怎么把“做一个开放世界游戏”这个大任务拆成几百个小任务的吧! </aside>
二、编程思维的第二个核心:找到重复的规律
“分解完问题之后,第二步就是要找规律啦。”码灵点了点自己的像素眼镜,镜片上立刻浮现出几个跳动的数字,“你看我手里的这些数字:2、4、6、8、10、12……你是不是一眼就能看出来,这些都是偶数,后一个数比前一个数大2?你不用一个一个数,就能知道第10个数是20,
期末考的最后一声铃响落下时,林晓(Lin Xiao)正把最后一本数学课本塞进书包侧袋,指节因为用力攥着下周编程竞赛的准考证而微微发白。作为初二(8)班的编程课代表,他上周刚在模拟赛里拿了三等奖,满心想着这次要冲一等奖,却在收拾书包时不小心把准考证滑进了书包最底层那本爸爸送的旧编程书里——那是本封皮磨得发白的《Python入门到实践》,他翻了两次都没找到,索性蹲在教室后门的花架边,把书包倒过来抖。
原本贴着白色瓷砖的地面突然变成了发光的绿色像素块,花架上的绿萝变成了长着代码叶子的荧光树,风里飘着0和1的细碎声响,他还没反应过来,就听见一个蹦蹦跳跳的声音:“Welcome to Code Adventure Island! 我是你的引导NPC码灵(Code Spirit),编号CT-001,专门负责引导新手冒险者入门编程思维哒!”
林晓抬头,看见一个淡蓝色发光的小方块,头上戴着个像素眼镜,手里攥着个像游戏手柄一样的发光物体,正歪头看他。他第一反应是最近刷编程视频刷多了出现幻觉,结果码灵伸手戳了戳他手里刚捡出来的准考证,那准考证居然瞬间变成了个发光的铜色钥匙:“你看,你刚才因为想搞清楚‘编程到底是什么’而产生的好奇心,就是打开代码冒险岛的密钥哦。”
“我?好奇心?”林晓愣了愣,“我以为编程就是写代码啊,我上次模拟赛就是敲代码的时候把冒号打成了分号,扣了好多分,我根本学不会,哪有什么好奇心。” 码灵闻言笑得方块身体都抖了抖,掉了一串闪着光的代码碎屑:“哈哈,这是最最常见的误解啦!很多新手一提到编程,就觉得是要背一堆语法、敲一堆看不懂的字母,其实编程的核心从来不是代码本身,而是编程思维(Computational Thinking)——简单来说,就是用结构化、逻辑化的方式解决问题的能力。你刚才收拾书包的时候,其实已经用过好几次编程思维啦!”
“收拾书包也算?”林晓更懵了,“我不过就是把东西塞进去而已啊。” “怎么会是随便塞呢?”码灵拉他走到旁边的像素长椅边坐下,递给他一个装着发光蓝色液体的水杯,“这杯是逻辑气泡水,蓝莓味的,喝了能让你思路更清楚~我们来复盘一下你刚才的动作:你是不是先想了一遍今天要带的所有东西,在脑子里列了个小清单?然后把语文、数学这些重的课本放在书包最下层,笔记本放中间,常用的水杯、雨伞放在外侧口袋,充电宝放在小夹层里?整个过程你是不是先做了规划,再分类,最后按规则摆放,最后得到了一个整齐的书包?这个过程的本质,就是编程思维的核心逻辑哦。”
<aside class="sidebar" markdown="1"> 📖 纸书边栏提示:你可以拿出自己的书包,试着回忆刚才整理的过程,对应一下码灵说的步骤,你会发现整理书包原来不是“随便塞”,而是一套有逻辑的流程。 </aside>
林晓接过水杯喝了一口,确实是熟悉的蓝莓味,和他上周在小卖部买的冰棒一个味道,他砸了砸嘴,突然觉得刚才因为找不到准考证有点焦躁的情绪平复了不少。他环顾四周,才发现长椅旁边不远处的像素草地上,还有好几个冒险者:一个扎马尾的小女孩举着像素画笔在画荧光树,一个戴眼镜的小男孩拿着计算器在算树上的数字谜题,还有一个拿着麦克风的小方块在哼歌,码灵介绍说这些都是来代码冒险岛学编程思维的,有的是设计师,有的是奥数选手,还有的是音乐人,他们都说编程思维帮他们解决了很多之前解决不了的问题。
“你看,编程思维不是只有程序员才需要哦,”码灵像是看穿了他的想法,指了指那个画画的女孩,“那个姐姐是做UI设计的,她用编程思维做界面设计,用户用起来特别顺手;那边算数的小哥哥是初中生,他用编程思维解数学压轴题,比之前快了一倍;唱歌的那个姐姐是作词人,她用编程思维写歌词,韵脚从来没卡过壳~所以不管你想做什么,编程思维都能帮到你。”
一、编程思维的第一个核心:把大问题拆成小任务
码灵指了指长椅旁边一棵长着代码叶子的树,树叶上闪着“Problem Decomposition”的字样:“你看那棵树,是不是由树根、树干、树枝、树叶组成的?如果让你画一棵树,你不会一下子就把整棵树画出来,而是会先画树干,再画树枝,最后画树叶,把‘画树’这个大任务拆成一个个小步骤,每个步骤都很简单,最后合起来就是一棵完整的树。这个过程就是我们说的分解问题(Problem Decomposition),是编程思维的第一个核心能力。”
他挥了挥手,面前的空气里立刻浮现出林晓刚才收拾书包的流程动画,旁边还配着简单的Python伪代码: ```python
收拾书包的伪代码
def 整理书包(): 物品清单 = 列出行李清单(课表, 出门需求) # 输入:今天的课表、出门要带的东西 分类物品 = 按类别分组(物品清单) # 按课本、文具、杂物分类 整理好的书包 = 按位置摆放(分类物品) # 重物放下层,常用物放外侧 return 整理好的书包 ``` “你把‘收拾书包’这个大任务,拆成了三个可执行的小任务,每个小任务都有明确的输入和输出:比如‘列清单’的输入是你今天的课表和出门需求,输出是你要带的物品列表;‘分组’的输入是物品列表,输出是分好类的物品组;‘摆放’的输入是分好类的物品组,输出是整理好的书包。每个小任务都不难完成,最后合起来就完成了整个大任务,这就是分解问题的用处呀。”
林晓恍然大悟:“哦!我想起来了,我上次规划周末行程的时候就是这么做的!我周末要上钢琴课、买文具、写作业、玩半小时游戏,我不会一下子就说‘我周末要忙死了’,而是先把大任务‘过周末’拆成四个小任务,然后给每个任务分配时间:比如上午9点到10点半上钢琴课,10点半到11点去买文具,下午2点到4点写作业,4点到4点半玩游戏,中间留20分钟吃午饭,这样安排下来,我既能把所有事做完,又不会累,还能有时间玩。”
“没错!”码灵打了个响指,周围的像素树都闪了闪,“不管是收拾书包、规划行程,还是以后做更大的项目,比如办班级晚会、做科创作品,第一步都是把大问题拆成一个个能解决的小任务,不然面对一个大问题,你肯定会觉得无从下手呀。我给你举个更复杂的例子:要是让你办一场班级的圣诞晚会,你肯定不会一下子就说‘我要办晚会’,而是会把它拆成‘定时间地点’‘报节目’‘买零食装饰’‘写主持稿’‘彩排’‘正式举办’这几个大任务,每个大任务再拆成更小的:比如‘报节目’可以拆成‘在班级群里发通知’‘统计节目数量’‘安排节目顺序’,每个小任务都很简单,最后合起来就是一场完整的晚会。”
<aside class="sidebar" markdown="1"> 💡 电子版互动提示:点击这里观看「1分钟看懂问题分解」的动画视频,看看游戏设计师是怎么把“做一个开放世界游戏”这个大任务拆成几百个小任务的吧! </aside>
二、编程思维的第二个核心:找到重复的规律
“分解完问题之后,第二步就是要找规律啦。”码灵点了点自己的像素眼镜,镜片上立刻浮现出几个跳动的数字,“你看我手里的这些数字:2、4、6、8、10、12……你是不是一眼就能看出来,这些都是偶数,后一个数比前一个数大2?你不用一个一个数,就能知道第10个数是20,第100个数就是200,甚至第1000个数是2000,根本不用一个个算,这就是找规律的好处呀。”
林晓举手:“这个我懂!我上次数学作业算1到100的和,我傻乎乎地加了100行,算到第50行的时候手都酸了,后来同桌告诉我用(首项+末项)×项数÷2,我一下就算出来了,原来这就是找规律啊!” 码灵打了个响指:“对啦!你刚才说的那个公式,就是无数人算过1加到n的和之后,总结出来的规律,你不用每次都重新加一遍,直接用现成的规律就能算出来,省了好多时间。我们把这个过程叫做模式识别(Pattern Recognition),就是找出问题里重复出现的规律,然后用这个规律来解决更多类似的问题,不用每次都从头开始做。”
他挥了挥手,镜片上的数字变成了《原神》的副本奖励列表:“你上次玩《原神》刷圣遗物副本,是不是发现每次刷出来的奖励都是固定的几种?比如每次刷‘仲夏庭院’副本,要么出花要么出羽毛,要么出沙漏要么出杯子,要么出头要么出冠,而且每个部位的圣遗物主属性有固定的范围?你是不是刷了两次之后就知道,这个副本不会出武器和角色突破材料,所以你刷圣遗物的时候只会刷这个副本,不会去刷别的没用的副本?这个‘知道副本奖励规律’的过程,就是模式识别呀。你找出了规律,就不用每次都把所有副本都刷一遍找奖励,省了好多时间。”
“在编程里,模式识别最常用的就是循环(Loop)结构。”码灵点了点树叶上的“for”“while”代码字样,“比如你要让电脑打印100句‘你好,代码冒险岛’,你不用写100行`print('你好,代码冒险岛')`,你只要找到‘打印一句话’这个重复的规律,然后用循环结构写1行代码,就能让电脑自动重复执行100次,这就是找规律帮我们省时间的地方呀。”
林晓突然想起上周的模拟赛,脸一下子红了:“哦……我上次模拟赛的时候,就是写代码算1到100的和,我傻乎乎地写了100行`a = a + i`,结果运行超时了,扣了好多分,原来我就是没找‘重复加同一个数’的规律,没用循环结构啊……” “没错!”码灵笑着指了指他的鼻尖,“你当时要是用了模式识别,找到加数的规律,用循环写,不仅代码只有3行,运行速度还快好几倍,肯定能拿高分呀。模式识别不仅用在编程里,你背九九乘法表的时候也在用:你看1×9=9,2×9=18,3×9=27,个位是9、8、7、6……十位是0、1、2、3……你只要找到这个规律,背乘法表就不用一个个死记硬背了,是不是?”
林晓点了点头,他确实之前背乘法表的时候,就是靠这个规律记的,以前总觉得背乘法表难,现在才发现原来自己早就用过模式识别了。
三、编程思维的第三个核心:抓核心、忽略细节的抽象能力
“找完规律之后,第三步就是抽象(Abstraction)啦。”码灵挥了挥手,面前的空气里浮现出一张班级大扫除的分配图,“你有没有过这种经历?你画一棵树的时候,不会把每片树叶的纹路、每根树枝的树皮都画得和真树一模一样,你只要画出树干、树枝、树冠的大致轮廓,别人一看就知道是树,这就是抽象——忽略掉不重要的细节,抓住最核心的特征,不用把所有细节都做完,就能解决问题。”
他点了点大扫除的分配图:“你看你们上次大扫除,你们分工的时候,是不是不需要每个人都学会擦玻璃、拖地、摆桌椅、擦黑板,你只要负责擦玻璃,其他人各负责各的,每个人只要做好自己负责的那部分就行?这个分工的过程也是抽象——你不需要知道拖地的具体步骤、摆桌椅的详细要求,只要知道‘拖地’这个任务的核心是‘把地面弄干净’,把这个任务交给擅长的人就行,你不用管细节,就能完成整个大扫除的工作。”
“抽象最大的好处就是能降低复杂度。”码灵打了个响指,周围的像素树旁边浮现出几个模块化的代码块,“如果让你一个人办黑板报,你要会画画、会写字、会剪纸,那肯定忙不过来,但你把任务抽象成几个不同的类别:画画模块、写字模块、装饰模块,每个模块交给不同的人做,最后拼起来就是完整的黑板报。在编程里也是一样,如果你要做一个班级管理的小程序,你不用一个人把所有功能都写完,你可以把功能
在编程里也是一样,如果你要做一个班级管理的小程序,你不用一个人把所有功能都写完,你可以把功能拆成几个不同的模块:考勤模块、成绩模块、通知模块,每个模块只负责自己的核心功能,你不用管每个模块里面的具体代码怎么写,只要知道每个模块能实现什么就行,最后把这些模块拼起来,就是一个完整的小程序。这就是抽象的好处——你不用陷在细节里,只要抓住核心,就能把大问题解决掉。”
林晓眼睛亮了:“哦!我上次办黑板报的时候就是这样的!我不会画画,我就负责找素材、贴装饰,画画的部分交给会画画的同学,写字的部分交给写字好看的同学,我们不用每个人都学会所有技能,只要做好自己负责的部分,最后黑板报就办得特别好,原来这就是抽象啊!” “对啦!”码灵打了个响指,周围的像素树纷纷落下闪着光的代码花瓣,“不过抽象可不是越粗越好哦,你要是把办黑板报抽象成‘去学校玩’,那肯定办不好,抽象的程度要刚好匹配你的需求:要是办班级的黑板报,你只要抽象成‘内容策划、美术设计、文字书写、物资准备’四个模块就够了;要是办全校的黑板报比赛,你还要再抽象出‘评委对接、时间规划、人员分工’这些模块,程度刚好够用就行,不用太粗也不用太细。”
他挥了挥手,面前的空气里浮现出三个不同精度的树的抽象图:第一个是只有绿色轮廓的简笔画树,第二个是有树干树冠的卡通树,第三个是有树叶纹路、树皮质感的写实树:“你看这三棵树,如果你是给幼儿园小朋友讲‘什么是树’,第一个简笔画就够了;如果你是给美术生做范画,第二个卡通树就够用;如果你是给植物学家做研究,才需要第三个写实的树。抽象的核心是抓当前问题的核心特征,忽略无关的细节,不是越简单越好,也不是越复杂越好,刚好够用才是最好的。”
<aside class="sidebar" markdown="1"> 📖 纸书边栏提示:下次你和同学一起做项目的时候,可以试试用抽象的方法分工,每个人只负责自己擅长的模块,你会发现效率高了好多! </aside>
三、编程思维的第三个核心:抓核心、忽略细节的抽象能力
林晓正盯着那三棵树看,码灵已经挥了挥手,画面切换到了代码冒险岛的“抽象广场”:那里有很多冒险者拿着不同颜色的模块方块,在拼装不同的小装置,有的拼成了自动喝水机,有的拼成了自动喂鱼器,有的拼成了自动削笔刀。 “你看那些冒险者,他们不用知道每个模块里面的电路是怎么连的、代码是怎么写的,只要知道每个模块的功能:比如‘感应模块’能检测人是不是在面前,‘出水模块’能控制出水的多少,‘电源模块’能给整个装置供电,他们只要把这些模块按规则拼起来,就能做出能用的装置,这个过程就是抽象——你