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