隱喻的重要性

要的研發成果經常產自類比( analogy )。經過把你不太理解的東西和一些你較爲理解、且十分相似的東西作比較,你能夠對這些不太理解的東西產生更深入的理解。這種使用隱喻的方法叫作「建模( modeling )」。
科學史中處處均可以看到藉助隱喻的力量而產生的新發現。化學家凱庫勒曾夢見一條蛇咬着本身的尾巴,醒來後他意識到相似的環狀分子結構正好可以解釋苯的各類特性。後來的進一步實驗證明了他的這一假說( Barbour 1966 )。
氣體的分子運動理論則是基於一種所謂的「撞球( billiard-ball )」模型,它把氣體分子想象成有質量且彼此之間發生彈性碰撞的小球,就像撞球同樣。有不少有用的理論就是基於這個模型提出來的。
而光的波動理論則主要是在研究光和聲音之間類似性的基礎上發展起來的。光和聲音都有振幅(亮度、響度)、頻率(顏色、音調)和其餘一些共有屬性。對聲波理論和光波理論進行對比研究的成果豐富,科學家們甚至付諸大量的努力,想尋找一種能在真空中傳播光波的介質(就像聲波能在空氣介質中傳播同樣),並將這種介質命名爲「以太( ether )」——但他們從未能找到過這種介質。雖然類比催生了豐盛的成果,這一次它卻把人們引入了歧途。
不過總的來講,模型的威力就在於其生動性,讓你可以把握整個概念。它能隱隱地暗示各類屬性( properties )、關係( relationships )以及須要補充查證的部分( additional areas of inquiry )。不過有時候,當隱喻的概念被過分引伸時,模型也會誤導人們。當科學家們尋求「以太」的時候,他們就是過分地引伸了模型。
正如你所預期的那樣,有些隱喻比其餘一些更貼切。一個好的隱喻應該是簡單的,它與另外一些相關的隱喻聯繫密切,且可以解釋大部分實驗證據及其餘已觀測到的現象。
來考慮一下這個例子:把一塊沉重的石頭綁在細繩上讓它來回擺動。在伽利略以前,信奉亞里士多德學說的人們看到這個現象時,想到的是重物體天然地從高處墜落,落向低處並靜止下來。他們會想,下落的石頭遇到了阻礙。而伽利略在看到這個現象的時候卻想到了鐘擺( pendulum )。他認爲,那塊石頭其實是在不斷地重複着幾乎徹底相同的運動。
這兩種模型的啓發能力是徹底不同的。亞里士多德學派的人未來回擺動的石頭看做是正在下落的物體,所以會去觀察石頭的重量、石頭被拉起的高度,以及它到達靜止狀態時所須要的時間。而在伽利略的鐘擺模型中的要素就徹底不一樣了。伽利略觀注石頭的重量、鐘擺的半徑、角位移以及每次擺動所花的時間。伽利略之因此可以發現亞里士多德學派的人所不能發現的單擺定律,正是由於他們所用的模型不一樣,這使得他們看到了不一樣的現象,提出了不一樣的問題。
隱喻在幫助人們更好地理解軟件開發問題方面所作的貢獻,與它幫助人們更好地理解科學問題所作的貢獻同樣大。在 1973 年圖靈獎的演講中, Charles Bachman 講到了由盛行的地心說到日心說的轉變。托勒密的地心說模型持續了 1400 年而沒有受到嚴重挑戰,直到 1543 年哥白尼提出了以太陽爲中心的理論,這個理論認爲宇宙的中心是太陽而不是地球。這一個認知模型的改變最終幫助人們發現了新的行星,並將月亮從新界定爲地球的衛星而不是一顆獨立的行星,它也令人們對人類在宇宙中的地位有了一個徹底不一樣的理解。

