《編程珠璣·續(xù)》讀書(shū)筆記

作者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ì)算很有效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,021評(píng)論 25 709
  • 天賜是某跨國(guó)公司的職員,業(yè)績(jī)普普通通,同事關(guān)系不好不壞,在眾多同事中,只能是眾多平庸中的一個(gè),一心想要得到領(lǐng)導(dǎo)的賞...
    南漂先生閱讀 276評(píng)論 0 1
  • 你為了印證秋天不死 在我撿拾枯黃的落葉時(shí) 細(xì)潤(rùn)著我的掌心 黃昏來(lái)臨 這是第多少個(gè)黃昏 我笑問(wèn)母親 很多東西都記不起...
    子夜的風(fēng)2閱讀 272評(píng)論 2 13
  • 導(dǎo)語(yǔ) 密切的社會(huì)關(guān)系意味著大量的流言蜚語(yǔ),每個(gè)人的行為將會(huì)影響其聲譽(yù),而聲譽(yù)對(duì)一個(gè)復(fù)雜的社會(huì)而言,是信任的重要基礎(chǔ)...
    OneWing閱讀 882評(píng)論 0 7

友情鏈接更多精彩內(nèi)容