Is anything more important than happiness??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- nosix
? ? ? ?最近在極客時(shí)間上學(xué)習(xí)《從0開始學(xué)架構(gòu)》的課程骂际,給自己充充電孝治,晃晃悠悠敲了好幾年代碼了胞谈,也沒有做出啥牛逼的事填具,還是得提升提升,這本書也是在學(xué)習(xí)課程的時(shí)候看到艰额,正好趕上二手東618活動(dòng)就入手了澄港,學(xué)習(xí)筆記主要是記錄下看書想記住的部分,沒有啥高深的見解柄沮。
? ? 上圖就是本書提到的UNIX系統(tǒng)的設(shè)計(jì)哲學(xué)的精髓回梧,之前一直沒有聽到過這么一個(gè)原則,作為一個(gè)程序員想想還是挺慚愧的??祖搓。
? ? UNIX哲學(xué)(同其它工程領(lǐng)域的民間傳統(tǒng)一樣)是自下而上的狱意,而不是自上而下的。UNIX哲學(xué)注重實(shí)效拯欧,立足于豐富的經(jīng)驗(yàn)详囤。
? ? 每個(gè)人對(duì)事情都有自己的看法和總結(jié)
? ? 一、Unix管道發(fā)明人镐作,Unix傳統(tǒng)的奠基人之一 Doug Mcllroy在[Mcllroy78]中曾說:
? (i)讓每個(gè)程序就做好一件事藏姐,如果有新任務(wù),就重新開始该贾,不要往原程序中加入新功能而搞的復(fù)雜羔杨。
? (ii)假定每個(gè)程序的輸入輸出都會(huì)成為另一個(gè)程序的輸入,哪怕那個(gè)程序還是未知的靶庙。輸出中不要有無關(guān)信息的干擾,避免使用嚴(yán)格的分欄格式和二進(jìn)制的格式輸入。不要堅(jiān)持使用交互式輸入六荒。
? (iii)盡可能早地降設(shè)計(jì)和編譯的軟件投入試用护姆,哪怕是操作系統(tǒng)也不例外,理想情況下掏击,應(yīng)該是在幾星期內(nèi)卵皂,對(duì)于拙劣的代碼別猶豫,扔掉重寫砚亭。
? (iv)優(yōu)先使用工具而不是拙劣的幫助來減輕編程任務(wù)的負(fù)擔(dān)灯变,工欲善其事,必先利其器捅膘。
? ? Unix哲學(xué)是這樣的:一個(gè)程序只做一件事添祸,并做好。程序要能協(xié)作寻仗。程序要能處理文本流刃泌,因?yàn)檫@是最通用的接口。
二署尤、Rob Pike, 最偉大的C語(yǔ)言大師之一耙替,在《Notes on C Programming》中從另外一個(gè)稍微不同的角度表述了對(duì)Unix的哲學(xué)[Pike]:
? ? 原則1:你無法斷定程序會(huì)在什么地方耗費(fèi)運(yùn)行時(shí)間,瓶頸經(jīng)常出現(xiàn)在想不到的地方曹体,所以別急于胡亂找個(gè)地方改代碼俗扇,除非你已經(jīng)證明那兒就是瓶頸所在。
? ? 原則2:估量箕别,在你沒對(duì)代碼進(jìn)行估量铜幽,特別是沒找到最耗時(shí)的那部分之前,別去優(yōu)化速度究孕。
? ? 原則3:花哨的算法在n很小時(shí)通常很慢啥酱,而n通常很小,花哨算法的常數(shù)負(fù)責(zé)度很大厨诸。除非你確定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:沒有原則
? ? Ken Thompson ---- Unix最初版本的設(shè)計(jì)和實(shí)現(xiàn)者,禪宗偈語(yǔ)般地對(duì)Pike的原則4做出了強(qiáng)調(diào):拿不準(zhǔn)就窮盡。
三绽族、Unix 哲學(xué)中更多的內(nèi)容不是這些先哲們口頭表述出來的姨涡,而是由他們所做的一切和Unix本身所作出的榜樣體現(xiàn)出來的。從整體上來說吧慢,可以概括為以下幾點(diǎn):
? ? 1.模塊原則:使用簡(jiǎn)介的接口拼合簡(jiǎn)單的部件涛漂。
? ? 2.清晰原則:清晰勝于機(jī)巧。
? ? 3.組合原則:設(shè)計(jì)時(shí)考慮拼接組合检诗。
? ? 4.分離原則:策略同機(jī)制分離匈仗,接口同引擎分離。(這句話我其實(shí)一點(diǎn)都理解不了)
? ? 5.簡(jiǎn)潔原則:? 設(shè)計(jì)要簡(jiǎn)潔逢慌,復(fù)雜度能低則低悠轩。
? ? 6.吝嗇原則:除非卻無它法,不要編寫龐大的程序涕癣。
? ? 7.透明性原則:設(shè)計(jì)要可見哗蜈,以便審查和調(diào)試。
? ? 8.健壯原則:健壯源于透明與簡(jiǎn)潔坠韩。
? ? 9.表示原則:把知識(shí)疊入數(shù)據(jù)以求邏輯質(zhì)樸而健壯距潘。
? ? 10.通俗原則:接口設(shè)計(jì)避免標(biāo)新立異。
? ? 11.緘默原則:如果一個(gè)程序沒什么好說的只搁,就沉默音比。
? ? 12.補(bǔ)救原則:出現(xiàn)異常時(shí),馬上退出并給出足夠錯(cuò)誤信息氢惋。
? ? 13.經(jīng)濟(jì)原則:寧花機(jī)器一分洞翩,不花程序員一秒。
? ? 14.生成原則:避免手工hack焰望,盡量編寫程序去生成程序骚亿。
? ? 15.優(yōu)化原則:雕琢前先要有原型,跑之前先學(xué)會(huì)跑熊赖。
? ? 16.多樣原則:決不相信所謂“不二法門”的斷言来屠。
? ? 17.擴(kuò)展原則:設(shè)計(jì)著眼未來,未來總比預(yù)想來的快震鹉。
好記性不如爛筆頭俱笛,好的原則在于不斷用于實(shí)踐,不是每一條都適用传趾,讓適用的規(guī)則提升自己的代碼就好了??迎膜。