从第1台电子计算机问世到现在已经60年了,尽管计算机科学和技术继续保持高速发展的态势,但是计算机科学与技术不能再采用以往一样的方式发展,需要革命性的突破。如果一直顺着过去形成的惯性发展,计算机科学的路子可能会越走越窄。我们需要静下心来,认真进行反思,总结经验和教训,以便将来更快更好地发展。
计算机科学的迷途
1
.计算机科学不应以把解决方案搞复杂为荣
普遍认为,计算机科学是“算法的科学”。
美国计算机学会(
ACM
)对计算机科学有如下的定义:
Computer Science as the "systematic study of algorithmic processes that describe and transform information: their theory, analysis, design, efficiency, implementation and application"
。算法研究应该是计算机科学的重要内容,但是从某些意义上讲,计算机科学“成也算法,败也算法”。
计算机科学有两个基础:可计算性和计算复杂性。可惜,目前学习可计算性的主要兴趣在证明某些问题不可计算;学习计算复杂性的主要兴趣在证明
NP
困难问题。在其他学科中很少见到科学家对不可解或实际上几乎不可解的问题有这么大的兴趣。电子工程科学真正帮助了电路设计,如芯片设计的
EDA
工具在集成电路产业发展中功不可没。但计算机科学并没有大大减轻编软件的困难,软件设计理论的确需要革命性的突破。
上世纪
70
年代有一本书《计算机和不可解性(
Computers and Intractability
)》,作者是
M. R. Garey
和
D. S. Johnson
,很多学校都采用作为本科高年级或研究生教材,影响很大。这本书的扉页上有一张漫画,漫画中一个人说:这个问题我不能解决,但是你也不能解决,因为它是
NP
完全问题。说话那个人表现出十分得意的样子。这幅漫画影响了计算机界几十年,从事计算机科学研究的人对解决不了实际需要攻克的困难问题一般不会有任何内疚,因为这是大家都解决不了的
NP
问题。这种导向对计算机科学已产生了不好的影响。我们真正需要的不是发现一些理论上复杂的问题,而是要在用户满意的前提下尽可能有效地解决实际存在的复杂问题。计算机科学不应以把解决方案搞复杂为荣,尽可能用简单方法处理复杂问题是信息技术的生存之道。
2
.应当重视确定可有效求解的问题边界
我们做的研究工作多数是改进前人的算法或理论模型,至于沿着已开辟的方向究竟还有多大改进的余地却很少考虑,很可能这一方向已到了可有效求解的问题边界,而另一方向有很广阔的改进空间我们反而没有触及。
15
年前,美国纽约大学的施瓦茨(Schwartz)教授在智能中心做过一个报告。他说,数学上已知的(knowable)问题边界极不规则(如图1所示)。就像油田开采一样,在某个位置钻井有油,偏离一点就没有油。问题的可解性也很类似,某个问题在某些条件下是易解的,但是如果条件稍微改变一点点就很难解甚至不可解了。确定可有效求解的问题边界,应该是计算机科学的重要内容。
图1 数学上已知的问题边界极不规则
3
.并行处理不是万能药
并行计算的成功与逐步普及容易使人产生错觉,只要是单机难以解决的问题就想求助于并行计算机,但并行计算并不是万能药。
计算机算法大致上可分成三类:(
1
)线性或几乎是线性复杂性的算法,如分类(
sorting
)、商务处理等;(
2
)多项式或较低的指数复杂性算法,如矩阵运算等;(
3
)指数复杂性算法,如各种模式转换、规划(
planning
)等。第一类算法一般可用微机或服务器实现;第二类算法和问题规模大或有实时要求的第一类算法需要并行计算机。已知的第二类算法几乎都是科学计算。超级计算对第三类算法帮助不大,加速
100
万倍也只能稍稍扩大求解问题规模,需要寻找新的思路。
线性提高并行处理能力不可能对付指数增长的组合爆炸问题(NP问题)。解决人工智能等问题的非确定算法(如搜索算法)在并行处理中,会出现加速比远远超过处理机数的异常现象(好的异常),但我的博士论文
《组合搜索的并行处理(Parallel Processing for Combinatorial Search)》已经证明,好的异常和坏的异常(并行不如串行)要么都存在,要么都不存在。除非能开发出指数增长的并行处理能力,否则用生物计算机的所谓海量并行也不可能有效地解决组合爆炸问题。解决人工智能等组合爆炸问题的根本出路在于对所求解问题本身的深入理解。
计算机科学不仅要研究复杂性,还要研究“简单性”
1
.复杂性与简单性
大多数理论计算机科学家热衷于发现人为的难题,而不是寻求有效的方法解决实际问题。我们不仅需要刻画问题困难程度的“复杂性理论”,计算机科学可能更需要建立“简单性理论”,即如何发现最简单的方法去解决实际问题。由于易解问题的边界极不规则,我们特别需要一种理论指导算法设计者选择努力的方向,需要知道往某一方向努力理论上还有多大的改进空间。
例如,热力学中有一个著名的卡诺循环(
Carnot Cycle
),其理论表述很简单:
卡诺效率(
Carnot Efficiency
)
= 1
–
Tc/Th
Tc
和
Th
分别代表热机工作环境的低温和高温。这一极简单的定律对热机的设计起到非常大的作用。但是,在计算机科学里似乎从未见过这样简洁的对实际设计有指导意义的公式。
2
.驾驭复杂性是信息技术创新的基本问题
人工智能领域权威学者布鲁克斯(
Brooks
)说过:“复杂性是致命的敌人。”系统复杂性研究已成为
21
世纪最重要的科学内容,但计算机领域的科研人员对这一最活跃的领域似乎关注不够。在钱学森等老科学家的倡导下,我国学者在复杂巨系统和定性定量相结合的研究上已取得不少成果,有些成果应对计算机科学家有重要借鉴意义。
信息技术发展的历史证明:信息技术发展遵循简单性法则,过于复杂的技术往往被淘汰或变成脱离主流的技术,如
Ada
语言、数据流计算机、
B-ISDN
(宽带综合业务数字网络)技术等。互联网成功的原因之一在于
KISS
原则(
Keep It Simple and Stupid
)。我们应认真总结计算机的发展史,从中发现驾驭复杂性的规律,为计算机领域的技术创新导航。
计算机科学要为技术实现“化难为易”提供科学指南
以往的计算机科学为技术实现“化难为易”已经提供了一些科学指南,但是做得还不够。作为一门具有指导意义的科学,计算机科学应该做得更好一些。在“化难为易”方面,下面几个问题值得我们深思。
1
.降低问题复杂性的关键是选择合适的问题表述
我刚从美国回国工作时,有感于国内不重视不同于“计算方法”的算法研究,曾呼吁过国内要大力开展真正的算法研究,现在我感到要强调问题的另一面。一类问题的复杂性取决于它的问题表述(问题复杂性可能是计算机科学中很少有的不变量),只要问题表述没有改变,解决某一类问题的算法复杂性的下限就不可能改变。我们花了很多功夫优化算法,但却很少花功夫寻找合适的问题表述,可能是捡了芝麻丢了西瓜。有些所谓
NP
困难问题并不反映实际问题的本质“简单性”,比如识别人脸对人脑而言可能就是一个简单问题。我们不应研究人如何“绕过”了指数爆炸,而是要研究我们采用的人脸识别表述方法如何把我们引入了指数爆炸的歧路,我们
需要做的事情是选择对人脸数据的简单描述的模式。
2
.改变问题分解的途径可大幅度提高问题求解效率
我在美国做博士论文研究时,常常采用把一个问题分解成许多子问题的途径来解决复杂问题,这是计算机科学里最常用的
Divide and Conquer
方法。最近我的导师
Benjamin Wan
教授告诉我,对有些问题,他现在采用分解限制条件的办法比传统的子问题分解,求解效率可高出上千倍。有些实际问题,像机场的实时调度,可能有上百种限制条件。传统的求解方法是通过问题分解去缩小问题规模,如先分解到部门一级再综合。这样分解后的每一个子问题的复杂性并没有减少。但如果对限制条件进行分解,分解后的每个小问题只包含很少的限制,这样的小问题就极其简单,实际的求解效率可大大提高。
3
.虚拟化是化繁为简的关键技术
一部计算机发展的历史可看作计算机技术不断虚拟化的历史。上世纪
70
年代,
IBM 370
首先使用虚拟计算机概念。
1992
年布特勒·兰普森在获得图灵奖时引用别人的话说过:“计算机科学中的任何问题都可以通过另外一个层次解决。”计算机产业的发展不可能完全做到先提出完美的顶层设计再按既定的标准发展,标准往往是在竞争中形成的。为了解决发展过程中互操作和兼容等问题,常常通过虚拟机的思路在更高的层次隐藏下一层的技术细节。
我们要把虚拟机的思想理论化,使之成为计算机科学的重要内容。
计算机科学应重点突破技术发展的限制
1
.一味提高速度不是明智的选择。
这些年来,计算机技术的高速发展得益于摩尔(
Moore
)定律,所以不少人言必称摩尔定律。其实,计算机技术的发展也受害于摩尔定律。
CPU
和计算机性能的不断提高,确实缓解了某些过去不容易解决的困难,但也掩盖了计算机科学中的一些基本矛盾,
许多问题都指望通过计算机性能提高来解决。现在,芯片和计算机性能的提高已遇到功耗、可靠性和成本三面高墙,计算机科学应重点突破这些技术发展的限制。例如,像现在这样无限制地扩大芯片面积和集成度,一个芯片里集成几亿甚至几十亿个晶体管,造成功耗很大,成本不断增加,可靠性降低。近来许多专家都指出,一味地从提高芯片和计算机的速度上找出路不是一个明智的选择。
芯片器件的复杂性每年增长68%,到2018年单芯片内晶体管数预计将超过140亿个,而芯片设计能力(每个人月设计的晶体管数)每年只增长21%(CPU内大量的芯片面积只能用来做增值不高的缓存)。集成电路产业的瓶颈在芯片设计,若不能有效掌控芯片的复杂性,即使有了10纳米的新工艺,潜在的芯片能力也发挥不出来。
怎样才能把芯片所能提供的能力尽量发掘出来,需要在计算机科学上有所突破。
2
.吸取工业化进程的教训
我们应该从过去工业化的进程中吸取教训。几十年前,不管是化工还是钢铁,我们的前辈在实现工业化的过程中,并没有认识到他们的做法有什么不对。现在,到了我们这一代,我们发现有很多不合理的地方:没有给我们留下一个美好的环境,污染严重,浪费资源等等。我担心再过
50
年,我们的后人说,
21
世纪初有那么一批很蠢的计算机科学家,他们搞的信息化造成很多问题,浪费了很多资源,对人类文明也是一种浪费。我想,
与其将来被别人批判,还不如我们自己批判自己,走一条更加符合人类社会发展规律的道路
。我们需要反思:计算机科学技术是不是也走了一些弯路,是否应该探索革命性的突破?
计算机科学要寻求大的突破
计算机科学的发展已经到了相对成熟的阶段,如何继续向前发展是每一位计算机科学家需要认真思考的问题。我们需要摆脱过去已经取得的成就的拖累,提出新的发展思路。
1
.重新发明网络和操作系统
最近,美国国家自然基金会(
NSF
)在计算机和通信网络领域提出了新的研究方向,如投入
3
亿美金的
GENI
项目,值得我们注意。美国
NSF
网络和计算机领域的主管官员赵伟教授告诉我,他的基本思想是要
reinvention,
一个是要发明新的网络,另一个是要发明新的操作系统。他们认为,改进互联网应该是思科等公司的事,
NSF
不必为大公司赚钱操心。当网络带宽达到
10Tbps
时,分组交换可能已不能有效地工作。现在的互联网只相当于邮政系统,
NSF
应致力于发明相当
Express
快件系统的新网络。在操作系统方面,
NSF
不应再支持研究
Unix
或
Linux
,而是要创造新的操作系统。
NSF
的科研布局使我想起了美国麻省理工学院(
MIT
)的“不为”原则:“不做只要努力一定能成功的课题”,即要做没有成功把握的研究。我国
863
计划中有不少工程性很强的项目,要求一定成功是无可非议的。但即使是基金和
973
项目中,带有
reinvention
性质的项目也不多。今后,我们需要做一些目前还不能保证成功的研究。
2
.内容处理已成为必须突破的核心技术
当前,内容处理已成为网络浏览检索、软件集成(
Web
服务)、网格等计算机应用的瓶颈,语义处理也是下一代操作系统的核心技术。形形色色的软件技术最终都卡在语义上,语义处理已成为需要突破的关键技术。人工智能、模式识别等技术已有相当进展,但内容处理还处于重大技术突破的前夜,究竟什么时候能真正取得突破性的进展现在还难以预见。
冯·诺依曼的最大贡献是提出了在单台计算机上把程序视同为数据的程序存储式计算机模型,而语义研究的目标是在整个网络上实现将程序视同为数据。目前的浏览器已能做到不区分本地和远程的数据,将来可能实现的基于语义的操作系统应做到不区分本地和远程的程序。也就是说,我们的目标是实现广义的冯·诺依曼计算机,即联网的计算机真正变成一台计算机,在全球网络上实现程序等同于数据
。这是计算机科学家梦寐以求的理想,我们要持之以恒地追求。
计算机科学要成为提高办事效率与质量的“事理学”
1
.计算机科学本质上是
“
事理学
”
相对于研究物质结构原理的物理学,计算机科学本质上是研究做事效率和成本的
“
事理学
”
。所谓做事包括科学工程计算、事务处理、信息服务等各种人类想做的事情。
办事就要讲求章法、讲求系统、讲求组织,不仅仅是算法。盖一幢大楼,包括土木、水电、供暖等各种子系统,建筑公司可以做到相互配合井井有条;但编制大型软件失败的项目比比皆是,原因多半出在各部件和子系统无法协调配合。我们应不应该反思:计算机科学究竟缺了些什么?这里面可能有些根本性的规律我们没有掌握,怎么把一个事情做成功、做好,不仅仅是一个算法优化问题。
2
.关注服务科学
最近,
IBM
公司提出一个新的目标,叫做服务科学(
Service Sciences
)。专家们认为,服务科学可以将计算机科学、运筹学、产业工程、数学、管理学、决策学、社会学和法律学在既定领域内融合在一起,创建新的技能和市场来提供高价值的服务。促进技术和商务更紧密结合需要新的技能和技能组合,这些技能和应用方法必须从大学起开始教授,创建
“
服务科学
”
学科的想法从此诞生。
在美国,整个服务行业创造的价值已占全部
GDP
的
70%
以上,服务也需要科学做指导。
IBM
提出的服务科学全称是
SSME
,即服务科学、管理和工程,将服务看成科学、管理和工程的结合,把计算机和商务紧密联系起来了。美国很多学校已经开设了服务科学课程,将来培养出来的就是美国的行业工程师。若干年前,当有人从计算机硬件软件中提炼出计算机科学时,不少人奚落嘲笑;现在服务科学刚刚出现地平线上,我们不应当挑剔它的幼稚,要以敏锐的洞察力捕捉先机。
计算机科学应成为跨领域的二元或多元科学
1
.寻找被打断的“沟通链条”
近代科学学科划分过细、条块分割,反而模糊了人们对事物的总体性、全局性的认识。德国著名的物理学家普朗克认为:“科学是内在的整体,它被分解为单独的部分不是取决于事物本身,而是取决于人类认识能力的局限性。实际上存在从物理到化学,通过生物学和人类学到社会学的连续的链条,这是任何一处都不能被打断的链条”。
早在
100
多年前,马克思在《经济学
--
哲学手稿》中曾预言:“自然科学往后将会把关于人类的科学总括在自己下面,正如同关于人类的科学把自然科学总括在自己下面一样,它将成为一个科学。”面对着越来越复杂的问题,许多研究者开始探索从整体出发的研究方法,试图寻找那条被打断的“沟通链条”。
2
.形成跨领域的二元或多元计算机科学
计算机科学需要强调与自然科学、社会科学的交叉,应该成为跨领域的二元或多元科学。
将计算机学科分成科学与工程已不合时宜,南加州大学
不再按照体系结构作分界线区分计算机科学和计算机工程,而是按分析与综合分类的新框架做区分,以分析为主的叫科学,以综合为主的叫工程,计算机科学主要内容是跨学科的分析,计算机工程主要从事面向系统的综合。计算机科学要大大加强与物理学、生命科学及社会科学的交叉研究,形成计算物理学、计算生物学、社会计算等新学科,还可以形成“计算机
+
生命
+
物理”、“计算机
+
生命
+
社会”等三元交叉科学。这些交叉学科不仅仅是计算机的应用扩展,而是我们需要高度重视的计算机科学的未来主流方向。要做好这些交叉学科研究,必须加强以超级计算机为基础的计算机模拟与仿真。我们不能认为在
Computer+X
的交叉学科中,计算机只不过是一个工具。实际上这是若干新的科学,它既不是传统的计算机科学,也不是原来的
X
学,而是把这两方面或几方面融合起来的新科学
。
计算机的发展对未来人类社会也将有重大影响。计算机科学家不但要和其他领域的自然科学家合作,还需要和
社会学、经济学、新闻传播等方面的社会科学家更密切地合作。总之,今后计算机科学的研究,不能完全像过去一样走越分越细的以归约还原为主的道路,应当考虑走一条强调综合集成的新道路。
对计算机学科教育的反思
和美国
NSF
信息学部主任赵伟教授的一次对话引起我一些反思,赵伟教授认为,美国学科教育的发展有不同模式,有些封闭保守,有些开放包容。美国较好的学科教育发展模式可能是医学院和法学院,所有相关的知识都吸纳在本学院里,其他的学院一般不教医学和法律课程。工程学科也有较好的吸纳性,其他学院一般不会开设电路设计课。但计算机学科是发散的学科,其他学院可开设各种与计算机有关的课程。计算机科学会不会像数学一样把相关的知识都推出去,只剩下很少的内容?计算机学院将来教什么课?
我国一些计算机教育专家也发现了同样的问题,他们担心
计算机科学将逐步变成与现在数学差不多成为一门公共课。其实,如上所述,计算机科学方兴未艾,还有许多计算机科学应该重视的内容尚没有我们进入我们的视野,尤其是计算机科学与自然科学、社会科学的交叉将会大大充实计算机科学的内涵。我们真应当好好梳理一下,不要懵懵懂懂把计算机科学引入了很窄的死胡同。
致谢
本文有些观点是在与美国
NSF
信息学部主任赵伟教授及其他学者讨论中形成的,在此一并表示感谢。