论计算思维
《保密史与保密制度》课后论文,论计算思维及其在本科教育中的意义。我猜是老师自己的作业。
1. Abstract
本文扯了一扯计算思维的相关内容。应作业要求,特补充了关于与本科生教育有关的内容
2.引言
任何一门学科都有其核心思想。数学中,公理化的数理思维居于核心;工程学里,近似化的工程思维乃是黄金准则;法学上,权利与义务的思维则贯穿始终;经济学内,有着理性人的概念作为基本假设。一门学科的学习过程,相比知识的积累,更为重要的便是这种思维的培养。一门学科的思维,蕴含着整个学科理论体系的世界观与方法论,是整个学科研究经验的高度凝练与概括,真正可以称之为精华的东西。
那么对于计算机科学,我们又可以说什么?本文旨在阐述计算科学的思维,即计算思维。它的来源,意义,以及培养本科生计算思维的方法。
3. 计算思维的来源
一件非常没有意思的事是:几乎在每一篇谈及计算思维的文章中,在开篇都会不厌其烦地重复一遍周以真教授所给出的那个定义。因此,我希望换一种方式来阐述这个概念:从一个概念的来源出发。解释这个问题:什么是计算思维。
计算机科学,本质上是应用数学,它是数学与工程学的混血儿。一方面,它具有数学的抽象,严谨,与精确;另一方面,它又广泛应用了工程学中的近似方法。计算机科学,继承了这两者许多的特质。而其核心思想,亦是两者之精华。我们可以说
计算思维=数理思维 ∩ 工程思维。
计算思维是数理思维的一个子集,它是对数理思维加以实际限制所得到的一个子集。
那么,我们便可以着手了解计算思维了。首先,我们研究它与数理思维的联系。
数理思维属于认识论,实证论和方法论的综合思维形式。其最大的认识特征便是:概念化,抽象化,模式化。一个具有数理思维的人,往往具有如下的特征:在讨论问题时,习惯于强调定义,界定概念,明确问题的条件;在观察问题时,习惯于把握其中的(函数)关系,在微观认识的基础上构建综合多因素的宏观考量;在认识问题时,习惯将已有的严格数学概念广义化,并应用于现实中问题的认识过程中。将数学思想应用到实际,让数学概念,数学模型与现实世界中的事物建立同构,以数学的方法论去认识和处理客观事物。这就是数理思维。
我们容易发现,如果将上面一段文字中的“数理”二字换为“计算”,读来亦无任何不妥。这足以体现计算思维与数理思维的一脉相承性。事实上,所谓计算思维的概念,与其说是它是随着计算机技术发展而被提出,倒不如说它是随着应用数学的繁荣而出现。
培养计算思维的先决条件是培养数理思维。数理思维的核心就是公理化。而公理化可以理解为形式化+公理。数学所研究的内容,当所有定义明确给出之后,就已经被决定了。它从公理出发,按照指定的规则进行演绎,从而构建出整个数学体系。计算思维与数理思维的区别在于:它更加强调形式化的部分。它不关心演绎起点是否直观,是否正确,它所关心的是输入与输出,已知量与未知量之间是否有着正确的联系。
因为任何学科的知识都可以用命题的形式来表述。那么我们不妨用形式化的手段来阐述数理思维与计算思维之间的区别。
我们知道假言推理规则:$(A→B)∧A=>B$
数理思维需要解决的问题:不仅包括蕴含式$A→B$的真值,还要确定命题$A$是否正确。而计算思维研究的问题是$A→B$,进行了简化。它仅仅需要确定从$A$得到$B$这一过程是否正确。
其次,我们来研究计算思维与工程思维之间的联系。
工程是数学与科学的某种应用:以最少的资源,解决最多的问题。至于工程思维,虽说没有一个公认的定义,但这丝毫不妨碍我们对它的认识。工程思维的核心,便在于近似化:对实际的理论加上客观环境的限制。提出可行的方案并评估可行性,择优而用。
我们依然可以以“计算”二字替代“工程”而无恙。譬如计算机科学中,我们对算法的限制指标便是:时间复杂度与空间复杂度。
计算思维来源于数理思维与工程思维,然而它的内涵却并不仅仅是这样。计算,本质上是用一系列的运算,也就是映射,建立从未知量到已知量的映射关系,建立从输入到输出的关系。它是一门极为严谨的科学:计算结果正确与否可以得到检验——充分的可证伪性;它是一项实际的工程,需要考虑到诸如复杂性,鲁棒性等等限制因素——现实的约束;它也是一门优雅的艺术,同样是从A到B的映射,却有着的许许多多的实现方式,有复杂的,有简洁的。有优美的,也有丑陋的,问题的输入输出已经得到界定——然而实现的过程却充满着创造性。计算思维是一种建筑活动:只不过建筑材料不是木石砖瓦,而是各种基本运算。用这些材料,我们可以发挥无尽的创造力,去搭建想要的房屋。
我们还可以更加深入的对计算思维的内涵进行研究。如果我们注意到另外一个重要的概念:算法。周以真教授在《Computational Thinking》一文中所提出的所有计算思维的内涵,都是算法中的概念。事实上,任何可以归入计算思维范畴的内容,在算法中都可以找到对应的事物。换而言之,在计算思维与算法的运用之间可以建立一种同构。更进一步讲,计算思维就是使用算法的方法论。需要注意的一点区别在于计算思维并不直接等同于算法,思维属于“道”,而算法属于“器”,如何运用“器”的方法才是“道”。还有一点需要注意:“计算思维”这一概念暗示着这一过程的执行主体是人而非机器。
综上所述,我们可以以另外两种不同的方式为计算思维下一个定义。
第一种定义是种差+属概念:计算思维是工程化的数理思维。
第二种定义是:计算思维即运用算法的思维。
4. 计算思维的意义
不论是大到思索宇宙的奥秘,还是小到下一步路该如何控制肌肉。我们无时无刻都在进行思考,无论是有意识的还是无意识的。这种思考是一种计算,因为它确然符合计算的定义:根据已知量算出未知量。然而,我们日常生活中头脑所进行的计算与发生在计算机内部的计算却有着一些不同:这种区别在于,人类中的大多数,在绝大多数时间,都倾向于用归纳的方式进行计算,换而言之,一种神经网络的方法。谁也不知到在一百亿个神经元以及其十万倍数量的链接之间到底存在着怎样的黑魔法;计算机则不然,它严格遵循演绎的方法,根据严格的规则行事。如果正好运用一把计算思维来做一个类比:计算机所用的恰好是RISC指令集,而人脑采用的,则是无比复杂的CISC指令集。
对于人脑与计算机的区别,一种更好的评价方式是:是否适合(Fit)环境。对于复杂多变的物质世界,人脑通过极大的冗余设计获得了计算机望尘莫及的灵活度与适应性;然而对于稳定的环境与确定的条件,计算机的表现则有着压倒性的优势。在简单重复的工作的表现上,计算机总是比人脑更加高效,更值得信赖。恰好是计算机的这一特性,将科学家与工程师从奴隶般的机械计算中解放出来,使得他们将宝贵的脑力资源更多地用在创造性的工作之上,从而直接引发了第三次工业革命。
计算思维是一套概念模型,是从计算机科学中提取出的一套方法论。当我们运用一个思维模型时,要经历这样三个阶段:建模,解模,解释。与之相对应的则是抽象思维、演绎思维、发散思维。通过抽象,形式化,将我们所需要研究的问题进行归纳,用一种范式表达出来,建立模型;然后通过严密的演绎推理,解出这个模型;最后,使用发散思维,将蕴含于这个模型中的意义用自然语言表述出来。过去的科学研究,往往在解模的这一环节陷入瓶颈:计算量。计算机的出现解决了这一问题,从而使得科学技术的研究有了突飞猛进的发展。
不仅仅如此,计算思维曾经是数学家,计算机科学家,软件工程师等人的专利。然而随着计算机的普及,其应用领域的爆炸性发展,计算能力瓶颈的不断突破。计算作为一种智力活动的门槛被打破,计算思维不再应当是这些人的专属,它会逐渐普及开来,先是成为所有理工科大学生的必备技能,进一步拓展为所有大学生的基础素质,最终一步步拓延为全人类的集体直观。计算思维藉由信息化浪潮不可抵挡的势头,已经越来越受到人们的关注。
5. 本科教育中关于计算思维培养的现状
关于这一点,我对国内的老师们表示深深的遗憾。因为从大方向上,教育的方式就错了。当然我也表示深深的同情,这也是对于现实的妥协:没有合理的激励机制,谁会干这种费力的事情呢?第二点也是学生的问题:带好几个精英学生非常容易,但想给一窝认识水平参差不齐的学生讲好课,那可真是吃力不捞好。
夫子循循然善诱之。可是在我求学生涯中真正做到这一点的老师,一只手都能数过来。现在的大多数老师,喜欢照本宣科。就算是有那么些“教学创新”也不过是形式主义。也许老师们觉得,将虚拟存储体系比作人脑-图书馆体系,网络系统比作高速公路等等这些类比运用到教学之中就算是创新了。然而,这些手段都只是对于记忆知识以及粗浅理解的努力,没有触及问题的本质。
问题的核心在于:在当今中国,老师所讲的这些知识,不值钱。真正造成学生与社会需求脱节的原因:学生见识与认识的缺乏。
又不是什么航母导弹的核心机密,上课讲的知识真的不值钱。这些东西,但凡稍有信息检索能力的人,都可以轻易在网上迅速找出许多。真正有价值的是老师的认识,见识。对于问题的见解,在学习中曾走过的弯路。可惜对于这些内容,在教学中都少有提及。恰恰是这些不在“大纲”里面的东西,才是真正的精华。学生不缺知识,他们缺的是运用知识的方法。
为什么我们称牛顿,爱因斯坦是天才,是因为他们掌握了微积分,掌握了相对论吗?不,现代一个合格大学本科生都知道这些。它们之所以称之为天才,是因为他们发明了微积分,发明了相对论。那种创造性的思维火花才最为珍贵的瑰宝。使用轮子和重新造轮子,与重新发明轮子的难度是天壤之别。珍贵的不是那些知识,而是那种创造知识的悟性。
在学习的四个阶段:知识,理解,意识,悟性。教师所讲的,基本仅仅处于第一个阶段。一些好老师有特殊的教学技巧,可以直接传授给学生第二级的信息——理解。然而真正做到融会贯通,形成意识,也就是培养出计算思维。那就不是老师所能直接完成的任务了。名之而不可言之,是一个非常常见的现象。至于学习的最后的那个阶段,老师所能做的,就是启发、诱发、激发、开发。不过又有多少老师有这个能力和这个资格呢?
话说回来,教学应该完成的任务,便在于启发学生,重现知识创造的这一过程。
对于一个概念,首先,需要知道它是为了解决什么问题提出来的。然后才是怎么运用这个概念的问题。最后,知道了这个理论的知识性内容还远远不够,还需要将这些理论还原到生活实践之中,用来解决具体的问题。这才算是一个完整的教学流程。
现在的教学,可以说是只完成了中间的环节:知识性的内容。不信翻开手头任何一本计算机科学的教材或者数学教材,再翻开一本美国大学所用的教材,稍作对比,可见一斑。举个例子,当我看完《托马斯微积分》《线性代数及其应用》后,突然发现我做的笔记和国内的教材内容几乎没有什么差别。换而言之,国内的这些教材,都可以说是老师们自己学习后所总结出的知识性的内容——二次消化的产物。系统性上来讲,没什么可以挑剔的。用来复习,作为知识索引也许不错。但是运用到教学实践中,那就是灾难。这也是为什么对于很多优秀的学生而言,自学的效果比老师讲课要好的太多太多。
6. 怎样培养本科生的计算思维?
第一点,修正定位。
事实上,培养兴趣才是老师应该做的事情。正是,师傅领进门,修行在个人。
知识书上都有,不需要老师来教。老师真正需要做的,是阐述这个理论提出的原因,所能够解决的问题,如果这个问题恰好也是学生感兴趣的,那么就可以看到兴趣是如何成为最好的老师的。做一个导师,而不是一个教师。
第二点,历史驱动的学习模式。
正如哲学的学习就是哲学史的学习一样,数学与计算机的教育也可以考虑尝试这种模式。按照时间线而不是体系结构,在整个教育生涯中,重现学科的发展历程。不断地经历否定的过程,从最基本的概念,从最直观的现象,重现先贤们构建起整个理论系统的过程来。让学生明白,理论从何而来,向何而去。从问题提炼出的理论终究要回归到问题中去。
第三点:激励体系与评价体系的修正
现行的激励体制,奖惩评价体系都存在不少问题,无论是对于学生还是教师而言。浮躁。算了,这个说多了都是泪。
对于实际的改革,我是不报以任何希望的。这么大的系统工程,极小规模的教育实验还可以凑合弄弄,要普及那没几代人的努力是完成不了的。同时,现阶段改变教学模式,不仅仅是难度的问题,更是需求的问题。毕竟国家现在需要的是大量能干活的廉价工程师。至于创新,除了高精尖,抄国外不是挺主流的么,跟在老外后面捡面包屑在现阶段还是能够让不少人果腹的。真是Sad Story.