对象背后的那只看不见的手——软件世界的有神论

 

我想,每一个真心喜爱自己职业的程序员应该都会喜欢逻辑、理性、种种诸如此类,一看就是理科人的东西。即便表面上可能会表现出排斥、不喜,但行事总是不由的带有这种倾向。

如果你符合上述前提,但又不满足推论的结果,好吧,当我没说过,我不是一个程序员,这也不是重点。

希望看这篇文章的时候,不要用严苛的逻辑去阅读它,里边有很多比喻也许深究都是存在不恰当的,但这篇文章正是尝试用逻辑的方法在讨论逻辑中不逻辑的问题,我想表达的是一种我暂时还没法用文字讲清楚的想法。

最近在研究面向智能体(简称“AO”)的程序开发,准确的说我的研究主题是智能体(agent)这个东西,但在评价智能体和面向对象(简称“OO”,你懂的)的时候,有感面向对象的理念背后其实含有西方神学的影子,应该说是世界观,当然根据捉老鼠理论,这无伤大雅。

一切首先要从AO和OO的关系说起。

OO是一种世界观,它本身不是方法论,它可以有无数种实现方法,但它本身并不讨论如何实现的问题。

OO的世界观就是,无物不是对象。

但对象的层级仍然有些低,当用它描述一个有心智的实体时,它的缺陷就显示出来了。

从世界观,注意我强调是世界观上看,所有对象是不会主动运行的,它们天生就在那里静静地呆着,直到你用一只不知道从哪里来的手(也许是Main函数)轻轻地推了推它。学术点的说法是,它们都是被动地等待调用,而不会被主动激活。

可是一个人,可以就是你自己,你的行为是被人牵着走的吗?也许你面临很多抉择,很多环境,很多无可奈何,但从行为的本身而言,心智,或者你的思维、记忆、心灵、或者灵魂——描述的词很多,不列举了——才是驱动你作出行为的本源。也许你动了真的是因为有人推了你一把,但那个人一定不会长着一只看不见的手。

现实世界中,实体与实体之间是可以互相感知的。起码,有心智的实体是具有这个能力。例如说,当我在烧开水,我“看”到“水”“冒出了大量气泡,剧烈翻滚”,于是我们“明白”“水”已经“沸腾了”。“我”于是把“水”倒出(这里先不考虑从哪里倒出,以及倒到哪里)。

这段描述中核心是两个实体,“我”和“水”,“看”是“我”感知的手段,“‘水’冒出了大量气泡,剧烈翻滚”是“我”感知到的信息,“明白”是建模和分析的过程(也许明白这个词不是很恰当),“‘水’沸腾了”是分析的结果,把“‘水’倒出”是根据结果所作出的“反应”。

上边的文字有些绕,不过我想还是能讲的清楚的。

如果用OO的方法去描述这个过程,应该怎么做?

我想最容易,也是最常见的做法是这样(必须承认我不是程序员,也许你有更好的方法?):

设置两个对象,一个是我,一个是水。

