云计算百科
云计算领域专业知识百科平台

20.计算思维(Computational Thinking,CT)

前言

方法论有很多:

本次介绍:计算思维

一、计算思维

重点:

1.脑子里怎么分析问题

2.把问题转成可以被信息处理(计算机)执行的方案

3.不是标准作业流程 SOP,不是:1 分解完→2 模式识别完→3 抽象完→4 写算法。 它是一套思考工具集合,解决复杂问题时脑子反复来回用,工程开发、写代码、调试都会交替跳转使用。

4.用计算机科学的思路去分析问题,而不等于写代码。代码只是算法的实现载体。

二、计算思维四大核心:分解、模式识别、模式概括(抽象)、算法

四大要素依次递进:把大问题拆开 → 找规律共同点 → 提炼抽象模型忽略无关细节 → 写出一步步可执行方案。


1. 分解 Decomposition

把复杂的大问题,拆成多个更小、更容易处理的小子问题。
大问题本身很难直接解决;拆分后逐个解决子问题,最后合并结果。

例子

一个模拟量采集项目:总任务:读取多路AD电压
分解:

  • SPI硬件初始化
  • 芯片复位
  • 读取芯片ID校验芯片正常
  • 寄存器配置、自校准
  • 等待RDY就绪判忙
  • SPI读写寄存器
  • 读取ADC原始值
  • 原始值换算成电压
  • 互斥锁保护多线程访问
  • 批量读取全部通道

每一块都是子问题,单独写函数,最后拼起来。


2. 模式识别 Pattern Recognition

观察数据、现象、子问题,找出其中的规律、重复出现的特征、相似点与不同点。
做完分解之后,观察各个小问题:哪些地方是重复的?哪些条件会带来什么结果?识别模式,避免重复劳动。

