我们生活的世界已经变成了一个数字世界,充满了技术并由计算机科学驱动。软件和技术已经改变了每个学科和工作领域,从科学和医学到艺术史和心理学。数字技术无处不在。为了成为知情和赋能的公民,下一代学生需要了解他们所生活的这个数字世界。

这就是为什么计算思维被称为“21世纪必备能力”,它对每个人都很重要。学习计算思维对于了解数字世界的运作方式、利用计算机的力量解决棘手的问题以及成就伟大的事业至关重要!它还使我们能够进行批判性思考,不仅了解某些技术的好处,也懂得这些技术的潜在危害、道德影响或意外后果。

但究竟什么是计算思维?让我们来看看卡内基梅隆大学周以真教授的学术定义:

“计算思维是涉及确切表达问题及其解决方案的思维过程,使解决方案能以一种信息处理代理可以有效执行的形式来表示。”

怎样,听起来够绕吧?但其实,这只是用高大上的语言来表达了简单的想法!“信息处理代理”是指任何遵循一组指令来完成任务(我们称之为“计算”)的东西。大多数情况下,这个“代理”是指计算机或其它类型的数字设备——但它也可能是人!为了使事情变得简单,我们将其称为计算机。为了以计算机可以执行的方式表示解决方案,我们必须将它们表示为一步一步的过程,即算法。为了创建这些算法解决方案,我们应用了一些特殊的问题解决技巧。这些技能构成了计算思维!这些技能其实可以迁移到任何领域。

计算思维同时借鉴了数学思维和工程思维。然而,与数学不同的是,我们的计算系统受到底层“信息处理代理”及其操作环境的物理限制。因此,我们必须担心边界条件、故障、恶意代理以及现实世界的不可预测性。但与其他工程学科不同,由于我们独特的“秘密武器”软件的存在,在计算中我们可以构建不受物理现实约束的虚拟世界。因此,在网络与数字世界中,我们的创造力仅受想象力的限制。

计算思维可以被描述为“像计算机科学家一样思考”,但它现在是每个人都需要学习的重要技能,无论他们是否想成为计算机科学家!有趣的是,计算思维和计算机科学并不完全与计算机有关,它们更多地与人有关。你可能认为我们为计算机编写程序,但实际上我们是为人编写程序——帮助他们交流、查找信息和解决问题。

例如,我们使用智能手机上的应用程序来获取前往朋友家的路线。这个应用程序就是计算机程序的一个例子,而智能手机是为我们运行该程序的“信息处理代理”。那些设计计算最佳路线的算法,以及设计交互界面和如何存储地图等所有细节的人,都应用了计算思维来设计这个应用。但他们设计这个应用并不是为了智能手机,而是为了帮助使用智能手机的人。计算思维并不是让人像机器一样机械地去思考。

一门教授计算思维的课,应该教会学生:

这些技能可以迁移到任何其它课程领域,但与开发数字系统和使用计算机的能力解决问题特别相关。

计算思维有多种定义,但大多数都包含计算思维所体现的解决问题所需的必要技能。

计算思维以什么为代表(什么是计算思维)(1)

下面,我列出6种重要的技能:抽象、分解、算法思维、泛化与模式、评估、逻辑。

抽象

计算思维中最重要和最高级的思维过程是抽象的过程。抽象的作用是简化事物,它赋予我们可扩展能力和处理复杂性的能力。抽象需要确定问题最重要的方面是什么,并隐藏我们不需要关注的其它具体细节。问题的重要方面可用于创建我们正在处理的原始事物的模型或简化表示。然后,我们可以使用这个模型来解决问题,而不必一次处理所有的细节。

抽象用于定义模式、将个体实例泛化和参数化。它用于让一个对象代表多个对象。它捕获一组对象共有的基本属性,同时隐藏它们之间不相关的区别。例如,算法是一个过程的抽象,它接受输入、执行一系列步骤并产生满足期望的目标输出。抽象数据类型定义了一组抽象的值和用于操作这些数据的操作,对使用这些数据类型的用户隐藏了数据的实际表示。

计算机科学家常常在多个抽象层次上工作。反复应用抽象使我们能够构建越来越大的系统。最底层(至少对于计算机科学而言)是位(0 和 1)。在计算中,我们通常基于抽象层构建系统,这使我们能够一次只关注一层及相邻层之间的关系。当我们用高级语言编写程序时,我们不必担心底层硬件、操作系统、文件系统或网络的细节。作为另一个例子,互联网的细腰架构以TCP/IP为中间层,在其上层有大量不可预见的应用程序,而在其下层则有大量不可预见的硬件平台、通信媒体和设备。正是这种分层架构,促进了互联网技术的繁荣。

我们在日常生活中经常使用抽象。比如,当我们使用地图时,地图通过省略不必要的细节(例如公园中每一棵树的位置)向我们展示了整个世界的简化版本,只保留了地图阅读器需要的最相关的信息,例如道路和街道名称。

