關(guān)于Unix哲學(xué)17條原則的新感悟
現(xiàn)在,說(shuō)到操作系統(tǒng),談?wù)撟疃嗟木褪茿ndroid,ios,Linux,mac os,windows,已經(jīng)很少有人會(huì)使用到unix系統(tǒng)了,除了一些企業(yè)內(nèi)部的系統(tǒng),和編程愛(ài)好者社區(qū)會(huì)交流外,基本上已經(jīng)絕跡于江湖了。
但是,像某些行業(yè)里,因?yàn)闀?huì)和高端的服務(wù)器配合使用,而惠普和IBM又是服務(wù)器里面的王者,所以,類UNIX系統(tǒng)像AIX,其實(shí)還是在使用的,orcale,emc等公司其實(shí)還是會(huì)用。
可能你沒(méi)有聽懂,但是沒(méi)有關(guān)系,可以選擇強(qiáng)行記憶,下次你也好給朋友吹個(gè)牛什么的。
說(shuō)到unix,就要提到一個(gè)人,埃里克·史蒂文·雷蒙德,他是一個(gè)老黑客,一個(gè)作家,一個(gè)自由軟件的倡導(dǎo)和開創(chuàng)者,可能很多人都對(duì)他不是很了解,但是這本書卻是大名鼎鼎的——《UNIX編程藝術(shù)》,就算你沒(méi)看過(guò),可能在網(wǎng)上閑逛時(shí)都瞄到這本書的名字。
最近,我也在看他寫的另一本書《大教堂與大集市》,深受啟發(fā)。
《UNIX編程藝術(shù)》一書,我在讀書時(shí)看過(guò),但那時(shí)完全看不懂,里面全都是講如何更好的編程的一些很抽象的東西,不過(guò),還是咬牙勉強(qiáng)看完,后來(lái)編程實(shí)踐多了后,漸漸就能體會(huì)其中的精髓了。
現(xiàn)在想起,其中關(guān)于思維的原則,有很多值得參考的地方,于是拿出來(lái)和大家一起細(xì)細(xì)再品味一下。
***的就是他提出的17條編程原則,經(jīng)過(guò)時(shí)間和實(shí)踐的錘煉,發(fā)展成為Unix哲學(xué)17條原則,在維基百科能搜到。
下面就來(lái)說(shuō)說(shuō)我對(duì)這17要原則的解讀——
1、模塊化原則(Rule of Modularity)
原文:開發(fā)人員應(yīng)該使用定義良好的界面連接簡(jiǎn)單的部分來(lái)構(gòu)建程序,所以問(wèn)題是本地的,部分程序可以在未來(lái)的版本中替換以支持新的功能。此規(guī)則旨在節(jié)省調(diào)試復(fù)雜,長(zhǎng)期且不可讀的代碼的時(shí)間。
解讀:這條規(guī)則,現(xiàn)在但凡學(xué)編程的人都知道,代碼要模塊化,這樣不僅方便別人復(fù)用,自己也能更便捷的替換新代碼。而實(shí)際上,不管是學(xué)習(xí)還是實(shí)踐中,模塊化原則都是非常好的一條原則,比如,我們學(xué)習(xí)寫作,如果能將一篇文章分模塊,并通過(guò)邏輯線索串聯(lián)起來(lái),就能形成一篇不錯(cuò)的文章,其實(shí)就是模塊化原則在起作用,我們常說(shuō)的格式化寫作,就是這樣的。因?yàn)槟K是可以替換的,模塊是組成一堵墻的單元結(jié)構(gòu),可以是漂亮的空心磚,也可以是純色的實(shí)心磚。同樣,工作中也很實(shí)用,將不同的大任務(wù)分解成不同的小人物和模塊,逐個(gè)擊破,也是非常實(shí)用的,關(guān)鍵點(diǎn)就在于模塊化是可復(fù)用和可替換的。
2、清晰原則(Rule of Clarity)
原文:開發(fā)人員應(yīng)該編寫清晰的程序,就好像最重要的溝通是向開發(fā)人員讀取和維護(hù)程序,而不是計(jì)算機(jī)。這個(gè)規(guī)則的目的是使代碼在將來(lái)的代碼中盡可能易讀和易理解。
解讀:清晰在編程中意味著當(dāng)別人看你寫的代碼時(shí),能明白其中的含義,同樣的,學(xué)習(xí)中也應(yīng)該這樣,就像我們寫作就是為了梳理清楚我們的思考,表達(dá)出來(lái)讓別人理解一樣,看上去是在碼字,實(shí)際上是在和別人溝通交流。說(shuō)一些模糊和含混的話是容易的,但是要想表達(dá)出想法,清晰是非常重要的。
3、和解原則(Rule of Composition)
原文:開發(fā)人員應(yīng)該編寫能夠與其他程序輕松通信的程序。這條規(guī)則的目的是讓開發(fā)人員把項(xiàng)目分解成小而簡(jiǎn)單的程序,而不是過(guò)于復(fù)雜的單片程序。
解讀:也叫適當(dāng)妥協(xié)原則,這個(gè)原則在人際交往中應(yīng)用得更多,還有就是自我思維中用得多,比如,一天我們想要鍛煉身體,跑5公里,于是感性會(huì)說(shuō),算了吧,有點(diǎn)冷,難得換衣服了吧,被窩很舒服,理性則會(huì)說(shuō),必須堅(jiān)持,為了保持健康。于是,兩者開始協(xié)商,***協(xié)商好了以后,就變成了穿保暖一點(diǎn)的衣服去跑步,適當(dāng)降低運(yùn)動(dòng)量。而在與人的交流中,我們有時(shí)也會(huì)面臨自己的時(shí)間和別人時(shí)間沖突的時(shí)候,這時(shí)就會(huì)需要進(jìn)行適當(dāng)?shù)暮徒庖赃_(dá)成共識(shí)。和解原則更像一種處世原則,讓我們不能一味的強(qiáng)調(diào)自己,而要照顧別人的感受。
4、分離規(guī)則(Rule of Separation)
原文:開發(fā)者應(yīng)該將程序的機(jī)制與程序的策略分開;一種方法是將程序分成與該接口通信的前端接口和后端引擎。這條規(guī)則旨在通過(guò)允許改變策略,盡可能降低操作機(jī)制的不穩(wěn)定性來(lái)防止錯(cuò)誤引入。
解讀:這個(gè)有點(diǎn)不好理解,實(shí)際上后來(lái)發(fā)展出來(lái)就是java里的按照接口編程,簡(jiǎn)單說(shuō),就是A按照接口統(tǒng)一的協(xié)議來(lái)通信B,B提供相對(duì)應(yīng)的具體功能實(shí)現(xiàn),兩者是分開的,互補(bǔ)干擾,但是對(duì)達(dá)成的共識(shí)是沒(méi)有任何異議的,一旦要改變這個(gè)共識(shí),需要重新協(xié)商并做好約束。舉個(gè)例子,比如汽車的輪胎,分離規(guī)則,就是說(shuō)輪胎的制造商只需要按照統(tǒng)一的接口生產(chǎn)對(duì)應(yīng)尺寸的輪胎就可以了,至于在哪里生產(chǎn),用什么材料生產(chǎn),汽車組裝時(shí)并不用關(guān)心,而和軸承對(duì)接的發(fā)動(dòng)機(jī)同樣也可以是多樣化的。
5、簡(jiǎn)單規(guī)則(Rule of Simplicity),6、簡(jiǎn)約規(guī)則(Rule of Parsimony)
原文:開發(fā)人員應(yīng)該設(shè)計(jì)簡(jiǎn)單的方法,通過(guò)尋找方法將程序系統(tǒng)分解成小而直接的合作件。這條規(guī)則的目的是阻止開發(fā)者寫作“復(fù)雜而美麗的復(fù)雜性”,這是現(xiàn)實(shí)中容易出錯(cuò)的程序。
原文:開發(fā)人員應(yīng)該避免編寫大型程序。這一規(guī)則的目的是防止由于項(xiàng)目的所有者不愿拋棄顯著的大量工作而導(dǎo)致失敗或次優(yōu)方法的過(guò)度投資。較小的程序不僅易于編寫,優(yōu)化和維護(hù),棄用時(shí)更容易刪除。
解讀:這兩條規(guī)則是同一個(gè)意思,如果按照現(xiàn)在時(shí)髦的話說(shuō),就是一切都要盡量的小,盡量的簡(jiǎn)便可執(zhí)行。因?yàn)橐坏](méi)有朝著簡(jiǎn)單的方向去做,就會(huì)越來(lái)越龐大,這一點(diǎn)對(duì)于編程來(lái)說(shuō)尤其重要,越是簡(jiǎn)單的程序,越是容易維護(hù),也容易發(fā)現(xiàn)問(wèn)題。而那些看上去很復(fù)雜的程序,大多數(shù)都是冗余和不必要的,而實(shí)際上,要想簡(jiǎn)單,有時(shí)需要的反而是更強(qiáng)大的歸納總結(jié)能力。
7、透明度原則(Rule of Transparency)
原文:開發(fā)人員應(yīng)該設(shè)計(jì)可見(jiàn)性和可發(fā)現(xiàn)性,通過(guò)編寫這樣一種方式,他們的思維過(guò)程可以清楚地被未來(lái)的項(xiàng)目開發(fā)人員所看到,并使用輸入和輸出格式,以便識(shí)別有效輸入和正確輸出。此規(guī)則旨在減少調(diào)試時(shí)間并延長(zhǎng)程序的使用壽命。
解讀:這條原則容易被誤解,對(duì)外部使用的人來(lái)說(shuō),只需要知道輸入和輸出就行了,比如計(jì)算器,按下數(shù)字進(jìn)行加減乘除,只不過(guò)對(duì)于程序內(nèi)部來(lái)說(shuō),透明是意味著要公開代碼,這樣才能更好的理解程序,方便改進(jìn)程序。這條原則適用于自我提升,在反思中特別有用,比如寫下了一天的工作思考,然后自己順著寫下的思路開始復(fù)盤自己一天的思考邏輯,哪些做得好,哪些做的不好。但是同樣意味著,這樣私密的東西,不一定都要告訴別人。
8、穩(wěn)健性規(guī)則(Rule of Robustness)
原文:開發(fā)人員應(yīng)該通過(guò)設(shè)計(jì)透明和可發(fā)現(xiàn)性來(lái)設(shè)計(jì)強(qiáng)大的程序,因?yàn)橐子诶斫獾拇a更容易對(duì)復(fù)雜程序中無(wú)法預(yù)見(jiàn)的意外情況進(jìn)行壓力測(cè)試。此規(guī)則旨在幫助開發(fā)人員構(gòu)建強(qiáng)大,可靠的產(chǎn)品。
解讀:可靠性是我們一直都非常重視的,即便是移動(dòng)互聯(lián)網(wǎng)如此發(fā)達(dá)今天,我們依然會(huì)遇見(jiàn),程序APP崩潰,手機(jī)卡機(jī)的情況,實(shí)際上,這也是我們常說(shuō)的反脆弱性,遇見(jiàn)一些特定的意外情況時(shí),我們能不能夠應(yīng)對(duì)和處理,就是我們平時(shí)在編寫我們自己這個(gè)“程序”時(shí)最重要的事了,有的人可靠性很高,一般的小打擊都是打不倒的,而有的人可靠性不那么高,一點(diǎn)點(diǎn)挫折就會(huì)奔潰。說(shuō)的就是這樣穩(wěn)健性。
9、表示規(guī)則(Rule of Representation)
原文:開發(fā)人員在面對(duì)選擇時(shí)應(yīng)該選擇使數(shù)據(jù)更復(fù)雜,而不是程序的邏輯,因?yàn)榕c復(fù)雜的邏輯相比,人類更容易理解復(fù)雜的數(shù)據(jù)。這條規(guī)則的目的是使任何開發(fā)項(xiàng)目的開發(fā)人員都可以使程序更易讀,從而使程序得以維護(hù)。
解讀:這條規(guī)則放在現(xiàn)在不是很適用了,因?yàn)橛写髷?shù)據(jù),雖然人類擅長(zhǎng)區(qū)分復(fù)雜的數(shù)據(jù),但前提是數(shù)據(jù)量不是特別大,而按照今天大數(shù)據(jù)的量,還是更適合用機(jī)器去分析,有一門專業(yè)叫數(shù)據(jù)挖掘,專門干這個(gè)數(shù)據(jù)分析工作的。當(dāng)然,邏輯清晰,數(shù)據(jù)詳實(shí),是很好的說(shuō)明文體,也是更多增加文章的可信性的,我們現(xiàn)在的調(diào)查研究和綜述報(bào)告就是這樣的。換句話說(shuō),就是要有清晰的思路,多樣的故事。
10、最小驚喜規(guī)則(Rule of Least Surprise)
原文:開發(fā)人員應(yīng)該根據(jù)潛在用戶的預(yù)期知識(shí)設(shè)計(jì)程序。例如,計(jì)算器程序中的“+”應(yīng)該總是指“加法”。該規(guī)則旨在鼓勵(lì)開發(fā)人員構(gòu)建易于使用的直觀產(chǎn)品。
解讀:意味著要盡量的讓每個(gè)單元有一個(gè)獨(dú)立的功能,也是現(xiàn)在發(fā)展出來(lái)的微服務(wù)一說(shuō)最早的出處了,現(xiàn)在因?yàn)榇髷?shù)據(jù)和分布式的關(guān)系,微服務(wù)越來(lái)越普及,換句話說(shuō),不僅是在編程里,即便在我們平時(shí)的生活中,也應(yīng)該遵循這樣的原則,在某個(gè)時(shí)間里,盡量的專心只做一件事,而不是想著要一心多用。
11、沉默的規(guī)則(Rule of Silence)
原文:開發(fā)人員應(yīng)該設(shè)計(jì)程序,以免打印不必要的輸出。這個(gè)規(guī)則旨在允許其他程序和開發(fā)者從程序的輸出中挑出他們需要的信息,而不必分析冗長(zhǎng)。
解讀:意思本來(lái)是說(shuō),為了調(diào)試方便,程序員常常打很多日志,這樣容易造成信息泄露或引起性能問(wèn)題,但是,我覺(jué)得這條規(guī)則更像是簡(jiǎn)單規(guī)則的擴(kuò)展,不過(guò)換個(gè)角度看,我們?cè)谒伎嫉臅r(shí)候,需要適當(dāng)?shù)某聊⒉皇撬械乃伎级家f(shuō)出來(lái),有的沒(méi)有醞釀好的思考可以暫時(shí)放一放,不要急于去表達(dá)對(duì)一個(gè)觀點(diǎn)的看法,應(yīng)該盡可能多的搜集信息,再下結(jié)論。
12、修理規(guī)則(Rule of Repair)
原文:開發(fā)人員應(yīng)該設(shè)計(jì)失敗的程序,易于本地化和診斷,換句話說(shuō)就是“失敗”。這條規(guī)則旨在防止程序的錯(cuò)誤輸出成為輸入,并破壞未被檢測(cè)到的其他代碼的輸出。
解讀:有錯(cuò)誤的輸入沒(méi)有關(guān)系,關(guān)鍵是我們能不能調(diào)整并修復(fù),就像現(xiàn)在很多人每天都接受很多垃圾信息一樣,并沒(méi)有意識(shí)到自己在接受拉結(jié),更沒(méi)有處理應(yīng)對(duì)的方法,這個(gè)原則告訴我們,當(dāng)我們有了可以修理的意識(shí)后,對(duì)于輸入錯(cuò)誤的輸入是可以控制的,在軟件測(cè)試?yán)镉纸羞吔鐪y(cè)試——通過(guò)輸入一些超過(guò)范圍的數(shù)值或非常規(guī)操作來(lái)測(cè)試輸入——這樣可以驗(yàn)證系統(tǒng)的可靠性,一個(gè)軟件系統(tǒng)是一定存在某種問(wèn)題的,有問(wèn)題不可怕,可怕的是不知道問(wèn)題出在哪里。
13、經(jīng)濟(jì)規(guī)則(Rule of Economy)
原文:開發(fā)人員應(yīng)該重視開發(fā)人員在機(jī)器上的時(shí)間,因?yàn)榕c上世紀(jì)70年代的價(jià)格相比,今天的機(jī)器周期相對(duì)便宜。這條規(guī)則旨在降低項(xiàng)目的開發(fā)成本。
解讀:這個(gè)規(guī)則有點(diǎn)矛盾,一方面想要說(shuō)人力成本的問(wèn)題,一方面又說(shuō)隨著硬件價(jià)格的下降,成本的降低,我認(rèn)為可以解釋為,投入的成本和產(chǎn)出的成本,程序員的工作就是耗費(fèi)時(shí)間和機(jī)器作斗爭(zhēng),讓機(jī)器能按照人的意志而運(yùn)行。付出成本是必然的,只要能在可接受的范圍內(nèi)就行了。
14、生成規(guī)則(Rule of Generation)
原文:開發(fā)人員應(yīng)該避免手動(dòng)編寫代碼,而是編寫抽象的高級(jí)程序來(lái)生成代碼。此規(guī)則旨在減少人為錯(cuò)誤并節(jié)省時(shí)間。
解讀:現(xiàn)在很多集成編程環(huán)境都有這樣的功能,對(duì)于一些固定規(guī)則的代碼,可以快速自動(dòng)生成,避免手工編寫程序的錯(cuò)誤。換句話說(shuō),就是我們常說(shuō)的能用自動(dòng)化替代的工作就用自動(dòng)化,機(jī)器比人更能做好這些工作。但不是說(shuō)人工的編寫就沒(méi)有意義,人工的操作就是為了糾正一些可能出現(xiàn)的錯(cuò)誤,并處理核心邏輯。
15、優(yōu)化規(guī)則(Rule of Optimization)
原文:開發(fā)人員應(yīng)該在打磨軟件之前制作原型。這條規(guī)則旨在防止開發(fā)者花費(fèi)太多時(shí)間來(lái)獲得邊際收益。
解讀:現(xiàn)在的軟件產(chǎn)品的制作,都會(huì)經(jīng)過(guò)產(chǎn)品經(jīng)理提出原型設(shè)計(jì),在動(dòng)手編寫程序前,已經(jīng)會(huì)優(yōu)化很多了。這個(gè)規(guī)則特別適合思維的迭代升級(jí)過(guò)程,因?yàn)楫?dāng)使用這樣的原則時(shí),你會(huì)發(fā)現(xiàn),自己的思考并不是***的,而是存在很多漏洞的,但是有漏洞沒(méi)有關(guān)系,慢慢找到并優(yōu)化,提升,***達(dá)到更好的效果。
16、規(guī)則的多樣性(Rule of Diversity)
原文:開發(fā)者應(yīng)該設(shè)計(jì)他們的程序是靈活的,開放的。這條規(guī)則的目的是使程序更加靈活,使其能夠以開發(fā)者所期望的方式使用。
解讀:規(guī)則的多樣性,就是我們的視角更多了,能應(yīng)用的武器也更多了,因?yàn)樗季S武器是越多越好,因?yàn)橐暯蔷蜁?huì)越來(lái)越多,看待問(wèn)題也會(huì)越來(lái)越精確。
17、可擴(kuò)展性規(guī)則(Rule of Extensibility)
原文:開發(fā)人員應(yīng)該通過(guò)使其協(xié)議可擴(kuò)展來(lái)設(shè)計(jì)未來(lái),允許輕松插件,而無(wú)需修改其他開發(fā)人員的程序架構(gòu)。
解讀:擴(kuò)展有點(diǎn)像多學(xué)一門技能和跨界,現(xiàn)在我們都提倡跨界,說(shuō)的就是一個(gè)人的人生可能性,換句話說(shuō)就是,人生的可擴(kuò)展性很多,有的人不斷學(xué)習(xí)成長(zhǎng),可擴(kuò)展性非常大,有的人剛開始很厲害,可沒(méi)有什么擴(kuò)展性,只能在原有的基礎(chǔ)上打轉(zhuǎn)。
好了,17條規(guī)則說(shuō)完了,字還是有點(diǎn)多,你能看到這里,已經(jīng)很厲害了。
你可能發(fā)現(xiàn)了,我并沒(méi)有說(shuō)規(guī)則的具體應(yīng)用,是的,畢竟有這么多原則,每一個(gè)原則都?jí)驅(qū)懸黄L(zhǎng)文了。
今天先按照一般思路解讀一下,以后如果在實(shí)踐中用到了,再詳細(xì)解釋如何應(yīng)用已經(jīng)發(fā)展變化。
希望這些規(guī)則能給你一些新的啟發(fā)。