1、什么是軟件開發?
軟件開發的過程就是人們使用各種計算機語言將人們關心的現實世界映射到計算機世界的過程;
現在的計算機的數學理論基礎是由計算機的開山鼻祖,大名鼎鼎的圖靈于1937年提出的圖靈機模型。 隨后不到十年,電子計算機就誕生了(1945)。(埃尼亞克)
我們都知道,它當時的主要任務之一就是用于導彈彈道軌跡的計算。當時的軟件開發(如果可以稱之為軟件開發的話)與現在的大不相同。為了算一道題,要有人 事先把完成加減乘除等各類運算的部件像搭積木那樣搭起來,如果換一道題,則要把這些部件分解開來,根據新的要求重新搭建,效率極低(與現在比)。
現代電子計算機的體系結構及實際計算模型來自馮.諾依曼的思想。 1946年他和他的同事們發現了埃尼亞克的缺陷,發表了一份報告,提出了程序放入內存,順序執行的思想,這樣,當算一道新題時就只需采取改變計算機中的程序的“軟”的方法。
英國的科學家維爾克斯實現了馮.諾依曼的思想,領導研制了“艾克薩克”,在技術上比埃尼亞克來了個大的飛躍。
因此,現在的計算機通常被稱為馮.諾依曼計算機。
軟件開發的歷史也從此正式開始。
早期程序員們使用機器語言來進行編程運算;隨著編譯技術的出現,人們設計了許多更高級別的語言;這些語言擺脫了機器語言繁瑣的細節,更接近于人的自然語 言,迅速流行開來。 據統計,全世界的高級語言起碼有幾千種,但從可計算性的角度看,它們的計算能力都等價于圖靈機。 已經證明,一個計算機語言,只要除了賦值語句之外,還包括順序語句,條件語句和循環語句,它的計算能力即相當于圖靈機。 這里當然要排除其他技術因素的影響,如程序長度,變量個數,數據精度等。
由于圖靈機的想法是把問題轉化為一步一步按規則執行的機械求解 過程,各種計算機語言也不過都是某種形式語言,因此軟件開發的過程實質上就是程序員們對客觀世界問題域的形式化的過程。 程序員們先建立問題的模型(形式化),再用計算機語言加以合適的表達,最后再輸入計算機里進行計算。
2 從 PO(面向過程)到OO(面向對象)
從上一節的論述我們知道:
軟件開發的過程就是人們使用各種計算機語言將人們關心的現實世界(問題域)映射到計算機世界的過程;如下圖:
現實世界問題域 → 建立模型(借助某種建模思想) → 編程實現(借助某種編程語言) → 計算機世界執行求解
在談論OO之前,先讓我們回顧一下高級語言的歷史。
最早的高級語言大約誕生于1945年,是德國人楚譯為他的Z-4計算機設計的Plan Calcul,比第一臺電子計算機還早幾個月;在電子計算機上實現的第一個高級語言是美國尤尼法克公司于1952年研制成功的Short Code;而真正得到推廣使用,至今仍在流行的第一個高級語言是美國的計算機科學家巴科斯設計,并于1956年首先在IBM公司的計算機上實現的 FORTRAN語言。
早期的高級語言主要是應用于科學和工程計算,其代表作有FORTRAN和ALGOL60。計算機進入商業和行政管 理領域以后,出現了COBOL和 RPG等便于商界使用的語言。近年來,這類語言和數據庫技術,圖形界面技術(可視化編程),面向對象的思想及RAD(Rapid Application Devolopment)的概念相結合,形成了一批更方便使用的所謂第四代語言(4GL),如Powerbuilder,Delphi,VB等。
前一類應用于科學和工程計算的大型語言相對來說更為基礎,因而也更為靈活,應用范圍更為廣泛。 在FORTRAN,BASIC(學習型)之后,自70年代以來,模塊特征更明顯,簡單易用,可靠性強的PASCAL異軍突起,在世界范圍內廣泛流行。 但進入80年代以后,它的地位又逐漸為更實用的C語言替代。 到現在,C語言的地位已相當于一種“高級匯編語言”了。
80年代后期,面向對象的語言開始浮出水面,C++借助使用C語言的龐大程序員隊伍,一舉建立了面向對象語言的老大地位。從而OO的思想正式統治了整個軟件開發界。C++的流行甚至使得美國軍方從80年開始大力扶植的Ada語言還未及推廣便胎死腹中了。
90年代以后,計算機世界更是發生了天翻地覆的變化,原先的單機平臺讓位于WEB,“網絡就是計算機”,新的語言不僅要是OO的,Visual的,更要是基于WEB的。 Java語言借INTERNET的東風,橫空出世,一夜紅遍天下,變化之快令人瞠目結舌。
上述這些變化,表面是不同的編程工具在城頭變幻大王旗,但其背后反映的卻是一種更為深刻的認識論的改變,即你是用何種觀點來認識這個世界的? 在PO中,程序員們分析了問題域之后,得到一個PO的模型,其中常見的詞語是變量,函數,過程等;
PO: 現實世界 → 流程圖(變量,函數) → PO語言 → 執行求解
在OO中,程序員們先得到一個OO的模型,其中常見的詞語是類,對象,方法,消息等;
OO: 現實世界 → 類圖(對象,方法) → OO語言 → 執行求解
我們可以看到:
PO更接近于計算機世界的物理實現;OO則更符合于人們的認識習慣;
如果說,軟件危機的根源在于人們認識表達的過程(不斷反復,逐步深化)和馮.諾依曼計算機的實現過程(順序執行)之間存在巨大鴻溝的話,那么從PO到OO意味這這鴻溝在逐漸縮小;
OO作為一種思想及編程語言,為軟件開發的整個過程——從分析設計到coding——提供了一個完整解決方案。 OO堪稱是軟件發展取得的里程碑式的偉大成就,人們無不為之喝彩!
一提到OO,我們將會聯想到C++,smalltalk,simula,聯想到Use Case,ROSE,Mr Jacboson 以及Rational公司,但卻很少有人會提及維特跟斯坦(Wittgenstein)。 然而,正是這位充滿傳奇色彩的哲學家,不僅第一次清楚地表達了OO的思想,更進一步提及了OO以后的事情,及其最后的極限所在。
在目前這個變幻莫測的時代重溫并認真思考一下這位先哲的思想,或許能使我們更加清醒,更明確前方道路的漫長。
3 維特跟斯坦(Wittgenstein)與OO
維特跟斯坦是本世紀乃至人類哲學史上最偉大的哲學家之一。 他生前只于1922年出版了一本著作——《邏輯哲學論》(Tractatus Logico-Philosophicus)。在該書中,他闡述了一種世界觀,或者說一種認識世界的觀點,這種觀點,在六七十年后的今天,終于由一種哲學思想沉淀到技術的層面上來,成為計算機業界的寵兒,這就是“OO”,Object-Oriented,面向對象,或物件導向(港臺用語)。
讓我們先扯得遠點兒,(可能扯得確實遠了點),先談談這個人,再談他 《邏輯哲學論》一書中的 OO 思想。
對西方哲學感興趣的朋友都知道,在西方哲學史上發生過兩次深刻的轉向。 一次是由“本體論”向“認識論”的轉向;另一次是由“認識論”到“方法論”的轉向。
古希臘羅馬時代的西方哲學,被稱為“本體論”的時代,那時哲學家們最關心的是世界的本源問題,即世界是由什么組成的?世界的本質是什么?等等這些探究世界根本的問題。 從泰勒斯的“萬物皆水”到“四元素”說,“原子論”,再到伯拉圖的“絕對理念”,都對這一問題提出了各自的見解。
基督教借助信仰的影響力量(猶太教傳統)和世俗的政治專制力量(羅馬傳統),以上帝這一概念對此問題作出終結性回答,持異議者將有生命危險,布魯諾即因此被燒死。當然,基督教也出了幾個杰出的哲學家,他們繼承了希臘的理性傳統,混合了圣經的思想,構造了宏偉的基督教哲學體系。他們的代表人物是奧古斯丁和托馬斯.阿奎拿。 阿奎拿曾提出了證明上帝存在的五種方法(希臘理性傳統) 。
中世紀之后,隨著文藝復興運動的興起,人們開始從上帝的陰影下走出,發現了自身的作用,即人的價值。以笛卡爾的“我思故我在”為標志,哲學開始了由“本體論”向“認識論”的轉變;這一時期哲學關心的是人的認識的問題,具體的流派以各自側重的不同常分為 “唯理論”和“經驗論”,前者注重理論演繹,以笛卡爾等人為代表;后者則注重感覺和經驗,代表人物是洛克,培根等。
科學其實就是融合了“唯理論”和“經驗論”的長處而發展壯大的。 既強調試驗和觀察,運用歸納法,也重視利用數學和邏輯從歸納的結果出發,構造理論框架,演繹出新的科學定理。
到了康德以后,尤其是本世紀初,哲學的核心問題開始由“認識論”轉向“方法論”,哲學關心的核心問題是認識如何實現的問題。這一時期,哲學家們開始認識到語言對于人的認識的特殊地位,他們紛紛從研究語言出發來研究哲學。 其中甚至有些人極端的認為以前的所有哲學問題不過是語言的問題而已。哲學的這次轉向有時也被稱為是“語言的轉向” ,新的哲學觀點被冠以“語言哲學”或“分析哲學”的名稱。
“語言哲學” 的發展經歷了兩個階段,或者說可以被進一步分為兩個學派:“邏輯分析派”和“日常語言派”。維特跟斯坦的引人矚目之處在于:他在前期持邏輯分析的觀點,后期則持日常語言的觀點。
總結一下上面論述的要點,現在我們知道:
西方哲學的發展,經歷了兩次變革,一次是認識論轉向;一次是語言轉向;第一次轉向使哲學的基礎從本體論和形而上學變為認識論,從研究超驗的存在物轉到研究認識的主體和主客體關系;第二次轉向把對主客體的關系的研究變成了對主體間的交流和傳達問題的研究。把對主體的研究從觀念和思想的領域轉到了語言的領域 (語句及其意義);這兩次轉向的代表人物分別是笛卡爾和維特跟斯坦。
下面是維特跟斯坦(Wittgenstein)的小傳。
維特跟斯坦1889年生于維也納。青年時期的教育首先使他成為一名航空專業工科研究生,1908-1911,曼徹斯特。23歲時他到著名的劍橋大學學習哲學,成為羅素的學生。據說維特跟斯坦當時正為自己未來的發展方向感到迷茫,工科還是哲學?一天晚上他帶著自己的一些手稿(雜感之類的東西)來找羅素,要羅素讀一下,然后判斷自己是否是學哲學的料,如果不行的話,就準備卷鋪蓋走人。 羅素拿起他的手稿,只看了頭一句話,就堅決地對他說,你不學哲學太可惜了之類的話。維特跟斯坦這才堅定了投身哲學的決心。
在第一次世界大戰期間(1914-1918),維特跟斯坦參加奧地利軍隊,后來被俘。正是在這段時間里,他完成了自己的成名作,《邏輯哲學論》(Tractatus Logico-Philosophicus)。該書于1922年以英文出版,是他生前出版的唯一的一本著作。
在這本書中,維特跟斯坦闡述了自己的"邏輯原子論"的哲學觀點,成為該學派的代表人物之一。 其他著名的“邏輯原子主義者”包括羅素,懷海特,弗雷格等。該書的出版開創了哲學研究的新方向。
完成這本書后,維特跟斯坦認為自己已經解決了所有的哲學問題,于是他就真的放棄了哲學,先是作了一個花匠,后來作了一名小學教師。 需要說明的是,他家很富有,但他主動放棄了對巨額遺產的繼承權,自愿過一種樸素簡單的生活。
大約10年的時間,維特跟斯坦脫離了哲學界。但后來,他對自己在《邏輯哲學論》中表述的哲學的可靠性產生了深深的懷疑。于是,在1929年他重新返回劍橋,成為三一學院的老師。1939 年他得到了教授的職稱。但在第二次世界大戰期間,他卻以一名醫生的身份為軍隊服務。1947年維特跟斯坦從劍橋退休,定居于愛爾蘭。這一時期他對哲學的思考形成了他后期的哲學思想。1949年他去了趟美國,當年回來時不幸身患癌癥,1951年在牛津與世長辭。
死后,他后期的思考被整理出版,《哲學研究》(Philosophical Investigations),《關于確定性》(On Certainty) 等等,開創了語言哲學研究的另一個新的方向。
以上我羅里羅唆,主要是介紹了維特跟斯坦在哲學史上的地位,及其頗具傳奇色彩的一生。興之所至,請大家見諒。
下面我們進入主題,談一談《邏輯哲學論》 及其中表述的OO思想。
4. OO之后是什么?
一、 從軟件工程的發展歷史來看
1969年NATO會議之后,“軟件危機”成為人們關注的焦點。為迎接軟件危機的挑戰,人們進行了不懈的努力。這些努力大致上是沿著兩個方向同時進行的。一是從管理的角度,希望實現軟件開發過程的工程化。這方面最為著名的成果就是提出了大家都很熟悉的“瀑布式”生命周期模型。它是在60年代末“軟件危機”后出現的第一個生命周期模型。如下所示。
分析 → 設計 → 編碼 → 測試 → 維護
后來,又有人針對該模型的不足,提出了快速原型法、螺旋模型、噴泉模型等對“瀑布式”生命周期模型進行補充。現在,它們在軟件開發的實踐中被廣泛采用。
這方面的努力,還使人們認識到了文檔的標準以及開發者之間、開發者與用戶之間的交流方式的重要性。一些重要文檔格式的標準被確定下來,包括變量、符號的命名規則以及原代碼的規范格式。
值得一提的是,在開發者之間、開發者與用戶之間的交流方式這方面,由于Internet的出現提供了一種全新的交流手段,也產生了一種基于 Internet的全新的開發方式,即OSS(Open Source Software)。其代表作有Linux(操作系統),Apeche(web server),Sendmail(Mail server)等。OSS是一種極有前途的開發方式,借Internet發展的大潮,它勢必會對整個軟件開發模型產生難以估量的影響。近期的IEEE軟件工程專刊將為次出一期專題特刊。1999年1月份也將舉行關于Linux/OSS的國際研討會。各家計算機公司紛紛對此作出反應,微軟也意識到了來自 OSS的巨大威脅,在8月底提出了一份內部保密的文件,專門提出了自己的應對策略,可謂是山雨欲來風滿樓。有興趣者請對此保持關注。
軟件工程發展的第二個方向,側重與對軟件開發過程中分析、設計的方法的研究。這方面的第一個重要成果就是在70年代風靡一時的結構化開發方法,即PO(面向過程的開發或結構話方法)。 PO是人們在用計算機世界來表達現實世界時,追求過程話、模塊化、封裝以及更高的抽象的結果。人們用計算機來映射現實世界時,最低層的實現無非是靠數字電路技術產生的高電平與低電平信號。用數學的語言來表示,就是像 010101000010111 這樣的二進制串。這樣的抽象層次是極低的,遠離了自然語言,對一般人是不可理解的。人們把這些二進制串分塊定義,提出了字節、ASCII碼這樣的更高抽象層次的概念,使之對應于自然語言的一個個字母。在此基礎再借助某種形式語言,抽象出變量、表達式、運算、語句等概念。在這個層面上,一般經過訓練的程序員已經可以比較不那么痛苦地進行軟件開發了。下一步的抽象就產生了PO。在PO中,人們關注的是如何用函數和過程來實現對現實世界的模擬,將其映射到計算機世界之中。 OO是這種抽象層次不斷提高的過程的自然發展結果,它采用類和對象的概念,把變量以及對變量進行操作的函數和過程封裝在一起,用這種更高一級的抽象來表達客觀世界。通常,一個對象包含一些屬性和方法,它對應于自然語言中一個有意義的名詞,描述了現實世界中的一個物體(物理實體)或概念(抽象實體)。這個抽象層次如下圖所示:
計算機世界中的抽象層次
*XO(X?-Oriented) 最高的抽象層次
*OO(對象、類)
*PO(過程、函數、變量)
*變量、運算、表達式、語句
*字節(4位、8位、16位、32位、64位)
*二進制串 0101011110001 最低的抽象層次
從上圖及以上的討論我們知道,軟件工程的發展歷史就是人們不斷追求更高的抽象、封裝和模塊化的歷史。OO當然不會是歷史的終結。盡管不能精確得到OO之后是什么,我們至少可以推知,OO之后的XO,必然將是比OO更高一級的抽象。它所依賴的核心概念必然高于并包容對象這一概念。正如對象高于并包容了函數和變量一樣。
二、 從維特根斯坦在《邏輯哲學論》一書中的思想來看
前面我們已經知道,維特根斯坦在《邏輯哲學論》 一書中提出了如下思想:
*世界可以分解為事實 ( The world divides into facts.)
*事實是由原子事實(atomic facts)組成的。
*一個原子事實是多個對象(objects)的組合。
*對象是簡單的(基本的) The Object is simple。
*對象形成了世界的基礎。
即: 世界---事實----原子事實----對象這樣一個從整體到局部、從抽象到具體的認識之鏈。在這個層次中,對象作為最基本的模塊,構成了整個認識大廈的基石。對象通過相互之間的復雜的關聯構成了整個世界。這個觀點也是面向對象理論的基石。
上一段我們通過對計算機世界的分析得出,OO之后的發展,必將產生比OO更高一級的抽象的概念用于編程。按照維特根斯坦的思想可以很自然地得出結論:這個概念就是事實(FACT)。即面向對象之后是面向事實,OO之后是FO(Fact-Oriented)。那么,什么是事實(fact)?讓我們再次重溫一下維特根斯坦的觀點。
首先,世界是所有事實的總和。世界可以分解為事實。任一事實或者為真,或者不為真。(即事實應返回一個布爾變量,或為TRUE,或為FALSE)
其次,那些為真的事實,是由原子事實(atomic facts)組成的。
原子事實和簡單對象的關系是這樣的:一個原子事實是多個對象(object)的組合。在原子事實中,對象以某種確定的方式相連。原子事實中對象相互連接的方式即是原子事實的結構。 也就是說,原子事實是有結構的,這種結構被維特根斯坦看作是現實世界的模式(form)。
這里,維特根斯坦提出了幾個重要的概念:事實(fact)、原子事實(atomic fact)和模式(form)。
如果我們以上的推理過程正確的話,我們將得出一個結論:面向對象(OO)之后是面向事實(FO),在面向事實(FO)的分析、設計和編程中,我們將主要圍繞事實(fact)、原子事實(atomic fact)和模式(form)這些基本概念來組織我們的軟件開發活動。在人們認識世界的層次結構中,這些概念是比對象(object)和類(class) 更高一級的抽象。
5. 最后的極限
OO之后如果FO,那么我們當然要問,FO之后又是什么?再往后哪?有沒有一個最后的極限?若有,極限何在?這是個很困難的問題,不過還是讓我們繼續思考下去,看看能有些什么結果,盡管它可能會是十分愚蠢和幼稚。
我們知道,軟件的實質是人們以計算機編程語言為橋梁,將客觀感知世界映射于計算機世界中去,以解決人們在客觀感知世界中要解決的問題。這里牽涉三個主要的范疇:
客觀感知世界--------計算機編程語言----------計算機世界
(1)計算機世界
在計算機世界中,可以想象的是,單位面積的一塊芯片上可以集成的晶體管數目總會有個上限,摩爾定律早晚要失效。另外,現在多數電腦采用的馮.諾依曼結構也需要被突破。(如并行計算的研究)
(2)計算機編程語言
現在的計算機編程語言,都是某種類型的形式語言。要解決一個問題,首先我們必須為它構造算法。也就是說,對于沒有算法的問題,我們是束手無策的。這類問題被成為是“不可計算的”。它們的解不能由圖靈機來產生。這是我們面臨的一個極限。
那么一個問題有了算法,是不是就一定可以解決哪?很遺憾,答案是不。對于那些NP(非多項式)問題,尤其是NP完備的問題,盡管存在算法,我們仍然是無法在多項式時間內解決的。著名的“哈密頓線路問題”和“旅行推銷員問題”都屬于這類問題。它們的共同特征是,當問題的規模(或復雜度)線形增加時,解決該問題所要化的時間將呈指數上升,以至于它們盡管理論上是可求解的,但實際上卻是不可能的。因為要花費的時間可能已經超過了宇宙的壽命。這也是我們面臨的一個極限。
還需要指出,現在的計算機語言作為形式語言的一種,也必然具有形式語言自身所有的局限性。數學的發展史上,曾經有三次危機,第三次危機是有羅素的一個“佯謬”引發的悖論危機。為解決此危機,希爾伯特提出了宏偉的形式化規劃,企圖使數學一勞永逸地處于無可爭辯的安全基礎之上。可是,1931年奧地利25歲的天才數學邏輯學家歌德爾提出了一條劃時代的定理,粉碎了希爾伯特形式化的美夢。哥德爾定理向我們展示,公理系統本身的協調性的陳述在被編碼成適當的算術命題后,將成為一道這樣“不能決定的”不能決定的命題。想象一個表達式既不為真,也不為假,它的真假對一個形式系統(計算機)而言它是不可判定的。因此在這方面,哥德爾定理是我們面臨的又一個極限。
(3)客觀感知世界
現在讓我們假設軟件工程已經發展到了這樣一個理想的境界,有一天我們實現了自然語言編程,是否就萬事大吉了?換句話,自然語言是否能很好地描述、表達客觀感知世界? 維特根斯坦在《邏輯哲學論》里已經指出了。
*世界的意義必定存在于世界之外;
*顯然倫理學是無法表述的。 倫理學是超越現實的;
*實際上存在著不可表達的東西;這顯示了它的存在;它是神秘的。
(見《邏輯哲學論》第六節)
也就是說,外部世界中存在一些我們可以感知卻無法用語言來表達的東西。
他接著說:
“對于那些不可言說的,必須保持沉默。”(Whereof one cannot speak,thereof one must be silent)
這句話,成為我們最后的極限。
在討論完這三個范疇中我們將面臨的主要問題后,我們最后來討論一下人的主觀世界對軟件及軟件開發的影響。
6. 極限之外的空間
世界可以分為主觀想象世界和客觀可感知世界,或者說是內世界和外世界。其中,主觀想象世界是計算機從未涉足的空間。這是屬于我們個人的私有空間,充斥著我們自己離奇古怪的幻想和起伏不定的情緒。它具有極大的跳躍性和不確定性,常常以直覺、想象的方式進行著自己的活動。它們通常是語言所不能表達的。
盡管這個內世界是如此的復雜、混亂、難以捉摸,但它卻是我們與生俱來的一部分。我們就是這樣的人。
就是這樣的人從事著軟件開發的工作。
這樣的人開發出來的軟件究竟在多大程度上是對客觀世界不折不扣的映射?還是這個映射過程已經被扭曲或摻雜了?軟件開發者的這個主觀想象世界,他們的歡樂、沮喪、奇想、恐懼、希望等等,究竟是怎樣影響著軟件開發的質量?
人們是要用計算機來復制整個世界?還是來復制人本身?
人們是在扮演上帝的角色嗎?
這樣的問題我實在不知該如何去解答,甚至覺得根本無從下手。
如果你還有足夠的耐心讀到這里,請你也來想一想,希望它們不會使你頭疼。 :)
最后,我將引用我從網上偶爾發現的一篇文章中的話作為結束語:
“自以為是的立法者(人類)犯下了一個大錯,以為自己能定義整個軟件開發過程。他們既不了解其開始也不了解其結果。學術界試了一下,然后就知難而退了。商業界則對其毫無辦法。大型軟件開發商們斥巨資來制造代碼,明明想要扮演上帝的角色,卻還裝作自己是人類的公仆。所有人都在盯著鏡子里的自己。計算機卻在一旁偷偷的笑。”