Jeff Yan關於軟體構架和軟體架構的不同的討論

來源:互聯網
上載者:User

以下是閻宏博士在CSDN一個關於構架和架構概念的討論中的發言,對我們理解這兩個概念很有協助!


架構:architecture
架構:framework

軟體的大尺度結構就是架構。一個軟體不管好壞,都會有一個架構。軟體架構中可以利用架構,也可以不利用架構。譬如JSP就是一種架構,而你的系統可以利用JSP架構,形成自己的架構。

所有的framework都是遵循好萊塢原則設計的,否則就不叫framework。所謂好萊塢原則,說的是You don't call us - we will call you. 意思就是在一個framework下的代碼,都是被動地被framework調用,而不是相反。通過這種方式,大量重複的代碼就可以隱藏在framework裡面,需要特別設計的代碼以預定介面的方式交給開發人員,寫好後由framework調用。

譬如JSP就是一個framework。你寫的JSP指令碼會被JSP引擎編譯成servlet的一部分。這種servlet都帶有大量重複的代碼,是JSP程式員不需要考慮的,由framework負責。


如果用房屋作比喻,架構就是忽略掉細節的抽象建築結構,在圖紙可以看到,存在於人腦之中,不體現為房屋的某一個物理部分。架構師就是建築設計師,英文都是architect。

軟體架構師:software architect
建築設計師:building architect

架構是房屋的骨架,房屋的骨架是物理存在的。

卡爾。馬克思在《資本論》中說,蜜蜂建造的蜂房可以使人類最傑出的建築黯然失色,但是最蹩腳的建築設計師也勝過蜜蜂,因為在設計師開始設計之前,房屋的架構就已經存在於設計師的腦中了。

馬克思的意思是說人類的設計是有目的的活動,而蜜蜂不是。馬克思所說的這個存在於人類腦中的,是架構不是架構。房屋的架構如果掉到了人腦裡,哪怕是一小部分,人就死了。


下面摘自我的一本書,一直沒有工夫完成。

第1.1節、什麼是架構
什麼是軟體系統的架構(Architecture)?一般而言,架構有兩個要素:
 它是一個軟體系統從整體到部分的最高層次的劃分。
一個系統通常是由元件組成的,而這些元件如何形成、相互之間如何發生作用,則是關於這個系統本身結構的重要訊息。
詳細地說,就是要包括架構元件(Architecture Component)、連接器(Connector)、任務流(Task-flow)。所謂架構元素,也就是組成系統的核心“磚瓦”,而連接器則描述這些元件之間通訊的路徑、通訊的機制、通訊的預期結果,任務流則描述系統如何使用這些元件和連接器完成某一項需求。
 建造一個系統所作出的最高層次的、以後難以更改的,商業的和技術的決定。
在建造一個系統之前會有很多的重要決定需要事先作出,而一旦系統開始進行詳細設計甚至建造,這些決定就很難更改甚至無法更改。顯然,這樣的決定必定是有關係統設計成敗的最重要決定,必須經過非常謹慎的研究和考察。

電腦軟體的曆史開始於五十年代,曆史非常短暫,而相比之下建築工程則從石器時代就開始了,人類在幾千年的建築設計實踐中積累了大量的經驗和教訓。建築設計基本上包含兩點,一是建築風格,而是建築模式。獨特的建築風格和恰當選擇的建築模式,可以使一個獨一無二。
下面的照片顯示了中美洲古代瑪雅建築,Chichen-Itza大金字塔,九個巨大的石級堆壘而上,九十一級台階奪路而出,塔頂的神殿聳入雲天。所有的數字都如日曆般嚴禁,風格雄渾。難以想象這是石器時代的建築物。
 
圖1.1、位於墨西哥Chichen-Itza的古瑪雅文明的建築。(攝影:閻宏)
軟體與人類的關係是架構師必須面對的核心問題,也是自從軟體進入曆史舞台之後就出現的問題。與此類似地,自從有了建築以來,建築與人類的關係就一直是建築設計師必須面對的核心問題。英國首相丘吉爾說,我們構造建築物,然後建築物構造我們(We shape our buildings, and afterwards our buildings shape us)。英國下議院的會議廳較狹窄,無法使所有的下議院議員面向同一個方向入座,而必須分成兩側入座。丘吉爾認為,議員們入座的時候自然會選擇與自己政見相同的人同時入座,而這就是英國政黨制的起源,這個起源的關鍵就是建築物對人的影響。
在軟體設計界曾經有很多人認為功能是最為重要的,形式必須服從功能。與此類似地,在建築學界,現代主義建築流派的開創人之一Louis Sullivan也認為形式應當服從於功能(Forms follows function)。
幾乎所有的軟體設計理念都可以在浩如煙海的建築學曆史中找到更為遙遠的曆史迴響。最為著名的,當然就是模式理論和XP理論。
架構的目標是什麼
正如同軟體本身有其要達到的目標一樣,架構設計要達到的目標是什麼呢?一般而言,軟體架構設計要達到如下的目標:
 可靠性(Reliable)。軟體系統對於使用者的商業經營和管理來說極為重要,因此軟體系統必須非常可靠。
 安全行(Secure)。軟體系統所承擔的交易的商業價值極高,系統的安全性非常重要。
 可擴充性(Scalable)。軟體必須能夠在使用者的使用率、使用者的數目增加很快的情況下,保持合理的效能。只有這樣,才能適應使用者的市場擴充得可能性。
 可定製化(Customizable)。同樣的一套軟體,可以根據客戶群的不同和市場需求的變化進行調整。
 可擴充性(Extensible)。在新技術出現的時候,一個軟體系統應當允許匯入新技術,從而對現有系統進行功能和效能的擴充
 可維護性(Maintainable)。軟體系統的維護包括兩方面,一是排除現有的錯誤,二是將新的軟體需求反映到現有系統中去。一個易於維護的系統可以有效地降低支援人員的花費
 客戶體驗(Customer Experience)。軟體系統必須便於使用。
 市場時機(Time to Market)。軟體使用者要面臨同業競爭,軟體供應商也要面臨同業競爭。以最快的速度爭奪市場先機非常重要。
