軟體開發中的經驗主義和理性主義

來源:互聯網
上載者:User

軟體開發中的經驗主義和理性主義

讀《設計原本》筆記

 

理性主義和經驗主義是典型的認識論理論。這兩種類型的思想,從古到今,從中到外,互相對立,互相鬥爭,又互相影響,互相滲透。經驗主義者認為人類知識起源於感覺,並以感覺的領會為基礎。經驗主義誕生於古希臘。距今已有2400餘年的曆史。理性主義者認為,感覺經驗只能產生關於表象世界的意見,由於表象可能使人受到蒙蔽,所以這種得之於觀察的經驗是不可靠的,無法被確認為知識。經驗主義的代表人物有弗.培根、洛克、巴克萊、休謨、霍布斯,他們都是英國哲學家,故常常稱作“英國經驗主義”;理性主義則以法國的笛卡爾、荷蘭的斯賓諾莎、德國的萊布尼茲為主要代表,他們都是西歐大陸各國的哲學家,因此也常常稱為“大陸理性主義”。兩派哲學家並非在所有問題上都壁壘分明,但在當時的某些認知論的重大問題上,特別是關於知識的起源的問題上,確實存在著基本觀點或主要傾向上的分歧。比如在有普遍必然性的科學知識上,它是否來源於感覺經驗的問題。這兩派哲學家還是觀點鮮明,分歧最大。

經驗主義者認為,物質世界雖然和精神世界不同質,但物質世界可以通過人的感覺而為人所知。感覺是溝通存在與思維的橋樑。“嚴肅地直接從感覺出發,通過循序漸進和很好的建立起來的實驗過程,努力為人的理智開闢和建築一條道路”,這就是經驗派的創始人培根的信念。感覺的可靠為理性的可靠奠定基礎。沒有感覺,自然和人就無法溝通。第二步就是把感覺與理性思維統一起來,將感覺的個別推廣,進而上升到理性的一般。只有這兩種能力更緊密跟純粹的結合,就能使思維把握住自然界中的“形勢”,而“熟悉形式的人也就能夠在不相同的實體中抓住自然的統一性”。

軟體開發遵循什麼呢?僅僅依靠深思熟慮就能正確的設計好軟體嗎?

理性主義者認為可行。理性主義者把人看成一個完美的生物,天生就是健全的,也是優秀的。人們會犯錯誤,但可以通過教育不斷完善自己。在經過正確的教育,不斷成熟的經驗以及大量的足夠的思考後,設計者可以設計出完美無瑕的軟體。因此,在理性主義者看來,軟體設計方法學的任務就是學習如何達到完美無瑕的程度。

經驗主義者認為人類天生是不健全的,有瑕疵的,會不斷遭到誘惑,不斷犯錯。大多數人認為自己的想法完美的,從而“大多數人都是在熱情與興趣的引誘下走向錯誤之淵。”因此,經驗主義者認為,軟體設計方法學的任務就是學習如何根據實驗來找出瑕疵,對設計進行不斷的迭代,從而逐步靠近完美無瑕。

通過深思熟慮設計出正確的軟體。原則上來說,這是可能的。因為軟體像數學,是邏輯的組合。但是對於真正的人和軟體來說,又是不可能的。首先,寫出軟體的人必須一絲不苟的檢查代碼,以發現任何差錯。一點點小小的差錯都會導致啟動並執行結果不正確。其次,即使你保證你的代碼在邏輯上百分之百正確,但是你能保證你的編譯器、你的作業系統也百分之百正確嗎?

現在的電腦程式是邏輯的組合,是純粹的數學意義上的對象,而不單純是抽象的數學意義上的對象。它和數學不一樣,不能通過證明來保證其正確性。我們不可能通過深思熟慮就能設計出完全正確的軟體,然後證明設計是正確的。困難並不在設計方法,而在設計者本身。人類必然會犯錯誤,在軟體開發中尤其如此。即使你設計的相當完美,在實現過程中也會出錯。定義對象、軟體架構、演算法、資料結構以及代碼實現本身都可能產生錯誤。在軟體業,“不存在沒有bug的軟體,只是你沒有發現而已。”這句話的本質就揭示了人類必然會犯錯誤的。無論在已知的環境下還是在未知的環境下。

