任何在 IT 公司工作的人附鸽,對于“架構”這個詞應該都不陌生。但你去問“架構”這個詞是什么意思步咪,似乎又有點只可意會不可言傳的意思。那么
- “架構”這個詞益楼,它應該如何定義呢猾漫?
- 架構設計對于軟件系統(tǒng)和軟件開發(fā)而言起到的作用是什么呢?
- 軟件系統(tǒng)或軟件產品的架構應該用什么樣的方式表達呢感凤?
這篇文章悯周,會嘗試討論一下上面這些問題。
如何定義架構設計陪竿?
我們先來看一個古老的的思想實驗:
忒休斯之船(The Ship of Theseus)最早出自羅馬帝國時代普魯塔克的記載禽翼。它描述的是一艘可以在海上航行幾百年的船,歸功于不間斷的維修和替換部件族跛。只要一塊木板腐爛了闰挡,它就會被替換掉,以此類推礁哄,直到所有的功能部件都不是最開始的那些了长酗。問題是,最終產生的這艘船是原來的那艘忒休斯之船桐绒,還是一艘完全不同的船夺脾?如果不是原來的船,那么在什么時候它不再是原來的船了茉继?
(摘自百度百科)
哲學家們?yōu)榱诉@個問題爭論不休咧叭,而它也被稱為“忒休斯悖論”∷附撸“忒休斯悖論”實際上問的是菲茬,一個物體是不是等于組成它的各個部分的總和?如果答案是肯定的生均,那么當船上所有木板都被更新了,那么這條船當然是一艘完全不同的船了腥刹。但是马胧,直覺告訴我們,這條船還是原來的那條船啊衔峰。如果不是這樣佩脊,一所學校,學生幾年就全換一遍垫卤,老師幾十年全換一遍威彰,難道這所學校就是一所新的學校了?一條河穴肘,河里的水奔流不息歇盼,難道這條河就不是原來那條河了?也就是說评抚,我們憑直覺知道豹缀,一個物體并不等于組成他的各個部分的簡單加總。那么慨代,它到底等于什么呢邢笙?
要回答這個問題,就需要引入系統(tǒng)論的觀點了侍匙〉撸科學研究的主要方法,是把復雜事物拆解成一個個簡單模塊來分析,這種思維模式叫做“還原論”段磨。然而际歼,人們發(fā)現,還原論可以很好地解決單個事物的問題铛纬,卻很難解決系統(tǒng)性、結構性的問題唬滑。想要解決這些復雜問題告唆,必須重新回到“整體論”,而系統(tǒng)論正是研究這一領域的學科晶密。
在《系統(tǒng)之美》這本書中擒悬,“系統(tǒng)”不是一堆事物的簡單集合,而是由一組相互連接的要素構成的稻艰、能夠實現某個目標的整體懂牧。任何一個系統(tǒng)都由要素、連接和功能(目標)構成。譬如對于忒休斯之船僧凤,其要素是一堆木板畜侦,連接是這些木板的位置和鉚合關系即結構,而功能就是航行躯保。系統(tǒng)論講的是廣義上的系統(tǒng)旋膳,房間的溫度、公司的經營途事、國家的經濟验懊,都可以用系統(tǒng)論的模型去進行描述。
軟件系統(tǒng)尸变,也是一種系統(tǒng)义图,因此也可以用系統(tǒng)論的方法進行描述。架構就是構成軟件系統(tǒng)的要素召烂、連接和目標碱工。架構設計就是找到軟件系統(tǒng)中的要素,并將要素之間的連接描繪清楚奏夫,從而實現軟件系統(tǒng)目標的過程痛垛。
為什么架構這么重要?
架構清晰桶蛔,才能理解問題
《系統(tǒng)之美》的作者說匙头,當我們看一個系統(tǒng)時,往往只會注意到系統(tǒng)的要素仔雷,而忽略掉系統(tǒng)的連接和目標蹂析。但對于一個系統(tǒng)而言,要素往往不是最重要碟婆、隨時可以替換的电抚。如果改變了系統(tǒng)的連接,那么系統(tǒng)就會發(fā)生巨大的變化竖共。譬如在大學里蝙叛,如果不是教授給學生打分,而是學生給教授打分公给,那么大學就不再是大學而是商業(yè)培訓機構借帘。而比連接更重要的是目標,譬如大學的目標如果不是教書育人淌铐,而是賺錢盈利肺然,大學也會成為另外一種系統(tǒng)。
軟件系統(tǒng)是一種非常抽象和復雜的系統(tǒng)腿准,軟件系統(tǒng)的構造是一個非常復雜的問題际起。普通人去理解軟件系統(tǒng)往往只能看到其中的要素(功能模塊),而看不到要素之間的連接(模塊之間的關系),但如果不能確定功能模塊之間的關系而直接進入到開發(fā)狀態(tài)街望,由多人或多個組織單元從事的軟件系統(tǒng)的開發(fā)就會陷入混亂校翔,在耗費大量的人力物力和時間成本后,發(fā)現難以達成想要的目標灾前,只留了一堆需要繼續(xù)投入人力成本維護的代碼防症。
架構合理,才能應對變化
《人月神話》中有一句名言:軟件開發(fā)過程中豫柬,唯一不變的就是變化本身。變化就會帶來軟件系統(tǒng)的熵增扑浸,即軟件的生命力從最初的理想狀態(tài)烧给,逐步趨向于復雜、混亂和無序的狀態(tài)發(fā)展喝噪,直到軟件不可維護而被迫下線或重構础嫡。顯而易見,對于從事軟件系統(tǒng)開發(fā)的商業(yè)組織而言酝惧,熵增的后果就是無法滿足客戶需求導致的收入減少和成本居高不下榴鼎。而業(yè)界多年成功和失敗的經驗已經證明,軟件系統(tǒng)熵增的根本導因就是架構設計被忽視晚唇。
例如大多數軟件項目都采用了快速迭代的開發(fā)方法巫财,即從軟件的一小部分重要功能模塊開始開發(fā),逐步增加新的功能模塊哩陕。這種方法帶來好處的同時也帶來了問題平项,系統(tǒng)開發(fā)過程中會不斷引入新的要素(功能模塊),這些新的要素的引入很可能會打破原本已經存在的要素之間的連接(功能模塊之間的關系)悍及。如果在開始開發(fā)之前沒有進行架構設計闽瓢,將所有重要的要素都找出來、理清要素之間的連接并證明其可以支持系統(tǒng)達成最終的目標心赶,那么在開發(fā)過程中就會需要不斷進行重構扣讼,或者因為“技術無法實現”而放棄某些功能。
架構穩(wěn)定缨叫,才能積累能力
得到App《啟發(fā)俱樂部》第29期《能力如何增長椭符?》中有這樣一段話:
能力增長,不是兵來將擋水來土掩耻姥,遇到問題解決問題的結果艰山。而是一開始就有一個初始架構,這個架構不提供答案咏闪,但它提供了一組永恒的問題曙搬,同時屏蔽了那些不指向能力積累的解決方案。
玩兒過 Linux 的程序員應該都聽說過“神的編輯器" Emacs,這是一款 1975 年開始開發(fā)并至今仍有用戶使用文本編輯器纵装,而它居然還能支持多種 1990 年代后出現的編程語言的開發(fā)與調試征讲。相似的例子還有 Eclipse,它除了作為最初的 Java IDE橡娄,還被改造為多種其它用途诗箍。
為什么這些軟件能夠經過數十年的發(fā)展依然經久不衰,支撐了在當年不可能預見的需求挽唉;而有很多軟件產品每隔三五年就要進行一次完全的翻新滤祖、不能在最初的版本上進行向前兼容的演進,不斷積累能力瓶籽?因為在進行軟件產品開發(fā)前沒有進行必要的架構設計匠童,這樣就根本找不到那“一組永恒的問題”。于是面對客戶的“定制需求”時塑顺,就只能“真的定制”汤求,給出無數不能指向能力積累的解決方案。
這種狀態(tài)不僅導致軟件系統(tǒng)的交付周期延長严拒、質量下降扬绪,也會導致提供軟件產品或服務的商業(yè)組織大量收入變?yōu)槌杀径鵁o法成為利潤。
軟件系統(tǒng)的架構如何描述
關于軟件系統(tǒng)的架構如何表達方法裤唠,在行業(yè)里爭論就比較多了挤牛,由于所處的環(huán)境和工作背景的不同,每個人的理解都不太一樣种蘸。但目前在行業(yè)中赊颠,有一些共識是架構的表達需要分層分類,不可能簡單的用一張 PPT 就描繪清楚軟件系統(tǒng)架構的所有問題劈彪。
行業(yè)中比較常見的關于架構分層分類的方法是:業(yè)務架構竣蹦、應用架構、數據架構沧奴、技術架構痘括。這些詞被放到不同的環(huán)境中時,其具體含義也會發(fā)生一些變化滔吠,但其底層邏輯是一致的纲菌。
業(yè)務架構:對于軟件系統(tǒng)開發(fā)者而言,其最終的目的是為了實現客戶的概念目標(戰(zhàn)略目標)疮绷,而概念目標往往是一些比較含糊的描述翰舌,并沒有給出具體的實現方法;因此概念目標必須被拆解為具體的業(yè)務目標冬骚,即通過開展哪些業(yè)務椅贱,怎么開展來把概念目標實現懂算;在業(yè)務目標出現后,能推導出系統(tǒng)的功能目標庇麦,即系統(tǒng)應該具有哪些功能模塊计技。概念目標,往往是客戶的高層領導關注的山橄,業(yè)務目標則是具體的業(yè)務負責部門領導關注的垮媒,而功能目標則是軟件系統(tǒng)的操作者關注的。業(yè)務架構的核心是把要實現軟件系統(tǒng)業(yè)務目標所需要的業(yè)務有哪些(要素)航棱,這些業(yè)務之間的關系(連接)是什么講清楚睡雇。把業(yè)務搞清楚,不僅僅是架構的問題饮醇,也是真正理解用戶需求它抱,并且給出明確的問題解決方法的過程,而這也是業(yè)務專業(yè)性的體現驳阎。
應用架構:業(yè)務架構設計是在不考慮軟件實現方式的前提下進行的抗愁,如何實現業(yè)務設計以及如何體現信息化給業(yè)務帶來的價值提升則是應用設計階段要解決的問題馁蒂,在這個階段就要進行應用架構的設計呵晚。應用架構為子系統(tǒng)劃分了明確的邊界,深刻影響系統(tǒng)功能組織沫屡、代碼開發(fā)饵隙、部署和運維等各方面。應用架構定義系統(tǒng)有哪些模塊或子系統(tǒng)沮脖、以及它們之間如何分工和合作金矛。同時,系統(tǒng)的可擴展性勺届、可配置性問題驶俊,往往也需要在應用架構設計階段給出答案∶庾耍可以看出饼酿,做業(yè)務架構設計的人,不一定要懂技術知識胚膊,但做應用架構設計則是要同時擁有業(yè)務知識和一定的技術知識故俐。
數據架構:數據架構要回答的是軟件系統(tǒng)重數據的來源、數據模型紊婉、數據存儲或其分布药版、數據流向以及數據管理的相關內容。
技術架構:技術架構關注的是軟件系統(tǒng)的實現問題喻犁,其中包含了從技術選型槽片、代碼開發(fā)何缓、測試到最終部署的各種問題。
在上述四類架構設計工作中筐乳,應用架構通常是最為薄弱的環(huán)節(jié)歌殃,因為業(yè)務架構可以由不特別懂技術的人做,技術架構可以由不特別懂業(yè)務的人做蝙云,而應用架構需要能深刻理解業(yè)務又懂技術的人做氓皱,這樣的能力往往需要多個工種的工作經驗和長時間的積累才能獲得。當然勃刨,應用架構做的越好波材,也越容易給商業(yè)組織帶來競爭力。
結語
如前文所述身隐,如果在軟件系統(tǒng)開發(fā)前廷区,沒有將架構問題解決,那么會給開發(fā)工作帶來無盡的麻煩贾铝。而對于從事 TO B 軟件產品或服務開發(fā)的商業(yè)組織而言隙轻,因其所提供的產品或服務要面對不同客戶,也一定會面對不同客戶的不同需求所帶來的定制化問題垢揩,架構設計的重要性就更加不言而喻玖绿。
因此在產品或服務的立項階段和研發(fā)過程中的設計階段,就必須將業(yè)務架構叁巨、應用架構斑匪、數據架構和技術架構中的關鍵問題描述清晰,并且該產品或服務的功能越多锋勺、部署方式越復雜就越需要認真完成這一工作蚀瘸,不可繞過。如果只是把 UI/UE 設計完成就開展相關的研發(fā)工作庶橱,一定會在熵增的路上越陷越深贮勃。