例子

  • ADC代码:
    • 读通道电压,流程高度相似:写控制寄存器 → 启动单次转换 → 等待RDY → 读2字节 → 转电压。
    • SPI操作总是:CS拉低 → 收发 → CS拉高。这就是识别出来的模式。

    关键点:找重复、找共性、找因果;看到现象归纳出现象背后的模式。


    3. 模式概括 / 抽象 Abstraction(模式概括就是抽象的过程)

    抽象:只保留解决问题必须的关键信息,忽略无关、次要细节;把识别到的模式提炼成通用模型,不绑定某一个具体案例。
    “模式概括”就是从多个具体实例,总结出通用规则,是通向抽象的步骤。

    • 具体:读ADC通道0;读ADC通道1(一个个具体操作)
    • 模式概括:所有通道读取流程大体一致,只有通道号数字不一样
    • 抽象:封装函数 adc_read_data(uint8_t Channel),传入通道号就能读任意通道;隐藏内部SPI时序、CS操作细节。调用者只需要给通道号,不需要关心底层SPI怎么收发几个字节。

    ✅抽象核心:过滤不重要信息,聚焦对问题有用的信息。
    调用函数的人不需要知道内部实现,只需要知道输入输出。


    4. 算法 Algorithm

    算法:一套明确、有序、可执行、有限步骤的指令序列,用来解决某一类问题。输入 → 执行步骤 → 输出。
    经过分解、识别模式、抽象之后,最终产出就是算法。
    算法必须满足:

  • 明确:每一步含义清晰,不能模棱两可
  • 有限:一定会结束,不能无限死循环
  • 输入输出:有输入,产生结果输出
  • 例子

    代码里adc_busy()就是一个算法:
    输入:无;输出:是否AD转换就绪
    步骤:
    ①循环读取RDY引脚电平
    ②如果RDY为低,返回就绪;
    ③超时则读状态寄存器打印报错,返回未就绪;
    ④中间间隔延时。

    代码只是算法的一种实现载体;算法是思路,可以用中文描述、流程图、伪代码、C语言写出来。


    完整流程串联(完整计算思维工作流)

    以ADC多路采集举例完整链路:

  • 分解:把“读取多路光电压”拆成SPI初始化、芯片复位、校准、SPI读写、等待就绪、原始值转电压、批量读取等子问题。
  • 模式识别:发现各个通道读取流程几乎一样;所有SPI访问都需要CS片选操作;每次转换都要等待RDY引脚。
  • 模式概括+抽象:把重复SPI操作封装adc_write/read;把通道读取封装通用函数,屏蔽底层寄存器细节,外部只需要传入通道号。
  • 算法:写出“单通道读取算法”“批量读取全部通道算法”,写成C代码运行。

  • 容易混淆点区分

  • 分解:切分问题(大→小)
  • 模式识别:找规律、找重复(观察)
  • 抽象:提炼通用模型,扔掉无关细节(概括建模)
  • 算法:给出一步步做事的步骤(解决方案)
  • 计算思维 ≠ 编程:编程是工具;计算思维是思考方法,可以不用电脑也能用。

    三、具体实践

    重点:

            不是严格先后执行的流水线步骤,不是:先做完分解 → 再做模式识别 → 再抽象 → 最后写算法,做完一个才能下一个。

            更准确:是解决同一个复杂问题时,脑子里用到的4种思考工具,会来回跳、反复用。

    举个大白话类比:
    好比你修一台坏的设备,你会用到:

  • 拆开看(分解)
  • 对比找哪里不对劲(模式识别)
  • 忽略不重要污渍,只看电路(抽象)
  • 按顺序检修操作(算法)
  • 你不会死板的:完全拆完,才开始对比;对比完才过滤无关信息;全部做完才动手检修。中间会来回倒。


    例如写ADC代码

    目标:要实现读取AD多路ADC电压。

    1. 分解:把大任务切碎

    脑子里想:这个大活太复杂,我把它切成一堆小任务。

    • SPI初始化
    • 芯片硬件复位
    • 读ID判断芯片是否活着
    • SPI读写寄存器
    • 等待RDY就绪
    • 芯片自校准
    • 读ADC原始数据
    • 原始值换算电压
    • 多线程加互斥锁
    • 循环读取全部通道

    👉作用:大问题啃不动,切成小碎片,碎片一个个处理。

    但切完碎片之后,你马上就要观察这些碎片,不是等全部切完。

    2. 模式识别:看碎片,找重复、找相同、找规律

    盯着上面一堆小任务看,找共同点:

    • 不管读寄存器还是写寄存器,SPI都要:CS拉低 → 收发 → CS拉高。流程一模一样。
    • 读通道0、通道1、通道2……流程几乎一样,仅仅通道号数字不同。
    • 每次AD转换完成,都要看RDY引脚电平。

    👉作用:发现重复劳动。看到“这件事反复出现”。

            发现重复之后,你不会停在这里,你会进一步想:能不能不要复制粘贴一模一样代码?→这就进入抽象。

    3.模式概括+抽象:提炼通用,隐藏细节

            既然很多地方都要SPI收发,我不要每次都手写一遍CS拉低拉高。
            把重复的SPI收发封装成函数:adc_write() adc_read()。

            以后要用SPI写数据,直接调用函数。调用者不用关心CS怎么拉,延时多少,只需要传入要发送的数据。把底层细节藏起来。

            读通道也封装函数 adc_read_data(uint8_t Channel),传入通道号就读对应通道。不用每路写一套代码。

    👉作用:把具体案例,提炼成通用工具;丢掉无关细节。

    4. 算法:给出一步一步明确操作流程

    现在有了一堆封装好的函数工具,组合出做事的步骤。

    示例:单通道读取算法

  • 加互斥锁
  • 设置ADC控制寄存器选中对应通道
  • 写模式寄存器启动单次转换
  • 等待RDY引脚变为低电平
  • SPI读取2字节转换结果
  • 将原始AD值换算成电压
  • 释放互斥锁
  • 返回电压值
  • 👉作用:把前面所有思考,变成一套可执行步骤。算法可以写成伪代码、流程图、C代码。


    关键误区:是不是固定顺序1‑2‑3‑4?

    ❌错误理解:

    分解全部做完 → 全部模式识别做完 → 全部抽象做完 → 写算法。线性流水线。

    ✅真实工程思考过程(来回跳转):

  • 先把整体分解成几块;
  • 看其中一块,做模式识别,发现重复逻辑;
  • 对这一小块做抽象封装函数;
  • 给这块写算法逻辑;
  • 回头继续分解下一块;
  • 新模块又做模式识别,又抽象……循环往复。
  • 甚至调试的时候:跑代码出错,又要重新分解问题、识别错误模式、重新抽象、修改算法


    总结

    • 分解:大问题拆小
    • 模式识别:在小问题里找重复规律
    • 抽象:利用规律封装通用工具,屏蔽细节
    • 算法:用工具编排一套一步步做事的流程

    它们是四种思考武器,不是四步固定工序。解决工程问题会交替使用。

    对比生活例子:做蛋糕

  • 分解:做蛋糕拆成:备料、打蛋清、和面、烘烤、装饰。
  • 模式识别:所有搅拌操作动作逻辑类似;不同烘焙只是时间温度参数不同。
  • 抽象:“搅拌”作为一个通用动作,不关心手怎么动,只关心输入原料输出混合物。
  • 算法:按顺序:备料→打蛋清→和面→设置烤箱温度时间烘烤→装饰。
  • 思考的时候,不会完全备完所有料,才想搅拌;搅拌过程发现问题还会回头调整配料。

    四、缺少一项后的结果

    如果缺少其中某一项,写代码会变成什么糟糕样子?

    现实开发感悟

    实际写代码,往往不是完全缺失某一项,而是做的不到位:

    • 分解:拆了函数,但单个函数还是 200‑300 行,拆得不够;
    • 模式识别:看到一部分重复,但漏掉一部分;
    • 抽象:封装函数,但内部还是向外泄露很多硬件细节;
    • 算法:正常情况可以跑,异常 / 边界情况完全没考虑。
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 20.计算思维(Computational Thinking,CT)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!