
我清楚地感到在很多人頭腦里,“科學(xué)理論”與“科學(xué)定律”的區別是混亂的,他們感到疑惑:“科學(xué)理論需要什么才能被認為是真實(shí)正確的?”
我將嘗試解釋為什么這是一個(gè)錯誤的問(wèn)題,因為我們永遠無(wú)法用實(shí)驗來(lái)“證明”一個(gè)理論。我將通過(guò)深度探討科學(xué)證明的本質(zhì)進(jìn)行解釋。然后我將說(shuō)明這些原則可以怎樣以一些有趣而出乎意料的方式應用到軟件開(kāi)發(fā)中。
當你尋找解釋某事的理論時(shí),最好的情況是你找到了一個(gè)非常通用的理論。也就是,你的理論在任何時(shí)候,任何情況下,無(wú)一例外地都是適用的。如果你找到了這樣一個(gè)理論,你可以這樣開(kāi)始描述它:“以下的結論是永遠真實(shí)的。。?!?/p>
實(shí)際上,盡管科學(xué)研究已經(jīng)持續了幾千年,我們只有非常少的這種永遠真實(shí)理論。幾乎所有理論有其“應用范圍”。例如,今天我們知道牛頓于十七世紀建立的經(jīng)典力學(xué)理論在我們達到原子級時(shí)就不再適用了。在原子級上,經(jīng)典理論不再作出精確的預測,我們需要另一種理論,量子力學(xué),來(lái)解釋發(fā)生的現象。類(lèi)似地,在速度與光速相比非常低的時(shí)候,經(jīng)典理論可以很好工作;當達到或接近光速時(shí),我們需要愛(ài)因斯坦的狹義相對論進(jìn)行預測。因此,需要注意理論只在特定領(lǐng)域里是“正確”或“非常接近正確”的。在這一領(lǐng)域外我們就需要其它理論,而該理論的適用范圍可能包含也可能不包含原理論的適用范圍。因此有時(shí)我們有一些“更通用”的理論,其他的理論只在某些限制條件下是正確的。
當然,如果你有一個(gè)你相信是“通用”的理論——也就是,它適用于所有情況——你必須對它進(jìn)行測試??茖W(xué)在本質(zhì)上是一種實(shí)驗過(guò)程,而測試一個(gè)通用理論包括逐漸擴大邊界,持續消除限制條件,以證明理論確實(shí)對所有情況都是適用的。
一個(gè)科學(xué)實(shí)驗定義了它所進(jìn)行的適用范圍。被限制在適用范圍中的實(shí)驗得到符合或是不符合理論的結果。這些情況被總結在一個(gè)2x2的矩陣中,如圖1所示。

