本文寫于19年12月1日
不想當(dāng)程序員的架構(gòu)師不是好程序員希坚。
寫這篇文章的時(shí)候边苹,我正坐在圖書館里,冬天的陽光透過寬大的玻璃窗戶裁僧,撒在擺滿了書架的地上个束,好久沒有寫文字了,突然有一種欲望:想談?wù)劶軜?gòu)和架構(gòu)師聊疲。
當(dāng)你提到架構(gòu)兩字的時(shí)候你首先想到的是什么茬底,往往被關(guān)聯(lián)到的是建筑,建筑架構(gòu)的設(shè)計(jì)跟軟件工程的設(shè)計(jì)的確很像获洲,大家也都這樣類比阱表,甚至在英語中,建筑師 和 架構(gòu)師 都是同一個(gè)單詞 “architect”贡珊。但我覺得最爬,軟件的架構(gòu)設(shè)計(jì)還要比建筑的設(shè)計(jì)復(fù)雜,軟件架構(gòu)是一個(gè)動(dòng)態(tài)的飞崖,建筑不是烂叔。
說軟件架構(gòu)的設(shè)計(jì)是動(dòng)態(tài)的,不覺得很貼切么固歪,沒有一成不變的架構(gòu)蒜鸡,架構(gòu)一直是在演進(jìn)式的變化胯努,以便更能服務(wù)好增長的業(yè)務(wù)而帶來的需求。
架構(gòu)設(shè)計(jì)逢防,那設(shè)計(jì)是為誰服務(wù)的叶沛,是為應(yīng)用程序系統(tǒng)服務(wù)的,那應(yīng)用程序系統(tǒng)有什么樣的需求忘朝,有兩種需求:功能性需求和非功能性需求灰署。
功能性需求,就比較好理解了局嘁,添加一個(gè)商品溉箕、修改一個(gè)商品、統(tǒng)計(jì)商品在一定時(shí)間段的銷量報(bào)表悦昵,還有可能再給這些功能加上權(quán)限肴茄,這是功能性需求。表示的是但指,這個(gè)應(yīng)用程序系統(tǒng)可以干什么寡痰。
非功能性需求,就是我們常說的是否可監(jiān)控棋凳、可回退拦坠、是否具備高可用、高并發(fā)剩岳、高性能的特性贞滨,表示的是,一個(gè)應(yīng)用程序在運(yùn)行時(shí)的質(zhì)量卢肃。
當(dāng)然疲迂,還有一個(gè)更重要的需求,也是歸在非功能性需求里面的莫湘,就是:快速安全的交付軟件尤蒿。
架構(gòu)隨著時(shí)間的變化演進(jìn)著,人們在這方面的思考也在增加幅垮,于是腰池,后來就有人發(fā)明了一種4+1的視圖來描述架構(gòu)。4代表的是4種視圖忙芒,有邏輯視圖示弓、實(shí)現(xiàn)視圖、進(jìn)程視圖呵萨、部署視圖奏属,1代表的是1個(gè)場景。
邏輯視圖潮峦,是由研發(fā)人員來創(chuàng)建的囱皿,元素包含類和包勇婴,通過類和包之間的關(guān)系來實(shí)現(xiàn)依賴;
實(shí)現(xiàn)視圖嘱腥,由我們常使用的maven耕渴、idea等構(gòu)建編譯系統(tǒng)工具來實(shí)現(xiàn),表示的是模塊之間的以及組件之間的依賴關(guān)系齿兔;
進(jìn)程視圖橱脸,是一組運(yùn)行時(shí)候的組件,他們之間如果發(fā)生關(guān)系就是依賴進(jìn)程通信分苇;
最后是部署視圖添诉,指的就是運(yùn)行在機(jī)器上的進(jìn)程了。最后通過業(yè)務(wù)場景來將這些視圖關(guān)聯(lián)起來医寿。
依靠這樣的模型可以便于說明架構(gòu)吻商,那架構(gòu)的目標(biāo)是什么呢,目標(biāo):“用最小的人力成本來滿足構(gòu)建和維護(hù)該系統(tǒng)的需求”糟红。
那架構(gòu)的價(jià)值是什么呢,其實(shí)先前我們在描述架構(gòu)的需求的時(shí)候已經(jīng)提到了功能性需求和非功能性需求乌叶,架構(gòu)的價(jià)值就是對應(yīng)這兩種需求的盆偿,功能性需求--行為價(jià)值,非功能性需求-架構(gòu)價(jià)值准浴。哪種價(jià)值最重要呢事扭,記住:架構(gòu)價(jià)值最重要乐横。
好了求橄,該架構(gòu)師登場了。
我們主要從兩個(gè)方面來談?wù)劶軜?gòu)師葡公,架構(gòu)師是什么樣的人罐农,架構(gòu)師的職責(zé)。
架構(gòu)師是什么樣的人催什,是能力最強(qiáng)的一群程序員涵亏,而且也必須堅(jiān)持一直做程序員。他們的代碼量雖然不多蒲凶,但必須承接編程任務(wù)气筋,如果不親身承受因系統(tǒng)設(shè)計(jì)而帶來的麻煩,就體會(huì)不到因設(shè)計(jì)不佳所帶來的痛苦旋圆,隨而會(huì)逐漸迷失正確的設(shè)計(jì)方向宠默。
程序員最常接觸的就是產(chǎn)品和業(yè)務(wù)人員,產(chǎn)品給你提需求灵巧,你陪產(chǎn)品聊需求搀矫,需求越聊越清晰抹沪。
產(chǎn)品人員關(guān)注的是需求對應(yīng)的功能有無按照規(guī)范實(shí)現(xiàn),擴(kuò)展性艾君、穩(wěn)定性都是研發(fā)人員更關(guān)注采够。
業(yè)務(wù)人員提出業(yè)務(wù)期望給到產(chǎn)品人員,待系統(tǒng)上線后冰垄,業(yè)務(wù)人員開始推廣業(yè)務(wù)蹬癌,業(yè)務(wù)人員更加不會(huì)關(guān)心系統(tǒng)穩(wěn)定性、擴(kuò)展性虹茶。
但是逝薪,恰恰系統(tǒng)的可監(jiān)控、可擴(kuò)展蝴罪、穩(wěn)定性才是系統(tǒng)架構(gòu)的基礎(chǔ)董济。
第一職責(zé)
既然架構(gòu)和建筑常來類比,我們繼續(xù)打個(gè)比方要门。大家去樓盤買房虏肾,關(guān)注的都是戶型,朝向欢搜,綠化封豪,幾乎沒有人關(guān)心到這個(gè)大樓的的地基和主體結(jié)構(gòu)。
而我們的架構(gòu)的架構(gòu)價(jià)值正如大樓的地基一樣重要炒瘟,因此架構(gòu)師的第一個(gè)職責(zé)就是要關(guān)心架構(gòu)的質(zhì)量屬性吹埠,也就是架構(gòu)價(jià)值所強(qiáng)調(diào)的。乃至疮装,需要持續(xù)地缘琅,從公司長遠(yuǎn)利益出發(fā)與其它非研發(fā)部門做抗?fàn)帯?/p>
工作中常常有類似下面的三種程序員
程序員A:“我們可以未來再重構(gòu)代碼,產(chǎn)品上線最重要”
程序員B:“在工程中容忍糟糕的代碼存在廓推,可以在短期內(nèi)加快工程的上線速度刷袍,未來這些代碼會(huì)造成一些額外的工作量,但是并沒什么大不了”
程序員C:“我的工作是且僅是樊展,按照需求文檔編寫代碼做个,并且修復(fù)任何BUG”
第二職責(zé)
那么,架構(gòu)師的第二個(gè)職責(zé)就是創(chuàng)建一個(gè)讓需求功能實(shí)現(xiàn)更容易滚局,修改更簡單居暖,擴(kuò)展更輕松的軟件架構(gòu)。記住精力守恒定律:“你投入到程序中的精力越多藤肢,用戶使用時(shí)遇到的麻煩和折騰的精力就會(huì)越少”太闺。
第三個(gè)職責(zé),做一個(gè)演進(jìn)式架構(gòu)師嘁圈,這樣的架構(gòu)師的職責(zé)就要分別從愿景省骂、同理心蟀淮、合作、適應(yīng)性钞澳、自治性怠惶、治理、愿景分別去考慮問題轧粟。
愿景:確保在系統(tǒng)級(jí)有一個(gè)經(jīng)過充分溝通的技術(shù)愿景策治,這個(gè)愿景可以幫助你滿足客戶和組織的需求;
同理心:理解你所做的決定對客戶和同事帶來的影響兰吟;
合作:和盡量多的同事進(jìn)行溝通通惫,從而更好地對愿景進(jìn)行定義、修訂和執(zhí)行混蔼;
適應(yīng)性:確保在你的客戶和組織需要的時(shí)候調(diào)整技術(shù)愿景履腋;
自治性:在標(biāo)準(zhǔn)化和團(tuán)隊(duì)自治之間尋找一個(gè)正確的平衡點(diǎn);
治理:確保系統(tǒng)按照技術(shù)愿景的要求實(shí)現(xiàn)惭嚣;
“好程序員”應(yīng)該竭盡全力把程序?qū)懙耐ㄋ滓锥窈@樣別人拿到這樣的程序就能很好的理解,找起B(yǎng)UG來也容易晚吞,架構(gòu)師首先是好的程序員奄侠,其次架構(gòu)師要擔(dān)當(dāng)維護(hù)應(yīng)用程序系統(tǒng)架構(gòu)的架構(gòu)價(jià)值的角色。
確保軟件系統(tǒng)能夠持續(xù)地提供業(yè)務(wù)所需要的功能载矿,設(shè)計(jì)的架構(gòu)應(yīng)盡可能讓程序員容易開發(fā)和維護(hù)。
注:文中漫畫來自網(wǎng)絡(luò)