擴展性預(yù)期
確保系統(tǒng)的架構(gòu)和設(shè)計可以隨著業(yè)務(wù)的發(fā)展而擴展,需要在'業(yè)務(wù)需要'發(fā)生之前就想好,遠在業(yè)務(wù)部門的預(yù)測超過平臺的容量之前,就已經(jīng)對如何擴展系統(tǒng)深思熟慮了。 軟件的整個生命周期中,開發(fā)交付其實只是一小部分,后期的需求變更、維護升級、重構(gòu)優(yōu)化才是主旋律。那么多考慮軟件的擴展性和未來預(yù)期是很有必要的,作為架構(gòu)師至少看得到半年后的規(guī)模擴展吧?
標準規(guī)范
負責(zé)各項標準、規(guī)范、流程的設(shè)定和推行。這是架構(gòu)團隊的一個重要職能,也是最容易被忽視的。技術(shù)手段并不是所有的問題的最佳解決方案,很多場景通過推行標準規(guī)范就可以達到不錯的預(yù)期效果。
比如編碼規(guī)范,可以通過投入大量人力來開發(fā)IDE/代碼庫的插件進行代碼規(guī)范的自動檢查,再需要不斷的測試來驗證這個插件的可靠性。通過編程考試或者平時的review來強化這一規(guī)范的落地,再加上編程規(guī)范的不斷宣導(dǎo)可以達到至少八成的效果,何樂而不為,最后那兩成效果就放到公司真到一定的級別了考慮技術(shù)實吧。再比如架構(gòu)組研發(fā)了統(tǒng)一的基礎(chǔ)日志組件,可以規(guī)范日志格式、掩碼敏感信息、自動截取/壓縮超長日志報文等功能,這種組件就應(yīng)該作為標準全員推廣。
拆解抽象
在參與業(yè)務(wù)迭代的過程中,能夠抽絲剝繭(拆解),發(fā)現(xiàn)需求、編碼、測試、發(fā)布等環(huán)節(jié)中的痛點、共性點或未來瓶頸點等進行抽象、實現(xiàn)并最終推廣全員。在代碼層面也適用,拆解交織繁雜的代碼邏輯,抽象出基礎(chǔ)公共模塊。都是架構(gòu)團隊的基本技能。
舉例來說,架構(gòu)師經(jīng)常會參加各種各樣的評審,對那些常見的review comments,五花八門的自造輪子,一旦發(fā)現(xiàn)就要有這種敏感度需要制定標準規(guī)范或者研發(fā)統(tǒng)一的組件了。
技術(shù)寬度
架構(gòu)師需要足夠的技術(shù)寬度,從軟件到硬件,從語言到操作系統(tǒng),從編碼到測試,從運維到安全,從擁抱開源到自造輪子都要有所涉獵。有個比喻,說架構(gòu)師需要具備某種上帝視角,來俯視軟件產(chǎn)品的誕生、成長、重構(gòu)整個生命過程。而且架構(gòu)師要有空杯心態(tài),若學(xué)習(xí)的技術(shù)越多,就覺得自己的水平越高,那基本不會是一個合格的架構(gòu)師;實際應(yīng)該是越學(xué)習(xí)覺得自己不懂的越多。
另外,特別要有面對疑難雜癥的自信和能力,為業(yè)務(wù)團隊提供強力的技術(shù)輸出。因為疑難雜癥的最后一關(guān)就只有架構(gòu)團隊。
協(xié)調(diào)領(lǐng)導(dǎo)
架構(gòu)團隊絕對不是偏安一角寫寫基礎(chǔ)組件,既然要制定標準,推行規(guī)范,那就必須與其他團隊進行協(xié)作,需要征得他們的合作態(tài)度,才能順暢的推行,這個靠架構(gòu)團隊在技術(shù)和業(yè)務(wù)上的影響力來驅(qū)動協(xié)調(diào)基本可以辦到。但在某些情況下,需要一些強制的手段,比如設(shè)計文檔的強制評審,那就必須賦權(quán)給架構(gòu)團隊一定的權(quán)力,或者在一些矩陣型組織里架構(gòu)師就是擁有技術(shù)的絕對權(quán)威,這個就是領(lǐng)導(dǎo)力。
深入業(yè)務(wù)
技術(shù)的存在就是為業(yè)務(wù)服務(wù)的,脫離業(yè)務(wù)的架構(gòu)都是耍流氓,99%的情況下這句話都沒毛病。有些技術(shù)人有嚴重的重技術(shù)輕業(yè)務(wù)思想,這種人除非真的是鉆研技術(shù)的一把好手,可能不善言談不善溝通(筆者本人是可以接受的),但是架構(gòu)團隊里這種人不能多。后文我們會詳細討論下架構(gòu)團隊和業(yè)務(wù)團隊的協(xié)作問題。
創(chuàng)新突破
架構(gòu)團隊在IT內(nèi)部必須是第一生產(chǎn)力,不管是單兵作戰(zhàn)還是團戰(zhàn)能力。除了過硬的基本功外,不斷的學(xué)習(xí)和尋求技術(shù)上的突破,是貫穿架構(gòu)團隊始終的一個Object。前人已經(jīng)累計了很多經(jīng)典優(yōu)秀的平臺、框架或思想作為傳承,我們可以繼承但絕不能守舊。
在學(xué)術(shù)研究中,“創(chuàng)新”一詞用來表示團隊有增加值的產(chǎn)出。而有些創(chuàng)新調(diào)研項目很多時候并不會有實際的產(chǎn)出,甚至更糟糕些,會產(chǎn)生許多沉沒成本,但這都不是阻礙創(chuàng)新的借口。創(chuàng)新是架構(gòu)團隊延續(xù)生命力的最佳營養(yǎng)品和必要條件??梢韵胂鬀]有創(chuàng)新突破,架構(gòu)團隊完全可以就地解散。
架構(gòu)團隊的處世之道
《架構(gòu)即未來》《架構(gòu)真經(jīng)》兩本經(jīng)典架構(gòu)書里都對架構(gòu)的原則展開了很多,但都是偏向技術(shù)層面的。這里我要另辟蹊徑,說的不只是架構(gòu)本身的原則,還有架構(gòu)團隊如何玩得轉(zhuǎn)的原則,跟上文架構(gòu)團隊的定位是戚戚相關(guān)的:
可抽象的有基礎(chǔ)組件面相的實現(xiàn)盡量由架構(gòu)統(tǒng)一實現(xiàn),然后推動各系統(tǒng)使用通用的基礎(chǔ)框架,而不是每個系統(tǒng)寫。比如加解密,比如HTTP客戶端,并不是所有人對加密的填充、編碼、提供者都有清晰的認識,也并不是所有人對HTTP客戶端里的超時時間、DEFAULT_MAX_PER_ROUTE、SSL配置等都了解,專業(yè)的事情交給相對更加專業(yè)的人去實現(xiàn)。
《架構(gòu)即未來》里提到一條“要使用成熟的技術(shù)”,個人延伸一下:不僅如此還要使用盡量統(tǒng)一的技術(shù),盡量統(tǒng)一的代碼層級結(jié)構(gòu)(起碼有一些約定俗成的層級)。有人用Gson, fastjson,jackson的比比皆是,hibernate/mybatis也是各有所好。都是成熟的技術(shù),但是不統(tǒng)一,導(dǎo)致了不管是矩陣式還是敏捷式團隊,同一個人維護不同系統(tǒng)時,必然會有一些不適應(yīng),需要思維的跳躍,無形的增加很多非必要成本;再者不同技術(shù)的引入可能會增加更多的BUG或管控風(fēng)險和排障的難度。
常見的代碼層級結(jié)構(gòu) controller->business->service->dao,在一些人的項目里 business變成了handler, service變成了proxy,怎么都會讓人無所適從吧?
微服務(wù)體系內(nèi)的單體系統(tǒng)必須做好自我保護,這是架構(gòu)團隊理應(yīng)對IT產(chǎn)品做出的承諾。服務(wù)提供方根據(jù)需求說明設(shè)計并承諾了一個服務(wù)接口定義,如果調(diào)用方只管調(diào)用服務(wù)方只管實現(xiàn),一個不慎就會把接口設(shè)計成一顆雷。
比如會員系統(tǒng)提供用戶基本信息的查詢接口,這個接口提供的用戶信息“基本”的邊界在哪里,單表查詢也就罷了,如果需要多表連接查詢呢?有些人喜歡把這個接口做的大而全,很靈活,比如在最基礎(chǔ)的用戶信息之上,會附加一些其他字段如QQ號,工作單位,年收入等等算不上基本信息的信息,只要調(diào)用方多傳入一些參數(shù)即可。確實感覺靈活了,但為此服務(wù)方不得不做各種的入?yún)⑴袛嗪蚐QL拼接,最差的情況可能需要關(guān)聯(lián)用戶的所有相關(guān)表,性能差到冰點不用說,對系統(tǒng)本身的吞吐量和并發(fā)能力都會有特別大的影響。這就是系統(tǒng)沒有自我保護好。因為并不是說系統(tǒng)有什么BUG, 但是因為這個靈活度引入了極大的性能隱患。
再比如用戶列表的查詢,服務(wù)使用方傳入?yún)?shù)作為WHERE條件進行過濾,如果使用方什么都不傳,這個查詢接口基本等同于全表查詢的脫庫了。這時候必掛無疑,那么是不是應(yīng)該加上分頁,或者最大結(jié)果集的限定條件進行自我保護呢?
架構(gòu)團隊的任何框架、組件級別的需求,都應(yīng)該做好充分調(diào)研,不能閉門造車自己臆想需求。技術(shù)人很少能做到喬幫主似的,對方不知道自己想要什么由我來告訴你應(yīng)該用什么;再者如果臆想的實現(xiàn)最終發(fā)現(xiàn)并不適用又耗費了大量成本,或多或少總會被別的團隊看輕吧,身為架構(gòu)師如何能忍?而且把需求調(diào)研溝通清楚,未來推廣也會得到大家的支持,很簡單,因為需求是大家一起提出來的。
任何的標準規(guī)范的推行、框架組件的立項、實現(xiàn)和發(fā)布需要獲得高層的充分授權(quán),也需要與重要干系人(比如團隊或職能部門負責(zé)人)提前溝通好,減少推動阻力,獲得推行計劃的承諾。比如為了線上系統(tǒng)的監(jiān)控和排障考慮,需要有健康檢查、規(guī)范的日志格式等,這些業(yè)務(wù)需求之外的任務(wù)勢必會增加業(yè)務(wù)團隊的負擔(dān),如果沒有從上至下的強制性推動,很難有實際進展。架構(gòu)團隊萬勿把自身置為其他團隊的對立面。
在迭代周期內(nèi)的重要環(huán)節(jié)都需要有架構(gòu)團隊(或架構(gòu)評審委員會,后文會詳說)的深度參與,包括需求調(diào)研,接口/數(shù)據(jù)庫設(shè)計評審,代碼評審,上線評審等。這個對于創(chuàng)業(yè)公司起步階段特別有益,因為在規(guī)范和標準沒有在IT內(nèi)部形成一種文化驅(qū)動的高度,同一個事情被不同的人做出來完全是千人千面,那對于一個組織來說,這種不可控是很危險的。
特別注意,這些參與絕對不能以俯視批判挑毛病的角度展開,而應(yīng)該以合作共贏建議的方式展開。當(dāng)然如果是無法妥協(xié)的雙方起沖突的問題必須通過授權(quán)來強制修正。
《架構(gòu)及未來》把監(jiān)控設(shè)計放在15條原則的第4條,它也是筆者推崇的一個重要原則。監(jiān)控可以把我們整個系統(tǒng)的健康度清晰的展示出來,兩眼一抹黑只是另一種形式的掩耳盜鈴。監(jiān)控的顆粒度細化到什么程度需要視團隊成熟度有所不同,不在本文討論范圍。重要的是,監(jiān)控設(shè)計應(yīng)該在系統(tǒng)的初期概要設(shè)計期間作為非功能性需求就考慮進去。
再做個提醒,監(jiān)控可以視作運維工作的一部分,所以在前期做架構(gòu)設(shè)計的時候,一些運維工作也應(yīng)該記錄Involve進來。文件傳輸?shù)降走x擇FTP還是接口傳輸,有沒有考慮運維帶寬、斷點續(xù)傳、CDN等問題呢?
盡量通過工程化來替代人工。工程化就是Engineering,軟件工程化是個比較抽象的概念,就是把軟件按照工程的方式進行開發(fā)維護。這里我們說的工程化可以簡單理解成工具化,自動化的動手文化。當(dāng)然這里的“動手”不是打架,而是敲代碼,Just show me the code。我們的自動化運維、實時監(jiān)控告警、自動化發(fā)布、智能排障,都是工程化手段來解放人力。這也是驅(qū)使團隊不斷進步的一種方式,不能陷在一些重復(fù)勞動的舒適區(qū)里,要不斷的想辦法改進工作效率和質(zhì)量。
架構(gòu)團隊出品的任何產(chǎn)品、流程必須建立最嚴格的標準,比如代碼質(zhì)量、性能指標、監(jiān)控指標、高可用性、可擴展性等。在一個大的組織架構(gòu)里建立信任是個很慢的過程,但是失去信任卻可能是瞬間的?!凹軜?gòu)出品,必屬精品”應(yīng)該是架構(gòu)團隊的一塊金字招牌,必須保護好。Besides, 架構(gòu)團隊要有比較優(yōu)秀的宣傳能力,能夠把自己的產(chǎn)品包裝成一個高附加值的優(yōu)秀作品,好像你不用就會懊惱一輩子似的,當(dāng)然這一切都是必須是真實的不能盲目夸大。因為筆者是實實在在看過不少架構(gòu)師撰寫的產(chǎn)品發(fā)布郵件,寫的不痛不癢,平平淡淡,完全激不起想要試用一下的沖動,還何談推廣。
線上系統(tǒng)特別注意驚群效應(yīng)的影響。比如緩存失效后,如何解決驚群效應(yīng)帶來的數(shù)據(jù)庫或者微服務(wù)化鏈路尾端服務(wù)的壓力驟增的問題。這個是技術(shù)問題。比如秒殺場景下會有平時百倍千倍萬倍的流量打進來,服務(wù)器資源會被瞬間消耗殆盡導(dǎo)致崩潰和癱瘓,這就不僅僅是技術(shù)問題了,還有與前線業(yè)務(wù)方協(xié)調(diào)溝通的問題,這種活動必須提前通知到IT。
來自維基百科:
Thundering herd problem驚群問題是計算機科學(xué)中,當(dāng)許多進程等待一個事件,事件發(fā)生后所有這些進程被喚醒,而只有一個進程能獲得CPU執(zhí)行權(quán),其他進程又得被阻塞,這造成了嚴重的系統(tǒng)上下文切換代價。C10K/C10M問題都與這個相關(guān)。
還有兩個類似的術(shù)語一并介紹下:
“Slashdot effect點杠效應(yīng)”這個詞指的是當(dāng)著名新聞網(wǎng)站Slashdot在一篇有趣的文章里報道了一個網(wǎng)站后許多人紛至沓來把它幾乎擠爆的現(xiàn)象。后來被列入其他著名網(wǎng)站后所發(fā)生的類似現(xiàn)象也用這個詞來稱呼了。這個詞和Flash crowd這個更一般性、更合適的詞對應(yīng)。
“Flash crowd突發(fā)訪問擁堵”這個詞是1973年Larry Niven在他的短篇科幻小說Flash Crowd中生造出來的。小說預(yù)言了廉價的瞬移技術(shù)會使得一大群人都會傳送到有趣的新聞故事發(fā)生的地方從而導(dǎo)致?lián)矶隆?0年后,這個詞在互聯(lián)網(wǎng)上被廣泛用于指當(dāng)網(wǎng)站有了能吸引許多人的東西之后其服務(wù)器系統(tǒng)資源使用量成指數(shù)增長。在此之前,Alfred Bester在他的小說The Stars My Destination中也預(yù)計到了這種效應(yīng)。
架構(gòu)團隊 versus 業(yè)務(wù)團隊
單獨拎出來這兩個團隊的相處之道并不是說這兩個團隊有什么不得了的沖突(相較于開發(fā)vs測試,開發(fā)vs運維,測試vs運維),只是只要有協(xié)作就會出現(xiàn)問題,但是這個沖突并不難解決。其實上文也斷斷續(xù)續(xù)提到一些原則,但終極方案無外乎兩個詞:尊重和信任。
架構(gòu)要得到尊重就要在技術(shù)上保持先進性,且必須對業(yè)務(wù)有一定的深入度;業(yè)務(wù)要得到尊重那就除了要在業(yè)務(wù)上有深刻理解,在與技術(shù)的結(jié)合上也必須有自己的思考。而事關(guān)信任,雙方只要在自己發(fā)布的產(chǎn)品上傾注足夠的專注度,展示了自己的態(tài)度,最后又保證了質(zhì)量和口碑,就會逐步建立起信任關(guān)系。
架構(gòu)評審委員會ARC
定義
七拼八湊好不容易整理了一個個人還算滿意的定義:架構(gòu)評審委員會Architect Review Committee作為IT的一個治理監(jiān)管機構(gòu),有權(quán)力確保IT運轉(zhuǎn)在整個架構(gòu)生態(tài)內(nèi)保持一致,提高IT的產(chǎn)品質(zhì)量,并最終與公司的目標、戰(zhàn)略達成一致。
《架構(gòu)即未來》一書中架構(gòu)評審委員會的縮寫是AR B(oard),筆者選擇了ARC純粹是為了好記好發(fā)音。其實ARB才是業(yè)界主流說法...
那為什么要有ARC?是否必要呢?那是必然的。上圖中歸納的5大塊:技術(shù)、流程、標準、質(zhì)量和創(chuàng)新都在ARC的轄內(nèi),且ARC有絕對的話語權(quán)提供決策結(jié)果,另外ARC也是捏合架構(gòu)團隊(落地)、PMO(項目管理辦公室)和業(yè)務(wù)團隊的關(guān)鍵機構(gòu)。
不能再搞笑的是筆者竟然先看到了微軟2012年的一篇題為Should We Kill The Architecture Review Board?>的文章...WTF...
傳送門: https://blogs.msdn.microsoft.com/nickmalik/2012/04/17/should-we-kill-the-architecture-review-board/
我簡單給大家歸納一下文中表達的意思:按照COBIT標準IT的治理體系應(yīng)該有三個委員會:架構(gòu)Arch委員會、策略Strategy委員會和指導(dǎo)Steering委員會 ,而架構(gòu)委員會只對項目工程有話語權(quán),指導(dǎo)委員會卻對IT投資、預(yù)算和交付等有話語權(quán),一句話就是管錢袋子的定規(guī)則,架構(gòu)委員會干不過指導(dǎo)委員會。既然架構(gòu)委員會說了不算那就不要了,成立一個CIO牽頭的說了算的IT治理委員會,來完成滿足COBIT標準的事情。標題說的那么嚇人說Kill掉,其實也就是因為微軟里的ARB說了不算,對于決策權(quán)這個在筆者的定義里已經(jīng)標明了。
咱們中小型公司沒有也不需要微軟那么大的標準體系,當(dāng)然不關(guān)心那么多道道,三者合一就叫ARC來行使所有IT治理框架需要的所有職能。
創(chuàng)業(yè)公司如果有如下困擾,并開始越來越明顯的影響到IT正常的運作,那么貴公司應(yīng)該考慮成立ARC:
軟件產(chǎn)品的質(zhì)量不可控,時常發(fā)生缺陷Escapse到線上生產(chǎn)環(huán)境的事件;
職能團隊、業(yè)務(wù)團隊、項目團隊之間各自為戰(zhàn),沒有統(tǒng)一的規(guī)范,代碼、接口、數(shù)據(jù)庫千變?nèi)f化,比如那些三無項目:無注釋無文檔無單元測試;
有各種各樣的阻力或者痼疾導(dǎo)致無法推動持續(xù)交付/持續(xù)部署的進行;
研發(fā)團隊與測試團隊之間脫節(jié),比如研發(fā)不自測就提交測試,測試團隊在需求階段未被拉入,導(dǎo)致測試案例缺失等;
IT產(chǎn)品整體在架構(gòu)、治理方面沒有人或者只有CTO一人負責(zé),導(dǎo)致IT團隊對產(chǎn)品的遠期路線線缺乏足夠的認識,僅僅滿足于實現(xiàn)業(yè)務(wù)功能而已;
公司已經(jīng)出具規(guī)模了,但非功能性需求還從來沒有被正式提出來過,性能、安全等。
職能范圍
提高軟件產(chǎn)品的質(zhì)量
規(guī)劃,設(shè)計和實施IT基礎(chǔ)設(shè)施和應(yīng)用程序健壯的、可擴展的、可靠安全的架構(gòu)
定義架構(gòu)設(shè)計的標準,政策和總體原則
建立和推廣優(yōu)秀架構(gòu)設(shè)計的最佳實踐
創(chuàng)建架構(gòu)的路線圖:持續(xù)交付、灰度發(fā)布、服務(wù)治理、智能監(jiān)控等等
負責(zé)軟件產(chǎn)品在各個過程環(huán)節(jié)的評審,包括但不限于可行性、需求、接口、數(shù)據(jù)庫、生產(chǎn)發(fā)布等的評審
保持對新技術(shù)、新框架、新思想的敏感度和足夠的深入度,方能從容應(yīng)對未來可能的升級
必須保證擁有或者領(lǐng)導(dǎo)權(quán)或者充分的授權(quán)
驅(qū)動IT產(chǎn)品的創(chuàng)新和升級,補齊短板,但是要做好與常規(guī)任務(wù)的權(quán)衡
工作原則
嚴格堅持統(tǒng)一的評審標準,堅決不能存在雙標情況,否則會降低ARC的權(quán)威性;
確保ARC過程得到足夠的尊重,且ARC一旦產(chǎn)生結(jié)論則被視為最終決定。若最終評審結(jié)果得不到修正,浪費大家的時間,ARC失去公信力,標準規(guī)范也就失去了意義。
不能以任何理由,比如常見的項目周期緊就不要評審了之類的借口,隨隨便便繞開ARC過程。一旦開了頭就會有其他團隊的效仿并繞開,最終ARC的價值就會不斷被迅速削弱。
ARC組織內(nèi)必須固定一部分永久性的委員,可以是有話語權(quán)有地位的領(lǐng)導(dǎo)(CTO,總監(jiān),VP),可以是專業(yè)或技術(shù)上有威望的專家(架構(gòu)師,業(yè)務(wù)負責(zé)人等),這部分的委員是保證ARC流程是可以容易下達傳導(dǎo)的。其他再配置一些某些專長的候選人作為輪換委員,作為ARC過程的補充力量,畢竟ARC組織的人數(shù)相比整個IT組織是遠不夠用的。
發(fā)生如下情況說明成員需要調(diào)整了:
a. 時不時的發(fā)生ARC成員之間的意見不一致, 總有一方要被踢出去,保證內(nèi)部的絕對統(tǒng)一;
b. 發(fā)現(xiàn)成員有濫用權(quán)力、刁難、憑個人好惡等違反公司利益的方式做事,必須剔除并作為長期關(guān)注對象,以防做出其他對公司有損害的事情;
c. ARC過程經(jīng)常被合理挑戰(zhàn),而且挑戰(zhàn)的結(jié)果是對的,這個人可以考慮被培養(yǎng)并吸納;
ARC的大部分活動實際上對于每個成員來說是一種額外的工作,在保證自己日常工作的情況下還要隨時出席各種的ARC會議,這對ARC成員的日常工作規(guī)劃是個考驗,所以ARC過程和會議都要盡可能的準備充分和直接了當(dāng)。比如代碼接口評審的代碼必須提前準備好演示IDE環(huán)境,數(shù)據(jù)庫評審提前準備好PDM, 會議過程要足夠的FOCUS,不能太發(fā)散導(dǎo)致會議時間過長。
某些時候不得不在ARC的權(quán)威性和業(yè)務(wù)排期之間做選擇的時候,一定要拋給決策高層(比如CTO)來做出決定,ARC不能站出來當(dāng)'惡人'。反過來,如果ARC對業(yè)務(wù)團隊的資源占用經(jīng)常被抱怨,那必須考慮重新調(diào)整輕量化ARC的過程了。
終于寫完了,基本都是大段大段的文字,配圖都不好配,確實不如貼代碼來的舒爽,可能大家會看的比較累。我就再總結(jié)一下,其實主要就說了一下架構(gòu)團隊?wèi)?yīng)該如何以及如何更好的自處或他處,IT管理者如何使用好架構(gòu)團隊這把尖刀的事情。論點太多沒有再花時間找到他們的內(nèi)在聯(lián)系做個歸集,還請各位看客多擔(dān)待,擱筆。
(歡迎加入螞蟻金服)