AI时代,教会孩子“计算思维”
本文刊载于《三联生活周刊》2019年第22期,原文标题《AI时代,我如何教会孩子“计算思维”》
我是一个标准的计算机专业出身的孩儿妈。我现在在一家叫Hulu的美国公司做中国区总经理,团队做技术开发,使用人工智能和机器学习技术做视频内容识别、推荐、搜索等等。我一直在技术行业,曾经在几家硅谷创业公司和微软、雅虎做过研究员、程序员、产品经理,也曾经互联网创业。去年我的团队还写了一本关于机器学习算法的畅销书。
我自己从初中开始参加计算机竞赛,本科在清华大学计算机系专业是人工智能,在斯坦福大学读了计算机专业的硕士和博士,然后在硅谷和北京工作。
我也是两个孩子的妈妈,老大在剑桥大学读物理,老二在北京读高中。当我将养育两个孩子的故事和心得写成《魔鬼老大,天使老二》时,没想到挺受欢迎。大家挺关心,我这样一个强理工科背景的妈妈,是怎样培养孩子的。从我30多年前选大学专业开始,计算机就是一个开始热门的专业。有趣的是,去年我在公众号“东西方教育”最受欢迎的文章正是《我的孩子要不要学计算机?》。
骐骐的竞赛
虽然我在计算机技术行业做了几十年,我也业余研究儿童教育,但是“计算思维”这个词,真正作为一个概念进入我的脑海并且有了比较深的理解,还是源于我们家老二骐骐的一次竞赛。
三四年前,骐骐12岁,他有一次说,在学校参加了一个“奇怪的比赛”。“不知道是什么竞赛,有点儿像数学,但又不是数学。”他跟我讲了几个题,我觉得有点像逻辑,但是好像又不完全是,肯定不是数学竞赛。开始我也没有特别在意。后来骐骐又跑回来说,他竞赛初试考得好,要到牛津大学去参加决赛。这个必须引起重视了。我就在网上查了一下这个竞赛究竟是怎么回事。
我发现这个竞赛叫“Bebras计算挑战”,是一个有超前意识的比赛,由牛津大学和谷歌承办,目的是“让全世界的孩子为计算而兴奋”。竞赛的内容是“计算机科学家们喜欢解决的问题”,来评测孩子的“计算思维”。世界上各国的孩子,不需要学统一的编程语言,不需要统一的语言,都可以参赛。
骐骐去牛津大学参加了决赛。他们有一整天的比赛和相关的活动,听了计算机科学家的演讲,看了有趣的先进AI展示。因为骐骐参加这个竞赛,我仔细看了所有的资料,跟踪了他的竞赛过程。这个过程中我了解到“计算思维”这个还比较鲜为人知的概念。
作为一个计算机行业的从业者,作为一个面试过成百上千程序员和研究员的人,在我头脑里“计算”和“教育”这两条线的交汇清晰起来,我深深地理解了为什么计算思维能力很重要,它和其他数理能力的不同,以及它是怎样一步步培养的。
什么是计算思维
计算思维(Computational Thinking),是一组解决问题的方法,它教会孩子像计算机一样表述问题和解决问题,或者说,它教会孩子理解和模拟计算机怎么解决一个问题。计算思维包括几个方面:分解问题,逻辑和规律,算法,抽象。它可以说是学计算机和编程之前的基础技能。或者说,编程只是表象,有计算思维才能真正写出正确的程序。用写文章做比喻,编程语言好比汉字、法语或者日文,计算思维则是文章的构思、组织和内容。
我们可以从小培养孩子的计算思维,让他们有兴趣,启发他们在这方面的智力,让他们长大以后更加轻松地去学计算机相关的专业技能。我觉得,计算思维会变成孩子基础教育的一部分,像语文、数学一样,正式进入中小学课本。但是这个变化的到来还有数年,在此之前,恐怕要靠各位家长自己的努力了。在这篇文章里,我希望能简单地介绍计算思维的概念,给些例子,并分享我对孩子们的计算思维启蒙的经历和一些建议。
分解问题,基本计算思维能力
为什么要分解问题?
我先问大家,计算机聪明吗?
你们一定会说:很聪明!它可以做像登月、自动导航、下围棋、构建虚拟现实之类特别有意思的事情,它可以下棋打败世界冠军。其实,计算机是一个机器,它能做到的事情是很厉害,但是计算机能够接受的命令,实际上是非常非常简单的。
可以说,计算机能够懂得的命令,就像一两岁的小孩一样,只有非常少的几种,而且非常简单。举个例子吧,你不能跟计算机说:你去炒一个鸡蛋!但是你可以跟它说:你先把油放到锅里,然后把鸡蛋放进去,然后翻炒五分钟,拿出来放在盘子里。计算机能够接受的这种很简单的命令,我们在计算机学科里面称为指令。
计算机是很死板的。如果你把那个指令写错了,你说先放鸡蛋再放油,那么计算机真的就会去先放鸡蛋再放油,它不会自己去改过来的。也许你听说过某个很聪明的计算机自己会改错,其实并不是,它改错的那个程序是需要人来写的。
但是计算机有一个方面又是特别厉害的,这就是它的速度特别特别地快。它可以在人无法感知的毫秒内完成几百万、数千万次的计算。所以计算机有一个很好的优点,它可以不厌其烦、不断地反复做一件事。比如说,一个人可以把100本书从A排到Z。但是让你排1万本书,你就非常累了,可能要排好几天。但是计算机是不怕累的,如果有1万本电子书,甚至10万本,100万本,它不到一秒钟就能排出来。计算机快,又不会抱怨重复劳动。所以虽然计算机显得很聪明,其实只是把简单的事情做得非常地快。
为了利用计算机这种擅长很快地处理简单问题的能力,那么如何分解问题,就显得很重要。分解问题是计算思维的基本思路:一个大问题分解成计算机可以运作的小问题,然后逐步完成。计算机程序就是描述如何一步一步解决一个问题的。
分解问题不是个难题,我们日常生活中每天都在做,前面那个炒鸡蛋的例子就可以分解成:(1)准备原料;(2)炒蛋;(3)盛到盘子里。这三步需要一步一步地进行,顺序不能颠倒。这个在计算机的语言里叫“串行”。
如果我们把上面的步骤细化,第二步(2)可以再次分解为:(2.1)把油下锅;(2.2)把蛋下锅;(2.3)翻炒5分钟。这三小步也需要串行。在第2步的同时,也就是炒蛋的同时,我们可以把盘子准备好,这叫并行。并行就是不需要增加更多的时间,同时做多件事。
菜谱是计算思维分解问题的绝好实例。不过计算机做的事情一般比炒菜要酷炫或无聊得多,它更适合于比炒菜更难,更耗时间,要求更高的事。比如,计算机控制的无人驾驶,我们可以分解为:(1)摄像监测前面的道路;(2)图像分析找出车道;(3)如果前面没有障碍物,按当前速度继续开。当然,前面的每一步又可以分解成若干小步。真实的计算机系统肯定比这个要复杂,要处理各种边界条件,但是思路大致如此。
计算机希望把一个大问题,表示为能够单独解决的小问题。多小就足够小了呢?小到能用我们下面要介绍的“算法”解决,就行了。
一个算法的例子:排序
我们现在用“排序”(Sorting)来介绍算法。开学的时候,一群不认识的小朋友来到一起,需要从矮到高排队。下面我们来仔细分解一下,如果老师是个机器人(计算机),这个排队它可以怎么做。
方法一,老师先找到最矮的同学,让他站在最前面。然后,老师再在余下的小朋友中找最矮的,排在第一个后面,以此类推,直到把所有小朋友排好。
这个方法是经典计算机遍历排序算法。你可以想象,计算机把每个小朋友的高度表示成一个数字,每次看所有的数字,挑一个最小的,放到一边,然后再在剩余的数字里面挑最小的,直到全部的数字都被排好。这个方法的好处是简单易懂,缺点是比较慢,每次都要在没排过的所有数字当中看一遍,就好比老师每次都要看剩下的所有小朋友。
第二个排序的方法,所有的小朋友先随便站成一排。然后,前后每两个小朋友互相看一下对方,如果前面的比后面的高,那他们就换一下位置。
这个方法是不是比较有趣?你是否相信,这个方法最后也能把同学们从矮到高排成一排?大家可以用几个数字试试,是否发现,根据数字不同的初始位置,比如2、1、3或者3、1、2,这个方法是不是会有时候快些,有时候慢些?
然后我再问一个问题:这个方法,什么时候知道大家都排好了不用再动了?答案是每个人都比前面一个人高,不用再换位置,就可以结束了。
你可能要问,为什么要做第二个方法呢?老师直接来排不是挺好的吗?原因是如果只有10个孩子,我们当然可以用方法一来排。如果有1万个孩子要排队,那方法一就太难了:第一次老师要在1万个孩子里挑最矮的,第二次要在9999个人里面挑。而方法二,每次都是前后两个人交换,不太难。方法二还有一个特别大的好处,就是可以同时进行:前后两个小朋友随时都可以交换,不用等老师来看。这就是前面提过的并行处理,而计算机做并行处理是很在行的。
有趣的排序方法很多,我再给大家提供一个方法三:男孩从矮到高排队,女孩从矮到高排队,然后老师在前面,每次老师从两个队的队首,挑选那个比较矮的孩子,合成一个队就行了。
你可能还会问,为什么1万个孩子要从矮排到高啊?其实,孩子排队只是个比喻。真实世界中有很多排序的例子,比如图书馆的书要按作者姓名排序,字典里的词要按拼音排序。排序也是更加复杂算法的基础。
算法就是用一系列简单明确的操作来完成一项标准任务。大家在排序的例子里可以看到很多计算机算法的关键特性,比如:
(A)多样性:同一个问题的解法有多个。每个方法在不同的情况下可能效果很不一样,有的在这种情况下快,有的在那种情况下慢。一般来说,总有一个很笨的方法能达到目的,比如一个个地数过。计算机可以先用这个笨办法,然后再改进。
(B)重复性:大家可以注意到一个现象,我们经常说有一些事情要重复做,直到某一个条件满足。比如说,“重复直到所有的孩子都排好了”。条件满足了,算法就结束了。这里讲了一个计算里常用的概念,叫循环,就是一件事情反复地做,直到某一个条件满足为止。我们说过,计算机最爱不厌其烦地重复劳动。这个概念之所以重要,是因为这个算法可以用在N多个孩子排队身上,不需要预先知道一共有多少个孩子。
(C)完整性:不能有的孩子没排进去,所以我们的方法,要保证每个孩子都排好。比如有三个孩子一模一样高,你的方法也需要正确地工作,不能一直犹豫谁排在谁前面,也不能扔掉两个孩子。
看了这些,是不是觉得计算思维和数学思维不是一回事了?
生活中处处是算法
在我们学计算机的人看来,生活处处是算法。平时在家里或者在学校,我们是不是常常在找东西?比如出门前,我们要找到自己的鞋,从学校回来前要找到自己的书包。找东西的术语就叫查询,或者搜索(Search)。
搜索也有很多种不同的方法:你可以从头到尾把图书馆的书挨个地看,直到找到一本书。问题是图书馆一般都有很多书,估计这样找一本要花好几天。而且,如果这个图书馆没有这本书就麻烦了,我们要把所有的书都找过才知道没有。
所以,一般的方法是先排序再查找,还可以建立索引(Index),计算机也常常用索引的方法来查找。你还可以先分类再查找。比如说孩子的衣服、袜子,都可以分类放在不同的抽屉里方便查找。
妈妈常说:“你不把你的东西整理好,你就一直在找东西!!!”这句箴言说明了分类和搜索之间的优化关系,说明了妈妈的智慧,也说明了计算思维可以教会我们良好的生活习惯。整理东西就是分类和排序,如果预先把分类、排序都做得很好,查找起来就方便快捷多了。
查找算法也符合前面讲的几个算法特性:有多种方法找东西(多样性),需要循环直到找到为止(重复性),只要东西在家,就一定能找到(完整性)。
下面我们把学到的分解问题和算法连起来。比如,有1万个人,1万件大小不同的衣服,怎么把合适的衣服发给合适的人呢?看到这里,你肯定觉得这个答案很简单:(1)把人从矮到高排好;(2)把衣服从小到大排好;(3)按顺序每人发一件衣服。至于排人和排衣服,可以用不同的排序算法,比如人可以让他们用互换法自己排,衣服可以按号排。这个简单的例子里面隐含了一个抽象的概念:当我们解决这个发衣服大问题的时候,不需要具体解决排序的子问题(步骤1和步骤2),我们可以假设,总有办法把人和衣服排好的。
计算机之所以能够解决发射飞船到火星这种复杂问题,就是因为它假设一些子问题可以被抽象出去,单独解决。
计算思维启蒙
我家老大,一直没有正式学过编程,他应该是读高中的时候自己在网上学了一点儿。去年他因为要去一个无人驾驶公司做暑期实习,又自己学习了AI相关的算法。他的专业是学物理的,计算机方面的知识,对他来说都是需要用的时候再现学。但是编程,包括写程序来处理数据工作,对他来说都不是难题。老二现在在高中学计算机课,但是我前面提到他糊里糊涂地去参加Bebras竞赛时,并没有学过编程或者计算机相关课程。
所以总体上,我对他们两个计算思维能力的培养还是比较成功的。等我正式地了解到计算思维的概念后,回头想了一下,我是否对两个孩子进行过计算思维的启蒙呢?我总结了以下几点:
第一,因为我的背景,从小到大跟孩子在处理一些问题上,其实是用这种计算思维的方法的。我在《魔鬼老大,天使老二》一书里反复提到过,如何教孩子处理复杂问题的能力。事实上,很少有家长会在复杂技能培养上下功夫,我的书也许是亲子教育书中唯一花大篇幅谈论这个的。我现在回头去看,其实解决复杂问题,最主要的一点就是有把复杂问题分解成简单问题的能力。
比如说孩子做作业要写一篇文章,那么这个功课可以分解成收集资料、写提纲、写文章,最后再修改。写文章的那一步还可以具体分解成写每个段落。再比如孩子遇到不会的题,一个题的一部分不会做,我会建议他把这块空出来,把其他部分做完,有时间再回去解决不会的那部分。
分解问题,分而治之,把子问题清晰地描述和隔离,我们才可能解决大的问题,才可能大团队分工合作,才可能把飞船发射到火星之外。
那么顺着这样的思路,在孩子小的时候,我们可以教会孩子们在日常生活中问这些问题:
这件事怎么分步骤来做?这件事可以分成几步?
哪些大步可以再分成小步?
哪些可以同时做?哪些不能同时做?哪些可以找别人来做?
哪些步骤需要有条件才能进入?什么条件?
我们出去旅行可以分解成计划、买票、收拾东西、出去玩儿。计划,可以说如果下雨就去博物馆,如果不下雨就去公园。然后再带孩子用流程图画出来,再照着这张图去做事,这样你就已经很像一台计算机了。
第二,我帮孩子建立了规律和无穷的概念。看过《魔鬼老大,天使老二》的读者也许记得那个骐骐小时候“无穷大”的故事。骐骐在3岁10个月的时候就接触了这个无穷大的概念,虽然他是不能理解的,但是他觉得这个“特别大”的概念引人入胜,每天都在想。后来到他们上初中的时候,两个人都看过一本书叫《从一到无穷大》,这本书讲无限和其中美妙的规律,他们很喜欢,对这些数列概念他们非常有兴致,很好奇。后来他们学到斐波那契数列、帕斯卡三角、递归,这些概念他们接受起来都非常自然,而这些又都是计算思维的基础概念。
另外,我和孩子平时常用计算思维来解释生活中的现象。比如上飞机的时候,按座位从前到后排好队登机更快,还是随机乱上更快?是一个典型的模拟优化问题。孩子们常常饶有兴味地讨论这些现象,不是当作功课,而是当作有趣的话题,它们是很好玩的,比打游戏还要好玩,或者可以帮他们把游戏打得更好。所以让计算语言变成日常语言的一部分,是培养孩子计算思维的一个好方法。
计算思维,时代技能
在我们的孩子成长的时代里,他们必须要学会和计算机相处。他们以后可以是直接和计算机打交道的技术人员、研究人员、AI技术的实践者,更多的孩子会是计算机技术的使用者,或者被影响的人。其实,你现在在手机上看个帖子或者美图一张照片,背后都是计算机算法。可以说,我们生活与工作的方方面面都会跟计算机相关。
去年,我在“爱奇艺大会”上和《中国有嘻哈》的导演一起谈AI,很有兴趣地听到了他讲述如何在节目制作中,把一部分以前场记和剪辑需要做的事交给AI。比如说找到多个镜头拍摄的同一场景并且同步对齐,找到衔接对话,等等,这些非常繁琐的工作交给AI,可以把几十天后期制作工作减少到几天,错误大大减少,而且他可以专注于节目本身中更加有创意性的工作。这是了解计算机长处,分解自己工作一部分给机器来做的典型成功案例。
在这个新的时代,计算思维可以成为你的有力助手,让你在任何行业脱颖而出。所以,你的孩子可以不学计算机,但是你的孩子不能没有计算思维。
END