
01
關于軟件架構(Software Architecture),這其實也是仁者見仁,智者見智,不過也早有了一個國際標準了,我所使用的概念全都來自國際標準。
國外軟件架構的書有很多,有卡耐基梅隆大學的《軟件構架實踐》,作者們是美國國防部軍事軟件的供應商,這個大學好像外包了美國的很多軍事項目。不過這本書講的項目都是軍事項目,我們軟件技術人員大多是沒有搞過搞軍事項目的。我們更多的是企業(yè)應用軟件的開發(fā),所以,那本書中的軍事領域里面的那些術語,很多是和我們軟件開發(fā)過程中的術語是不一樣的,因此,我們不會太多的涉及這本書的內容,當然了,雖然我們無法用他書中的概念來談關于架構的問題,但它的那里面的很多方法也是可以參考的。
What’s Software Architecture?
軟件架構,也可以稱為是軟件系統(tǒng)結構,或者說軟件實際上是軟件系統(tǒng)的一個簡稱。
它最核心的一個方法論,是面對真正的需求,去尋找到一個架構,從而能夠平衡(balance)的完成這個需求。
02
我們先來看看,軟件是個什么東西?
What’s Software?
軟件是什么?
Software is a general term used to describe a collection of computer programs, procedures and documentation that perform some tasks on an operating System.
這個軟件它是用來干什么的呢?
它是一個計算機的程序,然后呢,是這樣的一個集合或者一個收集物。要讓程序通過系統(tǒng)來執(zhí)行一些任務,就是一個執(zhí)行過程,從操作系統(tǒng)的眼光看,它是運行在操作系統(tǒng)上的很小的一個局部的過程。
那什么又是軟件系統(tǒng)呢?
What’s Software System?
The term software system is often used as a system of computer program or software.
A software system is a system based on software forming part of a computer system(a combination of hardware and software).
The term software system is related to the application of systems theory approaches in software engineering context. This approach is often used to study large and complex software,because it focuses on the major components of software and their interactions.
The term software system is also related to the field of Software Architecture.
我們再來對軟件系統(tǒng)做一個更深刻的說明,軟件系統(tǒng)這個術語,它常常也是一個計算機程序?;蛘哕浖囊粋€同義詞。一個計算機系統(tǒng)包括了硬件、軟件。當我們講一個軟件架構的時候,我們要跟硬件與軟件,粘連在一起嗎?軟件架構是需要映射一個組織的架構嗎?
核心問題是,軟件有一個架構。先有架構,然后軟件,然后又有一個語境。我們直觀的看到軟件要部署在硬件上,這樣構成了一個計算機系統(tǒng),而這個計算機系統(tǒng),是需要運行在一個企業(yè)里面的,它首先要映射一個企業(yè)。這是我們的兩個核心。
一個軟件系統(tǒng)在一個企業(yè)里面,要包括四個部分,軟件,硬件,組織,信息。
那么,軟件系統(tǒng)有哪些分類?
Major Categories of Software Systems:
Application software/Programming software (DevelopmentTools)/System Software
應用軟件/編程軟件(開發(fā)工具)/系統(tǒng)軟件
03
首先,介紹一下軟件體系結構的核心概念和關鍵圖像。
Architect (架構師) 名詞/Architecting(構架) 動詞/Architecture(架構,體系結構) 名詞
Architect performs Architecting./Architecting results in Architecture./Architect creates Architecture.
他們的關系是,架構師構架體系結構。那,什么是架構師呢?
What is An Architect?
System stakeholder(涉眾) responsible for a system’s architecture.
架構師是,負責系統(tǒng)體系結構的系統(tǒng)利益干系人(涉眾)。
04
軟件架構首先放在了一個軟件工程的語境里面,它最重要的目標就是提高它的模塊的通用性,以及關注點的分割,通過這兩個核心的手段,來降低軟件的復雜性,這是軟件工程中要解決的重中之重的問題。
Approach,是一個途徑。達到一個目標你有很多途徑,在一些條件的限定下,你獲得一種對各種資源的平衡(比如項目管理中,資源時間成本,三者互相統(tǒng)一又互相矛盾的關系),你再去選擇一條適合你的一種途徑。
各種類型的軟件系統(tǒng)都有一個架構。它是系統(tǒng)里面一個有效的組成部分,這就把我們的范圍在逐漸縮小,逐漸限定。我們首先要選擇一下我們的方向,我在書中探討的是,應用軟件的架構。
軟件一定會有一個架構,不管你有沒有意識到,架構一定存在。那我們研究架構的時候需要考慮,是哪一種類型的架構,我們先下決心去做一種選擇,然后再確定我們研究的是應用軟件,那應用軟件也會有很多呀,我們到底要做什么,我們最終要選擇的是做一個application,在企業(yè)的環(huán)境中,去做一個企業(yè)級的應用。
通過這樣一系列的選擇,用的這個方法,其實是非常復雜,因為你要進行取舍,最后才能確定方向。然后呢,還要找到一個架構,來達到一種很好的平衡,這樣才算理解了前進的方向。
05
架構師通過他的思考與設計,構建了一個符合要求達到標準的軟件架構。
注意我們的主語和謂語,我們現(xiàn)在的目光要聚焦在誰在干這個事兒,不是如何干,也不是干成的結果是什么,也不是等著這個結論與結果,然后用一個東西把它描述一下。
很多人,把架構理解成了一種結果性的東西,比如系統(tǒng)文檔,他們認為通過這些文檔,就理解了這種文檔背后的系統(tǒng)交流的語言,這個方向其實有點問題,搞成了反推機制,也就是說我們開發(fā)好一個軟件后,然后再解釋這個軟件是如何產生的,反過來再解釋這個軟件的架構,而不是把架構理解成一個動態(tài)正向的過程,是一個前期的設計過程,這其實已經搞反了。
我們有時候,會看到軟件工程中有很多的藍圖,這其實是設計上的東西。
而這三者的關系是,架構師通過執(zhí)行構架這個活動,然后設計實現(xiàn)了一個架構。
06
當然,在現(xiàn)實生活中,很多時候架構實際上是三個要素(政治,經濟與技術),斗爭與評價,甚至是迭代的動態(tài)平衡后的一個結果。
首先是一個技術面臨的實現(xiàn)因素,你在企業(yè)里面呆久了之后你就會知道,架構,首先是政治斗爭的結果,然后是經濟斗爭的結果,再然后才是技術選擇的結果。
比如,在一個公司里,每個銷售經理從怎么維護自己部門的利益的角度來看問題,其他部門的負責人也是如此,而很少有人能從大局觀來看問題,當然老板必須從大局觀來看。這是因為公司的政策都會影響他們,會影響他們的收入,地位,以及未來發(fā)展前途。
所以,每一個架構也會影響他們,組織結構也是一種balance的結果。因為我參與了一些事務的決策過程,這里面的利益之爭是非常復雜的。
第一個要素首先是正視權力斗爭的結果,然后下一個是經濟利益斗爭的結果,第三位才是技術選擇的結果。
如果我們有足夠多的開發(fā)經驗和人生閱歷的話,你慢慢就會接受一個概念,架構沒有最好的,只有適合自己的,只有適合自己特定的企業(yè)環(huán)境的。
當然了,這個世界上充滿智慧的人也很多,很多人都是高標準、嚴要求,甚至很多都算是完美主義者,包括我自己,但我發(fā)現(xiàn)這種思考問題的角度是大有問題的。
我們在開發(fā)軟件的過程中,尤其是在實現(xiàn)軟件架構的過程中,有很多人在技術上喜歡用比較新的東西,有技術含量的東西,以體現(xiàn)出我是牛人的特點的東西。從而,力爭把軟件設想得比較先進,以證明我的偉大。
但實際經驗,我要告訴你,你那叫找死,你只要能夠解決問題,達到平衡,能按時完成任務,讓老板們賺到錢,然后你也賺到錢,你只需要比別人多想一小步就足夠厲害了。
因此,在架構面前,我們不做best,做到better,我認為就很perfect了,這是因為,在技術面前,總有更新的,也總有更先進的,你追求這個永遠追求不完。當然了,我們還要有一個考慮,步子不能太大,要結合實際情況,財、物、人、力,各種資源整體協(xié)調前進,做先鋒做先驅可以,做先烈就有點慘了,如果沒有各方面足夠的投入,那就沒有必要了。
你可以做一個先驅,而不要緊接著做了先烈,一不小心把自己作死了,這就是有點冒進了,因此,我們要把握好這個度。
所以,有這樣一句話,叫尺度把握人生,高度決定視野,角度改變觀念。