开篇:你早已是程序员——那些藏在生活里的编程思维
周五下午六点的厨房飘着糖醋排骨的焦香,李女士把沾了油渍的超市促销传单拍在实木餐桌上,手里攥着的红色马克笔在挂历上圈出三个醒目的红圈——这已经是他第无数次筹备周末的家庭聚餐了。她先抬头问刚下班的老公:“这周末舅舅一家来,表姐带三岁的小侄子,小姨夫
周五下午六点的厨房飘着糖醋排骨的焦香,李女士把沾了油渍的超市促销传单拍在实木餐桌上,手里攥着的红色马克笔在挂历上圈出三个醒目的红圈——这已经是他第无数次筹备周末的家庭聚餐了。她先抬头问刚下班的老公:“这周末舅舅一家来,表姐带三岁的小侄子,小姨夫海鲜过敏的消息你上次跟我说过,还有吗?”
老公一边踢掉上班穿的皮鞋,一边把公文包扔在玄关的置物架上,漫不经心地答:“哦对,小姨夫对虾和花生都过敏,去年在老家吃了虾馅饺子,浑身起疹子去的医院,差点喘不上气,这次千万别买海鲜类的。还有奶奶上次说你家做的红烧肉太硬,嚼得后槽牙疼了三天,这次炖烂点。表姐家娃不吃辣,别放辣椒,上次你做的辣子鸡他尝了一口就哭了,表姐脸都黑了。”李女士一边应着,一边在传单边缘写下几个加粗的关键词:海鲜过敏、软食、无辣、儿童无刺,指尖因为常年做饭沾了洗洁精,有些发皱。
她特意提前一周就在家庭群里发了个在线共享表格,让每个人填自己的饮食禁忌和特殊需求,表格里列了“是否过敏(过敏源是什么)”“饮食偏好(素食/不吃辣/清真等)”“特殊需求(老人软食/儿童无刺/糖尿病要低糖等)”三个必填项,连平时很少冒泡的奶奶都特意让表姐帮忙填了“牙口不好,要吃炖烂的肉,不能吃凉的”。去年聚餐的教训她还记着:当时她没提前问禁忌,买了虾仁做三鲜馅,小姨夫吃了直接送急诊,住了三天院,花了一万多,她愧疚了快半年,这次特意多留了个心眼。
写完了关键词,李女士拿起手机翻出来上次聚餐的复盘笔记,那是她上个月刚写的,上面列了上次的问题:①素菜只准备了两道,吃素的奶奶和小姨都没吃饱;②忘了准备小朋友的餐具,最后用了大人的不锈钢碗,边缘太锋利,小侄子差点划到嘴;③备菜时间不够,开饭晚了四十分钟,舅舅赶火车差点迟到。这次她把这些问题一条一条划掉,在旁边写上对应的解决措施:素菜准备四道,提前买儿童专用的软边餐具,提前一天预处理食材,当天不用再洗菜切菜。
接下来要做的事其实很明确:先定菜单,再列采购清单,然后规划去超市的时间——周末的超市早上九点开门,去晚了新鲜排骨和绿叶菜都会被抢光,她打算八点半就出门,骑电动车十分钟到超市,赶在第一批人进去的时候采购。然后提前一天把肉类腌好,蔬菜洗好切好分装进保鲜盒,当天只需要炒菜就行。现场分工她也想好了:老公负责搬东西、布置客厅、摆餐具,表姐来了之后让她帮忙看小侄子,她负责做饭,小姨夫负责陪舅舅喝酒聊天,奶奶负责带小侄子玩。她还特意在备忘录里加了一条应急预案:如果菜不够,就提前存好附近饭店的电话,点两个菜送上门;如果小朋友闹,就把提前准备好的贴纸书和动画片投在电视上,肯定能哄住。
你可能会觉得,这不就是普通人筹备一次聚餐的正常操作吗?有什么特别的?但如果你把李女士的整个流程拆解开,会发现她每一步都在用计算思维(Computational Thinking)——也就是我们常说的“编程思维”,只是她从来没有写过一行代码,也没有意识到自己已经在用程序员的核心能力解决问题。
一、藏在厨房里的编程思维:从家庭聚餐到计算思维四要素
很多人对“编程思维”的第一印象是“写代码”“程序员专属”“需要很高的数学基础”,但实际上,计算思维的本质是用有限的步骤解决无限问题的通用思维模式,和会不会写代码、是不是程序员没有任何关系。计算机只是执行计算思维的工具,就像你算数不用计算器也能算,只是计算器算得更快更准;你把计算思维写成计算机能懂的指令,就是“编程”,但哪怕你一辈子都不碰代码,你也每天都在用计算思维。
我们就把李女士筹备聚餐的流程,对应到计算思维的四个核心要素,看看你平时是不是也在用:
1. 分解(Decomposition):把大问题切成小块,一口一口吃
你有没有遇到过这种情况:领导给你安排了一个“做个活动方案”的大任务,你脑子一片空白,不知道从哪下手?或者老师让你写一篇一万字的论文,你盯着空白文档发了半天呆?这就是你不会“分解”问题。
分解就是把一个复杂的、看起来无从下手的大问题,拆成若干个独立的、可解决的小问题,每个小问题都简单到不需要动太多脑筋就能完成。李女士面对“筹备周末家庭聚餐”这个看起来麻烦的大任务,没有一头雾水,而是先把它拆成了5个独立的小模块: 1. 人员与需求调研:确认谁来、有什么禁忌 2. 菜单与采购清单制定:买什么、买多少 3. 时间与路线规划:什么时候去、怎么去 4. 前置准备与现场分工:提前做什么、每个人负责什么 5. 应急预案:出问题怎么办
每个小模块还能继续拆:比如“人员与需求调研”又可以拆成“在家庭群发接龙确认名单”“单独询问每个人的饮食禁忌”“统计总人数和小朋友的数量”,每个拆出来的小问题都简单到直接就能做:发接龙就是群里发个链接,问禁忌就是单独发一句微信,统计人数就是数一下接龙的名字,完全不会让人焦虑。
这种“切蛋糕式”的解决问题的方法,就是程序员写代码时的常用思路:做一个电商网站太复杂?先拆成用户模块、商品模块、订单模块、支付模块,每个模块再拆成更小的功能,一个个做,最后拼起来就是一个完整的网站。你平时做工作汇报、写论文、甚至整理衣柜,用的都是同样的逻辑:把大任务拆成小任务,逐个击破。
2. 模式识别(Pattern Recognition):从过往经验里找规律,少走弯路
李女士筹备过不下十次家庭聚餐,早就摸透了家里的“聚餐规律”:每次至少3个吃素食的亲戚(奶奶、小姨、偶尔来的表姑),2个完全不吃辣的人(奶奶、小姨夫),1个4岁以下的小朋友(表姐家娃每年都在长,去年三岁今年四岁,还是吃软食),还有至少2个爱喝酒的男士(舅舅、老公)。所以这次她不用再挨个问每个人喜欢吃什么,直接按规律准备:素菜至少3道,辣菜最多1道微辣的,给小朋友准备单独的软食和无刺菜,备两箱啤酒。
这种从过往经验里找到重复出现的规律,用来简化当前问题的方法,就是模式识别。程序员写代码的时候也会用模式识别:比如做过很多次登录功能,下次再做的时候直接拿之前的代码改一改就行,不用每次都重新写;比如做电商活动的时候,发现“满减+优惠券”的模式转化率最高,下次活动就继续用这个模式,不用再试别的。
你平时也在用模式识别:比如你每次出差都带充电器、身份证、笔记本,不用每次收拾行李的时候都想一遍要带什么;比如你每次点外卖都选评分4.5以上、配送时间30分钟以内的商家,不用每次对比几十家店;比如你每次过生日都买同一个口味的蛋糕,不用每次都要试新的口味。这些都是模式识别,帮你省时间,少踩坑。
3. 抽象(Abstraction):去掉无关细节,抓住核心问题
李女士在筹备聚餐的时候,完全不会考虑“舅舅今天穿什么颜色的衣服”“表姐最近工作顺不顺利”“老公这周工作累不累要不要给他加个菜”这些和聚餐本身无关的信息,她只需要抓住4个核心约束: 1. 饮食安全:小姨夫海鲜、花生过敏,小朋友不能吃太硬太辣的东西 2. 体验舒适:奶奶牙口不好需要软食,客人太多不能太挤 3. 效率优先:周末超市人多,要赶早,预处理食材节省当天时间 4. 成本可控:预算不超过500块
所有决策都围绕这四个核心约束来:买什么菜看有没有人过敏、是不是软食,要不要多买素菜看有没有素食者,什么时候去超市看人多不多,买什么价位的菜看预算够不够。其他所有无关信息全部忽略,这就是抽象。
抽象是很多人觉得难的点,但本质上就是“抓重点”。程序员写代码的时候也会用抽象:比如做一个聊天软件,不用考虑用户是用苹果手机还是安卓手机,不用考虑用户是在家里还是在公司,只要抓住“用户能发消息、能收消息、能发图片”的核心需求,先把核心逻辑做出来,其他细节比如界面颜色、消息提示音,都可以后面再调整。你平时做工作汇报的时候,也不用讲你昨天加班到几点、路上堵了多久车,只要讲你做了什么成果、遇到了什么问题、下一步计划是什么,这就是抽象,去掉无关细节,抓住核心信息。
4. 算法(Algorithm):固定可重复的步骤,按顺序做就能拿到结果
李女士这次做的筹备流程是固定的: 1. 提前7天:家庭群发接龙确认人数,单独询问饮食禁忌,列初步菜单 2. 提前3天:根据菜单列采购清单,确认预算 3. 提前1天:去超市采购,回家预处理食材(肉类腌制、蔬菜清洗分装) 4. 当天上午:老公布置客厅、摆餐具,李女士备凉菜 5. 下午3点:开始做热菜,蒸米饭 6. 下午5点:客人到达,安排小朋友在儿童区玩 7. 下午5点半:开饭 8. 晚上8点:收拾餐桌,准备水果零食 9. 晚上9点:送客,复盘这次的问题,
周五下午六点的厨房飘着糖醋排骨的焦香,李女士把沾了油渍的超市促销传单拍在实木餐桌上,手里攥着的红色马克笔在挂历上圈出三个醒目的红圈——这已经是他第无数次筹备周末的家庭聚餐了。她先抬头问刚下班的老公:“这周末舅舅一家来,表姐带三岁的小侄子,小姨夫海鲜过敏的消息你上次跟我说过,还有吗?”
老公一边踢掉上班穿的皮鞋,一边把公文包扔在玄关的置物架上,漫不经心地答:“哦对,小姨夫对虾和花生都过敏,去年在老家吃了虾馅饺子,浑身起疹子去的医院,差点喘不上气,这次千万别买海鲜类的。还有奶奶上次说你家做的红烧肉太硬,嚼得后槽牙疼了三天,这次炖烂点。表姐家娃不吃辣,别放辣椒,上次你做的辣子鸡他尝了一口就哭了,表姐脸都黑了。”李女士一边应着,一边在传单边缘写下几个加粗的关键词:海鲜过敏、软食、无辣、儿童无刺,指尖因为常年做饭沾了洗洁精,有些发皱。
她特意提前一周就在家庭群里发了个在线共享表格,让每个人填自己的饮食禁忌和特殊需求,表格里列了“是否过敏(过敏源是什么)”“饮食偏好(素食/不吃辣/清真等)”“特殊需求(老人软食/儿童无刺/糖尿病要低糖等)”三个必填项,连平时很少冒泡的奶奶都特意让表姐帮忙填了“牙口不好,要吃炖烂的肉,不能吃凉的”。去年聚餐的教训她还记着:当时她没提前问禁忌,买了虾仁做三鲜馅,小姨夫吃了直接送急诊,住了三天院,花了一万多,她愧疚了快半年,这次特意多留了个心眼。
写完了关键词,李女士拿起手机翻出来上次聚餐的复盘笔记,那是她上个月刚写的,上面列了上次的问题:①素菜只准备了两道,吃素的奶奶和小姨都没吃饱;②忘了准备小朋友的餐具,最后用了大人的不锈钢碗,边缘太锋利,小侄子差点划到嘴;③备菜时间不够,开饭晚了四十分钟,舅舅赶火车差点迟到。这次她把这些问题一条一条划掉,在旁边写上对应的解决措施:素菜准备四道,提前买儿童专用的软边餐具,提前一天预处理食材,当天不用再洗菜切菜。
接下来要做的事其实很明确:先定菜单,再列采购清单,然后规划去超市的时间——周末的超市早上九点开门,去晚了新鲜排骨和绿叶菜都会被抢光,她打算八点半就出门,骑电动车十分钟到超市,赶在第一批人进去的时候采购。然后提前一天把肉类腌好,蔬菜洗好切好分装进保鲜盒,当天只需要炒菜就行。现场分工她也想好了:老公负责搬东西、布置客厅、摆餐具,表姐来了之后让她帮忙看小侄子,她负责做饭,小姨夫负责陪舅舅喝酒聊天,奶奶负责带小侄子玩。她还特意在备忘录里加了一条应急预案:如果菜不够,就提前存好附近饭店的电话,点两个菜送上门;如果小朋友闹,就把提前准备好的贴纸书和动画片投在电视上,肯定能哄住。
你可能会觉得,这不就是普通人筹备一次聚餐的正常操作吗?有什么特别的?但如果你把李女士的整个流程拆解开,会发现她每一步都在用计算思维(Computational Thinking)——也就是我们常说的“编程思维”,只是她从来没有写过一行代码,也没有意识到自己已经在用程序员的核心能力解决问题。
一、藏在厨房里的编程思维:从家庭聚餐到计算思维四要素
很多人对“编程思维”的第一印象是“写代码”“程序员专属”“需要很高的数学基础”,但实际上,计算思维的本质是用有限的步骤解决无限问题的通用思维模式,和会不会写代码、是不是程序员没有任何关系。计算机只是执行计算思维的工具,就像你算数不用计算器也能算,只是计算器算得更快更准;你把计算思维写成计算机能懂的指令,就是“编程”,但哪怕你一辈子都不碰代码,你也每天都在用计算思维。
我们就把李女士筹备聚餐的流程,对应到计算思维的四个核心要素,看看你平时是不是也在用:
1. 分解(Decomposition):把大问题切成小块,一口一口吃
你有没有遇到过这种情况:领导给你安排了一个“做个活动方案”的大任务,你脑子一片空白,不知道从哪下手?或者老师让你写一篇一万字的论文,你盯着空白文档发了半天呆?这就是你不会“分解”问题。
分解就是把一个复杂的、看起来无从下手的大问题,拆成若干个独立的、可解决的小问题,每个小问题都简单到不需要动太多脑筋就能完成。李女士面对“筹备周末家庭聚餐”这个看起来麻烦的大任务,没有一头雾水,而是先把它拆成了5个独立的小模块: 1. 人员与需求调研:确认谁来、有什么禁忌 2. 菜单与采购清单制定:买什么、买多少 3. 时间与路线规划:什么时候去、怎么去 4. 前置准备与现场分工:提前做什么、每个人负责什么 5. 应急预案:出问题怎么办
每个小模块还能继续拆:比如“人员与需求调研”又可以拆成“在家庭群发接龙确认名单”“单独询问每个人的饮食禁忌”“统计总人数和小朋友的数量”,每个拆出来的小问题都简单到直接就能做:发接龙就是群里发个链接,问禁忌就是单独发一句微信,统计人数就是数一下接龙的名字,完全不会让人焦虑。
这种“切蛋糕式”的解决问题的方法,就是程序员写代码时的常用思路:做一个电商网站太复杂?先拆成用户模块、商品模块、订单模块、支付模块,每个模块再拆成更小的功能,一个个做,最后拼起来就是一个完整的网站。你平时做工作汇报、写论文、甚至整理衣柜,用的都是同样的逻辑:把大任务拆成小任务,逐个击破。
> 💡 电子版侧边栏:你有没有试过把大任务拆成小任务后效率翻倍?欢迎在评论区分享你的经历。 > 📌 纸书脚注:周以真(Jeannettte Wing)教授在2006年发表于《Communications of the ACM》的开山论文中,首次将“分解”列为计算思维的核心要素之一,相关论文可扫码阅读。
2. 模式识别(Pattern Recognition):从过往经验里找规律,少走弯路
李女士筹备过不下十次家庭聚餐,早就摸透了家里的“聚餐规律”:每次至少3个吃素食的亲戚(奶奶、小姨、偶尔来的表姑),2个完全不吃辣的人(奶奶、小姨夫),1个4岁以下的小朋友(表姐家娃每年都在长,去年三岁今年四岁,还是吃软食),还有至少2个爱喝酒的男士(舅舅、老公)。所以这次她不用再挨个问每个人喜欢吃什么,直接按规律准备:素菜至少3道,辣菜最多1道微辣的,给小朋友准备单独的软食和无刺菜,备两箱啤酒。
这种从过往经验里找到重复出现的规律,用来简化当前问题的方法,就是模式识别。程序员写代码的时候也会用模式识别:比如做过很多次登录功能,下次再做的时候直接拿之前的代码改一改就行,不用每次都重新写;比如做电商活动的时候,发现“满减+优惠券”的模式转化率最高,下次活动就继续用这个模式,不用再试别的。
你平时也在用模式识别:比如你每次出差都带充电器、身份证、笔记本,不用每次收拾行李的时候都想一遍要带什么;比如你每次点外卖都选评分4.5以上、配送时间30分钟以内的商家,不用每次对比几十家店;比如你每次过生日都买同一个口味的蛋糕,不用每次都要试新的口味。这些都是模式识别,帮你省时间,少踩坑。
3. 抽象(Abstraction):去掉无关细节,抓住核心问题
李女士在筹备聚餐的时候,完全不会考虑“舅舅今天穿什么颜色的衣服”“表姐最近工作顺不顺利”“老公这周工作累不累要不要给他加个菜”这些和聚餐本身无关的信息,她只需要抓住4个核心约束: 1. 饮食安全:小姨夫海鲜、花生过敏,小朋友不能吃太硬太辣的东西 2. 体验舒适:奶奶牙口不好需要软食,客人太多不能太挤 3. 效率优先:周末超市人多,要赶早,预处理食材节省当天时间 4. 成本可控:预算不超过500块
所有决策都围绕这四个核心约束来:买什么菜看有没有人过敏、是不是软食,要不要多买素菜看有没有素食者,什么时候去超市看人多不多,买什么价位的菜看预算够不够。其他所有无关信息全部忽略,这就是抽象。
抽象是很多人觉得难的点,但本质上就是“抓重点”。程序员写代码的时候也会用抽象:比如做一个聊天软件,不用考虑用户是用苹果手机还是安卓手机,不用考虑用户是在家里还是在公司,只要抓住“用户能发消息、能收消息、能发图片”的核心需求,先把核心逻辑做出来,其他细节比如界面颜色、消息提示音,都可以后面再调整。你平时做工作汇报的时候,也不用讲你昨天加班到几点、路上堵了多久车,只要讲你做了什么成果、遇到了什么问题、下一步计划是什么,这就是抽象,去掉无关细节,抓住核心信息。
4. 算法(Algorithm):固定可重复的步骤,按顺序做就能拿到结果
李女士这次做的筹备流程是固定的,从提前7天到聚餐结束后复盘,每一步都有明确的时间、内容和输出: 1. 提前7天:家庭群发接龙确认人数,单独询问饮食禁忌,列初步菜单 2. 提前3天:根据菜单列采购清单,确认预算 3. 提前1天:去超市采购,回家预处理食材(肉类腌制、蔬菜清洗分装) 4. 当天上午:老公布置客厅、摆餐具,李女士备凉菜 5. 下午3点:开始做热菜,蒸米饭 6. 下午5点:客人到达,安排小朋友在儿童区玩 7. 下午5点半:开饭 8. 晚上8点:收拾餐桌,准备水果零食 9. 晚上9点:送客,复盘这次的问题,更新家庭聚餐的常用需求模板,把这次的禁忌和偏好更新进去,下次筹备的时候直接调出来用,不用再挨个问
在计算机科学里,算法的严格定义是「一个有限的、确定的、有效的步骤序列,接受一定的输入,产生一定的输出,并在有限步骤后终止」——翻译成人话就是:你做任何事的时候,只要按固定的步骤走,就能拿到你想要的结果,这就是算法。你蒸米饭的步骤“洗米→加水→按煮饭键→等30分钟”是最简单的算法,李女士的聚餐筹备流程是复杂的算法,程序员写的排序算法、推荐算法也是算法,本质没有任何区别,只是解决的问题不同而已。
算法有三个核心特点,你可以对照李女士的流程看看是不是符合:
- **确定性**:每一步都有明确的定义,不会产生歧义,比如“提前1天去超市采购”,不会有人理解成“提前1小时”
- **可重复**:同样的输入(同样的聚餐需求),按同样的步骤走,每次都能得到差不多的结果(成功的聚餐)
- **有终止条件**:流程走到“送客复盘”就结束了,不会无限循环下去
这种用固定步骤解决问题的思路,就是算法的核心。你平时用的导航APP的路线规划、外卖APP的商家排序、短视频平台的推荐,背后都是算法在起作用,而你自己早就每天都在用算法解决问题了。
```mermaid graph TD A[开始筹备聚餐] --> B[调研人员需求: 人数/禁忌/偏好] B --> C[制定菜单&采购清单] C --> D[规划采购时间&路线] D --> E[提前1天