已經(jīng)好久沒有寫博客了,不是因為沒有學(xué)東西,而是因為學(xué)的東西不夠系統(tǒng),不夠具體,沒有整理起來(外加人懶),所以不想浪費筆墨。所以一直潛水。。但總會有感想的,在學(xué)習(xí)的過程中,時常會遇到一些令人驚喜的東西,令人拍案叫絕的東西,但學(xué)會之后覺得簡單或者不值一提,于是沒有當(dāng)機立斷寫出一些洞見。事后用的時候倒覺得理所當(dāng)然了。其實這是要不得的,學(xué)習(xí)的過程我認為不應(yīng)該是純粹的吸收,而是要有選擇的過濾,留其精華,去其糟粕,如果能加入自己的總結(jié)就更好了,只可惜我在很多時候忘記了這事兒,或者在很多時候沒有空下來專門做一次如此認真的總結(jié)。但在技術(shù)的層面上,一般的說法是,任何一種技術(shù)都是基于某種設(shè)計思想,而至于用什么來具體實現(xiàn)并不是最重要的。其實思想和設(shè)計不能用簡單的一對一和一對多關(guān)系來說明。經(jīng)常會有人說一種思想可以衍生多種技術(shù),其實他只說對了一半,因為一種技術(shù)并不只是一種思想的實現(xiàn),而是多種思想的交融。
拿軟件設(shè)計來說,對于基于窗口的程序設(shè)計,我們有多種技術(shù)方案可以選擇,在windows下有mfc,.net, wpf,在linux下有g(shù)tk, qt, wxWidgets,在mac下有cocoa, 但核心思想差不多,大多用到了mvc思想,但mvc思想本身也是一個組合思想,它組合了策略模式,觀察者模式等。對于這樣的一個設(shè)計思想來說,它其實是一個對設(shè)計的高度抽象。我甚至可以做這樣一個奇怪的思考:如果將mvc模式套用到人身上,那么人所看到的就是view,人所想到的就是controller,人所使用的便是model了,那么針對一個人來說,他的基本動作可能如下:看到東西->產(chǎn)生需求->尋找工具來實現(xiàn)自己的需求。所以我感覺,軟件設(shè)計有時更像對人的行為模擬,軟件系統(tǒng)更像是一個虛擬的人(這個人的智商要看你給他多少知識和能力),或者說,軟件設(shè)計歸根到底是以人的認知來實現(xiàn)的,所以我們要劃分模塊,要理清各個模塊之間的關(guān)系,要考慮它們之間的相互影響,還要考慮他們之間的交互。如果各個模塊之間關(guān)系混亂不清,那么你將會的到一個很爛的系統(tǒng),置于會出現(xiàn)什么結(jié)果,那就不得而知了。舉個簡單的例子:試想一下如果你吃飯咬到舌頭了,卻發(fā)現(xiàn)屁股痛,這是一件多么尷尬的事情。
所以,軟件的設(shè)計實際上是一個很復(fù)雜的事情,一個高超的軟件更為復(fù)雜,因為你要考慮太多的情況,一個人是極其復(fù)雜的。但正如所有的物質(zhì)都是由簡單的原子組成的,所有的復(fù)雜性都能劃分成最簡單最基本的東西。就好比操作系統(tǒng)這樣一個常人很難企及的東西,其實最底層也就六個操作,引用linux創(chuàng)始人linus的話來說就是:“你在UNIX上完成的大部分任務(wù)都是通過六個基本操作完成的,它們被稱作"系統(tǒng)呼叫"(system call)。第一個基本操作是"創(chuàng)建子進程"(fork),一個程序把自身完全復(fù)制出來,這樣你就有了兩個相同的拷貝。第二個基本操作是復(fù)制出來的程序,再用一個新項目替換自己。其他四個基本系統(tǒng)呼叫--打開、關(guān)閉、讀和寫--都是為了訪問文件的。這六個系統(tǒng)呼叫便組成了UNIX的簡單操作。然后,你只需在程序之間創(chuàng)造出交流渠道(pipes),就能解決復(fù)雜的問題。”,那么歸結(jié)到人身上,也就是那么幾種:活動(身體活動和思維活動),新陳代謝,睡覺(純屬個人想法勿噴)。
記得以前看bbc的紀錄片《混沌理論》中講到圖靈的一段,圖靈曾經(jīng)提出一個偉大的構(gòu)想:自然界由一個最簡單的數(shù)學(xué)公式組成。這個理論促進了后來的“混沌理論”和“分形學(xué)”的研究和發(fā)展,包括著名的“蝴蝶效應(yīng)”,也和“混沌理論”有關(guān)。我們都知道,圖靈被稱為“計算機之父”,而現(xiàn)代的軟件設(shè)計方法和這種構(gòu)想肯定存在千絲萬縷的聯(lián)系。所以,我認為,軟件設(shè)計如果是一種把問題搞復(fù)雜的設(shè)計,那將是一個失敗的設(shè)計。軟件設(shè)計應(yīng)該是將一個復(fù)雜的系統(tǒng)一步一步劃分成“原子”的過程,而軟件架構(gòu)的目標應(yīng)該是使每一個分塊都容易理解而且容易改變(所謂的可維護性和可擴展性)。
而對于人來說,人生活在一個“實體”的世界里,如果把人類的歷史看作一天,那么人擁有真正的思想是在一分鐘以前,所以上帝無法阻止人類用“面向?qū)ο?rdquo;的方式來進行軟件設(shè)計,也無法阻止程序員用mvc的思想來實現(xiàn)一個軟件系統(tǒng),因為這一切看起來理所當(dāng)然。所以,無論你的技術(shù)多么高超,我都可以想象你在面對一堆復(fù)雜的算法和一堆鮮活的對象的時候的不同感受,因為我也可以感同身受:)。所有的人都喜歡用簡單的方式解決問題(如果你不是,那你也許是公務(wù)員,:)),更喜歡用簡單的方式解決復(fù)雜的問題,那樣會有成就感,程序員是最佳案例。為什么說一個會偷懶的程序員是一個好的程序員?那是因為程序員的偷懶是對問題的抽象和擴展,對之前冗長而繁瑣的解決問題的方式建立一個更為寬泛的適用模型,從而應(yīng)對類似重復(fù)的問題。而所謂的抽象,便是思維的結(jié)晶。其實,抽象在各行各業(yè)都有應(yīng)用,只不過在軟件開發(fā)領(lǐng)域,這個詞被提及的非常之廣范非常之響亮,以至于成了某些編程語言的關(guān)鍵字。其實抽象是一個很寬泛的概念,它是一種對事物本質(zhì)的提取過程(《數(shù)據(jù)結(jié)構(gòu)》中有這樣的定義),所以我覺得在軟件設(shè)計中的抽象,可以運用到其他領(lǐng)域,在其他領(lǐng)域中的抽象,也能應(yīng)用到軟件設(shè)計中來。所以,沒必要驚訝圖靈是個數(shù)學(xué)家,或者唐納德也是數(shù)學(xué)家...,因為從本質(zhì)上來說,數(shù)學(xué)這門科學(xué)就是一種抽象科學(xué),把自然界抽象成數(shù)學(xué)模型,而計算機就是對數(shù)學(xué)抽象模型的模擬器。
胡說了一大堆,也不知從哪兒來的靈感,但作為一個軟件工程師,我覺得這些東西是應(yīng)該而且值得去思考的。上次看到一則博文講到,這個世界由三種人推動:科學(xué)家,藝術(shù)家,工程師。也許這種說法并不一定正確,但至少說明了一個觀點:工程師想要實現(xiàn)優(yōu)秀的產(chǎn)品,必須懂得科學(xué)家和藝術(shù)家的抽象,因為那是他們的思維結(jié)晶。而一個好的工程師,從某種程度來說,也是一個科學(xué)家或者一個藝術(shù)家。