上一篇我們聊了軟件架構的概念以及歷史背景(WHAT),在這篇我們一起來聊聊為什么要做軟件架構設計(WHY)亲轨。
架構設計的真正目的
我們在日常生活和工作中都很經常性發(fā)生趋惨,因為重要而去做的情況,而很少會去尋找“為什么去做”的動因惦蚊,在架構設計上也是一樣器虾,每個技術人員都知道要做架構設計,但為何要做架構設計呢蹦锋?
先用幾個問題來解析一下:
- 不做架構設計系統(tǒng)就跑不起來么兆沙?
這讓我想起筆者做的第一個項目,設計過程只是幾個人一起簡單的討論一下就直接動手擼碼莉掂,也沒有正規(guī)的去做設計過程葛圃,最終項目也正常上線,效果也還行,而且開發(fā)效率還比較快库正。當然這個也只是表明這個說法并不是一定的曲楚,但是筆者認為如果項目前期完成沒有一點設計,去及時的識別出風險褥符,可能會導致系統(tǒng)中存在一些未被發(fā)現(xiàn)的重要陷阱龙誊,后期被發(fā)現(xiàn)后,修改成本過大喷楣,從而加劇項目風險趟大。
- 做了架構設計會提高開發(fā)效率嘛?
其實看上面的案例可以體現(xiàn)到抡蛙,架構設計并不一定會對開發(fā)效率有所提升护昧,畢竟架構設計需要投入時間和人力,對于一些簡單的項目粗截,這部分投入如果用來盡早編碼惋耙,項目也許會更快。當然在項目前期沒有投入精力來做好設計熊昌,如果頻繁出現(xiàn)變更绽榛,也會因為架構設計不好,導致越來越糟婿屹,可能到處都是重復的代碼灭美,項目的進度會越來越慢。
- 設計良好的架構能促進業(yè)務發(fā)展么昂利?
這點好像挺有道理届腐,不可否認,良好的架構肯定對業(yè)務發(fā)展有利蜂奸,但是要明確對“良好”做好定義犁苏,比如我們現(xiàn)在想做一個社交軟件,面向的人員可能就是某公司內部100號人扩所,但是我們卻去照抄微信的架構围详,這很明顯不符合業(yè)務需求。
通過這幾個問題的分析祖屏,好像這些不都是架構設計的真正目的助赞。如果有仔細看上一篇分享的架構設計的歷史背景文件,可以體會到袁勺,整個軟件技術發(fā)展的歷史雹食,其實就是一部與“復雜度”斗爭的歷史。架構的出現(xiàn)也不例外期丰,而架構本來就是為了應對軟件系統(tǒng)復雜度而提出的一個解決方案群叶,所以架構設計的主要目的是為了解決軟件系統(tǒng)復雜度帶來的問題漠嵌。
雖然目的的描述話語很簡潔,但卻是架構設計過程中需要時刻銘記在心的一條準則盖呼。舉個我們在項目中遇到的例子:
項目經理小A:小B,這里面是XX項目的需求化撕,你開展下面的架構設計工作吧几晤,一周要完成。
設計師小B:好的植阴。
然后小B打開需求文檔蟹瘾,一看WC這么多需求,我該從哪里開始進行架構設計奥邮帧憾朴?我還要考慮高性能、高可用喷鸽、高擴展……這么多高 XX众雷,我最少要1個月才完成啊,唉做祝,一周怎么可能完成呀砾省,【腦補】要不然我在業(yè)界找個差不多的架構套進來?好像行不通混槐,我還是找C老大問問怎么搞编兄。
設計師小B走到架構師大C旁邊,并且闡述了現(xiàn)狀声登,進行請教狠鸳。
架構師大C聞后:小B啊,做設計先要銘記一條準則悯嗓,架構設計的目的是“解決軟件系統(tǒng)復雜度帶來的問題”的件舵,你要先熟悉和理解需求,然后去識別哪些地方會比較復雜(復雜性)绅作,在重點來對這些復雜點進行設計芦圾,這也是你設計的入口點,其次對于這些高XX俄认,我們要有針對性的去考慮个少,架構設計并不是要面面俱到,不需要每個架構都具備高性能眯杏、高可用夜焦、高擴展等特點,比如你看你現(xiàn)在負責的這個項目岂贩,用戶只有100人不到茫经,而且沒有其他高并發(fā)需求,所有可以把高性能的權重調低,優(yōu)先去考慮其他方面卸伞。
設計師小B:噢抹镊,看來我思考的方向錯了,完全沒有想到這個準則荤傲,就想著一展身手垮耳,我開始還想拿業(yè)界某公司的架構套用進來,這么一想遂黍,好像這項目根本就用不著终佛,套用進來還大大增加了項目的復雜度了,學習了雾家。
所以我們在做設計時铃彰,心里面要明確自己的目的,是為了解決復雜度的問題芯咧。而復雜度有很多不同的來源牙捉,比如人(不同的代碼風格,不同的編程習慣)敬飒,比如業(yè)務鹃共,比如技術。那么架構不可能面面俱到的解決所有問題驶拱,必須要分析出所面對的一個或幾個關鍵的問題霜浴,這樣架構的設計就能有落腳點,而且問題解決也不會有大的沖突蓝纲。
任何系統(tǒng)最開始都是非常簡單的阴孟,類似敏捷開發(fā)一樣,需求不斷迭代税迷,而架構也一樣永丝,會隨著需求的變化而不斷演進,就比如以前我負責的一個產品一樣箭养,最開始僅僅只有底層框架慕嚷,在加上常用的功能集(組織結構、權限體系毕泌、系統(tǒng)參數(shù)喝检、字典等),到后來集成更多功能:表單定義撼泛、列表定義挠说、流程、任務調度愿题、報表等损俭,系統(tǒng)就慢慢變的開始復雜起來蛙奖,這也很明卻的表明架構設計也是隨發(fā)展的不同階段而面臨不同的問題。
而我們設計時只要在不同階段集中解決幾個最主要的問題即可杆兵,我們在解決問題的時候其實也是一個決策的過程雁仲,在一個有約束的盒子里去求解或接近最合適的解,這個有約束的盒子是團隊經驗琐脏、成本伯顶、資源、進度骆膝、業(yè)務所處階段等所編織、摻雜在一起的綜合體(人灶体,財阅签,物,時間蝎抽,事情等)政钟,架構無優(yōu)劣,但是存在恰當?shù)募軜嬘迷诤线m的軟件系統(tǒng)中樟结,而這些就是決策的結果养交。
架構設計的誤區(qū)
關于架構設計的目的,常見的誤區(qū)有:
- 因為架構很重要瓢宦,所以要做架構設計
架構是很重要碎连,但架構為何重要呢?我們做架構設計時一定要知其然驮履,知所以然鱼辙。
- 不是每個系統(tǒng)都要做架構設計嗎?
這也是典型的知其然不知其所以然,系統(tǒng)確實要做架構設計玫镐,但還是不知道為何要做架構設計倒戏,反正大家都要做架構設計,所以做架構設計肯定沒錯恐似。這樣很容易走入生搬硬套的歧路杜跷,但實際上在自己的公司或項目上出現(xiàn)“水土不服”。
- 公司流程要求系統(tǒng)開發(fā)過程中必須有架構設計
流程一定要進行架構設計矫夷,就會出現(xiàn)事實上不需要架構設計但形式上卻繼續(xù)去做架構設計葛闷,不但浪費時間和人力,還會拖慢整體的開發(fā)進度双藕。
- 為了高性能孵运、高可用、可擴展蔓彩,所以要做架構設計
高XX要根據(jù)項目的實際(復雜性)需要去設計治笨,并不能一概而論驳概,如果不管什么系統(tǒng),也不管什么業(yè)務旷赖,上來就要求“高性能顺又、高可用、高擴展”等孵,結果就會出現(xiàn)架構設計復雜無比稚照,項目落地遙遙無期,團隊天天吵翻天……等各種讓人抓狂的現(xiàn)象俯萌,費盡九牛二虎之力將系統(tǒng)整上線果录,卻發(fā)現(xiàn)運行不夠穩(wěn)定,經常出問題咐熙,出了問題很難解決弱恒,加個功能要改 1 個月……等各種繼續(xù)讓人抓狂的事件。
復雜度分析案例
我們利用“架構設計的真正目的是為了解決軟件系統(tǒng)復雜度帶來的問題”這個指導思想來做一個實踐棋恼。
我現(xiàn)在正在做一個客戶保護的項目返弹,基本功能有登陸、客戶報備管理爪飘、品牌义起、政策、統(tǒng)計等师崎,我們先識別其復雜度到底體現(xiàn)在哪里默终。
性能: 系統(tǒng)主要面向的用戶是業(yè)務員和內審員,業(yè)務員大概有50人犁罩,內審員1人穷蛹,業(yè)務員整體訪問率不高,平均每天單個業(yè)務員的訪問次數(shù)不到10次昼汗,因此性能這部分并不復雜肴熏,存儲用 MySQL 完全能夠勝任,可以不用緩存顷窒。
可擴展性: 客戶保護系統(tǒng)的功能雖然比較穩(wěn)定蛙吏,但是因為在需求采集側沒有跟客戶很好的達到一致,所以要考慮需求變更的風險鞋吉,可擴展性的復雜度也需要考慮鸦做,當然我們不能對所有功能都做可擴展性的復雜分析,我這里主要是對核心邏輯業(yè)務:報備做變化的應對谓着,報備分了幾個流程泼诱,但是其核心的邏輯是相差不大的,所以進行封裝設計赊锚,另外將核心邏輯分為穩(wěn)定層和變化層治筒,主要避免大改設計屉栓。
高可用: 客戶保護系統(tǒng)即使宕機1小時,對客戶的管理工作影響并不大耸袜,因此可以不做負載均衡友多,更不用考慮異地多活這類復雜的方案了。但是堤框,如果客戶保護數(shù)據(jù)全部丟失域滥,修復是非常麻煩的,只能靠人工逐條修復蜈抓,基本難以接受启绰,因此需要考慮存儲高可靠。我儲存的異常情況主要分為:機器故障沟使、機房故障委可,因為服務器采用阿里云,所以這塊風險相對比較低格带,故而這里采用異地服務器mysql同步來進行備份。
安全性: 客戶保護管理系統(tǒng)存儲的信息有一定的隱私性刹枉,主要在于客戶的信息叽唱,但并不是和金融相關的,也不包含強隱私(例如玉照微宝、情感)的信息棺亭,因此安全性方面只要做:用戶賬號密碼管理、數(shù)據(jù)庫訪問權限控制就基本滿足要求蟋软。
成本: 由于系統(tǒng)很簡單镶摘,基本上1臺服務器就能夠搞定,對于客戶來說完全不是問題岳守,可以無需太多關注凄敢。
當然還有其他方面的復雜度分析角度,就不做細說了湿痢。
小結
- 架構設計的主要目的是為了解決軟件系統(tǒng)復雜度帶來的問題涝缝。
- 在做架構設計時一定要時刻銘記設計的目的,避免陷入誤區(qū)譬重。
思考題
結合上面的案例拒逮,嘗試使用“解決軟件系統(tǒng)復雜度帶來的問題”指導思想來分析您現(xiàn)在正在做的項目或產品。
歡迎您把答案寫到留言區(qū)臀规,和我一起討論滩援。