經過把你不太理解的東西和一些你較爲理解、且十分相似的東西作比較,你能夠對這些不太理解的東西產生更深入的理解。這種使用隱喻的方法叫作「建模(modeling)」.程序員
舉個例子來講,駕駛汽車到達某人的家,寫成算法是這樣的: 沿167號告訴公路往南行至Puyllap;從South Hill Mall出口出來後往山上開4.5英里;在一個雜物店旁邊的紅綠燈路口右轉,接着在第一個路口左轉;從左邊褐色大房子的車道進去,就是North Cedar路714號。算法
用啓發式方法是這樣的: 找出上一次咱們寄給你的信,照着信上的寄出地址開車到這個鎮;到了以後你問一下咱們的房子在哪裏。這裏每一個人都認識咱們——確定會有人願意幫你的:若是你找不到人,那就找個公共電話亭給咱們打電話,咱們會出來接你。數據庫
那麼該如何使用軟件中的隱喻呢?應該用它來提升你對編程問題和編程過程的洞察力;用它來幫助你思考編程過程當中的活動,想象出更好的作事情的方法。你不可能看到一行代碼並說它違反了本章所描述的某個隱喻。但隨着時間的流逝,人們會發現,相對於不善於運用隱喻的人來講,那些使用隱喻來照亮本身的軟件開發過程的人,他對於編程的理解會更好,而且可以更快的寫出更好的代碼。編程
對於我的規模的工做乃至小型的項目來講,這種寫信的隱喻已經足夠了,然而對於其餘場合而言,這個隱喻還遠遠不夠——它沒有完整的、充分刻地刻畫軟件開發工做。函數
你須要學會如何一次爲軟件系統增長一個小部分。跟「生長」密切相關的另外一些詞語有:「增量的(incremental)」、「迭代的(iterative)」、「自適應的(adaptive)」、以及「嚴謹的(evolutionary)」。以增量的方式進行設計、編譯和測試,都是目前已知的最強有力的軟件開發概念。 在進行增量式開發時,咱們先作出軟件系統的一個儘量簡單、但能運行的版本。它沒必要接受真實的輸入,也無須對數據進行真正的處理,更不用產生真實的輸出——它僅僅須要構成一個足夠強壯的骨架,支撐起將來將要開發的真實系統。對於你標誌出的每一項基本功能,可能僅須要調用虛假的類(dummy class)。這個最基本的起點,就像牡蠣開始孕育珍珠的那顆細小沙粒。 在骨架造成以後,你要一點點地在其上附着肌肉和皮膚:把每一個虛假的類替換爲真正的類;再也不僞裝接受輸入,而是把接收真實輸入的代碼替換進去;再也不僞裝產生輸出,而是把產生真實輸出的代碼替換進去。你一次增長一小部分代碼,直到獲得一個徹底能夠工做的系統。工具
建造軟件的這一說法暗示了軟件開發過程當中存在着諸多階段,如計劃、準備及執行等,根據所建造軟件的不一樣,這些階段的種類和程度可能會發生變化。進一步研究這一隱喻時,你還會發現許多其餘方面的類似之處。 當開發軟件時,你會大量使用高級語言所提供的功能,而不會本身去編寫操做系統層面的代碼。你可能還要用些現成的程序庫,好比說一些容器類(constainer class),科學計算函數、用戶潔面組件、數據庫訪問組件,等到。總之,本身編寫那些能買獲得的現成的代碼一般是沒有意義的。 精心計劃,並不是意味着事無鉅細的計劃或過分的計劃。你能夠把房屋結構性的支撐(structural support)規劃清楚,而在往後再決定是用木地板仍是地毯,牆面漆成什麼顏色,屋頂使用什麼材料,等等。一項規劃得當的項目可以提高你「在後期改變細節(設計)的能力」。你對同類軟件的開發經驗越豐富,(在開發新軟件時)就能認準更多的細節。你只須要保證已經作了足夠的計劃,不會到後來由於計劃上不足而引起重大問題。測試
技術並非規矩(rule),它只是分析工具(analytical tools).好的工匠知道完成某項工做要用哪樣工具,也知道該怎樣正確地使用。程序員也該這樣。編程方面的知識學的越多,你腦中的工具箱中就會有更多的分析工具,也會知道該在什麼時候用這些工具,以及怎樣正確地使用它們。 在軟件領域裏,專業的諮詢人員有時會讓你用某種軟件開發方法而遠離其餘方法。這樣並不穩當,由於當你百分之百地依賴於某一方法論時,你就只會用一種方法去看世界了。某些狀況下,對於你所面臨的問題還有其餘更好的方法,你可能錯失良機。這種「工具箱隱喻」可以幫助你把全部的方法、技術以及技巧留在腦海中——合適的時候便可拿來就用。ui