其他的部分按下不表,我想讨论的是“感知”这一行为,我会怎么设计(以下文字是基于C#的)?

设置一个委托,在水这个对象里添加一个“沸腾了”的事件,由我这个对象去订阅这个事件,那么我就知道水“沸腾了”。

但这里存在什么问题?我确实从事件知道水“沸腾了”。

回到对现实的描述,首先,“‘水’沸腾了”是我推理分析的结果,而不是我看到的东西,我看到的是“‘水’冒出了大量气泡,剧烈翻滚”。那把事件的名字改为“气泡翻滚”,我接受以后再判断水是不是“沸腾了”不就行了吗?

有没有觉得有些别扭?

是的,因为我这个对象是被水推着走的,如果水一天不沸腾,我一天都不会做任何事情(例如检查下有没有煤气泄漏?)。现实中的情况恰恰相反,水不会推着人走,人才是这组行为的主体,那么问题在哪里?

人是有“心智”的实体,而水是没有的。

水有很多状态,可能是沸腾,可能是结晶,也可能是泼洒,但它永远不会主动做某件事情,它的改变一定是环境的变化引起的(前题它还是水,没被电解成别的什么东西)。

人不同,人会主动做一些事情,例如说烧水,水会主动烧人吗?嗯嗯,电影里边会。

这就是对象的局限所在,除非程序员想让对象变得更复杂,否则对象是没法更贴切的描述这个世界。如果让对象变得更复杂,那使用面向对象的意义也就不存在了,因为它提出的目的就是为了让事情变得更简单(强力备注:我绝对不是说面向对象不好,只是提出一些看法)。

继续烧水,我发现一壶水不够用,于是我决定同时烧几壶,但我只有一个人,所以我只能先把一壶水装好,烧上,再装一壶,烧上,再装一壶,烧上。好,现在煤气灶上正在烧三壶水,过了十分钟,它们陆续沸腾了。

这个过程是什么呢?我有序地创建了三个实体,我控制这三个实体陆续启动了三个线程,这三个线程互相之间是异步的,但这异步是由我调用的。

换一个场景,老师在课室上课,课室里有三个学生,这是只听老师一声吼~请把课本打开到第三页。于是,三个学生自己打开了课本,老师开始继续讲课。

这个过程又有什么呢?首先这三个实体一直都是异步的,它们并不受到老师的控制,可能有一个学生正在打瞌睡,另外两个学生翻书,这种异步并不需要老师去控制,学生们自己会决定自己做什么。

前者很容易可以用面向对象的方法构建,后者呢?

自己控制自己的实体,这实体还具有自己的线程,好吧,我的水平尚不足以准确描述这一场景。当然,用不那么精确的描述,还是可以的。把前者的水壶换成学生就好,看起来也差不多。确实,这样做能达到我的目的,也是大多数人的选择,可喜爱逻辑和理性的你,有没有感到一丝别扭?

嗯,由此,有人提出了面向智能体的思想。

呼,总算让智能体出来了。

简单说,智能体本身也是对象,但在对象的基础上增加了一些东西,它有心智,它的行为模式是观察外界环境,然后作出动作,至于做什么动作是由它自己决定的。理论上基本可以这么讲了,智能体是对象并不意味着提出它没有意义,面向对象的方法中谁能说它不包含面向过程呢?同理。

居然写了那么长的铺垫,果然写论文容易让人废话多,因为论文关于智能体上边有些内容当是为了给自己复习咯。

再总结一下普通对象和智能体的世界观上的区别,对象是不会主动做出动作的,它运行的时候永远是有一个看不见的手在推动它。而智能体呢,它会自己观察世界并作出反应。等等,不是说智能体也是对象吗?那为什么又要把它们区分开?这就是一种思想和理念上的不同,古人说的好,看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水。当你思维的角度变得不同,那意义已经是不同了。

不知道有多少人有我这样的经历,曾几何时,用面向过程的方法写软件的时候总觉得有些麻烦,当学到面向对象的时候忽然觉得茅塞顿开醍醐灌顶当头棒喝,感觉对象在手天下我有啊,看到什么都是对象,什么都可以用对象搞定。但真的要做开发的时候,却发现各种各样奇怪的逻辑问题,对象之间的交互,对象的启动总是有些摸不着头脑。即便有对象,即便有思想,却写不出跟书上一样优雅的代码。然后只能是刻苦阅读代码,研究各种系统架构,为无数神奇的构想击节称叹。

现在面向了智能体,是不是就可以说一声,智能体在手,天下我有呢?

我不敢,不知道你敢不敢。

为什么不敢?

来个假设,现在智能体已经有了心智,暂且把它看作一种生物,给它起个名字,例如说厄加特(agent,别吐槽我=_=!!),有一天,一只厄加特忽然问了一个问题,我从哪里来?

程序员,这只厄加特是你创造的,你能回答它吗?

“孩纸,你是我创造的。”程序猿说。

“你,你是谁?你为什么这么说?你有什么证据吗?”

“我是程序猿嘎德(god,求别吐槽)。证据,你看我写的代码,这是编译器看到没?当我把代码编译好,你就出现了。你看,你的构成就是0和1。”程序猿的声音隆隆作响。

“这明明就是我的基因图谱,天生就有的。这就是我的细胞吖。还有,这不合逻辑,这世界不是在大爆炸中产生的吗?要不你怎么解释这宇宙在不断的扩张。”

“那是我在给这程序打补丁,进行拓展开发懂不?”

这个故事写到这里,后边写不下去了,因为这是一个鸡生蛋的问题。但不知道能不能讲清楚我的想法。

对于对象,亦或者智能体而言,它是哪来的。编译吖、分配堆栈吖种种。把一个软件看成一个宇宙,这个软件宇宙,从创建好以后,是静止的(没有运行),对于这个软件宇宙而言它没有时间,但却有空间,无论你运不运行,对象就在那里,不增不减。直到启动了它(从main函数开始运动),忽然这个世界就有了时间,但这个世界内在的生物却无法理解这时间是从哪来的。

换个角度,作为人类,我们何尝不是如此?我们生存在这宇宙中,我们知道我们是父母生的(对象的分配堆分配栈分配内存分配处理器),但我们却无法回答你是谁,你从哪里来,你要到哪里去(大学门卫的三大终极问题)。无神论者说,我命由我不由天,我也是无神论者,我持同样观点。但无神论最大的软肋也在这里,目前为止,没有办法回答任意一个终极问题。于是有人提出了有神论。例如说,世界是上帝造的,人是上帝生的,人从上帝那来,回到上帝那去,人的一生,每一下呼吸,每一个动作,都是上帝控制的,人不是万能,而上帝无所不能。

有神论最大的弱点就是,你把上帝换成其他任意字符,这个结果对有神论这而言都是成立的,信不信由你。

那厄加特会不会这么想呢?也许会,也许不会,但从能力上来说,程序猿嘎德就是厄加特的神,厄加特是嘎德创造的,厄加特是嘎德编译的,厄加特从硬盘中来,到内存中去,厄加特的一生,每一个动作,都是嘎德控制的,厄加特不是万能,但嘎德无所不能。

这段话,对于厄加特而言,把嘎德换成任意字符都是成立的,假如它是有神论者。

其实这篇文章我想讨论是程序设计开发的瓶颈在哪里,为什么从面向对象以后,无数的技术无数的方法无数的理念被提出,却没有一种能想面向对象一样然后茅塞顿开,能成为一座丰碑?我想不知道(注意,是“不知道”,不是“不用”)面向对象的程序员估计都不好意思说自己是程序员吧。

因为软件的世界是一个有神论的世界,但逻辑的世界没有神。

这就是我所能看到的最大的瓶颈,无论是对象也好,智能体也罢,它们在软件世界中的存在都是凭空出现的,我们会写至少一个入口函数,然这个东西忽然就出现在了软件的世界。这是为什么即便有了对象,我们还想寻找智能体,但又为什么不敢说智能体在手,天下我有的根本原因。

因为对于智能体而言,仍然有一只来自嘎德的看不见的手指挥着它的一举一动,如果说对象只是不知道有这只手,那么智能体却是认为这只手不存在,自己所做的一切都是自己的决定。

我刚开始觉得很可笑,我一直以为计算机技术是跟宗教没有半毛钱关系的,程序猿可以信教,但软件没有信仰。但我现在发现我错了,因为软件的世界本来就是一个神的世界。

后记:

我好饿,写不下去了,这不是我的缘故,是有个看不见的手。。。=_=

这个世界有着千丝万缕的联系,只是多数人都会视而不见而已

——Ben哥。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值