當某個徹底改變大家世界觀的激進想法出現(xiàn)時,我們會本能地去怪罪那些帶來新思想的信使
當人們自以為找到真理時莺褒,他是不會輕易放棄的昔穴。于是暖侨,Unix信徒們只能繼續(xù)勇往直前,頑強地堅守著他們的信仰趁窃,并相信有一天世界會改變牧挣,軟件的理想國終將來臨。
這個世紀的哲學(xué)會成為下一世紀的常識
NIH(Not Invented Here醒陆,非我發(fā)明)綜合癥就是人們?yōu)榱俗C明自己能夠提供更加卓越的解決方案而放棄其他開發(fā)人員已經(jīng)完成的工作瀑构。這是自私自利的做法。
Ken Thompson(Unix發(fā)明者)和Linus兩人至少有一點相似之處刨摩,就是對事物的好奇心
Unix哲學(xué)概述(公認準則)
- 小即是美
比如想編寫一個將A文件復(fù)制到B文件的程序寺晌,如果要嚴格遵循unix哲學(xué)的話,就只提供復(fù)制操作澡刹,而不關(guān)心文件是否存在合法等問題呻征,這些問題由其他小程序負責(zé)
如果編寫的程序有如下跡象,就表明該軟件已經(jīng)偏離了unix的設(shè)計哲學(xué)罢浇。
- 傳遞給函數(shù)的參數(shù)數(shù)量過多陆赋,導(dǎo)致代碼走出了屏幕寬度
- 子程序代碼的長度超過了整個屏幕。注意嚷闭,使用較小的字體且在較大的顯示器上
- 要靠閱讀代碼注釋攒岛,你才能記住子程序到底在做什么
- 在開發(fā)程序過程中,你已經(jīng)無法記起一個給定的錯誤信息是在什么條件下引發(fā)的
優(yōu)秀的設(shè)計師會不遺余力地追求軟件的可維護性胞锰,他們會給自己的代碼加上完整而不冗余的注釋灾锯,他們會盡量編寫短小精悍的子程序。
大多數(shù)軟件工程師不會滿足于靠維護他人軟件為生胜蛉。他們認為只有編寫新軟件才能真正掙到錢挠进,而不是修復(fù)舊有軟件的bug。不幸的是誊册,用戶卻不這么想。他們希望軟件能夠穩(wěn)定運行暖璧。如果無法做到這一點案怯,就會對程序供應(yīng)商產(chǎn)生不滿。
軟件維護不是一份很吸引人的工作澎办,因此程序員一直想辦法讓這個任務(wù)變得更容易嘲碱,甚至干脆避開它金砍。然而,大部分人都無法推卸這個責(zé)任麦锯,他們也許能夠?qū)⑦@份煩人的工作交給新手來做恕稠,但更多時候,這一職責(zé)還是會落在原作者身上扶欣。
小程序消耗的系統(tǒng)資源較少鹅巍,且容易與其他工具相結(jié)合
- 讓每一個程序只做好一件事
作者舉了一例,ls命令料祠。作者認為:ls只需用來顯示內(nèi)容骆捧,不應(yīng)該給它加上列格式化的代碼,可以把格式化的工作交給其他命令來幫髓绽,ls命令就會小得多敛苇,也就會更容易理解、維護顺呕,占用較少資源枫攀。這種說法對嗎?株茶?
- 盡快建立原型(prototyping)
發(fā)生變化是不可避免的来涨,這通常要歸咎于人們溝通交流的失敗。當產(chǎn)品的最終用戶試圖解釋其需求時忌卤,他的敘述與實際情況會有出入扫夜。他可能忽略了一些事情,或是沒精確表達出他腦海里那些想法的細節(jié)(這很有可能3刍病)因此笤闯,工程師們只能用想象力來填補這些空白。盡管他會仔細閱讀需求文檔棍厂,但在設(shè)計過程中難免加入主觀偏見颗味。更糟糕的是,工程們與用戶之間還隔著一些人牺弹,比如產(chǎn)品經(jīng)理浦马、銷售團隊、支持人員张漂,這些人會進一步曲解最終用戶的期望晶默。
永遠沒有做完的軟件,只有發(fā)布的軟件
有了一個具體原型航攒,你就可以指著它說道:“產(chǎn)品將會是這個樣子磺陡。”如果能把它演示給值得依賴的客戶看,并獲得他們的反饋币他,你就會了解你的設(shè)計是否具有針對性了坞靶。通常你會收到大量批評,沒關(guān)系蝴悉,你已經(jīng)獲得寶貴的反饋信息彰阴,總好比在產(chǎn)品發(fā)布之后聽到萬千用戶要求召回軟件的憤怒聲了
- 舍高效率而取可移植性
c程序缺乏shell腳本的可移植性。c程序往往要依賴頭文件拍冠、計算機體系結(jié)構(gòu)以及具體unix版本中一系列不支持的特性尿这。
不要花太多時間去優(yōu)化程序。很多unix程序員常犯的錯誤是倦微,為了獲得性能上一些微不足道的優(yōu)勢而采用c語言去重寫shell腳本妻味,這純粹是浪費時間。如果必須要優(yōu)化c程序的性能欣福,unix平臺提供了prof和其他一些工具來定位使用最頻繁的子程序责球,對這些代碼塊進行優(yōu)化,可以產(chǎn)生事半功倍的效果拓劝。
另一種提高程序性能的方法就是研究如何處理數(shù)據(jù)雏逾。
最高效的方法往往不可移植。很可能要利用某些特殊硬件功能的優(yōu)勢郑临,當目標硬件被取代后栖博,就不行了。
衡量應(yīng)用程序是否成功的一個標準就是它能夠在多少個系統(tǒng)上運行厢洞。人們在早期為可移植性軟件付出的所有努力都會在后期得到豐厚回報仇让。
- 使用純文本文件來存儲數(shù)據(jù)
便于可移植,通用的轉(zhuǎn)換格式躺翻,易于閱讀和編輯
那些被稱為unix大師的人都會擁有自己的常用工具集丧叽,里面包含了一些程序和shell腳本,在他們從一臺機器轉(zhuǎn)換到另一臺機器公你,一份工作換到另一份工作時踊淳,這些工具如影隨形。
- 充分利用軟件的杠桿效應(yīng)
利用代碼重用的優(yōu)勢陕靠。良好的程序員編寫優(yōu)秀代碼迂尝,優(yōu)秀的程序員借用優(yōu)秀代碼。那些能夠有效地裁剪和組合模塊的開發(fā)人員才真正擁有“就業(yè)保障”剪芥。如果有這個能力垄开,開發(fā)人員往往能在很短的時間內(nèi)寫完很多軟件,企業(yè)普遍會認為這些員工是無可替代的
避免NIH綜合癥税肪。查看過別人的工作并夸口說自己可以做得更好说榆,并不代表你更有創(chuàng)造性虚吟。
標準驅(qū)動著軟件供應(yīng)商逐步走向軟件商品化的模式寸认。所有的電子表格看來很相似签财,所有的文字處理軟件也都有相同功能等等。為此偏塞,公司既要滿足統(tǒng)一標準唱蒸,又要保證獨特性。想在市場上立于不敗之地灸叼,就要增加產(chǎn)品的閃光點神汹,而不是另起爐灶,從零開始古今。
允許他人使用你的代碼來提高軟件杠桿效應(yīng)
- 使用shell腳本來提高杠桿效應(yīng)和可移植性
無論什么時候屁魏,只要有可能,編寫shell腳本來替代c程序都不失為一個良好選擇捉腥。如果你真的想讓shell腳本運行得更快氓拼,那么 你就必須找到不同的解決辦法,而不是立刻改用c程序
使用shell腳本抵碟,你可以站在巨人的肩膀上桃漾,這些巨人其實也站在其他巨人的肩膀上,循環(huán)反復(fù)拟逮,這就是軟件的杠桿效應(yīng)撬统。
- 避免強制性的用戶界面
這樣的界面往往是模態(tài)的
- 讓每一個程序都成為過濾器
你永遠猜不到人們將如何使用你的軟件。永遠不要自以為是地認為他們會完全遵從你的設(shè)計意圖敦迄。
問題
現(xiàn)在的開源軟件設(shè)計都遵循unix的公認哲學(xué)嗎恋追?
unix哲學(xué)在實踐上有多大難度?
次要準則(不一定每個人都認同)
- 允許用戶定制環(huán)境
- 盡量使操作系統(tǒng)內(nèi)核小而輕巧
- 使用小寫字母罚屋,并保持簡短
- 并行思考
- 尋找90%的解決方案
百分百完成任務(wù)是很困難的 - 更壞就是更好
如果某一事物的包容性強到足以涵蓋所有事物苦囱,那它就比那些“獨家”系統(tǒng)要好很多
就算一群人認同你的觀點,也不代表你就是對的沿后。我同樣可以找到另外一群認同我的觀點的人沿彭。
Windows最像VMS,它們都基于這樣的設(shè)想尖滚,那就是用戶害怕使用計算機喉刘,而unix從來沒有試圖去滿足新手易于使用的需要
這個世界上最快的全文搜索引擎其實只是運行在廉價的PC機集群上,運行的也是免費的操作系統(tǒng)
雖然在可移植性上漆弄,java比c要更好睦裳,但它的效率卻是C的95%。真正與內(nèi)核打交道的人是極少數(shù)撼唾,大部分開發(fā)人員都是在開發(fā)能夠運行在windows和linux平臺之上的應(yīng)用程序廉邑。對他們來說,java可以很好地滿足需求。