架構(gòu)師之路(1)面向過程和面向?qū)ο?/h1>

字號:

1、引言
    機算機科學(xué)是一門應(yīng)用科學(xué),它的知識體系是典型的倒三角結(jié)構(gòu),所用的基礎(chǔ)知識并不多,只是隨著應(yīng)用領(lǐng)域和方向的不同,產(chǎn)生了很多的分支,所以說編程并不是一件很困難的事情,一個高中生經(jīng)過特定的訓(xùn)練就可以做得到。但是,會編程和編好程絕對是兩碼事,同樣的程序員,有的人幾年之后成為了架構(gòu)師,有的人卻還在不停地coding,只不過ctrl-c、ctrl-v用得更加純熟了。在中國,編程人員終的歸途無外乎兩條:一是轉(zhuǎn)向技術(shù)管理,它的終點是CTO;二是繼續(xù)深入,它的終點是首席架構(gòu)師,成為CEO的人畢竟是少數(shù)。如果你現(xiàn)在還是個普通的程序員,希望繼續(xù)在技術(shù)這條路上前進的話,我想你還是應(yīng)該先補充一點軟件工程的思想,學(xué)習(xí)一點有關(guān)設(shè)計模式的知識,只有具備這些能力,你才能從整體和宏觀層面來考慮問題、分析問題和解決問題。本人Coding了很多年,中間走了不少彎路,雖然終沒什么大成就,但總算有一些心得,很愿意把自己的一些經(jīng)驗?zāi)贸鰜砀蠹曳窒恚@或許對你的發(fā)展有所幫助。
    由程序員轉(zhuǎn)為架構(gòu)師,繞不開的概念就算是面向?qū)ο?OO)了。記得在大學(xué)的時候,我們專業(yè)開了一門課叫《面向?qū)ο蟮木幊獭贰D莻€時候,我們剛剛學(xué)了一門C語言,開發(fā)環(huán)境用的還是DOS下的Turbo C,半點項目開發(fā)的經(jīng)驗都沒有,純粹的空對空。所以,一學(xué)期下來,我始終處于一種懵懂狀態(tài),既沒領(lǐng)會面向過程和面向?qū)ο蟮降子惺裁磪^(qū)別,也沒搞懂面向?qū)ο竽軒硎裁春锰帯?BR>    2、面向過程(OP)和面向?qū)ο?OO)
    2.1 蛋炒飯和蓋澆飯
    有人這么形容OP和OO的不同:用面向過程的方法寫出來的程序是一份蛋炒飯,而用面向?qū)ο髮懗鰜淼某绦蚴且环萆w澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什么菜,你就澆上什么菜。我覺得這個比喻還是比較貼切的。
    蛋炒飯制作的細節(jié),我不太清楚,因為我沒當過廚師,也不會做飯,但后的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。
    蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那么的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這么多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那么香。
    到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設(shè)定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那么多講究,那么從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優(yōu)勢,他可以組合出來任意多的組合,而且不會浪費。
    2.2 軟件工程
    蓋澆飯的好處就是“菜”“飯”分離,從而提高了制作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟件工程的專業(yè)術(shù)語就是“可維護性”比較好,“飯”和“菜”的耦合度比較低。蛋炒飯將“蛋”“飯”攪和在一起,想換“蛋”“飯”中任何一種都很困難,耦合度很高,以至于“可維護性”比較差。軟件工程追求的目標之一就是可維護性,可維護性主要表現(xiàn)在3個方面:可理解性、可測試性和可修改性。面向?qū)ο蟮闹饕锰幘褪秋@著的改善了軟件的可維護性。
    面向過程(OP)和面向?qū)ο?OO)是不是就是指編碼的兩種方式呢?不是!你拿到了一個用戶需求,比如有人要找你編個軟件,你是不是需要經(jīng)過需求分析,然后進行總體/詳細設(shè)計,后編碼,才能終寫出軟件,交付給用戶。這個過程是符合人類基本行為方式的:先想做什么,再想如何去做,后才是做事情。有的同學(xué)說:“我沒按照你說的步驟做啊,我是直接編碼的”。其實,你一定會經(jīng)歷了這三個階段,只不過你潛意識里沒有分得那么清楚。對于拿到需求就編碼的人,可能編著編著,又得倒回去重新琢磨,還是免不了這些過程,
    以O(shè)O為例,對應(yīng)于軟件開發(fā)的過程,OO衍生出3個概念:OOA、OOD和OOP。采用面向?qū)ο筮M行分析的方式稱為OOA,采用面向?qū)ο筮M行設(shè)計的方式稱為OOD,采用面向?qū)ο筮M行編碼的方式稱為OOP。面向過程(OP)和面向?qū)ο?OO)本質(zhì)的區(qū)別在于分析方式的不同,終導(dǎo)致了編碼方式的不同。
    2.3 面向過程(OP)和面向?qū)ο?OO)