01
關(guān)于軟件架構(gòu)(Software Architecture)钥飞,這其實也是仁者見仁付翁,智者見智筛欢,不過也早有了一個國際標(biāo)準(zhǔn)了恢共,我所使用的概念全都來自國際標(biāo)準(zhǔn)战秋。
國外軟件架構(gòu)的書有很多,有卡耐基梅隆大學(xué)的《軟件構(gòu)架實踐》讨韭,作者們是美國國防部軍事軟件的供應(yīng)商脂信,這個大學(xué)好像外包了美國的很多軍事項目。不過這本書講的項目都是軍事項目透硝,我們軟件技術(shù)人員大多是沒有搞過搞軍事項目的狰闪。我們更多的是企業(yè)應(yīng)用軟件的開發(fā),所以濒生,那本書中的軍事領(lǐng)域里面的那些術(shù)語埋泵,很多是和我們軟件開發(fā)過程中的術(shù)語是不一樣的,因此,我們不會太多的涉及這本書的內(nèi)容丽声,當(dāng)然了礁蔗,雖然我們無法用他書中的概念來談關(guān)于架構(gòu)的問題,但它的那里面的很多方法也是可以參考的雁社。
What’s Software Architecture?
軟件架構(gòu)浴井,也可以稱為是軟件系統(tǒng)結(jié)構(gòu),或者說軟件實際上是軟件系統(tǒng)的一個簡稱歧胁。
它最核心的一個方法論滋饲,是面對真正的需求,去尋找到一個架構(gòu)喊巍,從而能夠平衡(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í)行一些任務(wù)海洼,就是一個執(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)這個術(shù)語是整,它常常也是一個計算機程序肖揣。或者軟件的一個同義詞浮入。一個計算機系統(tǒng)包括了硬件龙优、軟件。當(dāng)我們講一個軟件架構(gòu)的時候事秀,我們要跟硬件與軟件彤断,粘連在一起嗎?軟件架構(gòu)是需要映射一個組織的架構(gòu)嗎秽晚?
核心問題是瓦糟,軟件有一個架構(gòu)。先有架構(gòu)赴蝇,然后軟件菩浙,然后又有一個語境。我們直觀的看到軟件要部署在硬件上,這樣構(gòu)成了一個計算機系統(tǒng)劲蜻,而這個計算機系統(tǒng)陆淀,是需要運行在一個企業(yè)里面的,它首先要映射一個企業(yè)先嬉。這是我們的兩個核心轧苫。
一個軟件系統(tǒng)在一個企業(yè)里面,要包括四個部分疫蔓,軟件含懊,硬件,組織衅胀,信息岔乔。
那么,軟件系統(tǒng)有哪些分類滚躯?
Major Categories of Software Systems:
Application software/Programming software (DevelopmentTools)/System Software
應(yīng)用軟件/編程軟件(開發(fā)工具)/系統(tǒng)軟件
03
首先雏门,介紹一下軟件體系結(jié)構(gòu)的核心概念和關(guān)鍵圖像。
Architect (架構(gòu)師) 名詞/Architecting(構(gòu)架) 動詞/Architecture(架構(gòu)掸掏,體系結(jié)構(gòu)) 名詞
Architect performs Architecting./Architecting results in Architecture./Architect creates Architecture.
他們的關(guān)系是茁影,架構(gòu)師構(gòu)架體系結(jié)構(gòu)。那丧凤,什么是架構(gòu)師呢募闲?
What is An Architect?
System stakeholder(涉眾) responsible for a system’s architecture.
架構(gòu)師是,負責(zé)系統(tǒng)體系結(jié)構(gòu)的系統(tǒng)利益干系人(涉眾)愿待。
04
軟件架構(gòu)首先放在了一個軟件工程的語境里面蝇更,它最重要的目標(biāo)就是提高它的模塊的通用性,以及關(guān)注點的分割呼盆,通過這兩個核心的手段,來降低軟件的復(fù)雜性蚁廓,這是軟件工程中要解決的重中之重的問題访圃。
Approach,是一個途徑相嵌。達到一個目標(biāo)你有很多途徑腿时,在一些條件的限定下,你獲得一種對各種資源的平衡(比如項目管理中饭宾,資源時間成本批糟,三者互相統(tǒng)一又互相矛盾的關(guān)系),你再去選擇一條適合你的一種途徑看铆。
各種類型的軟件系統(tǒng)都有一個架構(gòu)徽鼎。它是系統(tǒng)里面一個有效的組成部分,這就把我們的范圍在逐漸縮小,逐漸限定否淤。我們首先要選擇一下我們的方向悄但,我在書中探討的是,應(yīng)用軟件的架構(gòu)石抡。
軟件一定會有一個架構(gòu)檐嚣,不管你有沒有意識到,架構(gòu)一定存在啰扛。那我們研究架構(gòu)的時候需要考慮嚎京,是哪一種類型的架構(gòu),我們先下決心去做一種選擇隐解,然后再確定我們研究的是應(yīng)用軟件鞍帝,那應(yīng)用軟件也會有很多呀,我們到底要做什么厢漩,我們最終要選擇的是做一個application膜眠,在企業(yè)的環(huán)境中,去做一個企業(yè)級的應(yīng)用溜嗜。
通過這樣一系列的選擇宵膨,用的這個方法,其實是非常復(fù)雜炸宵,因為你要進行取舍辟躏,最后才能確定方向。然后呢土全,還要找到一個架構(gòu)捎琐,來達到一種很好的平衡,這樣才算理解了前進的方向裹匙。
05
架構(gòu)師通過他的思考與設(shè)計瑞凑,構(gòu)建了一個符合要求達到標(biāo)準(zhǔn)的軟件架構(gòu)。
注意我們的主語和謂語概页,我們現(xiàn)在的目光要聚焦在誰在干這個事兒籽御,不是如何干,也不是干成的結(jié)果是什么惰匙,也不是等著這個結(jié)論與結(jié)果技掏,然后用一個東西把它描述一下。
很多人项鬼,把架構(gòu)理解成了一種結(jié)果性的東西哑梳,比如系統(tǒng)文檔,他們認為通過這些文檔绘盟,就理解了這種文檔背后的系統(tǒng)交流的語言鸠真,這個方向其實有點問題悯仙,搞成了反推機制,也就是說我們開發(fā)好一個軟件后弧哎,然后再解釋這個軟件是如何產(chǎn)生的雁比,反過來再解釋這個軟件的架構(gòu),而不是把架構(gòu)理解成一個動態(tài)正向的過程撤嫩,是一個前期的設(shè)計過程偎捎,這其實已經(jīng)搞反了。
我們有時候序攘,會看到軟件工程中有很多的藍圖茴她,這其實是設(shè)計上的東西。
而這三者的關(guān)系是程奠,架構(gòu)師通過執(zhí)行構(gòu)架這個活動丈牢,然后設(shè)計實現(xiàn)了一個架構(gòu)。
06
當(dāng)然瞄沙,在現(xiàn)實生活中己沛,很多時候架構(gòu)實際上是三個要素(政治,經(jīng)濟與技術(shù))距境,斗爭與評價申尼,甚至是迭代的動態(tài)平衡后的一個結(jié)果。
首先是一個技術(shù)面臨的實現(xiàn)因素垫桂,你在企業(yè)里面呆久了之后你就會知道师幕,架構(gòu),首先是政治斗爭的結(jié)果诬滩,然后是經(jīng)濟斗爭的結(jié)果霹粥,再然后才是技術(shù)選擇的結(jié)果。
比如疼鸟,在一個公司里后控,每個銷售經(jīng)理從怎么維護自己部門的利益的角度來看問題,其他部門的負責(zé)人也是如此空镜,而很少有人能從大局觀來看問題忆蚀,當(dāng)然老板必須從大局觀來看。這是因為公司的政策都會影響他們姑裂,會影響他們的收入,地位男旗,以及未來發(fā)展前途舶斧。
所以,每一個架構(gòu)也會影響他們察皇,組織結(jié)構(gòu)也是一種balance的結(jié)果茴厉。因為我參與了一些事務(wù)的決策過程泽台,這里面的利益之爭是非常復(fù)雜的。
第一個要素首先是正視權(quán)力斗爭的結(jié)果矾缓,然后下一個是經(jīng)濟利益斗爭的結(jié)果怀酷,第三位才是技術(shù)選擇的結(jié)果。
如果我們有足夠多的開發(fā)經(jīng)驗和人生閱歷的話嗜闻,你慢慢就會接受一個概念蜕依,架構(gòu)沒有最好的,只有適合自己的琉雳,只有適合自己特定的企業(yè)環(huán)境的样眠。
當(dāng)然了,這個世界上充滿智慧的人也很多翠肘,很多人都是高標(biāo)準(zhǔn)檐束、嚴要求,甚至很多都算是完美主義者束倍,包括我自己被丧,但我發(fā)現(xiàn)這種思考問題的角度是大有問題的。
我們在開發(fā)軟件的過程中绪妹,尤其是在實現(xiàn)軟件架構(gòu)的過程中甥桂,有很多人在技術(shù)上喜歡用比較新的東西,有技術(shù)含量的東西喂急,以體現(xiàn)出我是牛人的特點的東西格嘁。從而,力爭把軟件設(shè)想得比較先進廊移,以證明我的偉大糕簿。
但實際經(jīng)驗,我要告訴你狡孔,你那叫找死懂诗,你只要能夠解決問題,達到平衡苗膝,能按時完成任務(wù)殃恒,讓老板們賺到錢,然后你也賺到錢辱揭,你只需要比別人多想一小步就足夠厲害了离唐。
因此,在架構(gòu)面前问窃,我們不做best亥鬓,做到better,我認為就很perfect了域庇,這是因為嵌戈,在技術(shù)面前覆积,總有更新的,也總有更先進的熟呛,你追求這個永遠追求不完宽档。當(dāng)然了,我們還要有一個考慮庵朝,步子不能太大吗冤,要結(jié)合實際情況,財、物、人暗甥、力佑笋,各種資源整體協(xié)調(diào)前進,做先鋒做先驅(qū)可以,做先烈就有點慘了,如果沒有各方面足夠的投入,那就沒有必要了婆排。
你可以做一個先驅(qū),而不要緊接著做了先烈笔链,一不小心把自己作死了段只,這就是有點冒進了,因此鉴扫,我們要把握好這個度赞枕。
所以,有這樣一句話坪创,叫尺度把握人生炕婶,高度決定視野,角度改變觀念莱预。