用Unix的设计思想来应对多变的需求
無論是Unix設(shè)計(jì),還是面向?qū)ο笤O(shè)計(jì),還是別的什么如SOA,ECB,消息,事件,MVC,網(wǎng)絡(luò)七層模型,數(shù)據(jù)庫設(shè)計(jì),等等,他們都在干三件事——解耦,解耦,還是解耦!所謂解耦,就是讓軟件的模塊和模塊間盡量少地依賴起來。
現(xiàn)實(shí)當(dāng)中的例子
讓我先舉幾個(gè)現(xiàn)實(shí)生活中的例子:
1.現(xiàn)實(shí)社會(huì)中,制造燈具的工廠完全不關(guān)心制造燈泡的工廠,制造燈泡的工廠完全不關(guān)心制造燈具的工廠,但是,燈泡和燈飾可以很完美地組合成用記所喜歡的樣子(這和@weidagang?在“需求變更和IoC”說到的那個(gè)PC的例子相仿)。他們是怎么做到的?
2.互聯(lián)網(wǎng)上,做網(wǎng)站的人完全不用關(guān)心用戶在用什么樣的操作系統(tǒng),什么樣的客戶端瀏覽器(當(dāng)然事實(shí)上,瀏覽器的不標(biāo)準(zhǔn)讓網(wǎng)站那邊很頭痛,這里只是舉個(gè)例),反過來,上網(wǎng)的人也不關(guān)心做網(wǎng)站的人在用什么的技術(shù)開發(fā)網(wǎng)站。但是大家在完全不關(guān)心對(duì)方的情況下,可以很正常地協(xié)同工作在一起。為什么?
這樣的例子太多了。為什么可以做成這樣呢?因?yàn)榇蠹乙蕾嚨氖且粋€(gè)接口,燈具和燈泡并不互相依賴,他們依賴的是一個(gè)接口,做網(wǎng)站的人和瀏覽網(wǎng)站的人依賴的還是接口——HTTP協(xié)議。這就是面向?qū)ο蟮暮诵乃枷搿蕾囉诮涌诙皇菍?shí)現(xiàn),這就是解耦。當(dāng)你看過這兩個(gè)例子以后,我希望你以后設(shè)計(jì)的軟件至少不能比我們現(xiàn)實(shí)社會(huì)中的這些方法要差。不然,你就是在讓社會(huì)倒退了,呵呵。
你會(huì)說,這和Unix,和應(yīng)對(duì)需求變化有什么關(guān)系?好讓我們?cè)賮砜匆幌耈nix的設(shè)計(jì)。
Unix設(shè)計(jì)的例子
下面是幾個(gè)Unix下的例子:
1.Unix下,所有的硬件都可以通過文件的方式存取。其統(tǒng)統(tǒng)在/dev下。于是,軟件和硬件的耦合被解開了,操作系統(tǒng)只需要把硬件統(tǒng)統(tǒng)變成文件,而程序只需要使用三個(gè)東西,一個(gè)是fd,一個(gè)是read(),一個(gè)是write(),就可以來操作任意的硬件了,這就是抽象,簡(jiǎn)單到不行。
2.Unix下,所有的命令都可以用管道串起來(管道絕對(duì)是個(gè)偉大的發(fā)明),這樣,所有的命令間的交互全部解耦到只依賴于STD_IN,STD_OUT設(shè)備上。最酷的是,用戶可以使用管道任意地拼裝那些命令,以完成各式各樣的功能。管道這個(gè)設(shè)計(jì)思想可以映射為今天的Web Service,你可以任意地拼裝各種Web Service。
看到這里,你會(huì)發(fā)現(xiàn),這還是解耦,本質(zhì)上來說,也是一種依賴倒置——OOD的精髓。但是,Unix還不僅僅是這些。我們?cè)賮砜磶讉€(gè)例子:
1.Unix下,軟件都是綠色地安裝。在iOS上更明顯——各個(gè)程序間基本上互不干擾,這個(gè)程序產(chǎn)生的垃圾文件不會(huì)影響到另一個(gè)程序。你刪到一個(gè)程序不會(huì)讓另一個(gè)程序不舉,各是各的空間。你可以刪除這些程序,只要把內(nèi)核心留著,系統(tǒng)照樣可以啟動(dòng)。
2.Unix下,你可以通過設(shè)置一些環(huán)境變量,讓多種環(huán)境同時(shí)存在,比如:某個(gè)LAMP用的是Apache 2.0, Mysql 4.0, PHP 4.0,某個(gè)LAMP用的是Apache 2.2, Mysql 5.0,PHP5.3,你不但可以方便地在系統(tǒng)中切換這兩個(gè)環(huán)境,你甚至還可以同時(shí)啟動(dòng)他們。
3.Unix下,你可以隨意地替換你想要的程序。比如,你不喜歡bash,你可以替換成ksh/csh等,你不喜歡awk,你可以替換成gawk,所有的東西都像零件一樣,你不喜歡什么,你就可以替換什么。
這三個(gè)例子告訴了我們——當(dāng)你把你的軟件設(shè)計(jì)地耦合度非常地低時(shí),你可以隨意地組合,隨意地安排你的系統(tǒng)。想當(dāng)?shù)撵`活,靈活到Windows到今天都學(xué)不會(huì)。
應(yīng)對(duì)需求變化
看到這里,你可能明白我想說的是什么了,你可能開始覺得怎么樣的系統(tǒng)設(shè)計(jì)會(huì)更有效了。如果你還記得《Steve Y 對(duì)平臺(tái)的長(zhǎng)篇大論》,你就會(huì)知道我想說什么了。是的,我想說的就是,當(dāng)你真正了解了Unix的設(shè)計(jì)思想后,你會(huì)覺得今天的這些東西都是對(duì)Unix設(shè)計(jì)思想的一種傳承或是變種。這種東西就是:
1)解耦,解耦,解耦。盡量地讓你的模塊不要在實(shí)現(xiàn)上耦合,而是耦合某個(gè)規(guī)范,某個(gè)標(biāo)準(zhǔn)。
2)KISS,KISS,KISS。要做到高度解耦,你的模塊就一定要很簡(jiǎn)單,當(dāng)然不是說簡(jiǎn)單到只有幾行代碼,而是簡(jiǎn)單到只干一件事,并把這件事干到極致。然后通過某個(gè)標(biāo)準(zhǔn)拼裝起來。
3)拼裝,拼裝,拼裝。我想不起來是誰說的了,這句話是這樣的,當(dāng)我想用一個(gè)模塊的時(shí)候,我直接調(diào)用就好了,沒有必要像C或Java一樣,還要編譯。是的,拼裝需要一個(gè)框架,需要一種標(biāo)準(zhǔn)協(xié)議,然后讓所有的系統(tǒng)都耦合在這種規(guī)范上,各自獨(dú)立運(yùn)行,就像一個(gè)機(jī)器上的各個(gè)部件一樣,當(dāng)我覺得這個(gè)部件不爽,換了就是了。(例如,當(dāng)我們?cè)趪L試不同的算法的時(shí)候)
想想建材和家俱市場(chǎng),無論用戶過來想裝修什么,我都可以滿足用戶的不同需求,只要你是和家裝相關(guān),我基本上都能滿足你,不是嗎?無論你怎么變,只要不變態(tài),我基本上都可以滿足你。這就是解耦,拼裝帶來的好處。
你可能會(huì)說我說得太簡(jiǎn)單了,另一方面,你可能覺得有一些系統(tǒng)這樣做沒必要,我承認(rèn),不過,你可以有選擇的或多或少地試試。(其實(shí),我相信你已經(jīng)在不自覺得或多或少地使用這種方式開發(fā)軟件了)
文章轉(zhuǎn)載自:酷殼網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的用Unix的设计思想来应对多变的需求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周鸿祎:比情怀更重要的硬件创业三定律
- 下一篇: 已婚男人的心理五大变化