本文最初發(fā)布于 Gergely Orosz 的個(gè)人博客,經(jīng)原作者授權由 InfoQ 中文站翻譯并分享。
我個(gè)人在大型系統的設計與構建方面擁有比較豐富的實(shí)踐經(jīng)驗。我參與重寫(xiě)了 Uber 的 分布式支付系統,設計并交付了 Skype on Xbox One,開(kāi)源了 Uber 的移動(dòng)架構框架 RIBs。所有這些系統都曾經(jīng)經(jīng)歷充分設計、多次迭代,并進(jìn)行過(guò)大量白板規劃與實(shí)際討論。此后,這些設計思路被整理成一份設計文件,且在實(shí)際著(zhù)手開(kāi)發(fā)之前進(jìn)行反復傳閱以盡量收集反饋意見(jiàn)。
這些系統都有一個(gè)共同的特點(diǎn),就是規模龐大:成百上千的開(kāi)發(fā)人員共同進(jìn)行構建,它們同時(shí)也為數百萬(wàn)人使用的其它系統提供支持。另外,這些系統也并不是全新項目——重寫(xiě)的支付系統負責取代現有的兩套支付系統,而且要求不能對正在使用這兩套系統的其它數十套系統及團隊造成任何業(yè)務(wù)影響。我們還對 Uber 的 App 進(jìn)行了重寫(xiě),其中同樣涉及幾百名工程師的協(xié)作,大家攜手將現有功能移植到新的架構當中。
這里,我先聊聊一些可能與大家印象中不同的情況。
第一,這些設計工作沒(méi)有使用任何標準軟件架構規劃工具。 是的,我們沒(méi)有使用 UML、4+1 模型、ADR、C4 或者是依賴(lài)關(guān)系圖。我們整理出了大量圖表,但這些圖表并未遵循任何嚴格的規則。這些只是非常簡(jiǎn)單的圖框加箭頭的組合,用于描述信息流或者類(lèi)結構與各組件之間的關(guān)系。事實(shí)上,同一設計文檔中的兩份圖表經(jīng)常采用完全不同的 Layout,而且往往由不同的工程師負責添加與修改。
第二,設計工作并不歸屬于團隊中的任何特定架構師。 我們壓根沒(méi)有設置 IT 架構師或者企業(yè)架構師職位。大家沒(méi)有聽(tīng)錯,Uber 以及微軟 /Skype 都沒(méi)有專(zhuān)門(mén)指定軟件架構師角色,即使是主管工程師這類(lèi)高級技術(shù)人員也得定期編寫(xiě)代碼。在全部項目當中,我們都引入了經(jīng)驗豐富的工程師,但架構或者設計本身并不歸屬于任何一位成員。他們?yōu)樵O計過(guò)程提供了巨大的幫助,但同時(shí)團隊中的初級成員也發(fā)揮著(zhù)重要作用,而且可以隨時(shí)提出反對意見(jiàn)并提供其它替代性方案。
第三,我們幾乎沒(méi)有參考任何常見(jiàn)的架構模式以及軟件架構文獻中的術(shù)語(yǔ)——例如 Martin Fowler 的架構指南。我們根本不提微服務(wù)、無(wú)服務(wù)器架構、應用程序邊界、事件驅動(dòng)架構這類(lèi)概念。雖然在頭腦風(fēng)暴期間偶爾會(huì )涉及,但我們覺(jué)得沒(méi)必要把它們寫(xiě)進(jìn)設計文檔當中。
那么,我們到底是怎么做的?為什么我們沒(méi)有遵循眾所周知的軟件架構建議方法?
就這個(gè)問(wèn)題,我與來(lái)自其他 FANG 技術(shù)公司(即 Facebook、亞馬遜、Netflix、谷歌)以及小型初創(chuàng )企業(yè)的同行工程師進(jìn)行過(guò)討論。事實(shí)證明,大多數團隊和項目(無(wú)論具體規模如何)都采用了以下幾種設計與實(shí)施方法:
為什么我們的方法跟軟件架構文獻中的說(shuō)法有這么大的差別?
實(shí)際上,對于大多數架構指南而言,我們的方法在原則上并沒(méi)有多大區別。幾乎所有指南都建議從業(yè)務(wù)問(wèn)題起步,繼而概述解決方案與權衡結論:我們也是這么做的。我們的區別,在于沒(méi)有使用那么多架構師或者架構文獻所強調的高復雜度工具。我們盡可能只選擇簡(jiǎn)單的工具,例如 Google Docs 或者 Office 365 等,同時(shí)保證設計記錄簡(jiǎn)潔明確。
我認為,這種方法與相關(guān)企業(yè)的工程文化息息相關(guān)。高度自治加層次分明,是這些科技企業(yè)與初創(chuàng )企業(yè)的共同特質(zhì):這些特質(zhì),在相對比較傳統的公司內則很少見(jiàn)到。正因為如此,傳統企業(yè)才必須在流程驅動(dòng)設計當中遵循更為嚴格的規則,以進(jìn)行更多“符合常識的設計”。
以銀行與汽車(chē)制造企業(yè)為例,開(kāi)發(fā)人員幾乎無(wú)權跨越上級提出任何關(guān)于架構的決策,全部相關(guān)工作都由不同級別的多位架構師負責,而他們也需要隨時(shí)監督多個(gè)技術(shù)團隊。這就讓整個(gè)流程變得相當緩慢,架構師本身也往往被大量請求吞沒(méi)。正因為如此,常見(jiàn)架構文獻中才提到盡量使用標準工具、整理出更加正式的文檔,希望借此讓系統設計思路更為清晰。再有,這些文檔還強化出一種自上而下的工作執行思路,畢竟在架構師的約束之下,普通工程師根本就無(wú)權對當前采取的正式方法或者決策提出質(zhì)疑。所以,他們通常也就懶得費那個(gè)心。公平地講,傳統企業(yè)同樣希望開(kāi)發(fā)人員之間能夠更多交換資源與意見(jiàn),從而在短時(shí)間之內靈活分配人員以應對不同項目,只是對他們來(lái)講這樣的目標很難實(shí)現??紤]到這一點(diǎn),我們在不同環(huán)境中使用不同工具的靈活作法其實(shí)也沒(méi)那么離經(jīng)叛道。
設計系統應該始終秉持簡(jiǎn)單為先的目標。 系統越簡(jiǎn)單,理解難度也就越低,越易于發(fā)現問(wèn)題,實(shí)現門(mén)檻也就更低。另外,語(yǔ)言描述越清晰,設計思路也越容易為他人所接受。因此,請避免使用那些團隊成員無(wú)法理解的術(shù)語(yǔ):即使是經(jīng)驗最少的成員,也應該能夠弄明白團隊到底在干什么、又為什么這么干。
干凈的設計類(lèi)似于干凈的代碼:易于閱讀,易于理解。編寫(xiě)干凈的代碼,我們可以選擇多種可行方法;但是,很少有人會(huì )建議在代碼開(kāi)發(fā)之初就采用 Gang of Four 設計模式。相反,干凈代碼的起步工作也同樣單純:?jiǎn)我回熑?、明確命名與易于理解的約定。這些原則也同樣適用于干凈的架構。
既然是這樣,那么架構模式還有什么意義? 我認為架構模式的意義跟編碼設計模式差不多,主要負責為我們提供如何改進(jìn)代碼或者架構的基本思路。在編碼模式方面,當我發(fā)現一種模式時(shí),往往會(huì )精神一振,嘗試深入探索并將其與單例模式聯(lián)系起來(lái)。但是,我可不打算硬性上升到“抽象生產(chǎn)模式”的高度。一般來(lái)講,只要我能弄明白這種模式的作用,并搞清要如何將其廣泛起效就足夠了。我承認,我也花了不少時(shí)間研究并嘗試理解 Gang of Four 設計模式,但是需要強調:這些對我編碼水平的提升,遠不及從其他工程師那里得到的反饋。
同樣的,了解常見(jiàn)架構模式也是好事:這有助于簡(jiǎn)化同事之間的討論流程,確保大家能夠以相同的方式溝通并相互理解。但是,架構模式本身并不是目標,也永遠不該被用于取代那些真正簡(jiǎn)單的系統設計方法。在設計系統時(shí),我們可能會(huì )意外發(fā)現自己用到了某種眾所周知的模式:這挺好的。但這不是強制要求,大家應該放松心態(tài)選擇自己的辦法??偠灾?,千萬(wàn)別把架構模式當成“錘子”,到處尋找合適或者不合適的“釘子”來(lái)敲。
架構模式的出現,源自工程師們在觀(guān)察到某些情況下存在著(zhù)共通的設計選擇傾向,而且這些設計選擇同樣會(huì )經(jīng)過(guò)命名、記錄以及廣泛討論。換言之,架構模式是解決方案出現之后才產(chǎn)生的工具,旨在讓其他開(kāi)發(fā)者能夠更輕松地解決問(wèn)題。作為一名工程師,大家的目標應該是更好地解決問(wèn)題,讓解決方案變成自己的有力工具,而不是強行運用那些時(shí)髦的架構模式,然后祈禱它們真能適合你的實(shí)際需求。
我聽(tīng)說(shuō),很多朋友都希望了解如何提升自身在架構與系統設計方面的水平。有些經(jīng)驗豐富的從業(yè)者會(huì )推薦大家閱讀與架構模式以及軟件架構相關(guān)的書(shū)籍。當然,多讀書(shū)肯定是好事,一般書(shū)籍的內容在深度上要遠遠超過(guò)網(wǎng)站上的帖子;但我個(gè)人的建議是,親自動(dòng)手永遠比單純閱讀效果更好。
最好的軟件設計應當簡(jiǎn)單易懂。 在啟動(dòng)下一個(gè)新項目之前,請不要再思考“我該如何構建這套系統、應該采用哪些經(jīng)過(guò)實(shí)踐驗證的模式,又選擇哪種正式方法進(jìn)行記錄?”相反,想想“我要怎樣才能以他人更易于理解的方式,拿出最簡(jiǎn)單的設計?”
最后還得強調一句,軟件架構最佳實(shí)踐、企業(yè)架構模式以及系統描述的正式方法都是非常重要且實(shí)用的工具,相信總會(huì )有合適的場(chǎng)景讓它們發(fā)揮作用。但在設計系統時(shí),請從簡(jiǎn)單始、以簡(jiǎn)單終,盡可能避免一切會(huì )無(wú)謂提高復雜度的架構與正式工具。
原文鏈接:
https://blog.pragmaticengineer.com/software-architecture-is-overrated/
點(diǎn)擊下方圖片即可閱讀
微軟內部薪資泄露,揭秘大型科技公司薪酬運作的關(guān)鍵細節
AI 落腳于不同領(lǐng)域,企業(yè)所面臨的問(wèn)題也不盡相同。無(wú)論是 AI 中垂直技術(shù)的應用,還是應用領(lǐng)域的垂直選擇,如何選擇合適的賽道成為當務(wù)之急。ArchSummit全球架構師峰會(huì )(北京站)2019大會(huì )中,獨家設置了“提升效率的AIOps“專(zhuān)題,為你講解智能運維的那些事!目前8折購票,限時(shí)立減1760元,團購更便宜哦~
聯(lián)系客服