理性主義和經(jīng)驗主義是典型的認(rèn)識論理論。這兩種類型的思想,從古到今,從中到外,互相對立,互相斗爭,又互相影響,互相滲透。經(jīng)驗主義者認(rèn)為人類知識起源于感覺,并以感覺的領(lǐng)會為基礎(chǔ)。經(jīng)驗主義誕生于古希臘。距今已有2400余年的歷史。理性主義者認(rèn)為,感覺經(jīng)驗只能產(chǎn)生關(guān)于表象世界的意見,由于表象可能使人受到蒙蔽,所以這種得之于觀察的經(jīng)驗是不可靠的,無法被確認(rèn)為知識。經(jīng)驗主義的代表人物有弗.培根、洛克、巴克萊、休謨、霍布斯,他們都是英國哲學(xué)家,故常常稱作“英國經(jīng)驗主義”;理性主義則以法國的笛卡爾、荷蘭的斯賓諾莎、德國的萊布尼茲為主要代表,他們都是西歐大陸各國的哲學(xué)家,因此也常常稱為“大陸理性主義”。兩派哲學(xué)家并非在所有問題上都壁壘分明,但在當(dāng)時的某些認(rèn)知論的重大問題上,特別是關(guān)于知識的起源的問題上,確實存在著基本觀點或主要傾向上的分歧。比如在有普遍必然性的科學(xué)知識上,它是否來源于感覺經(jīng)驗的問題。這兩派哲學(xué)家還是觀點鮮明,分歧。
經(jīng)驗主義者認(rèn)為,物質(zhì)世界雖然和精神世界不同質(zhì),但物質(zhì)世界可以通過人的感覺而為人所知。感覺是溝通存在與思維的橋梁。“嚴(yán)肅地直接從感覺出發(fā),通過循序漸進(jìn)和很好的建立起來的實驗過程,努力為人的理智開辟和建筑一條道路”,這就是經(jīng)驗派的創(chuàng)始人培根的信念。感覺的可靠為理性的可靠奠定基礎(chǔ)。沒有感覺,自然和人就無法溝通。第二步就是把感覺與理性思維統(tǒng)一起來,將感覺的個別推廣,進(jìn)而上升到理性的一般。只有這兩種能力更緊密跟純粹的結(jié)合,就能使思維把握住自然界中的“形勢”,而“熟悉形式的人也就能夠在不相同的實體中抓住自然的統(tǒng)一性”。
軟件開發(fā)遵循什么呢?僅僅依靠深思熟慮就能正確的設(shè)計好軟件嗎?
理性主義者認(rèn)為可行。理性主義者把人看成一個完美的生物,天生就是健全的,也是的。人們會犯錯誤,但可以通過教育不斷完善自己。在經(jīng)過正確的教育,不斷成熟的經(jīng)驗以及大量的足夠的思考后,設(shè)計者可以設(shè)計出完美無瑕的軟件。因此,在理性主義者看來,軟件設(shè)計方法學(xué)的任務(wù)就是學(xué)習(xí)如何達(dá)到完美無瑕的程度。
經(jīng)驗主義者認(rèn)為人類天生是不健全的,有瑕疵的,會不斷遭到誘惑,不斷犯錯。大多數(shù)人認(rèn)為自己的想法完美的,從而“大多數(shù)人都是在熱情與興趣的引誘下走向錯誤之淵。”因此,經(jīng)驗主義者認(rèn)為,軟件設(shè)計方法學(xué)的任務(wù)就是學(xué)習(xí)如何根據(jù)實驗來找出瑕疵,對設(shè)計進(jìn)行不斷的迭代,從而逐步靠近完美無瑕。
通過深思熟慮設(shè)計出正確的軟件。原則上來說,這是可能的。因為軟件像數(shù)學(xué),是邏輯的組合。但是對于真正的人和軟件來說,又是不可能的。首先,寫出軟件的人必須一絲不茍的檢查代碼,以發(fā)現(xiàn)任何差錯。一點點小小的差錯都會導(dǎo)致運(yùn)行的結(jié)果不正確。其次,即使你保證你的代碼在邏輯上百分之百正確,但是你能保證你的編譯器、你的操作系統(tǒng)也百分之百正確嗎?
現(xiàn)在的計算機(jī)程序是邏輯的組合,是純粹的數(shù)學(xué)意義上的對象,而不單純是抽象的數(shù)學(xué)意義上的對象。它和數(shù)學(xué)不一樣,不能通過證明來保證其正確性。我們不可能通過深思熟慮就能設(shè)計出完全正確的軟件,然后證明設(shè)計是正確的。困難并不在設(shè)計方法,而在設(shè)計者本身。人類必然會犯錯誤,在軟件開發(fā)中尤其如此。即使你設(shè)計的相當(dāng)完美,在實現(xiàn)過程中也會出錯。定義對象、軟件架構(gòu)、算法、數(shù)據(jù)結(jié)構(gòu)以及代碼實現(xiàn)本身都可能產(chǎn)生錯誤。在軟件業(yè),“不存在沒有bug的軟件,只是你沒有發(fā)現(xiàn)而已。”這句話的本質(zhì)就揭示了人類必然會犯錯誤的。無論在已知的環(huán)境下還是在未知的環(huán)境下。
在軟件工程領(lǐng)域,人們不斷嘗試通過嚴(yán)格的形式化方法來驗證正確性。或許這是因為軟件像數(shù)學(xué)一樣都是純粹的思想,因此嚴(yán)格的證明是可行的。這一點還不同于其他領(lǐng)域。大多數(shù)設(shè)計領(lǐng)域重的結(jié)果都是物理的實現(xiàn),人們無法證明與原料及其缺陷和空間及其適用性相關(guān)的原理。
什么經(jīng)驗可以保證設(shè)計的程序是正確的呢?我們已經(jīng)使用過正式的證明方法來證明安全操作系統(tǒng)內(nèi)核設(shè)計與實現(xiàn)的正確性。技術(shù)很適合用在這種情況下,正式的證明保證我們的設(shè)計正確。當(dāng)然,這種保證也無法達(dá)到。在數(shù)學(xué)史上,很多為人所接受的證明后來都被發(fā)現(xiàn)時存在謬誤的。正式證明并不是一個無錯的技術(shù)。它的優(yōu)勢在于正式證明中的推理形勢不同于程序設(shè)計。正式證明不需要冗余的代碼實現(xiàn),它只是證明設(shè)計思想和設(shè)計方法。然而,若通過程序來實現(xiàn),其間發(fā)生的錯誤又顯而易見會顯著增加。且設(shè)計方法都是在理想情況下,即使證明通過,也不能保證運(yùn)行時就一定正確。
一個有名的例子是德國漢莎航空公司2904航班的事故。由于計算機(jī)控制的停止系統(tǒng)出現(xiàn)了故障,導(dǎo)致飛機(jī)在華沙機(jī)場脫離跑道。停止系統(tǒng)的代碼是根據(jù)規(guī)范編寫的。而規(guī)范是經(jīng)過嚴(yán)格證明的。但規(guī)范還是沒有正確應(yīng)對意外情況。該規(guī)范是這樣的:
為了保證反向推力系統(tǒng)與阻力板只在著陸的情況下激活,部署到這些系統(tǒng)上的軟件需要滿足如下所有情況:
1.每個主要的著陸齒輪支柱必須有12噸以上的承重;
2.飛機(jī)輪子的旋轉(zhuǎn)速度必須達(dá)到72節(jié);
3.推力杠桿必須處于反推力位置。
對于華沙事故來說,前兩個條件都不滿足,因此大部分有效的制動系統(tǒng)都沒有激活。點沒有滿足,因為飛機(jī)是傾斜著陸的,為了抵消可能的風(fēng)向。這樣,兩個著陸齒輪達(dá)不到12噸的眼里,自然就無法激活傳感器。第二點也沒有滿足,因為潮濕的跑道上產(chǎn)生了劃水現(xiàn)象。
這個例子很好的說明了理性主義者無法使用演繹的完美的方法來解決這種“意外”。
在實際的軟件開發(fā)中,我們產(chǎn)生出一系列的設(shè)計方法學(xué),包括設(shè)計、原型、測試、迭代式增量實現(xiàn)、使用大量的測試用例進(jìn)行測試以及在改變之后進(jìn)行回歸測試等。這些方法無一不建立在經(jīng)驗主義基礎(chǔ)上。
軟件工程之外的設(shè)計領(lǐng)域可能不會進(jìn)行正確性證明,但他們卻通過無數(shù)的分析與模擬技術(shù)廣泛應(yīng)用了設(shè)計驗證。現(xiàn)在科學(xué)家們對機(jī)械零件進(jìn)行壓力、振動與聲學(xué)分析。憑借實地考察與錄像分析,建筑師與客戶可以在設(shè)計好的建筑上模擬使用場景。對大雪和大風(fēng)進(jìn)行負(fù)載壓力分析測試。而計算機(jī)硬件則在電路層次、邏輯設(shè)計與程序執(zhí)行層次上經(jīng)受了大量的模擬測試。
大量的經(jīng)驗性分析的必然結(jié)果就是設(shè)計過程中出現(xiàn)過多的迭代。分析得越精細(xì),就越能精確地度量出必要條件的滿足程度以及約束的遵從程度。
我是堅定的經(jīng)驗主義者。因為基于我的行業(yè)背景,我認(rèn)為沒有哪個軟件是完美的,是沒有瑕疵的。我們必然要依靠各種工具來矯正,來不斷彌補(bǔ)設(shè)計或?qū)崿F(xiàn)中的錯誤。我們需要好的調(diào)試手段、好的調(diào)試工具來進(jìn)行不斷的調(diào)試。調(diào)試的過程是調(diào)整的過程,是基于感官的認(rèn)知,是承認(rèn)人類是充滿瑕疵的。
現(xiàn)在流行的敏捷開發(fā)也是如此。敏捷開發(fā)的精髓在于通過持續(xù)的開發(fā),不斷反饋,不斷迭代,不斷矯正的過程,來達(dá)到軟件錯誤的收斂。若完全相信理性主義,則可能會在錯誤的道路上越走越遠(yuǎn),終完全失敗。
測試與迭代是必不可少的。僅僅依靠深思熟慮是不能正確的設(shè)計出復(fù)雜的對象的。經(jīng)驗主義學(xué)說在軟件開發(fā)過程中的作用是無與倫比的。