数字设备一直都在使用抽象。它们试图对用户隐藏尽可能多的不必要信息。例如,假设你在上次露营旅行中拍了一张漂亮的风景照片,现在你想在笔记本电脑上对它进行编辑并调整其中的颜色。通常我们可以通过打开图片编辑程序、调整一些颜色滑块或选择过滤器来做到这一点。当你这样做时,会有很多复杂的操作发生,而这些操作是计算机对你隐藏的。

你拍的照片在电脑上是作为一个大的像素列表存储的,每个像素是不同的颜色,每种颜色都用一组数字表示,而这些数字中的每一个都存储为二进制数字!这将是非常多的信息。想象一下,如果你在调整颜色时必须查看每个像素的所有颜色值并更改其中的每一个,那会不会崩溃? 好在计算机为你隐藏了这些信息,因此你不需要知道这些二进制信息就能实现你的目标。

分解

分解是将问题分解为更小、更易于管理的部分,然后专注于解决每个小问题。我们可以对一个复杂的问题进行分解,直到每个较小的部分都变得简单和易于解决。这些更小、更简单的问题的解决方案组合成了我们最初的大问题的解决方案。分解有助于让大问题不那么令人生畏!

由于计算机需要非常具体的指令,因此分解是创建可在计算设备上实现的算法和过程的一项重要技能。我们需要告知计算机需要遵循的每一个小步骤,才能让计算机帮助我们做事。

例如,制作蛋糕的整个任务可以分解为几个较小的任务,每个任务都可以轻松执行。

做蛋糕

  1. 烤蛋糕l 将原材料放入碗中(黄油、糖、鸡蛋、面粉)l 混合l 倒入锡罐l 放入烤箱烤30分钟l 从锡罐中取出
  2. 做糖衣
  3. 涂在蛋糕上

算法思维

算法是计算思维和计算机科学的核心。因为在计算机科学中,问题的解决方案不仅仅是一个答案(例如“42”或一个事实),它们是算法。算法是解决问题或完成任务的一步步过程。如果我们正确地遵循算法的步骤,即使对于不同的输入,也会得到正确的答案。例如,我们可以使用一个算法来找到地图上两个位置之间的最短路线。相同的算法可应用于任何一对起点和终点,因此最终的答案取决于算法的输入。如果我们知道解决问题的算法,那么我们随时都能轻松解决该问题,而无需思考!我们只需按照步骤操作即可。计算机自己并不能思考,所以我们需要给它们算法,告诉它们怎么做事。

算法思维是创造算法的过程。当我们创建一个算法来解决一个问题时,我们称之为算法解决方案。

算法的构成元素相对较少,因为数字设备只有几种类型的指令可以遵循。他们可以做的主要事情是接收输入、提供输出、存储值、按顺序执行指令、根据分支进行选择以及在循环中重复执行指令。尽管指令的范围非常有限,但我们已经描述了数字设备可以计算的所有内容,这就是为什么我们要将算法描述为仅限于这些元素的过程。

泛化和模式

泛化也称为“模式识别和泛化”。泛化是将问题的解决方案(或解决方案的一部分)进行普适化,以便它可以应用于其它类似的问题和任务。由于计算机科学中的解决方案是算法,这意味着我们将一种算法变得足够通用,从而它可以用于解决一系列问题。这个过程涉及抽象。为了使事物更通用,我们必须剔除与特定问题或场景相关但对算法的运行并不重要的不必要细节。

发现模式是这个过程的重要组成部分。当我们思考多个问题时,我们可能会认识到它们之间的相似之处,并发现它们可以用相似的方式予以解决。这被称为模式匹配,是我们在日常生活中一直都在做的事情。

泛化的算法可以被重用,用于解决一组相似的问题,这意味着我们可以快速有效地提出解决方案。

评估

评估涉及确定问题的诸多可能解决方案,并判断哪种解决方案最好用,它们是否在某些情况下有效但在其它情况下无效,以及如何改进它们。在评判我们的解决方案时,我们需要考虑一系列因素。例如,这些过程(算法)求解问题需要多长时间,它们是否可扩展,是否能够可靠地解决问题,或者是否在某些情况下会以非常不同的方式执行。评估是我们在日常生活中经常做的事情。

我们可以通过不同的方式来评估我们的算法解决方案。我们可以通过在计算机上实现并运行它们来测试它们的速度;或者我们可以通过理论计算它们可能需要的执行步数来分析它们。我们可以通过喂给它们许多不同的输入并检查它们是否按预期工作来测试算法解决方案是否正确。当我们这样做时,我们需要考虑我们用于测试的不同输入。因为我们不想检查每一个可能的输入(通常有无数个可能的输入!),但我们仍然需要知道我们的算法解决方案是否对于所有输入都有效。测试是计算机科学家和程序员一直在做的事情。但是,因为我们通常无法测试所有可能的输入,所以我们也会尝试使用逻辑推理来评估系统。

逻辑

在尝试解决问题时,我们需要进行逻辑思考。逻辑推理是通过观察、收集数据、思考你知道的事实,然后根据已知弄清楚事情的缘由,从而试图完整地理解事物。它帮助我们利用现有的知识来建立规则和检查事实。

