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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

有没有觉得有些别扭?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

为什么不敢?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

后记:

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

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

——Ben哥。

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

  1. 研发里那只看不见的手,勒的很疼

    PS:本文经授权转载自微信公众号:小姐姐味道,文中观点不代表号主本人. 企业中,最重要的因素就是人.这些人儿,不能全部是所谓的精英,否则眼高手低整天扯皮没人干活,最终窝里斗:也不能全部是乌合之众,这样 ...

  2. 科技领域看不见的手如何影响企业未来命运

    作者:刘锋 "看不见的手"像幽灵一样盘踞在人类社会的发展过程中,时隐时现,在亚当·斯密的<国富论>中,看不见的手推动了经济的发展:在达尔文的进化论中,看不见的手推动了生 ...

  3. 亚当斯密的“看不见的手”

    正常情况下,市场会以它内在的机制维持其健康的运行.其中主要依据的是市场经济活动中的 经济人理性原则,以及由经济人理性原则支配下的理性选择.这些选择逐步形成了市场经济中的价格机制.供求机制和竞争机制.这 ...

  4. 在P2P市场中代替“看不见的手”的算法在哪里

    ◆ ◆ ◆ 本文简单探讨P2P市场机制,在此基础上探讨匹配撮合服务的可能性. ◆ ◆ ◆ P2P市场机制基本定义与假设 首先,我们回顾一些基本定义与假设.P2P市场为"网络借贷是指个体和个体 ...

  5. 深度原创丨揭开工业互联网看不见的手:从MindSphere+Mendix谈起

    关注ITValue,看企业级最新鲜.最具价值报道! 通过分析西门子" MindSphere + Mendix"布局,文章认为要透过看得见的集成平台,洞察工业应用软件,透过" ...

  6. 走近5G云游戏标准制定——握住互联网世界看不见的手

    编者按:互联网公司和华尔街一样,喜欢拿新鲜的名词唬人.又因为科技领域互联互通的特性,许多现有名词也可以拿来随意排列组合.所以,当"未来网络实验室"."5G云游戏标准&qu ...

  7. 汽车背后那些看不见的软件系统

    本文作者为知乎@SamGIU,斯图加特大学汽车与发动机工程硕士,本文主要介绍了汽车软件系统. 跨入汽车,按下启停键,你点燃汽车动力核心,仪表亮起.挂挡,踩满油门,你感受到十足的推背感.高速上,打开自动 ...

  8. 找对象不能只看TA的外表

     1  别人家的小奶猫简直太萌了!2 你为什么抱它不抱我-我不高兴!3 这设计怎么讲  4  垃圾桶是新的穿越道具!  5  找对象不能只看TA的外表  6  一下都不知道要干嘛了7 在评论区大声告诉 ...

  9. 电脑桌面只显示计算机不显示文件夹,电脑界面变成黑色的 所有的文件夹都变成黑色的 单击右键属性 什么都看不见 都是黑色的 只显示图标-文件夹图标...

    问答堂>手机>其他分类>电脑界面变成黑色的 所有的文件夹都变成黑色的 单击右键属性 什么都看不见 都是黑色的 只显示图标 可以聊qq 上网 就是变成了黑色的 所有的背景都变成了黑色的 ...

最新文章

  1. CPU 乱序执行验证
  2. sql server express 并发数的限制_阿里数据库性能诊断的利器——SQL执行干预
  3. 捋一捋20201217
  4. QT中使用全局变量在多个源程序中传递变量
  5. MySql中的内外联结查询
  6. Ubuntu下MySQL root密码忘记的解决方法
  7. 帆软报表判断传入条件是否为空,根据逗号分隔
  8. JavaScript初阶(十)---------- 数组
  9. android rfid 数据解析_基于RFID技术的标签数据完整性与安全性解析
  10. SpringBoot实现阿里云短信接口对接
  11. TreeMap通过值对象属性排序
  12. 设置计算机关机时间快捷键,电脑怎么设定关机时间?
  13. 连续两次入围Gartner魔力象限的Quick BI到底有何魔力?
  14. 概率中的先验分布,后验分布,似然估计的通俗理解
  15. SRAM cell 详解
  16. AppStore商店App的相关信息的获取
  17. 基于51单片机的智能晾衣架系统设计
  18. OPPO Find5 X909T ColorOS1.0系统精简笔记
  19. Pytorch实战:基于pytorch预测文章阅读量
  20. openshift+SkyDive 监控---离线安装

热门文章

  1. ASCII控制字符的解释
  2. Excel的xml表现格式
  3. android语言切换不重启,Android不重启应用切换语言
  4. python的tkinter库的安装,Python2 Python3的Tkinter库的安装
  5. pandas处理excel的制表符和换行符
  6. ContextCapture水面约束(水面破洞修复)
  7. uniapp 小程序地图定位选点功能
  8. event对象的offsetX、clientX、pageX、screenX及 window.innerWidth、outerWidth使用详解
  9. 2018 infoComm 大数据可视化的交互设计探索(整理) 韩小龙 CEO of Ventuz China
  10. 百度 开通 开发者搜索。 在也不用 翻墙了。