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