我们【即将面对】和【已经面对】的那些事儿

    计算机世界在以一种令人吃惊的速度前进着,从1946年到现在,也不过六十余年的光阴。与动则上百年到千年历史的其他学科相比,计算机科学是那么的年轻。但正是这门科学飞速地改变着我们的生活。理论和实践都在继续推进着,而我们也开始面对越来越复杂的问题。下面我们就来看看这里来自理论和实践的各种难题:

计算机理论部分:

(1)【P=NP?】当之无愧的计算机理论第一难题,也是最有意义的一道千喜大奖数学题。详细介绍会在后续补充。

我们【即将面对】和【已经面对】的那些事儿_第1张图片我们【即将面对】和【已经面对】的那些事儿_第2张图片

上图是普林斯顿大学(世界上最牛的数学研究地点)计算机系的墙壁,是ASCII码拼出的 "P=NP?"



(2)【离散数学】,尤其图论(影响软件算法)和数理逻辑(影响硬件设计)的进一步发展。现代软件中的算法理论主要依赖于图论的。图论将关系结构分为线性、树形、图形三类,他们之间是包含关系,即 线性<树形<图形。线性结构十分简单,被研究得比较透彻了;树形结构现在是高级数据结构的支撑点,基本上现代算法理论中的高级数据结构都和树形结构挂钩的;而图形结构是数学理论的难点。这就出现了一个有趣的关系:

实践中使用最多 计算机理论研究最多 数学理论研究做多
线性结构 树形结构 图形结构

    其实这不难解释,实践中运用最多的,一般都是被理解地很透彻而简单的结构;计算机理论总上想让实践更加高效,则大力推进着树形结构这种就有优良性质的数据组织方式;而数学上,树的性质是规整的,也是比较容易理清的,只剩下少数难题没有解决,那么数学家们自然更加乐忠于更加复杂的图形性质的探索。举一个不算恰当的比喻就是:线性结构好比你周围生活的小区,你十分熟悉;树形结构就好比这个地球,有很多神奇的东西让你惊叹;图形结构就好比宇宙,深邃浩淼,包容万物(事实上一切的关系都可以用图形表示)。这种实践、计算机理论、数学理论的阶梯,正好构成了计算机技术进步的阶梯。

我们【即将面对】和【已经面对】的那些事儿_第3张图片



(3)【人工智能的本质性发展】。其实人工智能在计算机诞生之初就被广泛设想,无数的科幻小说描述着人工智能,而人工智能在1956年,也就是计算机诞生后的10年就开始了广泛的研究。但令人遗憾的是,人工智能到现在都还没有任何本质性的突破。不要看到 IBM 的深蓝(Deep Blue)以及 Watson 先后击败了人类就认为人工智能已经得到了突飞猛进的发展,事实上Deep Blue和Watson所仰仗的是强大的计算机硬件,而不是强大的人工智能算法。在人工智能领域,先后出现了自动机,神经网络等令人兴奋的发现,以及后来的遗传算法、蚂蚁算法、退火算法。但事实上这些都没有本质上解决过人工智能的难题。下图是John McCarthy,人工智能之父,1971年图灵奖获得者。

我们【即将面对】和【已经面对】的那些事儿_第4张图片

    人工智能的本质难题是:现有的逻辑系统,只能按照确定的逻辑关系推理。一个东西,要么是"true",要么是"false”,这就决定了计算机只能计算确切的东西。计算机无法想人类一样思考“未知”、“可能”这样的概念,但这却是人工智能需要的。总的来说就是:计算机世界的推进法则是 "数学界研究成熟"→“计算机理论界研究成熟"→”计算机实践运用",而现在人工智能的尴尬之处就是数学理论基础都还没有成熟。一些数学家正在进行模糊逻辑的研究,但远远没有到说:"我们已经有人工智能的数学理论基础"的时候。



