《架构之美》读后感
Beautiful Architecture
Leading Thinkers Reveal the Hidden Beauty in Software Design
Byhttp://oreilly.com/catalog/9780596517984
架構(gòu)是系統(tǒng)設(shè)計的一部分,它突出了某些細(xì)節(jié),并通過抽象省略掉了另一些細(xì)節(jié)。軟件系統(tǒng)的架構(gòu)包括行為上的和結(jié)構(gòu)上的。外部行為描述展示了軟件如何與用戶、其他設(shè)備和外部設(shè)備進(jìn)行交互,也就是需求。結(jié)構(gòu)描述展示了軟件如何被劃分為多個部分,以及這些部分的關(guān)系。
架構(gòu)的設(shè)計受到許多因素的制約,架構(gòu)是好是壞并沒有統(tǒng)一的標(biāo)準(zhǔn)。這取決于人們對軟件的需求、軟件被構(gòu)建和運行的環(huán)境,以及軟件團(tuán)隊本身的特點等等因素。評價軟件好壞有很多指標(biāo),例如性能、安全、可伸展性等等。一般來說,這些指標(biāo)是很難全部滿足的,試圖改進(jìn)其中一個往往會對其他指標(biāo)產(chǎn)生負(fù)面影響。所以從某種意義上來說,軟件架構(gòu)是折中的游戲。對于一組功能需求和品質(zhì)需求,沒有唯一的正確架構(gòu)。
《架構(gòu)之美》沒有太多空洞的概念和論述,而是拋磚引玉地展示多個實際的項目。通過對它們架構(gòu)利弊的分析,以及相關(guān)的思考,給讀者提供了有益的啟發(fā)。在這里我簡單介紹幾個其中的例子。
“混亂大都市”和“設(shè)計之城”
一個例子是兩個類似但是命運完全不同的項目:“混亂大都市”和“設(shè)計之城”。
“混亂大都市”來自于一家成立不久的公司。軟件的延期是不可容忍的,所以軟件工程師們被迫盡其極限快速交付。代碼是以一系列的瘋狂沖刺方式堆疊在一起的,這使得“混亂大都市”從一開始就缺乏規(guī)劃,導(dǎo)致了一系列惡果。結(jié)構(gòu)混亂難以理解,沒有清晰的層次,模塊間的依賴關(guān)系錯綜復(fù)雜;組件的角色定義模糊,本該在這個組件的事情卻在另一個組件里實現(xiàn);整個項目完全是由膠帶、Shell腳本、Perl膠水、makefile和Visual Studio項目混合在一起的。
新手難以快速熟悉這個項目,就連老手也不知道整個項目的全景。所有人花費了大量精力得到了一份“架構(gòu)圖”,看上去像倫敦地鐵圖,甚至還有環(huán)線:
?
最終這家公司放棄了“混亂大都市”項目,并組織團(tuán)隊重新編寫,祝他們好運……
“設(shè)計之城”與“混亂大都市”類似,都是C++編寫的音頻軟件。從一開始,項目就有了清晰的目標(biāo):具體的首個產(chǎn)品和未來功能的路線圖,代碼必須支持這些功能和未來的變化。
團(tuán)隊采用了極限編程的方法,對于項目的很多關(guān)注點作了規(guī)定。例如統(tǒng)一的文件結(jié)構(gòu)、命名規(guī)范、編碼慣例等等。并且在系統(tǒng)核心的設(shè)計上花費的不少時間,最終得到了一個“過濾器和管道”的架構(gòu):
?
此書編寫時“設(shè)計之城”仍然在使用中,并且擴(kuò)展出了一些成功的產(chǎn)品。事實上,“設(shè)計之城”的代碼并不完美,有些地方存在技術(shù)爭論,但是在整潔的背景下這些問題顯得特別突出,從而在將來會得到解決。
GNU Emacs
另一個例子是GNU Emacs
Emacs是當(dāng)今流行的文本編輯器之一。Emacs于上世紀(jì)70年代中旬開始開發(fā),至今已走過了三十多年,但其架構(gòu)基本沒有改變過。而且,Emacs的特性在不斷地增加中。
Emacs采用了交互式應(yīng)用程序中應(yīng)用廣泛的“模型-視圖-控制器”模式。模型是程序所操作數(shù)據(jù)的底層描述;視圖時向用戶展示數(shù)據(jù)的方法;控制器負(fù)責(zé)實現(xiàn)用戶與視圖的交互,并對模型進(jìn)行更新。
?
- Emacs的模型,緩沖區(qū)就是簡單的字符串。每個緩沖區(qū)都有一種模式,用來指定對特定類型文本進(jìn)行編輯時的行為;緩沖區(qū)還維護(hù)了一個撤銷日志,用來記住各個用戶命令間的邊界;此外緩沖區(qū)還為文本在緩沖區(qū)中的定位提供的支持;緩沖區(qū)中的每個字符有自己的屬性,包括如何顯示以及如何應(yīng)對鼠標(biāo)操作等。
- Emacs的視圖可以自動更新顯示結(jié)果,并且只在用戶輸入時更新。例如現(xiàn)在的網(wǎng)頁瀏覽器就借鑒了這樣的方式。
- Emacs的控制器是用自己獨立的Emacs Lisp語言開發(fā)的。Emacs幾乎所有的功能都由Emacs Lisp實現(xiàn),用戶可以自己編寫Emacs Lisp程序來擴(kuò)充Emacs的功能。事實上,通常的Emacs發(fā)行版就包含了很多流行的Emacs Lisp包。
隨著軟件的特性不斷增長,用戶界面將變得復(fù)雜,程序本身將變得難以維護(hù)。評價一個程序的用戶界面復(fù)雜度,有兩個常見的維度:要維護(hù)的模型的復(fù)雜度,以及操作該模型命令集的復(fù)雜度。
Emacs的模型,即緩沖區(qū)僅僅是字符串,緩沖區(qū)的改變永遠(yuǎn)是可見的;Emacs的命令非常之多,但是一個新用戶完全可以像使用其他基本的文本編輯器一樣使用Emacs,Emacs還提供了許多工具用于發(fā)現(xiàn)和理解新功能。Emacs更像是一個包的組合體,由社區(qū)的許多人員共同維護(hù)。Lisp語言在這當(dāng)中扮演了重要的抽象邊界的角色。
另外還有兩個類似的架構(gòu):Eclipse和Firefox
Eclipse
Eclipse實際上是一個開發(fā)環(huán)境的框架,它本身沒有提供任何相關(guān)功能。通過Java Development Tools等類型的插件,Eclipse就可以對軟件開發(fā)提供大量廣泛的支持,而這正是Emacs所欠缺的。
Eclipse為每個插件的輸入和顯示都提供了非常底層的支持,這允許插件實現(xiàn)更加復(fù)雜的功能,但也帶來了問題:
Eclipse的插件開發(fā)是不安全的,而這正是Emacs具備的。一個充滿bug的插件會讓Eclispe崩潰,而在Emacs中用戶可以終止這樣的插件,并且用戶的數(shù)據(jù)不會被破壞。
Eclipse插件間的結(jié)構(gòu)比較復(fù)雜,這對插件作者是個挑戰(zhàn)。
插件需要足夠的樣板文件代碼。Eclipse中有個幫助大家編寫插件的插件Eclipse Plug-in Development Environment,但這并不能降低底層接口的復(fù)雜性。
這引了一些思考。在插件中究竟應(yīng)該使用哪類接口?插件開發(fā)人員應(yīng)該在怎樣的抽象級別上開發(fā),能否更接近問題?如果保護(hù)數(shù)據(jù)不被充滿bug的插件破壞?
Firefox
Firefox作為現(xiàn)代的瀏覽器,支持JavaScript動態(tài)的修改頁面,這一點很像Emacs中的Lisp和緩沖區(qū)。不過,Firefox更加徹底地讓自己的用戶界面,以及許多內(nèi)置功能都使用JavaScript來實現(xiàn)。
這也引起一些思考。在所有使用插件的程序中,插件的開發(fā)語言是不是為程序添加功能最好的方法?如果不是,為什么?
感想
引用William J. Mitchell為此書所寫的文章:
“好的建筑師不是通過隨意的、蠻力的方式來構(gòu)造他們的設(shè)計,他們肯定會避免笨拙的做法。”“在漂亮的建筑作品所表現(xiàn)出來的不同和復(fù)雜性背后,你通常會發(fā)現(xiàn)一些關(guān)于功能組織和規(guī)范秩序的簡單而優(yōu)雅的原則。發(fā)現(xiàn)這些原則需要思考,而思考正是建筑的快樂和經(jīng)驗的關(guān)鍵部分。”
“如果你能弄明白這些原則,就可以通過某種標(biāo)準(zhǔn)編程語言中同樣優(yōu)雅的幾行代碼構(gòu)造出這些作品的模型;但如果你弄不明白這些原則,那么肯定要編寫更長的、不包含那么多深刻見解的代碼。”
“建筑師會仰慕那些應(yīng)用了簡單優(yōu)雅原則來實現(xiàn)許多復(fù)雜性的架構(gòu)之美。類似地,軟件架構(gòu)師和程序員也會仰慕那些清晰而準(zhǔn)確執(zhí)行了許多復(fù)雜任務(wù)的代碼之美。科學(xué)家會仰慕那些描述了各種不同現(xiàn)象的簡單法則之美和它們的解釋能力。”
架構(gòu)之美在于其簡潔深刻地描述和解決現(xiàn)實的軟件設(shè)計問題,無論是它為軟件開發(fā)人員減少的麻煩,還是本身形式上的和諧和整齊,都足以讓人賞心悅目。
by Hao Fu
轉(zhuǎn)載于:https://www.cnblogs.com/MSRA_SE_TEAM/archive/2011/02/27/1966448.html
總結(jié)
- 上一篇: Android 线程 thread 两种
- 下一篇: vb 通过php连接mysql数据库连接