《Unix編程藝術(shù)》重讀筆記(一)
Posted on 2010-02-18 19:23 dennis 閱讀(7851) 評(píng)論(7) 編輯 收藏 所屬分類(lèi): 模式與架構(gòu) 、涂鴉 、計(jì)算機(jī)科學(xué)與基礎(chǔ)Unix哲學(xué)是自下而上,而不是自上而下的,注重實(shí)效,立足于豐富的經(jīng)驗(yàn),你不會(huì)在正規(guī)方法學(xué)和標(biāo)準(zhǔn)中找到它。
Unix管道的發(fā)明人Doug McIlroy曾經(jīng)說(shuō)過(guò):
1、讓每個(gè)程序就做好一件事,如果有新任務(wù)就重新開(kāi)始,不要往新程序中加入功能而搞的復(fù)雜。
2、假定每個(gè)程序的輸出都會(huì)成為另一個(gè)程序的輸入,哪怕那個(gè)程序是未知的。輸出中不要有無(wú)關(guān)的信息干擾,避免使用嚴(yán)格的分欄格式和二進(jìn)制格式輸入。不要堅(jiān)持使用交互式輸入。
3、盡可能早將設(shè)計(jì)和編譯的軟件投入試用,哪怕是操作系統(tǒng)也不例外,理想情況下應(yīng)該是幾星期內(nèi),對(duì)抽劣的代碼別猶豫,扔掉重寫(xiě)。
4、優(yōu)先使用工具,而非拙劣的幫助來(lái)減輕編程任務(wù)的負(fù)擔(dān),工欲善其事,必先利其器。
Rob Pike在《Notes on C programming》中提到:
原則1:你無(wú)法斷行程序會(huì)在什么地方耗費(fèi)運(yùn)行時(shí)間。瓶頸經(jīng)常出現(xiàn)在想不到的地方,所以別急于胡亂找個(gè)地方改代碼,除非你已經(jīng)證實(shí)那兒就是瓶頸所在。
原則2:估量。在你沒(méi)對(duì)代碼進(jìn)行估量,特別是沒(méi)找到最耗時(shí)的那部分之前,別去優(yōu)化速度。
原則3:花哨的算法,在n很小的適合通常很慢,而n通常很小。花哨算法的常數(shù)復(fù)雜度很大,除非你確定n一直很大,否則不要用花哨算法(即使n很大,也要優(yōu)先考慮原則2)。
原則4:花哨的算法比簡(jiǎn)單的算法更容易出bug ,更難實(shí)現(xiàn)。盡量使用簡(jiǎn)單的算法配合簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。
原則5:數(shù)據(jù)壓倒一切。如果已經(jīng)選擇了正確的數(shù)據(jù)結(jié)構(gòu)并且把一切組織得井井有條,正確的算法也就不言自明,編程的核心是數(shù)據(jù)結(jié)構(gòu),而不是算法。
原則6:沒(méi)有原則6.
Ken Thompson對(duì)原則4做了強(qiáng)調(diào):
拿不準(zhǔn)就窮舉。
Unix哲學(xué)的17條原則:
1、模塊原則:簡(jiǎn)潔的接口拼合簡(jiǎn)單的部件。
2、清晰原則:清晰勝于機(jī)巧。
3、組合原則:設(shè)計(jì)時(shí)考慮拼接組合。
4、分離原則:策略同機(jī)制分離,接口同引擎分離。
5、簡(jiǎn)潔原則:設(shè)計(jì)要簡(jiǎn)潔,復(fù)雜度能低則低。
6、吝嗇原則:除非卻無(wú)他法,不要編寫(xiě)龐大的程序。
7、透明性原則:設(shè)計(jì)要可見(jiàn),以便審查和調(diào)試。
8、健壯原則:健壯源于透明與簡(jiǎn)潔。
9、表示原則:把知識(shí)疊入數(shù)據(jù),以求邏輯質(zhì)樸而健壯。
10、通俗原則:接口設(shè)計(jì)避免標(biāo)新立異。
11、緘默原則:如果一個(gè)程序沒(méi)什么好說(shuō)的,就沉默。
12、補(bǔ)救原則:出現(xiàn)異常時(shí),馬上退出,并給出足夠錯(cuò)誤信息。
13、經(jīng)濟(jì)原則:寧花機(jī)器一分,不花程序員一秒。
14、生成原則:避免手工hack,盡量編寫(xiě)程序去生成程序。
15、優(yōu)化原則:雕琢前先要有原型,跑之前先學(xué)會(huì)走。
16、多樣原則:絕不相信所謂“不二法門(mén)”的斷言。
17、擴(kuò)展原則:設(shè)計(jì)著眼未來(lái),未來(lái)總是比預(yù)想來(lái)得快。
Unix哲學(xué)之一言以蔽之:KISS
Keep it simple,stupid!
應(yīng)用unix哲學(xué):
1、只要可行,一切都應(yīng)該做成與來(lái)源和目標(biāo)無(wú)關(guān)的過(guò)濾器。
2、數(shù)據(jù)流應(yīng)盡可能的文本化(這樣可以用標(biāo)準(zhǔn)工具來(lái)查看和過(guò)濾)。
3、數(shù)據(jù)庫(kù)部署和應(yīng)用協(xié)議應(yīng)盡可能文本化(讓人閱讀和編輯)。
4、復(fù)雜的前端(用戶(hù)界面)和后端應(yīng)該涇渭分明。
5、如果可能,用c編寫(xiě)前,先用解釋性語(yǔ)言搭建原型。
6、當(dāng)且僅當(dāng)只用一門(mén)編程語(yǔ)言會(huì)提高程序復(fù)雜度時(shí),混用語(yǔ)言編程才比單一語(yǔ)言編程來(lái)得好。
7、寬收嚴(yán)發(fā)(對(duì)接收的東西要包容,對(duì)輸出的東西要嚴(yán)格)
8、過(guò)濾時(shí),不需要丟棄的消息絕不丟。
9、小就是美。在確保完成任務(wù)的基礎(chǔ)上,程序功能盡可能的少。
最后強(qiáng)調(diào)的是態(tài)度:
要良好地運(yùn)用unix哲學(xué),你就應(yīng)該不斷地追求卓越,你必須相信,程序設(shè)計(jì)是一門(mén)技藝,值得你付出所有的智慧、創(chuàng)造力和激情。否則,你的視線就不會(huì)超越那些簡(jiǎn)單、老套的設(shè)計(jì)和實(shí)現(xiàn);你就會(huì)在應(yīng)該思考的時(shí)候急急忙忙跑去編程。你就會(huì)在該無(wú)情刪繁就簡(jiǎn)的時(shí)候反而把問(wèn)題復(fù)雜化——然后你還會(huì)反過(guò)來(lái)奇怪你的代碼怎么會(huì)那么臃腫,那么難以調(diào)試。
要良好地運(yùn)用unix哲學(xué),你應(yīng)該珍惜你的時(shí)間絕不浪費(fèi)。一旦某人已經(jīng)解決了某個(gè)問(wèn)題,就直接拿來(lái)利用,不要讓驕傲或偏見(jiàn)拽住你又去重做一遍。永遠(yuǎn)不要蠻干;要多用巧勁,省下力氣在需要的時(shí)候用,好鋼用到刀刃上。善用工具,盡可能將一切自動(dòng)化。
軟件設(shè)計(jì)和實(shí)現(xiàn)是一門(mén)充滿快樂(lè)的藝術(shù),一種高水平的游戲。如果這種態(tài)度對(duì)你來(lái)說(shuō)聽(tīng)起來(lái)有些荒謬,或者令你隱約感到有些困窘,那么請(qǐng)停下來(lái),想一想,問(wèn)問(wèn)自己是不是已經(jīng)把什么給遺忘了。如果只是為了賺錢(qián)或者打發(fā)時(shí)間,你為什么要搞軟件設(shè)計(jì),而不是別的什么呢?你肯定曾經(jīng)也認(rèn)為軟件設(shè)計(jì)值得你付出激情……
要良好地運(yùn)用unix哲學(xué),你需要具備(或者找回)這種態(tài)度。你需要用心。你需要去游戲。你需要樂(lè)于探索。
操作系統(tǒng)的風(fēng)格元素:
1、什么是操作系統(tǒng)的統(tǒng)一性理念
2、多任務(wù)能力
3、協(xié)作進(jìn)程(IPC)
4、內(nèi)部邊界
5、文件屬性和記錄結(jié)構(gòu)
6、二進(jìn)制文件格式
7、首選用戶(hù)界面風(fēng)格
8、目標(biāo)受眾
9、開(kāi)發(fā)的門(mén)坎