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