在軟體工程領域,人們不斷嘗試通過嚴格的形式化方法來驗證正確性。或許這是因為軟體像數學一樣都是純粹的思想,因此嚴格的證明是可行的。這一點還不同於其他領域。大多數設計領域最重的結果都是物理的實現,人們無法證明與原料及其缺陷和空間及其適用性相關的原理。

什麼經驗可以保證設計的程式是正確的呢?我們已經使用過正式的證明方法來證明安全作業系統核心設計與實現的正確性。技術很適合用在這種情況下,正式的證明保證我們的設計正確。當然,這種保證也無法達到100%。在數學史上,很多為人所接受的證明後來都被發現時存在謬誤的。正式證明並不是一個無錯的技術。它的優勢在於正式證明中的推理形勢不同於程式設計。正式證明不需要冗餘的代碼實現,它只是證明設計思想和設計方法。然而,若通過程式來實現,其間發生的錯誤又顯而易見會顯著增加。且設計方法都是在理想情況下,即使證明通過,也不能保證運行時就一定正確。

一個有名的例子是德國漢莎航空公司2904航班的事故。由於電腦控制的停止系統出現了故障,導致飛機在華沙機場脫離跑道。停止系統的代碼是根據規範編寫的。而規範是經過嚴格證明的。但規範還是沒有正確應對意外情況。該規範是這樣的:

為了保證反向推力系統與阻力板只在著陸的情況下啟用,部署到這些系統上的軟體需要滿足如下所有情況:

1.      每個主要的著陸齒輪支柱必須有12噸以上的承重;

2.      飛機輪子的旋轉速度必須達到72節;

3.      推力槓桿必須處於反推力位置。

對於華沙事故來說,前兩個條件都不滿足,因此大部分有效制動系統都沒有啟用。第一點沒有滿足,因為飛機是傾斜著陸的,為了抵消可能的風向。這樣,兩個著陸齒輪達不到12噸的眼裡,自然就無法啟用感應器。第二點也沒有滿足,因為潮濕的跑道上產生了划水現象。

    這個例子很好的說明了理性主義者無法使用演繹的完美的方法來解決這種“意外”。

在實際的軟體開發中,我們產生出一系列的設計方法學,包括設計、原型、測試、迭代式增量實現、使用大量的測試案例進行測試以及在改變之後進行迴歸測試等。這些方法無一不建立在經驗主義基礎上。

軟體工程之外的設計領域可能不會進行正確性證明,但他們卻通過無數的分析與類比技術廣泛應用了設計驗證。現在科學家們對機械零件進行壓力、震動與聲學分析。憑藉實地考察與錄影分析,建築師與客戶可以在設計好的建築上類比使用情境。對大雪和大風進行負載壓力分析測試。而電腦硬體則在電路層次、邏輯設計與程式執行層次上經受了大量的類比測試。

大量的經驗性分析的必然結果就是設計過程中出現過多的迭代。分析得越精細,就越能精確地度量出必要條件的滿足程度以及約束的遵從程度。

我是堅定的經驗主義者。因為基於我的行業背景,我認為沒有哪個軟體是完美的,是沒有瑕疵的。我們必然要依靠各種工具來矯正,來不斷彌補設計或實現中的錯誤。我們需要好的調試手段、好的調試工具來進行不斷的調試。調試的過程是調整的過程,是基於感官的認知,是承認人類是充滿瑕疵的。

現在流行的敏捷開發也是如此。敏捷開發的精髓在於通過持續的開發,不斷反饋,不斷迭代,不斷矯正的過程,來達到軟體錯誤的收斂。若完全相信理性主義,則可能會在錯誤的道路上越走越遠,最終完全失敗。

測試與迭代是必不可少的。僅僅依靠深思熟慮是不能正確的設計出複雜的對象的。經驗主義學說在軟體開發過程中的作用是無與倫比的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.