complete_code_Chapter2
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
《代碼大全》讀書(shū)筆記
Chapter2 Mataphors for a Richer Understanding of Software Development
第 2 章 用隱喻來(lái)更充分地理解軟件開(kāi)發(fā)
2.1 The importance of Metaphors
2.1 隱喻的重要性
通過(guò)把你不太理解的東西和一些你較為理解、且十分類(lèi)似的東西做比較,你可以對(duì)這些不太理解的東西產(chǎn)生更深刻的理解。這種使用隱喻的方法叫做“建模(modeling)”.
2.2 How to Use Software Metaphors
2.2 如何使用軟件隱喻*
算法和隱喻的區(qū)別
- 算法是一套定義明確的指令,使你能完成某個(gè)特定的任務(wù)。
- 算法是可預(yù)測(cè)的(predictable)、確定性的(deterministic)、不易變化的(not subject to chance)。
- 啟發(fā)式方法(試探法)是一種幫助你尋求答案的技術(shù),但它給出的答案是具有偶然性的(subject to chance),因?yàn)閱l(fā)式方法僅僅告訴你該如何去找,而沒(méi)有告訴你要找什么。
- 一個(gè)告訴你如何從A點(diǎn)到B點(diǎn)的算法,不會(huì)讓你繞路,不會(huì)讓你額外地經(jīng)過(guò)D、E、F等地方,更不會(huì)讓你停下來(lái)聞聞玫瑰花或喝咖啡。
- 啟發(fā)式方法并不會(huì)告訴你該如何直接從A點(diǎn)到達(dá)B點(diǎn),它甚至可能連A點(diǎn)和B點(diǎn)在哪里都不知道。
舉個(gè)例子來(lái)說(shuō),駕駛汽車(chē)到達(dá)某人的家,寫(xiě)成算法是這樣的: 沿167號(hào)告訴公路往南行至Puyllap;從South Hill Mall出口出來(lái)后往山上開(kāi)4.5英里;在一個(gè)雜物店旁邊的紅綠燈路口右轉(zhuǎn),接著在第一個(gè)路口左轉(zhuǎn);從左邊褐色大房子的車(chē)道進(jìn)去,就是North Cedar路714號(hào)。
用啟發(fā)式方法是這樣的: 找出上一次我們寄給你的信,照著信上的寄出地址開(kāi)車(chē)到這個(gè)鎮(zhèn);到了之后你問(wèn)一下我們的房子在哪里。這里每個(gè)人都認(rèn)識(shí)我們——肯定會(huì)有人愿意幫你的:如果你找不到人,那就找個(gè)公共電話亭給我們打電話,我們會(huì)出來(lái)接你。
那么該如何使用軟件中的隱喻呢?應(yīng)該用它來(lái)提高你對(duì)編程問(wèn)題和編程過(guò)程的洞察力;用它來(lái)幫助你思考編程過(guò)程中的活動(dòng),想象出更好的做事情的方法。你不可能看到一行代碼并說(shuō)它違反了本章所描述的某個(gè)隱喻。但隨著時(shí)間的流逝,人們會(huì)發(fā)現(xiàn),相對(duì)于不善于運(yùn)用隱喻的人來(lái)說(shuō),那些使用隱喻來(lái)照亮自己的軟件開(kāi)發(fā)過(guò)程的人,他對(duì)于編程的理解會(huì)更好,并且能夠更快的寫(xiě)出更好的代碼。
2.3 Common Software Metaphors
2.3 常見(jiàn)的軟件隱喻
Software Penmanship:Writing Code
軟件中的書(shū)法:寫(xiě)作代碼
對(duì)于個(gè)人規(guī)模的工作乃至小型的項(xiàng)目來(lái)說(shuō),這種寫(xiě)信的隱喻已經(jīng)足夠了,然而對(duì)于其他場(chǎng)合而言,這個(gè)隱喻還遠(yuǎn)遠(yuǎn)不夠——它沒(méi)有完整的、充分刻地刻畫(huà)軟件開(kāi)發(fā)工作。
Software Farming:Growing System
軟件的耕作法:培植系統(tǒng)
Software Oyster Farming:System Accertion
軟件的牡蠣養(yǎng)殖觀點(diǎn):系統(tǒng)生長(zhǎng)
你需要學(xué)會(huì)如何一次為軟件系統(tǒng)增加一個(gè)小部分。跟“生長(zhǎng)”密切相關(guān)的另一些詞語(yǔ)有:“增量的(incremental)”、“迭代的(iterative)”、“自適應(yīng)的(adaptive)”、以及“嚴(yán)謹(jǐn)?shù)?evolutionary)”。以增量的方式進(jìn)行設(shè)計(jì)、編譯和測(cè)試,都是目前已知的最強(qiáng)有力的軟件開(kāi)發(fā)概念。 在進(jìn)行增量式開(kāi)發(fā)時(shí),我們先做出軟件系統(tǒng)的一個(gè)盡可能簡(jiǎn)單、但能運(yùn)行的版本。它不必接受真實(shí)的輸入,也無(wú)須對(duì)數(shù)據(jù)進(jìn)行真正的處理,更不用產(chǎn)生真實(shí)的輸出——它僅僅需要構(gòu)成一個(gè)足夠強(qiáng)壯的骨架,支撐起未來(lái)將要開(kāi)發(fā)的真實(shí)系統(tǒng)。對(duì)于你標(biāo)志出的每一項(xiàng)基本功能,可能僅需要調(diào)用虛假的類(lèi)(dummy class)。這個(gè)最基本的起點(diǎn),就像牡蠣開(kāi)始孕育珍珠的那顆細(xì)小沙粒。 在骨架形成之后,你要一點(diǎn)點(diǎn)地在其上附著肌肉和皮膚:把每個(gè)虛假的類(lèi)替換為真正的類(lèi);不再假裝接受輸入,而是把接收真實(shí)輸入的代碼替換進(jìn)去;不再假裝產(chǎn)生輸出,而是把產(chǎn)生真實(shí)輸出的代碼替換進(jìn)去。你一次增加一小部分代碼,直到得到一個(gè)完全可以工作的系統(tǒng)。
Software Construction:Building Software
軟件構(gòu)建:建造軟件
建造軟件的這一說(shuō)法暗示了軟件開(kāi)發(fā)過(guò)程中存在著諸多階段,如計(jì)劃、準(zhǔn)備及執(zhí)行等,根據(jù)所建造軟件的不同,這些階段的種類(lèi)和程度可能會(huì)發(fā)生變化。進(jìn)一步研究這一隱喻時(shí),你還會(huì)發(fā)現(xiàn)許多其他方面的相似之處。 當(dāng)開(kāi)發(fā)軟件時(shí),你會(huì)大量使用高級(jí)語(yǔ)言所提供的功能,而不會(huì)自己去編寫(xiě)操作系統(tǒng)層面的代碼。你可能還要用些現(xiàn)成的程序庫(kù),比如說(shuō)一些容器類(lèi)(constainer class),科學(xué)計(jì)算函數(shù)、用戶(hù)潔面組件、數(shù)據(jù)庫(kù)訪問(wèn)組件,等到。總之,自己編寫(xiě)那些能買(mǎi)得到的現(xiàn)成的代碼通常是沒(méi)有意義的。 精心計(jì)劃,并非意味著事無(wú)巨細(xì)的計(jì)劃或過(guò)度的計(jì)劃。你可以把房屋結(jié)構(gòu)性的支撐(structural support)規(guī)劃清楚,而在日后再?zèng)Q定是用木地板還是地毯,墻面漆成什么顏色,屋頂使用什么材料,等等。一項(xiàng)規(guī)劃得當(dāng)?shù)捻?xiàng)目能夠提升你“在后期改變細(xì)節(jié)(設(shè)計(jì))的能力”。你對(duì)同類(lèi)軟件的開(kāi)發(fā)經(jīng)驗(yàn)越豐富,(在開(kāi)發(fā)新軟件時(shí))就能認(rèn)準(zhǔn)更多的細(xì)節(jié)。你只需要保證已經(jīng)做了足夠的計(jì)劃,不會(huì)到后來(lái)因?yàn)橛?jì)劃上不足而引發(fā)重大問(wèn)題。
Applying Software Techniques:The Intellectual Toolbox
應(yīng)用軟件技術(shù):智慧工具箱
技術(shù)并不是規(guī)矩(rule),它只是分析工具(analytical tools).好的工匠知道完成某項(xiàng)工作要用哪樣工具,也知道該怎樣正確地使用。程序員也該這樣。編程方面的知識(shí)學(xué)的越多,你腦中的工具箱中就會(huì)有更多的分析工具,也會(huì)知道該在何時(shí)用這些工具,以及怎樣正確地使用它們。 在軟件領(lǐng)域里,專(zhuān)業(yè)的咨詢(xún)?nèi)藛T有時(shí)會(huì)讓你用某種軟件開(kāi)發(fā)方法而遠(yuǎn)離其他方法。這樣并不妥當(dāng),因?yàn)楫?dāng)你百分之百地依賴(lài)于某一方法論時(shí),你就只會(huì)用一種方法去看世界了。某些情況下,對(duì)于你所面臨的問(wèn)題還有其他更好的方法,你可能錯(cuò)失良機(jī)。這種“工具箱隱喻”能夠幫助你把所有的方法、技術(shù)以及技巧留在腦海中——合適的時(shí)候即可拿來(lái)就用。
Key Points
要點(diǎn)
- 隱喻是啟示而不是算法。因此它們往往有一點(diǎn)隨意(sloppy).
- 隱喻把軟件開(kāi)發(fā)過(guò)程中其他你熟悉的活動(dòng)聯(lián)系在一起,幫助你更好地理解。
- 有些隱喻比其他一些隱喻更貼切。
- 通過(guò)把軟件的構(gòu)建過(guò)程比做是房屋的建設(shè)過(guò)程,我們可以發(fā)現(xiàn),仔細(xì)地準(zhǔn)備是必要的,而大型項(xiàng)目和小型項(xiàng)目之間也是有差異的。
- 通過(guò)把軟件開(kāi)發(fā)過(guò)程中的實(shí)踐比做是智慧工具箱中的工具,我們又發(fā)現(xiàn),每位程序員都有許多工具,但并不存在任何一個(gè)能適用于所有工作的工具,因地制宜地選擇正確工具是成為能有效編程的程序員的關(guān)鍵。
- 不同的隱喻彼此并不排斥,應(yīng)當(dāng)使用對(duì)你最有益處的某種隱喻組合。
轉(zhuǎn)載于:https://my.oschina.net/u/1771419/blog/1922187
總結(jié)
以上是生活随笔為你收集整理的complete_code_Chapter2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【云吞铺子之专家来了】CDN缓存解读和配
- 下一篇: Apache httpd Server