作者Jon Bentley,世界著名計(jì)算機(jī)科學(xué)家,被譽(yù)為影響算法發(fā)展的十位大師之一。本書(shū)講述了對(duì)于程序員有共性知識(shí),通過(guò)一些精心設(shè)計(jì)的有趣而又頗具指導(dǎo)意義的程序,對(duì)實(shí)用程序設(shè)計(jì)技巧及基本設(shè)計(jì)原則進(jìn)行透徹而睿智的描述,為復(fù)雜的編程問(wèn)題提供清晰而完備的解決思路。
第一部分 編程技術(shù)
1、性能監(jiān)視工具
聽(tīng)診器是一種簡(jiǎn)單工具,卻給醫(yī)生的工作帶來(lái)了革命:它讓內(nèi)科醫(yī)生能有效地監(jiān)控病人的身體。性能工具(profiler)對(duì)程序起著同樣的作用。
使用性能監(jiān)視工具。讓本月成為性能監(jiān)視工具月。請(qǐng)?jiān)陔S后的幾周至少監(jiān)視一個(gè)程序片段的性能,并且鼓勵(lì)你的伙伴也這樣做。記住,當(dāng)一個(gè)程序員屈尊來(lái)幫助一個(gè)小程序時(shí),并不總是高瞻遠(yuǎn)矚的。
開(kāi)發(fā)性能監(jiān)視工具。如果你還沒(méi)有方便的性能監(jiān)視工具,就自造一個(gè)吧。大多數(shù)系統(tǒng)都提供基本的性能監(jiān)視操作。20世紀(jì)60年代不得不觀察控制臺(tái)燈光來(lái)獲得信息的程序員,現(xiàn)在可從個(gè)人工作站的圖形窗口獲得同樣的信息。一個(gè)小程序通常足以把系統(tǒng)的命令特性包裝成方便的工具。
2、關(guān)聯(lián)數(shù)組
本章討論Algol傳統(tǒng)之外的一種語(yǔ)言特性:關(guān)聯(lián)數(shù)組(associative array)。我熟悉的數(shù)組都用數(shù)值作下標(biāo),而關(guān)聯(lián)數(shù)組則允許像count[“cat”]這樣的引用。這樣的數(shù)據(jù)結(jié)構(gòu)出現(xiàn)在Snobol和Rexx這樣的語(yǔ)言中,它允許我們用簡(jiǎn)單的程序來(lái)表達(dá)復(fù)雜的算法。
Awk可以使用程序事半功倍,我們目前看到的多數(shù)程序如果使用傳統(tǒng)的語(yǔ)言編寫(xiě),代碼量恐怕會(huì)多出一個(gè)數(shù)量級(jí)。規(guī)模的減小歸功于Awk的幾個(gè)特性:輸入行之上的隱士循環(huán)、自動(dòng)分隔成字段、變量的初始化和轉(zhuǎn)換,以及關(guān)聯(lián)數(shù)組。
3、程序員的懺悔
大多數(shù)程序員都會(huì)花很多時(shí)間去測(cè)試和調(diào)試,不過(guò)在他們寫(xiě)程序的時(shí)候,卻很少注意這些問(wèn)題。大廈周?chē)哪_手架使得工人能夠接觸到他們本來(lái)無(wú)法接觸到的地方;軟件中的腳手架由臨時(shí)程序和數(shù)據(jù)組成,他們可以使程序員訪問(wèn)系統(tǒng)的各個(gè)組件。腳手架不會(huì)隨著程序一起發(fā)給客戶(hù),然后在測(cè)試和調(diào)試中卻是不可或缺的。
4、自描述數(shù)據(jù)
一些系統(tǒng)允許程序員將兩個(gè)未指定類(lèi)型的數(shù)值(從整數(shù)到復(fù)數(shù)矩陣)對(duì)象相乘。系統(tǒng)在運(yùn)行時(shí)會(huì)先檢查存儲(chǔ)在操作數(shù)中的描述來(lái)決定其類(lèi)型,進(jìn)而執(zhí)行合適的操作。標(biāo)記體系結(jié)構(gòu)(tagged-architecture)的機(jī)器為自描述對(duì)象提供了硬件支持,一些通信協(xié)議也將對(duì)數(shù)據(jù)格式和類(lèi)型的描述與數(shù)據(jù)本身一同存儲(chǔ)。最重要的文檔助手是簡(jiǎn)潔的編程語(yǔ)言。名字-值對(duì)是一種簡(jiǎn)單而且實(shí)用的語(yǔ)言機(jī)制。程序文檔的最佳位置就在源文件中。數(shù)據(jù)文件是保存該文件自身來(lái)歷的好地方,不僅易于操作而且不易丟失。
第二部分 使用部分
5、劈開(kāi)戈?duì)柕现Y(jié)
在古希臘神話中,戈?duì)柕洗蛄艘粋€(gè)結(jié),并許諾把整個(gè)亞洲給能解開(kāi)這個(gè)結(jié)的人,可以當(dāng)亞細(xì)亞之王。幾百年來(lái)這個(gè)結(jié)紋絲不動(dòng),直到公元333年亞歷山大大帝來(lái)了,他沒(méi)有重蹈覆轍,而是拔出劍來(lái),將結(jié)一劈兩半,他隨即征服了亞洲。從那時(shí)起,“劈開(kāi)戈?duì)柕现Y(jié)”意味著為復(fù)雜問(wèn)題找出聰明的解法。
用現(xiàn)代的話說(shuō),亞歷山大找到了捷徑。主人公總是很懶惰,不肯用難的方法解決問(wèn)題,最終找到了一個(gè)簡(jiǎn)單的方案。去對(duì)付問(wèn)題,而不是對(duì)付程序。
6、計(jì)算機(jī)科學(xué)箴言集
如果還沒(méi)想清楚,就用蠻力算法吧。如果你發(fā)現(xiàn)特殊情況太多,那你的肯定是用錯(cuò)方法了。測(cè)試智能證明程序有錯(cuò)誤,而不能證明程序沒(méi)有錯(cuò)誤。對(duì)于那些快速算法,我們總是可以拿一些速度差不懂但是更容易理解的算法來(lái)替代它們。別輕信那些看似聰明的法則。
7、粗略估算
每一位程序員都應(yīng)該對(duì)粗略估算并不陌生,當(dāng)你嘗試為數(shù)據(jù)庫(kù)系統(tǒng)增加一條命令的時(shí)候,你可能要進(jìn)行下面的估算:需要多少程序員、多少時(shí)間來(lái)寫(xiě)這段代碼?需要增加多少磁盤(pán)來(lái)存儲(chǔ)多出來(lái)的數(shù)據(jù)?當(dāng)前使用的處理器速度是否能夠?qū)⑾到y(tǒng)響應(yīng)時(shí)間維持在合理的范圍內(nèi)?程序員的三大美德:對(duì)數(shù)值敏感、實(shí)驗(yàn)的欲望結(jié)良好的數(shù)學(xué)功底。
8、人員備忘錄
添加備忘錄,可以及時(shí)提醒自己,發(fā)現(xiàn)自己的不足之處。
第三部分 人性化I/O?
9、小語(yǔ)言
小語(yǔ)言是流行的第四代和第五代編程語(yǔ)言以及應(yīng)用程序生成環(huán)境的重要組成部分,然而它們對(duì)計(jì)算本身的影響要更廣。小語(yǔ)言通常為人類(lèi)提供了一個(gè)優(yōu)雅的界面,這既方便了人類(lèi)控制復(fù)雜的程序,也便于大系統(tǒng)中的模塊進(jìn)行彼此間的交互。
10、文檔設(shè)計(jì)
文檔設(shè)計(jì)需要?jiǎng)?chuàng)意。如果所有人著裝相同,所有車(chē)的車(chē)型和顏色也一樣,那么這個(gè)世界是多么的乏味甚至令人生畏。一個(gè)所有風(fēng)格看上去都差不多相同的文檔庫(kù)也是一樣。綜合考慮文檔的許多屬性,才能得到最佳的設(shè)計(jì)效果。好的文檔風(fēng)格就像好的編程風(fēng)格和好的寫(xiě)作風(fēng)格一樣,是無(wú)形的。內(nèi)容是文檔的首要目的,文檔風(fēng)格只是達(dá)到這一目的輔助手段。
11、圖形化輸出
繪制生動(dòng)的圖需要多樣的技術(shù)。圖作者必須對(duì)應(yīng)用程序足夠理解才能決定應(yīng)當(dāng)概括哪些數(shù)據(jù),必須足夠領(lǐng)會(huì)數(shù)據(jù)的含義才能避免得出沒(méi)有數(shù)據(jù)(或錯(cuò)誤)的結(jié)論,而且必須選擇合適的媒介(可能是墨或激光打印機(jī))來(lái)設(shè)計(jì)并實(shí)現(xiàn)圖。
12、對(duì)調(diào)查的研究
人們都知道調(diào)查,美國(guó)新聞界經(jīng)常向民眾發(fā)出民意調(diào)查,調(diào)查主題從總統(tǒng)的聲望到喜歡吃哪種爆米花五花八門(mén)。我為民意調(diào)查公司安裝個(gè)人電腦并為他們寫(xiě)自動(dòng)化程序,幫助他們提高活動(dòng)效率。
第四部分 算法
13、絕妙的取樣
在紙牌游戲中,如果讓計(jì)算機(jī)來(lái)發(fā)牌,該怎么做呢?如果給一副牌中每張牌指定從1到52的一個(gè)整數(shù),就可以從1~52范圍內(nèi)“隨機(jī)取樣”5個(gè)整數(shù)來(lái)得到一手牌,例如 :4 8 31 46 47,隨機(jī)取樣也出現(xiàn)在各種不同應(yīng)用中,如仿真、程序測(cè)試和統(tǒng)計(jì)學(xué)。
14、編寫(xiě)數(shù)值計(jì)算程序
行內(nèi)的人給它起了個(gè)好聽(tīng)的名字叫“數(shù)值分析”,對(duì)于大多數(shù)程序員來(lái)說(shuō),數(shù)值計(jì)算這個(gè)領(lǐng)域很像管道工的活兒:我們經(jīng)常用,但不去想太多的細(xì)節(jié),除非有東西出了問(wèn)題。但即使對(duì)于一個(gè)像我這樣的外行來(lái)說(shuō),數(shù)值分析也是有用的。
15、選擇
分析了Hoare的選擇算法的兩個(gè)方面:它的結(jié)果是正確的,并且它的計(jì)算很有效率。