Unix哲學(xué) A Quarter Century of Unix,Notes on Programming in C,Mike
Mike Gancarz的《UNIX哲學(xué)》[編輯]
1994年,X窗口系統(tǒng)開發(fā)組的成員Mike Gancarz根據(jù)他自己的Unix系統(tǒng)經(jīng)驗(yàn)以及和其他領(lǐng)域使用Unix系統(tǒng)的資深程序員們的討論結(jié)果,寫成了The UNIX Philosophy,提出了9條訓(xùn)格之言:
小即是美。
讓程序只做好一件事。
盡可能早地創(chuàng)建原型。
可移植性比效率更重要。
數(shù)據(jù)應(yīng)該保存為文本文件。
盡可能地榨取軟件的全部價(jià)值。
使用shell腳本來提高效率和可移植性。
避免使用可定制性低下的用戶界面。
所有程序都是數(shù)據(jù)的過濾器。
此外還有十條原則則并不為所有人認(rèn)同,甚至還是爭論的焦點(diǎn)(如宏內(nèi)核和微內(nèi)核之爭):
應(yīng)該允許用戶定制操作環(huán)境。
讓操作系統(tǒng)核心小而輕。
使用小寫字母并盡量簡短。
節(jié)約紙張,保護(hù)樹林。
沉默是金。
并行地思考。
部分加部分大于整體。
尋找問題的帕雷托法則。
程序隨需求而增長(更糟就是更好)。
層級(jí)地思考。
Unix哲學(xué)是一套基于Unix操作系統(tǒng)頂級(jí)開發(fā)者們的經(jīng)驗(yàn)提出的軟件開發(fā)的準(zhǔn)則和哲學(xué)。
UNIX 哲學(xué)由?Doug McIlroy?在1978年的《Bell System Technical Journal 》中發(fā)表:[1]
McIlroy:A Quarter Century of Unix[編輯]
道格拉斯·麥克羅伊是Unix系統(tǒng)上管道機(jī)制的發(fā)明者,也是Unix文化的締造者之一。他歸納的Unix哲學(xué)如下:
程序應(yīng)該只關(guān)注一個(gè)目標(biāo),并盡可能把它做好。讓程序能夠互相協(xié)同工作。應(yīng)該讓程序處理文本數(shù)據(jù)流,因?yàn)檫@是一個(gè)通用的接口。
更加簡化的版本是:做一件事,做好它。雖然只有第三條是特指Unix系統(tǒng)的,但Unix開發(fā)者們常常同時(shí)強(qiáng)調(diào)這三個(gè)信條。
Pike:Notes on Programming in C[編輯]
羅勃·派克在他的《Notes on Programming in C》中提到了以下格言。雖然這些規(guī)則是關(guān)于程序設(shè)計(jì)的,但作為Unix哲學(xué)絲毫不為過:
你永遠(yuǎn)不會(huì)知道你的程序會(huì)在什么地方耗費(fèi)時(shí)間。程序的瓶頸常常出現(xiàn)在意想不到的地方,因此在你確信找到瓶頸后再動(dòng)手優(yōu)化代碼吧。
測試代碼。只有在你詳細(xì)測試了代碼,并且發(fā)現(xiàn)一部分代碼耗費(fèi)了絕大部分的運(yùn)行時(shí)間時(shí)再對程序作速度優(yōu)化。
功能全面的算法(fancy algorithm)在處理小規(guī)模問題時(shí)效率很低,這是因?yàn)樗惴〞r(shí)間效率中的常量很大,而問題往往規(guī)模很小。除非你知道你遇到的常常是復(fù)雜的情況,否則就讓代碼丑陋但是簡單而高效吧。(即使問題規(guī)模確實(shí)很大,也首先嘗試第二條規(guī)則。)
功能全面的算法比簡單的算法更容易產(chǎn)生bug,更難實(shí)現(xiàn)。盡量使用簡單的算法和數(shù)據(jù)結(jié)構(gòu)。
數(shù)據(jù)決定一切。如果選擇的數(shù)據(jù)結(jié)構(gòu)能很好的管理數(shù)據(jù),算法部分往往不言自明。記住,數(shù)據(jù)結(jié)構(gòu),而非算法,才是編程的關(guān)鍵。
沒有第六條規(guī)則。
Pike的第一、二條規(guī)則重申了高德納的著名格言:“過早的優(yōu)化是一切罪惡的根源?!盵2]?Pike的第三、四條規(guī)則被肯·湯普遜改述成:“疑惑不定之時(shí)最適合窮舉?!笔聦?shí)上,這兩條規(guī)則也是KISS原則的具體表現(xiàn)。規(guī)則五在之前Fred Brooks的人月神話中也被提及。Jon Bentley的《Programming Pearls》中也有一章闡述了相同的設(shè)計(jì)哲學(xué)。此規(guī)則作為“如果你的數(shù)據(jù)結(jié)構(gòu)很好,那么控制它的算法就無關(guān)痛癢了”的例子常常被簡化成“簡約地寫代碼,聰明地用數(shù)據(jù)”。第六條規(guī)則當(dāng)然只是Pike針對蒙提·派森之小品Bruces sketch的幽默發(fā)揮而已了。