
本文寫于19年12月1日
不想當程序員的架構(gòu)師不是好程序員。
寫這篇文章的時候,我正坐在圖書館里,冬天的陽光透過寬大的玻璃窗戶,撒在擺滿了書架的地上,好久沒有寫文字了,突然有一種欲望:想談?wù)劶軜?gòu)和架構(gòu)師。
當你提到架構(gòu)兩字的時候你首先想到的是什么,往往被關(guān)聯(lián)到的是建筑,建筑架構(gòu)的設(shè)計跟軟件工程的設(shè)計的確很像,大家也都這樣類比,甚至在英語中,建筑師 和 架構(gòu)師 都是同一個單詞 “architect”。但我覺得,軟件的架構(gòu)設(shè)計還要比建筑的設(shè)計復(fù)雜,軟件架構(gòu)是一個動態(tài)的,建筑不是。
說軟件架構(gòu)的設(shè)計是動態(tài)的,不覺得很貼切么,沒有一成不變的架構(gòu),架構(gòu)一直是在演進式的變化,以便更能服務(wù)好增長的業(yè)務(wù)而帶來的需求。
架構(gòu)設(shè)計,那設(shè)計是為誰服務(wù)的,是為應(yīng)用程序系統(tǒng)服務(wù)的,那應(yīng)用程序系統(tǒng)有什么樣的需求,有兩種需求:功能性需求和非功能性需求。
功能性需求,就比較好理解了,添加一個商品、修改一個商品、統(tǒng)計商品在一定時間段的銷量報表,還有可能再給這些功能加上權(quán)限,這是功能性需求。表示的是,這個應(yīng)用程序系統(tǒng)可以干什么。
非功能性需求,就是我們常說的是否可監(jiān)控、可回退、是否具備高可用、高并發(fā)、高性能的特性,表示的是,一個應(yīng)用程序在運行時的質(zhì)量。
當然,還有一個更重要的需求,也是歸在非功能性需求里面的,就是:快速安全的交付軟件。
架構(gòu)隨著時間的變化演進著,人們在這方面的思考也在增加,于是,后來就有人發(fā)明了一種4+1的視圖來描述架構(gòu)。4代表的是4種視圖,有邏輯視圖、實現(xiàn)視圖、進程視圖、部署視圖,1代表的是1個場景。
邏輯視圖,是由研發(fā)人員來創(chuàng)建的,元素包含類和包,通過類和包之間的關(guān)系來實現(xiàn)依賴;
實現(xiàn)視圖,由我們常使用的maven、idea等構(gòu)建編譯系統(tǒng)工具來實現(xiàn),表示的是模塊之間的以及組件之間的依賴關(guān)系;
進程視圖,是一組運行時候的組件,他們之間如果發(fā)生關(guān)系就是依賴進程通信;
最后是部署視圖,指的就是運行在機器上的進程了。最后通過業(yè)務(wù)場景來將這些視圖關(guān)聯(lián)起來。
依靠這樣的模型可以便于說明架構(gòu),那架構(gòu)的目標是什么呢,目標:“用最小的人力成本來滿足構(gòu)建和維護該系統(tǒng)的需求”。
那架構(gòu)的價值是什么呢,其實先前我們在描述架構(gòu)的需求的時候已經(jīng)提到了功能性需求和非功能性需求,架構(gòu)的價值就是對應(yīng)這兩種需求的,功能性需求--行為價值,非功能性需求-架構(gòu)價值。哪種價值最重要呢,記住:架構(gòu)價值最重要。
好了,該架構(gòu)師登場了。
我們主要從兩個方面來談?wù)劶軜?gòu)師,架構(gòu)師是什么樣的人,架構(gòu)師的職責。
架構(gòu)師是什么樣的人,是能力最強的一群程序員,而且也必須堅持一直做程序員。他們的代碼量雖然不多,但必須承接編程任務(wù),如果不親身承受因系統(tǒng)設(shè)計而帶來的麻煩,就體會不到因設(shè)計不佳所帶來的痛苦,隨而會逐漸迷失正確的設(shè)計方向。
程序員最常接觸的就是產(chǎn)品和業(yè)務(wù)人員,產(chǎn)品給你提需求,你陪產(chǎn)品聊需求,需求越聊越清晰。
產(chǎn)品人員關(guān)注的是需求對應(yīng)的功能有無按照規(guī)范實現(xiàn),擴展性、穩(wěn)定性都是研發(fā)人員更關(guān)注。
業(yè)務(wù)人員提出業(yè)務(wù)期望給到產(chǎn)品人員,待系統(tǒng)上線后,業(yè)務(wù)人員開始推廣業(yè)務(wù),業(yè)務(wù)人員更加不會關(guān)心系統(tǒng)穩(wěn)定性、擴展性。
但是,恰恰系統(tǒng)的可監(jiān)控、可擴展、穩(wěn)定性才是系統(tǒng)架構(gòu)的基礎(chǔ)。
第一職責
既然架構(gòu)和建筑常來類比,我們繼續(xù)打個比方。大家去樓盤買房,關(guān)注的都是戶型,朝向,綠化,幾乎沒有人關(guān)心到這個大樓的的地基和主體結(jié)構(gòu)。
而我們的架構(gòu)的架構(gòu)價值正如大樓的地基一樣重要,因此架構(gòu)師的第一個職責就是要關(guān)心架構(gòu)的質(zhì)量屬性,也就是架構(gòu)價值所強調(diào)的。乃至,需要持續(xù)地,從公司長遠利益出發(fā)與其它非研發(fā)部門做抗爭。
工作中常常有類似下面的三種程序員
程序員A:“我們可以未來再重構(gòu)代碼,產(chǎn)品上線最重要”
程序員B:“在工程中容忍糟糕的代碼存在,可以在短期內(nèi)加快工程的上線速度,未來這些代碼會造成一些額外的工作量,但是并沒什么大不了”
程序員C:“我的工作是且僅是,按照需求文檔編寫代碼,并且修復(fù)任何BUG”
第二職責
那么,架構(gòu)師的第二個職責就是創(chuàng)建一個讓需求功能實現(xiàn)更容易,修改更簡單,擴展更輕松的軟件架構(gòu)。記住精力守恒定律:“你投入到程序中的精力越多,用戶使用時遇到的麻煩和折騰的精力就會越少”。
第三個職責,做一個演進式架構(gòu)師,這樣的架構(gòu)師的職責就要分別從愿景、同理心、合作、適應(yīng)性、自治性、治理、愿景分別去考慮問題。
愿景:確保在系統(tǒng)級有一個經(jīng)過充分溝通的技術(shù)愿景,這個愿景可以幫助你滿足客戶和組織的需求;
同理心:理解你所做的決定對客戶和同事帶來的影響;
合作:和盡量多的同事進行溝通,從而更好地對愿景進行定義、修訂和執(zhí)行;
適應(yīng)性:確保在你的客戶和組織需要的時候調(diào)整技術(shù)愿景;
自治性:在標準化和團隊自治之間尋找一個正確的平衡點;
治理:確保系統(tǒng)按照技術(shù)愿景的要求實現(xiàn);
“好程序員”應(yīng)該竭盡全力把程序?qū)懙耐ㄋ滓锥?,這樣別人拿到這樣的程序就能很好的理解,找起B(yǎng)UG來也容易,架構(gòu)師首先是好的程序員,其次架構(gòu)師要擔當維護應(yīng)用程序系統(tǒng)架構(gòu)的架構(gòu)價值的角色。
確保軟件系統(tǒng)能夠持續(xù)地提供業(yè)務(wù)所需要的功能,設(shè)計的架構(gòu)應(yīng)盡可能讓程序員容易開發(fā)和維護。
注:文中漫畫來自網(wǎng)絡(luò)