圖1:理論和實(shí)驗
當然,在實(shí)際世界中,我們無(wú)法知道我們在矩陣的左邊還是右邊——我們不知道理論是否正確。我們通過(guò)做實(shí)驗能知道的所有事情是,實(shí)驗結果符合或是不符合提出的理論;也就是說(shuō),我們可以“看到”圖表的上半部或是下半部。讓我們分析這四種可能結果。
在實(shí)驗符合理論的情況下(由圖1的上半部示出),我們有兩個(gè)可能相關(guān)也可能不相關(guān)的結果:
A. 理論是不正確的,或受限的,但是還沒(méi)有實(shí)驗,包括我們剛剛完成的實(shí)驗,推翻它(左上的情況)。
B. 實(shí)驗表明理論是正確的,理論在接受程度甚至適用范圍上有所增長(cháng)(右上的情況)。
在后面我將對這兩種結果作進(jìn)一步解釋。
在實(shí)驗不符合理論的情況中(由圖1的下半部示出),我們要考慮兩個(gè)沖突但重要的情況。結果與理論是不一致的。這意味著(zhù)以下二者之一:
C. 理論是正確的,實(shí)驗有錯誤(右下的情況)。
D. 實(shí)驗是正確的,理論必須被推翻,修改,或加以限制(左下的情況)。
讓我們先來(lái)看看后兩種結果。
不符合理論的實(shí)驗
很明顯,結果C是非常危險的,因為僅僅一個(gè)“反面數據點(diǎn)”就可以歪曲理論。在所有情況下,如果實(shí)驗者犯了錯誤,我們無(wú)一例外地得到錯誤的結果。這就是檢查和再檢查實(shí)驗工作,由不同的科學(xué)家在不同的實(shí)驗室重復實(shí)驗以發(fā)現我們是否得到“復制”的結果非常重要的原因。但是讓我們把注意力集中到結果D,它有兩種子情況:
D1:理論在廣義上是錯誤的。
D2:該實(shí)驗表明理論在應用范圍外的某些區域是錯誤的。
也就是說(shuō),該實(shí)驗發(fā)現了一個(gè)新的理論不適用的領(lǐng)域。在先前測試的更為嚴格的領(lǐng)域中理論可能仍是正確的。這就是我們對理論有三種選擇——推翻,修改,或對新的范圍加以限制——的原因。
在有些時(shí)候,科學(xué)界不愿意基于一個(gè)相反實(shí)驗推翻一個(gè)已被接受的信條。通常理論被修改或“打上補丁”來(lái)適應新的數據。只有在出現了若干否定實(shí)驗和多個(gè)補丁后科學(xué)界才開(kāi)始尋找一個(gè)能夠解釋所有結果的更好的理論。這是Thomas Kuhn在其著(zhù)作科學(xué)革命的結構中的發(fā)現,在書(shū)中他引進(jìn)了一個(gè)“規范變化”的概念。
符合的實(shí)驗
現在讓我們回到圖表的上半部。我們達成了一致并且愿意相信實(shí)驗;也就是說(shuō),我們沒(méi)有理由懷疑實(shí)驗有錯誤。這就意味著(zhù)理論是“正確的”嗎?
當然,如果理論就是基于可證實(shí)的真理(右上的情況)的,我們就得到了一致的結果。我使用了“可證實(shí)”的真理,因為有些理論在實(shí)現獲得必要的客觀(guān)性的技術(shù)突破前是無(wú)法被證實(shí)的。例如,地球是圓的是一個(gè)古希臘人的理論,1但是現代宇宙飛行使這一理論成為了一個(gè)可見(jiàn)的事實(shí)。因此,在我們不再需要“實(shí)驗”來(lái)為理論提供更多證據之前,我們擁有的只是一些“正面數據點(diǎn)”,它們充當了我們相信理論與真理的方向是一致的的理由。也許該實(shí)驗擴展了理論的適用范圍,因為先前沒(méi)有實(shí)驗證實(shí)了理論在該范圍內適用。因此盡管實(shí)驗結果增加了我們對理論的信心,它永遠不能“證明”理論對所有情況都是正確的。這是因為沒(méi)有實(shí)驗能在所有情況下驗證理論——它所能做的只是在一組特定情況下驗證理論。
最后一種情況,也就是左上的情況是怎樣的呢?在這種情況中,驗證的理論是不正確的,但是實(shí)驗并沒(méi)有顯示矛盾。問(wèn)題出在哪里?最有可能的情況是理論并沒(méi)有在其不適用的領(lǐng)域被驗證。實(shí)驗被限制在理論仍然適用的領(lǐng)域里了,因此我們所做的只是“證實(shí)”了理論在該限制領(lǐng)域內適用。當我們進(jìn)入沒(méi)有進(jìn)行實(shí)驗測試的領(lǐng)域時(shí),所有的猜想賭注都結束了。這就是為什么在它們被廣泛應用前理論會(huì )多年停留在“實(shí)驗證明”的狀態(tài)。這是因為還沒(méi)有實(shí)驗在理論將會(huì )失敗的領(lǐng)域內測試它們。多數科學(xué)研究包括“擴張界限”,于是一個(gè)理論的適用范圍將包含越來(lái)越多的空間。一般地,將一個(gè)理論擴張到足夠的空間需要幾十年甚至上百年間大量實(shí)驗的共同工作成果。而且有時(shí)要由一個(gè)十分新穎的實(shí)驗來(lái)發(fā)現一個(gè)建立了很長(cháng)時(shí)間的理論一組的需求領(lǐng)域。
隨著(zhù)越來(lái)越多的可獲得空間被填充,理論獲得了增加的正確性并逐漸形成了我們稱(chēng)之為定律的東西。例如,我們談?wù)撆nD的萬(wàn)有引力定律,它說(shuō)的是兩個(gè)物體之間的吸引力與它們質(zhì)量的乘積成正比,與它們之間的距離的平方成反比。要使這一描述過(guò)時(shí),我們必須進(jìn)行一個(gè)產(chǎn)生與理論不符的結果的實(shí)驗。
但是即使在這里也有爭論;在理論級上協(xié)調萬(wàn)有引力定律與量子力學(xué)一直是很困難的。這實(shí)際上并沒(méi)有動(dòng)搖萬(wàn)有引力定律作為“定律”的地位;只是人們認識到在非常小的距離內,其它力變得更為重要。
理論應該不僅“解釋”通過(guò)實(shí)驗獲得的后驗數據。一個(gè)好的理論應該能夠預測先驗數據,實(shí)驗結果將會(huì )是怎樣的。如果得到的結果與預測是一致的,我們就有了支持理論得更強有力的論據。非常好的理論基于很少量的假設有很強的預測能力。而較弱的理論即時(shí)在有很多仔細“調整”過(guò)的輸入參數的情況下仍然不能做出好的預測。換句話(huà)說(shuō):留神那些有太多“旋鈕”的理論。在某種意義上,這就是實(shí)際中的奧卡姆剃刀:相對復雜的理論,我們更傾向于喜歡簡(jiǎn)單的理論。并且我們必然對那些提出了很難度量或者根本無(wú)法度量的機制——比如,以太,就是量子力學(xué)中所謂“隱藏變量”——的理論有所偏見(jiàn)。
John Walker指出,在觀(guān)測科學(xué)中,比如天文學(xué)和宇宙學(xué),人們無(wú)法進(jìn)行實(shí)驗,而必須通過(guò)根據理論做出預測然后檢查預測與觀(guān)測結果是否吻合來(lái)測試理論。這有時(shí)被稱(chēng)為“追溯”。例如,大爆炸理論對原始時(shí)期氫氣,氦氣和氘的大量存在做出了非常精確的預測。精確性度量很可能歪曲這一理論,盡管從某種意義上來(lái)說(shuō),實(shí)驗只在130億年前進(jìn)行過(guò)一次。
下面是到目前為止我們主要探討的內容小結:
我們能知道一切嗎?
現代西方科學(xué)的標準“簡(jiǎn)化理論”觀(guān)點(diǎn)就是我們不斷深入地鉆研自然的秘密,最終我們將在理解一切的那一點(diǎn)完成我們的理論體系。這是古老的“剝洋蔥”學(xué)派的想法。
當然這一舞臺上有了極大發(fā)展。從第一個(gè)原則開(kāi)始,我們可以非常精確地計算氫原子的能級。這是對量子理論以及我們進(jìn)行非常精密的實(shí)驗來(lái)證實(shí)該理論的能力的肯定。從這里開(kāi)始,我們可以證明我們的理論最終可以禁受實(shí)驗測試并被驗證,盡管這一理論是非常深奧的。問(wèn)題是,這一過(guò)程可以一直進(jìn)行下去,于是在遙遠的未來(lái),我們可以理解一切嗎?
從理論上來(lái)說(shuō),沒(méi)有什么可以阻止我們達到這一目標。但是,正如Yogi Berra曾說(shuō)過(guò)的,“從理論上來(lái)說(shuō),理論和實(shí)踐沒(méi)有什么區別。但是在實(shí)踐中,兩者是有區別的?!碑斎?,我們應該把他的話(huà)的結尾理解為,“理論和實(shí)踐是有很大的實(shí)踐區別的?!?/p>
首先,我們通過(guò)量子力學(xué)和混沌理論知道,無(wú)限精確的預測是不可能的。量子力學(xué)改變了我們的世界觀(guān),現在我們理解了我們可以在原子級上預測現象是怎樣以概率發(fā)生的,而不是確定的——也就是說(shuō),在平均上我們可以是正確的,但是永遠不會(huì )對任何事件完全確定。相似地,由于我們永遠無(wú)法無(wú)限精確地知道初始條件,混沌理論告訴我們遠期的預測是非常困難的,因為初始條件的很小的變化可以在以后導致巨大的差別。這就是遠期天氣預報是不可能的的原因。
這是一個(gè)關(guān)鍵觀(guān)察:物理學(xué),化學(xué),地質(zhì)學(xué),生物學(xué),和天文學(xué)的所有理論最終概括為數學(xué)表達式。因此我們在數學(xué)上的局限性早晚會(huì )被帶到科學(xué)中去。我們已經(jīng)非常清楚地知道數學(xué)是“不完整”的。Kurt G?Del于1931年指出,在自我包含,一致性,和完整的意義上,沒(méi)有任何數學(xué)邏輯系統是完整的。摘自Wikipedia的對他的理論的敘述是:
對任何基本算術(shù)事實(shí)是可證明的形式理論來(lái)說(shuō),如果該理論是一致的,那么就可以構造一個(gè)算術(shù)陳述,它是正確的,但無(wú)法使用該理論證明或推翻。
這是一個(gè)非?!吧羁獭焙椭匾慕Y果。它說(shuō)的是有一些數學(xué)陳述,我們永遠無(wú)法在包含它們的邏輯系統中證明它們的正誤。有趣和偶然的是這一理論本身是可以證明的!
因此我們已經(jīng)有理由相信,某些知識對我們是不可訪(fǎng)問(wèn)的。
但是G?Del并不是唯一持有這種觀(guān)點(diǎn)的人。我們至少知道其它兩個(gè)領(lǐng)域,在其中我們永遠無(wú)法得到某些問(wèn)題的答案。
第一個(gè)領(lǐng)域的代表是計算機科學(xué)中的“停機問(wèn)題”。Wikipedia是這樣描述該問(wèn)題的:
給出一個(gè)程序的描述和它的初始輸入,決定程序在該輸入下運行時(shí)會(huì )不會(huì )停止(完成)。另一種可能是程序將一直運行下去無(wú)法停止。
Alan Turing在1936年證明了對所有可能輸入解決停機問(wèn)題的通用算法是不存在的。我們說(shuō)停機問(wèn)題在圖靈機上是不可判定的。因此,又有一類(lèi)問(wèn)題我們認為是沒(méi)有可能的解決方案或答案的。
第二類(lèi)問(wèn)題來(lái)自組合數學(xué)界。2最常見(jiàn)的例子是著(zhù)名的“旅行商問(wèn)題”,這個(gè)問(wèn)題乍一看幾乎是平淡乏味的:
已知一些城市以及從一座城市到另一座城市的旅行費用,最便宜的遍歷所有城市并回到出發(fā)城市的路線(xiàn)是什么?
對較少的城市這個(gè)問(wèn)題就是困難的,而且隨著(zhù)城市數量的增加問(wèn)題的復雜性迅速增長(cháng)。實(shí)際上,當城市數量超過(guò)一個(gè)非常小的值時(shí),即使使用計算機也無(wú)法解決這個(gè)問(wèn)題了,因為需要計算的可能組合的數量增長(cháng)得太快。3這個(gè)問(wèn)題就是很多“NP完全”問(wèn)題中的一個(gè)。4現在,對這類(lèi)問(wèn)題我們的最好解決辦法是找出近似解。按照目前的知識,NP完全問(wèn)題沒(méi)有精確解。
關(guān)鍵在于,我們有若干來(lái)自數學(xué)和計算機科學(xué)的指示,告訴我們有一些問(wèn)題是無(wú)法解決的,有一些假設是無(wú)法被證明正確或是錯誤的。但是這是一個(gè)悲劇嗎?從我個(gè)人來(lái)說(shuō),我接受人類(lèi)永遠無(wú)法知道一切的觀(guān)點(diǎn)。也許我們可以近似比我們可以證明的更多的東西。最終事情的某些方面可能被發(fā)現是不可知的。那么就由它們去吧。
軟件開(kāi)發(fā)界中有兩個(gè)領(lǐng)域直接與“知識的局限性”和“什么組成了一個(gè)證明”的提法相對應。前者是測試在軟件開(kāi)發(fā)中的作用,后者是迭代開(kāi)發(fā)的提法本身。
一個(gè)程序可以被證明是“正確”的嗎?
不可以??赡軙?huì )有一些非常小的微縮程序,在特殊條件下可以被證明是“正確”的——也就是,我們可以使用數學(xué)方法證明它們不可能給出不正確的結果。5但在現實(shí)世界的程序中,答案是否定的。起初,人們以為這只是一個(gè)組合數學(xué)問(wèn)題。就是說(shuō),如果我們通過(guò)一個(gè)不太小的程序考慮所有路徑組合,我們很快就可以得出結論,窮舉測試任何軟件都是一個(gè)不可能的任務(wù)。這與NP完全問(wèn)題是類(lèi)似的。但是,實(shí)際上,這種窮舉測試比NP完全問(wèn)題更糟糕。證明程序是正確的等價(jià)于解決停機問(wèn)題。而從圖靈的工作我們可以知道這是不可能的任務(wù)。
那么我們?yōu)槭裁匆獪y試程序?正如我們只能得出結論,理論在我們的實(shí)驗覆蓋的領(lǐng)域中是適用和正確的,我們也只能說(shuō)程序在我們進(jìn)行測試的數據集上是正確的。而正如一個(gè)“否定實(shí)驗”可以推翻一個(gè)理論,一個(gè)“失敗的測試”可以指出一個(gè)先前被認為沒(méi)有錯誤的軟件存在缺陷。因此我們永遠不能保證一個(gè)軟件是“沒(méi)有缺陷”的。我們所能做的是通過(guò)對其進(jìn)行更大更密集數據集的測試來(lái)增加我們對它的信心。
多數軟件測試的重點(diǎn)是“角落的狀況”和“愚蠢的輸入”。軟件不得不禁受各種設計者沒(méi)有預見(jiàn)的情況(比如一些開(kāi)玩笑的人在應該輸入數字的地方輸入古斯拉夫字母)——這是一個(gè)非常不幸的事實(shí)。軟件測試是困難的,而正確進(jìn)行測試是我們的職業(yè)的一個(gè)重要部分。我們一直在進(jìn)步,但是我們也應該注意到它的局限性。
我們只能指出一個(gè)程序有缺陷。我們永遠不能說(shuō)明它沒(méi)有缺陷了。最有價(jià)值的測試是失敗了的測試。所有其它的測試只是增加了我們的信心,但是沒(méi)有以任何方式,方法,或形式“證實(shí)”程序。
迭代開(kāi)發(fā)有哪些好處?
由于我們無(wú)法事先知道一切,迭代開(kāi)發(fā)幫助我們接近我們想要達到的目標。瀑布規劃和開(kāi)發(fā)是經(jīng)典項目管理知識的殘留,它做了一個(gè)相當無(wú)知和天真的假設,即你事先就知道要發(fā)生的一切并對其作出計劃。沒(méi)有什么比這更遠離真實(shí)情況了。
正如我們已經(jīng)看到對什么是可知的有確定的理論極限,我們也意識到對所有項目都有意外。特別地,對軟件業(yè)來(lái)說(shuō),新技術(shù)變得不那么完美一旦我們開(kāi)始使用它們;我們計劃復用其組件的軟件投資商退出項目;優(yōu)秀的架構最后產(chǎn)生了運行速度過(guò)慢以致無(wú)法使用的軟件。因此我們必須做出中期校正。這并不是例外——這是規則。
這與實(shí)驗科學(xué)有一個(gè)有趣的類(lèi)比。與流行的信念相反的,科學(xué)并不是一直以一種有序的方式前進(jìn),正如我提及的Thomas Kuhn和他的規范變化理念所指出的??茖W(xué)過(guò)程永遠充滿(mǎn)了意外;我們進(jìn)行實(shí)驗并得到否定結果。我們的經(jīng)驗與我們的理論沖突。因此一旦我們確信實(shí)驗是有效的,我們開(kāi)始修補該理論。
一個(gè)良好的以迭代方式管理的軟件開(kāi)發(fā)項目就像一系列實(shí)驗。我們根據證明或反對一些關(guān)于最終系統的樣子的假設的目標選擇我們的實(shí)驗。我們首先進(jìn)行集中于最高風(fēng)險元素的實(shí)驗。例如,如果一項新技術(shù)對一個(gè)正在開(kāi)發(fā)中的軟件的成敗有決定作用,我們要進(jìn)行一次旨在盡可能完整地測試它的迭代。如果實(shí)驗“失敗”了,那么我們就知道我們的“理論”——這項技術(shù)將幫助我們實(shí)現最終目標——是錯誤的,于是我們必須通過(guò)采取另一種方法“修改理論”。如果實(shí)驗證實(shí)了技術(shù)是健壯的,我們就可以繼續原路線(xiàn)并在下一次迭代中測試理論的其它部分。
通過(guò)這種做法我們使得過(guò)程校正成為必要。我們以一種有序的方式對付“意外”。我們不期望所有實(shí)驗都是成功的——恰恰相反,我們希望實(shí)驗失敗。迭代開(kāi)發(fā)最重要的是盡快找出我們的“理論”中錯誤的部分并有效利用“意外”來(lái)產(chǎn)生能良好工作的產(chǎn)品。
與迭代開(kāi)發(fā)方法完全相反的方法是在項目工作開(kāi)始前建立一個(gè)詳細,預知的計劃,然后不惜一切代價(jià)堅持該計劃——好像理論永遠不需要測試。問(wèn)題是,出現在過(guò)程最后的唯一測試幾乎總是令團隊成員,項目經(jīng)理,以及用戶(hù)失望。
我們經(jīng)歷了一個(gè)長(cháng)而曲折的思考過(guò)程,因此值得做一回顧:
軟件開(kāi)發(fā)不是一門(mén)精確的科學(xué),但是好的軟件開(kāi)發(fā)與好的科學(xué)有很多可比之處。特別地,借鑒數學(xué)和科學(xué)是非常有用的——就成熟性而言它們比計算機科學(xué)多了幾千年的發(fā)展——這樣我們就不會(huì )試圖去做一些不可能的事。我們已經(jīng)知道知識在實(shí)踐和理論上都有極限,將大量計算能力用于這種極限的組合是無(wú)益的。
1有趣的是,對地球直徑最早的計算是由Eratosthenes 的一個(gè)很好的實(shí)驗進(jìn)行的,他生活在公元前二世紀,與Archimedes 同時(shí)代。當然這一計算是基于地球是一個(gè)球體而不是平的的觀(guān)念的。Eratosthenes的結果與實(shí)際值是相當接近的。Eratosthenes還發(fā)明了確定一個(gè)數是否是質(zhì)數的“篩子”。
2引自Wikipedia:“組合數學(xué)識數學(xué)的一個(gè)分支,它研究滿(mǎn)足具體標準的物體的(有限)集合。特別地,它研究這些集合中物體的‘計數’... 盡管自二十世紀后期以來(lái),它已經(jīng)發(fā)展出了強大的理論方法,(它)卻不僅關(guān)注理論的建立,同時(shí)也相當關(guān)注問(wèn)題的解決。很多組合數學(xué)研究圖形,所有組合數學(xué)的研究都對圖形研究有所助益?!?/p>
3一些數字:直接算法可以處理大約50座城市。更復雜的算法可以處理大約近200座城市。在2001年,找到了一種可以處理德國15000座城市的解決方案,它使用了大規模計算機組。當前的最高紀錄是2004年實(shí)現的處理瑞典全境大約25000個(gè)城市,也使用了令人難以置信的數量的處理器。
4'NP'表示'Non-deterministic Polynomial time'(多項式時(shí)間非確定性問(wèn)題)。
5例如,一些有限狀態(tài)機屬于這一類(lèi)別。
聯(lián)系客服