complete_code_Chapter2

《代碼大全》讀書筆記

Chapter2 Mataphors for a Richer Understanding of Software Development

第 2 章 用隱喻來更充分地理解軟件開發


2.1 The importance of Metaphors

2.1 隱喻的重要性

經過把你不太理解的東西和一些你較爲理解、且十分相似的東西作比較,你能夠對這些不太理解的東西產生更深入的理解。這種使用隱喻的方法叫作「建模(modeling)」.程序員

2.2 How to Use Software Metaphors

2.2 如何使用軟件隱喻*

算法和隱喻的區別

  • 算法是一套定義明確的指令,使你能完成某個特定的任務。
  • 算法是可預測的(predictable)、肯定性的(deterministic)、不易變化的(not subject to chance)。
  • 啓發式方法(試探法)是一種幫助你尋求答案的技術,但它給出的答案是具備偶然性的(subject to chance),由於啓發式方法僅僅告訴你該如何去找,而沒有告訴你要找什麼。
  • 一個告訴你如何從A點到B點的算法,不會讓你繞路,不會讓你額外地通過D、E、F等地方,更不會讓你停下來聞聞玫瑰花或喝咖啡。
  • 啓發式方法並不會告訴你該如何直接從A點到達B點,它甚至可能連A點和B點在哪裏都不知道。

舉個例子來講,駕駛汽車到達某人的家,寫成算法是這樣的: 沿167號告訴公路往南行至Puyllap;從South Hill Mall出口出來後往山上開4.5英里;在一個雜物店旁邊的紅綠燈路口右轉,接着在第一個路口左轉;從左邊褐色大房子的車道進去,就是North Cedar路714號。算法

用啓發式方法是這樣的: 找出上一次咱們寄給你的信,照着信上的寄出地址開車到這個鎮;到了以後你問一下咱們的房子在哪裏。這裏每一個人都認識咱們——確定會有人願意幫你的:若是你找不到人,那就找個公共電話亭給咱們打電話,咱們會出來接你。數據庫

那麼該如何使用軟件中的隱喻呢?應該用它來提升你對編程問題和編程過程的洞察力;用它來幫助你思考編程過程當中的活動,想象出更好的作事情的方法。你不可能看到一行代碼並說它違反了本章所描述的某個隱喻。但隨着時間的流逝,人們會發現,相對於不善於運用隱喻的人來講,那些使用隱喻來照亮本身的軟件開發過程的人,他對於編程的理解會更好,而且可以更快的寫出更好的代碼。編程

2.3 Common Software Metaphors

2.3 常見的軟件隱喻

Software Penmanship:Writing Code

軟件中的書法:寫做代碼

對於我的規模的工做乃至小型的項目來講,這種寫信的隱喻已經足夠了,然而對於其餘場合而言,這個隱喻還遠遠不夠——它沒有完整的、充分刻地刻畫軟件開發工做。函數

Software Farming:Growing System

軟件的耕做法:培植系統

Software Oyster Farming:System Accertion

軟件的牡蠣養殖觀點:系統生長

你須要學會如何一次爲軟件系統增長一個小部分。跟「生長」密切相關的另外一些詞語有:「增量的(incremental)」、「迭代的(iterative)」、「自適應的(adaptive)」、以及「嚴謹的(evolutionary)」。以增量的方式進行設計、編譯和測試,都是目前已知的最強有力的軟件開發概念。 在進行增量式開發時,咱們先作出軟件系統的一個儘量簡單、但能運行的版本。它沒必要接受真實的輸入,也無須對數據進行真正的處理,更不用產生真實的輸出——它僅僅須要構成一個足夠強壯的骨架,支撐起將來將要開發的真實系統。對於你標誌出的每一項基本功能,可能僅須要調用虛假的類(dummy class)。這個最基本的起點,就像牡蠣開始孕育珍珠的那顆細小沙粒。 在骨架造成以後,你要一點點地在其上附着肌肉和皮膚:把每一個虛假的類替換爲真正的類;再也不僞裝接受輸入,而是把接收真實輸入的代碼替換進去;再也不僞裝產生輸出,而是把產生真實輸出的代碼替換進去。你一次增長一小部分代碼,直到獲得一個徹底能夠工做的系統。工具

Software Construction:Building Software

軟件構建:建造軟件

建造軟件的這一說法暗示了軟件開發過程當中存在着諸多階段,如計劃、準備及執行等,根據所建造軟件的不一樣,這些階段的種類和程度可能會發生變化。進一步研究這一隱喻時,你還會發現許多其餘方面的類似之處。 當開發軟件時,你會大量使用高級語言所提供的功能,而不會本身去編寫操做系統層面的代碼。你可能還要用些現成的程序庫,好比說一些容器類(constainer class),科學計算函數、用戶潔面組件、數據庫訪問組件,等到。總之,本身編寫那些能買獲得的現成的代碼一般是沒有意義的。 精心計劃,並不是意味着事無鉅細的計劃或過分的計劃。你能夠把房屋結構性的支撐(structural support)規劃清楚,而在往後再決定是用木地板仍是地毯,牆面漆成什麼顏色,屋頂使用什麼材料,等等。一項規劃得當的項目可以提高你「在後期改變細節(設計)的能力」。你對同類軟件的開發經驗越豐富,(在開發新軟件時)就能認準更多的細節。你只須要保證已經作了足夠的計劃,不會到後來由於計劃上不足而引起重大問題。測試

Applying Software Techniques:The Intellectual Toolbox

應用軟件技術:智慧工具箱

技術並非規矩(rule),它只是分析工具(analytical tools).好的工匠知道完成某項工做要用哪樣工具,也知道該怎樣正確地使用。程序員也該這樣。編程方面的知識學的越多,你腦中的工具箱中就會有更多的分析工具,也會知道該在什麼時候用這些工具,以及怎樣正確地使用它們。 在軟件領域裏,專業的諮詢人員有時會讓你用某種軟件開發方法而遠離其餘方法。這樣並不穩當,由於當你百分之百地依賴於某一方法論時,你就只會用一種方法去看世界了。某些狀況下,對於你所面臨的問題還有其餘更好的方法,你可能錯失良機。這種「工具箱隱喻」可以幫助你把全部的方法、技術以及技巧留在腦海中——合適的時候便可拿來就用。ui

Key Points

要點

  • 隱喻是啓示而不是算法。所以它們每每有一點隨意(sloppy).
  • 隱喻把軟件開發過程當中其餘你熟悉的活動聯繫在一塊兒,幫助你更好地理解。
  • 有些隱喻比其餘一些隱喻更貼切。
  • 經過把軟件的構建過程比作是房屋的建設過程,咱們能夠發現,仔細地準備是必要的,而大型項目和小型項目之間也是有差別的。
  • 經過把軟件開發過程當中的實踐比作是智慧工具箱中的工具,咱們又發現,每位程序員都有許多工具,但並不存在任何一個能適用於全部工做的工具,因地制宜地選擇正確工具是成爲能有效編程的程序員的關鍵。
  • 不一樣的隱喻彼此並不排斥,應當使用對你最有益處的某種隱喻組合。
本站公眾號
   歡迎關注本站公眾號,獲取更多信息