(4)【实践相关领域与计算机的融合】。计算机本身的成熟,并不代表计算机就能运用于实践。比如汉语翻译,这是一个计算机问题吗?不,这是一个语言学的问题,因为汉语在语言学上就是难于分析的。比如中文分词,你能将“我们都很喜欢动漫”分解成一个一个单词吗?你说可以,你大概会这样分“我们”、“都”“很”、“喜欢”、“动漫”,“都”作为副词理解,相当于英语的all,“很”作为副词理解,相当于英语的very,你说这不是很好分吗?那么请你再分解“我现在在成都”,你的程序上一次分词将“都”识别为副词,那么“成都”如何理解,程序如何知道这是一个名词?另外,有来自于语音设别,天气预报,图像识别,智能朗读,医学分析,等等领域的计算机化问题,当计算机专业人员来到这些领域准备动手实现自己的程序时,会迅速发现这样一个悖论【这个问题不是计算机不能解决,而是你们这个领域自己还没解决】

我们【即将面对】和【已经面对】的那些事儿_第5张图片

 


下面是计算机实践部分(仅涉及计算机本身,不涉及相关领域融合问题):

(1)【如何面对越来越高的数学运算要求】。如何面对超大数据,如何应对越来越高的各种精度要求?这个问题,对于在金融领域的程序员一定不会陌生。例如我对1 000 000 000 条双精度浮点数进行各种统计学分析,在公式计算过程中,乘除运算的精度高于Double的表示范围后,就会舍去部分精度,而如果每次运算舍去一定的精度,那么最后得到的结果可能和真实结果相差巨大!于是金融学的程序员一定对一种叫做Big Decimal的数据类型情有独钟,这个类型在一定程度上缓解了精度流失问题(Big Decimal的实现是非常有趣的,是一种软件模拟CPU数据运算的方法,有兴趣的朋友可以自己实现以下,可以帮你开阔视野,对你的计算机水平绝对很有帮助)。但是面对求7/3这样的问题仍然不可避免地会出现精度流失,是否可以让7/3这样的分数直接运算呢?而不是表示成浮点数。其他,可以讨论,一系列关于数学运算的问题,诸如平方、开放、log等一系列数学运算。这个问题可以概括为【能否让更多数学运算,原生地出现在程序语言中,而不是表示成整数或者浮点数】

我们【即将面对】和【已经面对】的那些事儿_第6张图片



(2)【如何面对越来越海量的数据】。如果一个程序员说“我连排序都不会!”,你一定会笑掉大牙,然后心中狠狠地鄙视对方一下,“连这么简单的东西都不会,不得不赞美一下老子的冒泡写地多么优美啊!”。但是,问题开始出现了,你可以轻松搞定1 000 000条数据的排序,甚至1 000 000 000条数据也不在话下,那么【数据量大于内存容量】呢?【数据量大于硬盘容量】呢?现在假设两种情况:一、有1 TB 数据分为1 000 个文件放在你的2TB的硬盘上,你有4G的内存;二、有1PB数据分布在1000台服务器上,每台服务器有12G内存。对于,这样两个排序问题,你还有信心简单搞定吗?我们现代即将面临的是一个海量数据的时代,多数简单的问题在面对海量数据这个前提的时候,都会变得异常困难。甚至连google这样的大公司都会为“68秒排序1TB数据,6小时排序1PB数据”而夸耀,hadoop分布式也自豪地说“2009年,在一个1406个节点组成的hadoop集群,在59秒里对500GB完成了排序;而在1460个节点的集群,排序1TB数据只花了62秒”。想想如何应对海量数据吧,这不是一个可以掉以轻心的事儿!

我们【即将面对】和【已经面对】的那些事儿_第7张图片



(3)【如何让计算更快】。在50年代到2000年左右,计算机界给出的答案是【更高的频率】,而随着频率的不断接近物理器件极限【多核CPU】成为了新的增长方式,但随之而来的就是【多核多线程编程】问题的出现,如何更好的进行多核多线程编程,计算机缺少一个坚实的理论基础来指引时间,这些年多核编程其实都是处在一个探索的过程中,Erlang的消息,Scala模仿的Actor,函数式编程,不变量的引入,基本这些都是实践的产物。这种实践先于理论的状况的发生,基本说明了这样一个事实,人们迫切需要使用多核多线程能力,但理论研究滞后了。所以现在的多核编程,更多地像一个实践难题,而不像一个理论难题。那么我们如何解决?

 

 

 

 

 

 

你可能感兴趣的:(多线程,数据结构,编程,算法,hadoop,图形)