Bachman 曾經把天文學中托勒密到哥白尼的轉變,與 20 世紀 70 年代早期計算機編程方面的變化作了比較。當 1973 Bachman 作這個比較時,數據處理正在從「以計算機爲中心( computer-centered )」的觀點向「以數據庫爲中心( database-centered )」的觀點轉變。 Bachman 指出,過去的數據處理是把全部數據看做流經計算機( flowing through a computer )的連續卡片流( stream of cards )(以計算機爲中心的觀點),如今則轉變爲把焦點放到數據池( pool of data )上,而計算機偶爾涉足其中(以數據庫爲中心的觀點)。
今天,咱們已經很難想象還有誰會認爲太陽是在繞着地球旋轉的。相似地,咱們也很難想象程序員還會認爲全部的數據應被看做是一個連續卡片流。在這兩個例子裏,舊的理論被拋棄後,咱們都以爲難以置信——竟然還有人曾經相信過這些理論?更有意思的是,當人們正在相信舊理論時,也一樣會認爲新理論是那麼地荒謬,正現在天咱們對舊理論的見解同樣。
在更好的理論出現以前,天文學家由於墨守地心說而屢屢受阻。在計算機世界裏面也有相似的狀況,以計算機爲中心的觀點也讓堅持它的計算機科學家步履蹣跚,直到以數據庫爲中心的理論出現。
人們經常輕視隱喻的力量。對前面的每個例子而言,很天然地有人會說:「嗯,恰當的隱喻固然是更有用,但其餘隱喻都是錯的!」雖然這是一種很天然的反應,實際遠非如此簡單。科學發展的歷史並非一系列從「錯誤」的隱喻到「正確」的隱喻的轉變,而是一系列從「不太合適」的隱喻到「更好」的隱喻的轉變,也是從不是很貼切的隱喻到更貼切的隱喻的轉變,仍是從在一 個方面暗示人們 到在另外一個方面暗示人們的轉變。
事實上,那些被更好的新模型所替代的舊模型也依然是頗有用的。工程師們依舊在使用牛頓力學來解決大部分的工程問題——雖然從理論上說,牛頓力學已經被愛因斯坦的理論所取代。
相對於其餘學科而言,軟件開發仍是一門很年輕的學科,它尚未成熟到擁有一套標準隱喻的程度。所以必然存在許多或相互補充、或相互抵觸的隱喻。某些隱喻相對好一些,而另外一些則比較糟糕。你對隱喻有多理解,也就決定了你對軟件開發有多理解。 
與其說一個軟件隱喻像是一張路線圖,還不如說它是一盞探照燈。它不會告訴你到哪裏去尋找答案,而僅是告訴你該如何去尋找答案。隱喻的做用更像啓示( heuristic ,啓發、試探法),而不是算法( algorithm )。
算法是一套定義明確的指令,使你能完成某個特定的任務。算法是可預測的( predictable )、肯定性的( deterministic )、不易變化的( not subject to chance )。一個告訴你如何從 A 點到達 B 點的算法,不會讓你繞路,不會讓你額外地通過 D E F 等地方,更不會讓你停下來聞聞玫瑰花或喝杯咖啡。
而啓發式方法(試探法)是一種幫你尋求答案的技術,但它給出的答案是具備偶然性的( subject to chance ),由於啓發式方法僅僅告訴你該如何去找,而沒有告訴你要找什麼。它並不告訴你該如何直接從 A 點到達 B 點,它甚至可能連 A 點和 B 點在哪裏都不知道。實際上,啓發式方法是穿着小丑兒外套的算法:它的結果不太好預測,也更有趣,但不會給你什麼 30 天無效退款的保證。
駕駛汽車到達某人的家,寫成算法是這樣的:沿 167 號高速公路往南行至 Puyallup ;從 South Hill Mall 出口出來後往山上開 4.5 英里 ;在一個雜物店旁邊的紅綠燈路口右轉,接着在第一個路口左轉;從左邊褐色大房子的車道進去,就是 North Cedar 714 號。
用啓發式方法來描述則多是這樣:找出上一次咱們寄給你的信,照着信上面的寄出地址開車到這個鎮;到了以後你問一下咱們的房子在哪裏。這裏每一個人都認識咱們——確定有人會很願意幫助你的;若是你找不到人,那就找個公共電話亭給咱們打電話,咱們會出來接你。
算法和啓發式方法之間的差異很微妙,兩個術語的意思也有一些重疊。就本書的目的而言,它們之間的差異就在於其距離最終解決辦法的間接程度:算法直接給你解決問題的指導,而啓發式方法則告訴你該如何發現這些指導信息,或者至少到哪裏去尋找它們。
若是有一些能明確指導你該如何解決編程問題的信息,編程固然會更容易,結果也更易預見。但編程這門學科還沒那麼先進,或許永遠也不可能那麼先進。對於編程來講,最大的挑戰仍是將問題概念化( conceptualizing ),編程中的不少錯誤都是概念性的錯誤。正由於每個問題在概念上都是獨特的,因此要找到一套能解決全部問題的一通百通的指導規則是很難的、甚至是不太可能的。如此看來,能通常性地知道大體如何解決問題,至少也和知道如何解決特定問題同樣有價值了。
那麼該如何使用軟件中的隱喻呢?應該用它來提升你對編程問題和編程過程的洞察力;用它來幫助你思考編程過程當中的活動,想象出更好的作事情的方法。你不可能看到一行代碼並說它違反了本章所描述的某個隱喻。但隨着時間的流逝,人們會發現,相對於不善運用隱喻的人來講,那些使用隱喻來照亮本身的軟件開發過程的人,他對於編程的理解會更好,而且可以更快地寫出更好的代碼。
相關文章
相關標籤/搜索