例如,假设你正在编写软件来计算从你家到某个位置的最短路线。在地图中,如果你从家向北行驶,则到图书馆需要2分钟,但如果你向南走,则需要3分钟才能到达下一个十字路口。你可能想知道:如果一开始就向南走,去图书馆是否有更好的路线?显然,从逻辑上这不可能,因为你需要步行3分钟才能到达第一个十字路口。

在更深层次上,计算机完全建立在逻辑上。他们使用“真”和“假”,并使用称为“布尔表达式”的东西(比如“年龄 > 5”)在计算机程序中做出决定。

追踪程序中的错误也需要逻辑思维,以找出程序中错误的位置和原因。

一个甜甜圈的例子

最后,以一个甜甜圈的例子来阐释什么是计算思维。

假设我们现在有一个任务,要从商店带甜甜圈给我们的老师们。我们收到每个人的订单,形成了一张110个甜甜圈的购买清单列表,我们希望在去商店之前计算出所有甜甜圈的总价格。计算思维可以帮助我们更容易地解决这个问题。

我们首先定义问题:要计算110个甜甜圈的总价格。

看到这个问题时,我们的第一反应通常是拿起自己的手机,并将甜甜圈的价格一个个累加起来。这个方法可行,但却是一种低效的方法。计算思维为我们提供了一种更好、更省力的方式。

我们可以将问题分解为更小的步骤:(分解)

1)我们需要知道每种甜甜圈的价格;

2)我们需要知道我们购买了每种甜甜圈类型的数量。

一旦我们知道了这两点,就可以计算出总价格。

不同类别甜甜圈的单价表:

种类A:每个 3元

种类B:每个1.60元

种类C:每个2.00元

种类D:每个2.10元

种类E:每个2.15元

按类型划分的甜甜圈数量:

25个甜甜圈A,每个3.00元

30个甜甜圈B,每个1.60元

10个甜甜圈C,每个2.00元

15个甜甜圈D,每个2.10元

30个甜甜圈E,每个2.15元

现在,通过把甜甜圈按照类型和数量有序组织成价格列表,我们发现列表中的每一项都遵循相同的模式(发现模式),这使我们能够构建一个方程来计算每种甜甜圈的总价格。

甜甜圈A的总价格:25个×3.00元/个= 75元

对于模式化的数据类型,可以对列表中的每一项简单地重复使用这个等式:

甜甜圈B的总价格:30个×1.60元/个=48元

甜甜圈C的总价格:10个×2.00元/个= 20元

甜甜圈D的总价格:15个×2.10元/个=31.5元

甜甜圈E的总价格:30个×2.15元/个= 64.5元

最后,我们可以将每种类型的甜甜圈价格相加来计算总价格:

75 48 20 31.5 64.5=239元

有了用于解决问题的等式,我们可以抽象出一个模板,其中包含两个计算总价格的公式。

按类型划分的项目数×单价=每个项目类型的价格

每个项目类型的价格 每个项目类型的价格 每个项目类型的价格 …=总价格

这个公式不仅可以用于甜甜圈价格的计算,也同样适用于纸杯蛋糕、冰淇淋三明治的计算,当然也适用于甜甜圈数量更多的情况。在消除了最初问题中的噪音和复杂性后,这个公式现在成为了一个易于使用的工具。(泛化)

然后,我们可以进一步扩展从这一经验中获得的知识,通过构建算法来确保每次都能获得可靠的输出,以便在其它庆祝活动中可以复用它。(算法思维)

第 1 步:按类型或风味添加项目。

第 2 步:为每个项目类型设置单价。

第 3 步:将按类型划分的项目数与其单价相乘。

第 4 步:将每种类型的总价格加在一起。

第 5 步:祝您胃口大开!

我们来评估一下这个方法。首先,它总是可以正确地完成计算总价格的任务。其次,抽象出来的模板和算法有很强的复用性。最后,这种方法可扩展性较强,即按这种方式来计算总价格的速度要远远快于逐个相加的方法,特别是在数量变得越来越多的时候。(评估)

正如这个计算思维示例所希望展示的那样,这个过程体现了我们解决问题方式的转变。通过公式化的过程,我们可以驾驭复杂性并专注于重要的事情,不会在噪音中迷失解决问题的方向。尽管这只是计算思维的一个简单例子,但很明显,这个过程可以被复制来解决大量数据的问题,并在这些充满数据的世界中引导未知的旅程。

本公众号xuanbamath创立四周年

为大家精选了12篇必读文章。

  1. 深度好文:小学数学应该学什么,怎么学?
  2. 或许世上本没有数学渣娃,被数学渣妈鸡多了,也便成了数学渣
  3. 小学数学最重要的能力如何培养?
  4. 深度好文:小升初需要欣赏的12个数学证明之美
  5. 高观点下的少儿编程与计算思维
  6. 奥数冠军教你如何解题(付费阅读,买一赠一)
  7. 讲座视频:怎样在生活中引导孩子进行数学思考?
  8. 为什么飞机的往返飞行时间不同?
  9. 孤独而高冷的素数
  10. 没有葫芦也要会画瓢, 说说我的奥数启蒙经历
  11. 少儿编程,我这样教

12.李国杰院士作序推荐高考数学满分得主新书《给孩子的数学思维课》

,