我想,每乙個真心喜愛自己職業的程式設計師應該都會喜歡邏輯、理性、種種諸如此類,一看就是理科人的東西。即便表面上可能會表現出排斥、不喜,但行事總是不由的帶有這種傾向。
如果你符合上述前提,但又不滿足推論的結果,好吧,當我沒說過,我不是乙個程式設計師,這也不是重點。
希望看這篇文章的時候,不要用嚴苛的邏輯去閱讀它,裡邊有很多比喻也許深究都是存在不恰當的,但這篇文章正是嘗試用邏輯的方法在討論邏輯中不邏輯的問題,我想表達的是一種我暫時還沒法用文字講清楚的想法。
最近在研究面向智慧型體(簡稱「ao」)的程式開發,準確的說我的研究主題是智慧型體(agent)這個東西,但在評價智慧型體和物件導向(簡稱「oo」,***)的時候,有感物件導向的理念背後其實含有西方神學的影子,應該說是世界觀,當然根據捉老鼠理論,這無傷大雅。
一切首先要從ao和oo的關係說起。
oo是一種世界觀,它本身不是方**,它可以有無數種實現方法,但它本身並不討論如何實現的問題。
oo的世界觀就是,無物不是物件。
但物件的層級仍然有些低,當用它描述乙個有心智的實體時,它的缺陷就顯示出來了。
從世界觀,注意我強調是世界觀上看,所有物件是不會主動執行的,它們天生就在那裡靜靜地呆著,直到你用乙隻不知道從**來的手(也許是main函式)輕輕地推了推它。學術點的說法是,它們都是被動地等待呼叫,而不會被主動啟用。
可是乙個人,可以就是你自己,你的行為是被人牽著走的嗎?也許你面臨很多抉擇,很多環境,很多無可奈何,但從行為的本身而言,心智,或者你的思維、記憶、心靈、或者靈魂——描述的詞很多,不列舉了——才是驅動你作出行為的本源。也許你動了真的是因為有人推了你一把,但那個人一定不會長著乙隻看不見的手。
現實世界中,實體與實體之間是可以互相感知的。起碼,有心智的實體是具有這個能力。例如說,當我在燒開水,我「看」到「水」「冒出了大量氣泡,劇烈翻滾」,於是我們「明白」「水」已經「沸騰了」。「我」於是把「水」倒出(這裡先不考慮從**倒出,以及倒到**)。
這段描述中核心是兩個實體,「我」和「水」,「看」是「我」感知的手段,「『水』冒出了大量氣泡,劇烈翻滾」是「我」感知到的資訊,「明白」是建模和分析的過程(也許明白這個詞不是很恰當),「『水』沸騰了」是分析的結果,把「『水』倒出」是根據結果所作出的「反應」。
上邊的文字有些繞,不過我想還是能講的清楚的。
如果用oo的方法去描述這個過程,應該怎麼做?
我想最容易,也是最常見的做法是這樣(必須承認我不是程式設計師,也許你有更好的方法?):
設定兩個物件,乙個是我,乙個是水。
其他的部分按下不表,我想討論的是「感知」這一行為,我會怎麼設計(以下文字是基於c#的)?
設定乙個委託,在水這個物件裡新增乙個「沸騰了」的事件,由我這個物件去訂閱這個事件,那麼我就知道水「沸騰了」。
但這裡存在什麼問題?我確實從事件知道水「沸騰了」。
回到對現實的描述,首先,「『水』沸騰了」是我推理分析的結果,而不是我看到的東西,我看到的是「『水』冒出了大量氣泡,劇烈翻滾」。那把事件的名字改為「氣泡翻滾」,我接受以後再判斷水是不是「沸騰了」不就行了嗎?
有沒有覺得有些彆扭?
是的,因為我這個物件是被水推著走的,如果水一天不沸騰,我一天都不會做任何事情(例如檢查下有沒有煤氣洩漏?)。現實中的情況恰恰相反,水不會推著人走,人才是這組行為的主體,那麼問題在**?
人是有「心智」的實體,而水是沒有的。
水有很多狀態,可能是沸騰,可能是結晶,也可能是潑灑,但它永遠不會主動做某件事情,它的改變一定是環境的變化引起的(前題它還是水,沒被電解成別的什麼東西)。
人不同,人會主動做一些事情,例如說燒水,水會主動燒人嗎?嗯嗯,電影裡邊會。
這就是物件的侷限所在,除非程式設計師想讓物件變得更複雜,否則物件是沒法更貼切的描述這個世界。如果讓物件變得更複雜,那使用物件導向的意義也就不存在了,因為它提出的目的就是為了讓事情變得更簡單(強力備註:我絕對不是說物件導向不好,只是提出一些看法)。
繼續燒水,我發現一壺水不夠用,於是我決定同時燒幾壺,但我只有乙個人,所以我只能先把一壺水裝好,燒上,再裝一壺,燒上,再裝一壺,燒上。好,現在煤氣灶上正在燒三壺水,過了十分鐘,它們陸續沸騰了。
這個過程是什麼呢?我有序地建立了三個實體,我控制這三個實體陸續啟動了三個執行緒,這三個執行緒互相之間是非同步的,但這非同步是由我呼叫的。
換乙個場景,老師在課室上課,課室裡有三個學生,這是只聽老師一聲吼~請把課本開啟到第三頁。於是,三個學生自己開啟了課本,老師開始繼續講課。
這個過程又有什麼呢?首先這三個實體一直都是非同步的,它們並不受到老師的控制,可能有乙個學生正在打瞌睡,另外兩個學生翻書,這種非同步並不需要老師去控制,學生們自己會決定自己做什麼。
前者很容易可以用物件導向的方法構建,後者呢?
自己控制自己的實體,這實體還具有自己的執行緒,好吧,我的水平尚不足以準確描述這一場景。當然,用不那麼精確的描述,還是可以的。把前者的水壺換成學生就好,看起來也差不多。確實,這樣做能達到我的目的,也是大多數人的選擇,可喜愛邏輯和理性的你,有沒有感到一絲彆扭?
嗯,由此,有人提出了面向智慧型體的思想。
呼,總算讓智慧型體出來了。
簡單說,智慧型體本身也是物件,但在物件的基礎上增加了一些東西,它有心智,它的行為模式是觀察外界環境,然後作出動作,至於做什麼動作是由它自己決定的。理論上基本可以這麼講了,智慧型體是物件並不意味著提出它沒有意義,物件導向的方法中誰能說它不包含面向過程呢?同理。
居然寫了那麼長的鋪墊,果然寫**容易讓人廢話多,因為**關於智慧型體上邊有些內容當是為了給自己複習咯。
再總結一下普通物件和智慧型體的世界觀上的區別,物件是不會主動做出動作的,它執行的時候永遠是有乙個看不見的手在推動它。而智慧型體呢,它會自己觀察世界並作出反應。等等,不是說智慧型體也是物件嗎?那為什麼又要把它們區分開?這就是一種思想和理念上的不同,古人說的好,看山是山,看水是水;看山不是山,看水不是水;看山還是山,看水還是水。當你思維的角度變得不同,那意義已經是不同了。
不知道有多少人有我這樣的經歷,曾幾何時,用面向過程的方法寫軟體的時候總覺得有些麻煩,當學到物件導向的時候忽然覺得茅塞頓開醍醐灌頂當頭棒喝,感覺物件在手天下我有啊,看到什麼都是物件,什麼都可以用物件搞定。但真的要做開發的時候,卻發現各種各樣奇怪的邏輯問題,物件之間的互動,物件的啟動總是有些摸不著頭腦。即便有物件,即便有思想,卻寫不出跟書上一樣優雅的**。然後只能是刻苦閱讀**,研究各種系統架構,為無數神奇的構想擊節稱歎。
現在面向了智慧型體,是不是就可以說一聲,智慧型體在手,天下我有呢?
我不敢,不知道你敢不敢。
為什麼不敢?
來個假設,現在智慧型體已經有了心智,暫且把它看作一種生物,給它起個名字,例如說厄加特(agent,別吐槽我=_=!!),有一天,乙隻厄加特忽然問了乙個問題,我從**來?
程式設計師,這只厄加特是你創造的,你能回答它嗎?
「孩紙,你是我創造的。」程式猿說。
「你,你是誰?你為什麼這麼說?你有什麼證據嗎?」
「我是程式猿嘎德(god,求別吐槽)。證據,你看我寫的**,這是編譯器看到沒?當我把**編譯好,你就出現了。你看,你的構成就是0和1。」程式猿的聲音隆隆作響。
「這明明就是我的基因圖譜,天生就有的。這就是我的細胞吖。還有,這不合邏輯,這世界不是在大**中產生的嗎?要不你怎麼解釋這宇宙在不斷的擴張。」
「那是我在給這程式打補丁,進行拓展開發懂不?」
這個故事寫到這裡,後邊寫不下去了,因為這是乙個雞生蛋的問題。但不知道能不能講清楚我的想法。
對於物件,亦或者智慧型體而言,它是哪來的。編譯吖、分配堆疊吖種種。把乙個軟體看成乙個宇宙,這個軟體宇宙,從建立好以後,是靜止的(沒有執行),對於這個軟體宇宙而言它沒有時間,但卻有空間,無論你運不執行,物件就在那裡,不增不減。直到啟動了它(從main函式開始運動),忽然這個世界就有了時間,但這個世界內在的生物卻無法理解這時間是從哪來的。
換個角度,作為人類,我們何嘗不是如此?我們生存在這宇宙中,我們知道我們是父母生的(物件的分配堆分配棧分配記憶體分配處理器),但我們卻無法回答你是誰,你從**來,你要到**去(大學門衛的三大終極問題)。無神論者說,我命由我不由天,我也是無神論者,我持同樣觀點。但無神論最大的軟肋也在這裡,目前為止,沒有辦法回答任意乙個終極問題。於是有人提出了有神論。例如說,世界是上帝造的,人是上帝生的,人從上帝那來,回到上帝那去,人的一生,每一下呼吸,每乙個動作,都是上帝控制的,人不是萬能,而上帝無所不能。
有神論最大的弱點就是,你把上帝換成其他任意字元,這個結果對有神論這而言都是成立的,信不信由你。
那厄加特會不會這麼想呢?也許會,也許不會,但從能力上來說,程式猿嘎德就是厄加特的神,厄加特是嘎德創造的,厄加特是嘎德編譯的,厄加特從硬碟中來,到記憶體中去,厄加特的一生,每乙個動作,都是嘎德控制的,厄加特不是萬能,但嘎德無所不能。
這段話,對於厄加特而言,把嘎德換成任意字元都是成立的,假如它是有神論者。
其實這篇文章我想討論是程式設計開發的瓶頸在**,為什麼從物件導向以後,無數的技術無數的方法無數的理念被提出,卻沒有一種能想物件導向一樣然後茅塞頓開,能成為一座豐碑?我想不知道(注意,是「不知道」,不是「不用」)物件導向的程式設計師估計都不好意思說自己是程式設計師吧。
因為軟體的世界是乙個有神論的世界,但邏輯的世界沒有神。
這就是我所能看到的最大的瓶頸,無論是物件也好,智慧型體也罷,它們在軟體世界中的存在都是憑空出現的,我們會寫至少乙個入口函式,然這個東西忽然就出現在了軟體的世界。這是為什麼即便有了物件,我們還想尋找智慧型體,但又為什麼不敢說智慧型體在手,天下我有的根本原因。
因為對於智慧型體而言,仍然有乙隻來自嘎德的看不見的手指揮著它的一舉一動,如果說物件只是不知道有這隻手,那麼智慧型體卻是認為這只手不存在,自己所做的一切都是自己的決定。
我剛開始覺得很可笑,我一直以為計算機技術是跟宗教沒有半毛錢關係的,程式猿可以信教,但軟體沒有信仰。但我現在發現我錯了,因為軟體的世界本來就是乙個神的世界。
後記:我好餓,寫不下去了,這不是我的緣故,是有個看不見的手。。。=_=
這個世界有著千絲萬縷的聯絡,只是多數人都會視而不見而已
——ben哥。
「看不見的手」
150年前,隱秘的歐洲金融權貴羅斯切爾德家族保留著一句名言 絕大多數的人民在智力上不足以理解這個系統 支票貨幣和信用貨幣 以及這個系統所衍生出的資本和巨大優勢,他們將承受壓迫而毫無怨言,甚至一點都不會懷疑這個系統損害了他們的利益。多年之後,羅斯切爾德家族的子孫,幾乎控制了所有發達國家的貨幣發行權,掌...
C 中看不見的臨時物件
物件導向的程式語言中涉及到物件的建立與銷毀,其中有建構函式與析構函式的呼叫,在建立物件 值拷貝物件等過程中,編譯器會隱含建立一些原始碼中沒有的臨時物件,如果不注意,這些臨時物件會給程式的效能帶來很大的影響。下面介紹二種常見的臨時物件產生環境並給出解決方案 1 當函式返回乙個物件時,一般情況下會出現臨...
關於假設 看不見的基石
關於假設 看不見的基石 invisible foundation stone 1序我們現在的大多數基礎理論都是建立在一些簡單而明顯的假設之上的。例如在數學領域,在物理學領域,在化學領域 同時也有一些基礎理論因為假設的錯誤或者不夠準確,而被新的理論所代替,或者被擴充套件和修改。例如 第五公設問題 2展...