架構的種類
根據我們關注的角度不同,可以將架構分成三種:
 邏輯架構、軟體系統中元件之間的關係,比如使用者介面,資料庫,外部系統介面,商業邏輯元件,等等。
比如下面就是筆者親身經曆過的一個軟體系統的邏輯架構圖
 
圖1.2、一個邏輯架構的例子。

從上面這張圖中可以看出,此系統被劃分成三個邏輯層次,即表象層次,商業層次和資料持久層次。每一個層次都含有多個邏輯元件。比如WEB伺服器層次中有HTML服務元件、Session服務元件、安全服務元件、系統管理元件等。
 物理架構、軟體元件是怎樣放到硬體上的。
比如下面這張物理架構圖描述了一個分佈於北京和上海的分布式系統的物理架構,圖中所有的元件都是物理裝置,包括網路分流器、Proxy 伺服器、WEB伺服器、應用伺服器、報表伺服器、整合伺服器、儲存伺服器、主機等等。
 
圖1.3、一個物理架構的例子。

 系統架構、系統的非功能性特徵,如可擴充性、可靠性、強壯性、靈活性、效能等。
系統架構的設計要求架構師具備軟體和硬體的功能和效能的過硬知識,這一工作無疑是架構設計工作中最為困難的工作。
此外,從每一個角度上看,都可以看到架構的兩要素:元件劃分和設計決定。
首先,一個軟體系統中的元件首先是邏輯元件。這些邏輯元件如何放到硬體上,以及這些元件如何為整個系統的可擴充性、可靠性、強壯性、靈活性、效能等做出貢獻,是非常重要的資訊。
其次,進行軟體設計需要做出的決定中,必然會包括邏輯結構、物理結構,以及它們如何影響到系統的所有非功能性特徵。這些決定中會有很多是一旦作出,就很難更改的。
根據作者的經驗,一個基於資料庫的系統架構,有多少個資料表,就會有多少頁的架構設計文檔。比如一個中等的資料庫應用系統通常含有一百個左右的資料表,這樣的一個系統設計通常需要有一百頁左右的架構設計文檔。
架構師
軟體設計師中有一些技術水平較高、經驗較為豐富的人,他們需要承擔軟體系統的架構設計,也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用,以及系統中邏輯的、物理的、系統的重要決定的作出。
這樣的人就是所謂的架構師(Architect)。在很多公司中,架構師不是一個專門的和正式的職務。通常在一個開發小組中,最有經驗的程式員會負責一些架構方面的工作。在一個部門中,最有經驗的專案經理會負責一些架構方面的工作。
但是,越來越多的公司體認到架構工作的重要性,並且在不同的組織層次上設定專門的架構師位置,由他們負責不同層次上的邏輯架構、物理架構、系統架構的設計、配置、維護等工作。


MVC是一個架構模式。.net是一個開發平台。

一個軟體系統可以同時使用到多個架構。

不可能每一行代碼都要用到某一個架構。

不懂得軟體工程而可以開發出軟體的人很多,對這樣的朋友我只會說good luck,到此為止。你想怎麼都可以。

如果你認真對待軟體工程,那最好還是使用通行的概念。概念本就是為了交流用的,如果你使用的是自己定義的概念,除了交流會產生混亂之外,不會有別的結果。

庫(library)或類庫(class library)不是架構,雖然架構可以體現為庫或類庫。好萊塢原則是所有架構的特點,不是僅僅出現在好架構中的。

想要創造,而不是人云亦云,這個很好,但不是在使用術語和概念的時候。術語和概念就是需要人云亦云。

舉個例子,北京有一家餐館禁止日本人入內,外面立個牌子,寫了一行英文(為什麼不是日文,我不知道)寫著“Japanese forbid entering”。這是一句根本不通的話,聽上去好像是日本人禁止別人入內。學習語言,必須人云亦云,不然就到了美國人聽不懂你的英語的程度,你能用英文創作嗎?先把人云亦云這一關過了,然後才談得上創造。

學習任何科學技術,都有採納通行術語概念的問題,就像英文是用來交流的一樣,這些名詞術語概念和它們的含義要首先掌握。要想創造,先過了這一關。反過來,放棄這些已有的名詞術語概念,自己創造一套,唯一的效果就是四不象,好像是英文,但是照英文理解根本不通,好像是軟體工程,照軟體工程那樣討論對牛彈琴。

遇到這樣的問題,你面臨的就根本不是能不能創造的問題,而是還沒有入門的問題。日本人就是japanese,禁止就是forbid,入內就是entering,因此日本人禁止入內就成了japanese forbid entering。有很多討論中的虛無觀點,其實是幼稚的表現。除非他什麼都不做,但凡做出來的,就差不多是japanese forbid entering這類的東西。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.