前些日子,在閑聊中,一位媒體朋友問(wèn)我:軟件架構師(Software Architect)究竟與普通程序員有什么區別,軟件架構師平時(shí)都在想些什么?這一問(wèn),倒提醒了我。想來(lái)自己從事軟件架構設計這個(gè)行當也有十多年了,現在確實(shí)有必要以文字的形式,把自己這些年來(lái)對于軟件架構設計這項充滿(mǎn)魅力、極其有趣的工作的所思所想、經(jīng)驗所得,好好整理一下。
軟件架構設計是一門(mén)建立在科學(xué)、工程基礎之上的藝術(shù)。根據我本人的體會(huì ),以下術(shù)語(yǔ)和詞匯大概就是那些讓一位軟件架構師在其職業(yè)生涯中時(shí)刻縈繞于心、揮之不去的核心關(guān)鍵詞:
權衡與平衡(Balancing the Tradeoffs)
軟件架構師必須學(xué)會(huì )的第一件事情是:懂得如何進(jìn)行權衡,在各個(gè)相互矛盾的設計要素、限制和約束條件之間巧妙地取得平衡。
與人類(lèi)所從事的其他工程活動(dòng)一樣,軟件開(kāi)發(fā)、軟件工程本質(zhì)上也是一種平衡的藝術(shù)。如何才能把握軟件開(kāi)發(fā)藝術(shù)的平衡之道?在現實(shí)的軟件開(kāi)發(fā)中,一名架構師必須首先掌握科學(xué)的、工程的思維方式和方法,也就是客觀(guān)的、系統的、符合邏輯的思維。錯亂的邏輯必然導致錯誤的結論,基于錯亂邏輯設計出來(lái)的軟件也必然會(huì )破壞軟件架構內在的和諧之美,因而是丑陋的。
抽象、建模與設計(Design with Abstraction and Modeling)
一位軟件架構師必須主動(dòng)地選擇工作在合適的抽象層次上。在必要的情況下,他/她必須能夠脫離具象的編程語(yǔ)言(如 Java、C++、VB.Net、JavaScript、Ruby 等等)進(jìn)行思考,能夠透過(guò)現象看本質(zhì),準確抓住事物的本質(zhì)。
如果一位“架構師”只會(huì )工作在代碼實(shí)現(Implementation)層,遇到任何問(wèn)題就忍不住要寫(xiě)上幾行代碼、砌上幾塊磚頭,擺擺看,否則就無(wú)法順利思考,卻不知道、不會(huì )利用圖形、符號、公式等抽象的、敏捷的手段來(lái)描述自己的思考和設計,那么這位“架構師”的能力是有嚴重缺陷的。
預見(jiàn)性和前瞻性(Prediction and Anticipation)
一位軟件架構師必須比團隊中的普通程序員、初級程序員看的更遠。
如果一位開(kāi)發(fā)“能手”和“高手”,經(jīng)驗豐富卻目光短淺,只知道解決眼前的現實(shí)問(wèn)題,不知道在有限的可用時(shí)間內往前多看幾步,考慮一下面向未來(lái)問(wèn)題和潛在風(fēng)險的應對之道,他是不足以享有“架構師”頭銜的。
簡(jiǎn)化之美(The Beauty of Simplification)
簡(jiǎn)化是這個(gè)世界上任何科學(xué)、工程技術(shù) —— 邏輯藝術(shù) —— 的本質(zhì)要求。
E=mc^2 告訴我們,我們人類(lèi)身處的這個(gè)宇宙存在著(zhù)永恒的簡(jiǎn)單真理。作為被科學(xué)家和工程師利用電子技術(shù)構造出來(lái)的虛擬世界 —— 軟件,這個(gè)空間、小宇宙自然也不例外。在軟件工程界,我們篤信:只有簡(jiǎn)單而有效,才是真正的軟件之美。
為什么我們要白白耗費資源,開(kāi)發(fā)出冗余的、重復的、七繞八拐的低效程序?軟件架構師必須帶領(lǐng)他/她的程序員團隊,始終堅持對軟件架構藝術(shù)之美 —— 簡(jiǎn)化的追求。
模式與重用(Patterns and Reuse)
軟件架構師必然首先是一名聰明的程序員,他/她知道何時(shí)、何處省力,如何省力:運用巧力來(lái)輕松完成原本繁重的開(kāi)發(fā)工作。
節省工作量的最好一個(gè)辦法就是重用。如果軟件開(kāi)發(fā)的 10 倍率銀彈存在的話(huà)(張恂一直認為談?wù)摬际香y彈的存在與否并無(wú)多大的實(shí)際意義),軟件重用無(wú)疑是一顆最有效的銀彈。重用自己的或別人的代碼、程序、構件、模塊、子系統乃至整個(gè)系統,可以讓過(guò)去需要 10 天完成的工作在 1 天之內完成,讓過(guò)去需要 1 年完成的工作在 1 個(gè)月之內完成,這樣的例子遍地都是,有什么辦不到的呢?
軟件模式的應用本質(zhì)上是對軟件設計思想、設計知識的重用。毋庸置疑,世界上任何一位軟件架構師,都知道而且應當知道軟件設計模式存在的寶貴價(jià)值和重要意義。
質(zhì)量、效率與資源(Quality, Efficiency and Resources)
如何在有限的,甚至往往是“窘迫”的時(shí)間進(jìn)度、經(jīng)費和人力資源等重重壓力之下,帶領(lǐng)團隊開(kāi)發(fā)出真正符合客戶(hù)需要的、高質(zhì)量的,同時(shí)又具有長(cháng)久生命力的軟件產(chǎn)品或系統,能夠不斷為企業(yè)和客戶(hù)創(chuàng )造價(jià)值,這是所有軟件架構師必須擔當的一項首要職責、艱巨任務(wù)。當然,這又是一個(gè)相當復雜的、涉及到科學(xué)、工程、藝術(shù)、社會(huì )人際關(guān)系和公司政治等多方面因素的權衡問(wèn)題。
敏捷、迭代與演進(jìn)(Agile Iterative Evolution)
高質(zhì)量的、好的軟件架構從來(lái)都不是一蹴而就的。把一個(gè)項目切分成 5 個(gè)連續階段,通過(guò)需求階段完成需求分析,設計階段完成概要設計和詳細設計,實(shí)現階段完成程序編碼,測試階段完成系統測試,部署階段完成安裝部署,這種傳統的、錯誤的線(xiàn)性開(kāi)發(fā)思維違背了軟件開(kāi)發(fā)的復雜現實(shí),成為導致國內外大量軟件開(kāi)發(fā)項目失敗的主要殺手。
我們應該避免采用這種高風(fēng)險的傳統瀑布式開(kāi)發(fā)流程,轉為采用迭代遞增、演進(jìn)的方式來(lái)設計和發(fā)展軟件架構,這是過(guò)去 30 多年來(lái)世界軟件工程界以及軟件架構師們學(xué)到的最寶貴經(jīng)驗之一。
開(kāi)發(fā)出敏捷、靈活、柔性,易于適應變化,能夠不斷地滿(mǎn)足客戶(hù)需求,不斷地為企業(yè)創(chuàng )造利潤,以及便于維護、擴展和升級的軟件架構,需要優(yōu)良、合理、高效的軟件開(kāi)發(fā)工藝流程的支撐。實(shí)現這一目標并非超乎現實(shí)的幻想,過(guò)去 20 年來(lái)世界上的領(lǐng)導企業(yè)和軟件開(kāi)發(fā)機構已經(jīng)為我們提供了大量系統、架構、框架和平臺的成功開(kāi)發(fā)案例。
軟件架構師應該與項目經(jīng)理、團隊成員們一道為自己的團隊挑選、定制一種適用的軟件開(kāi)發(fā)過(guò)程。敏捷迭代開(kāi)發(fā)要求軟件架構師通過(guò)軟件開(kāi)發(fā)的迭代、演進(jìn)周期,把握好前饋與反饋、前構與重構的平衡,不斷地利用編碼、集成、運行、測試以及與用戶(hù)、客戶(hù)的溝通等活動(dòng)來(lái)驗證軟件架構的設計思路、解決方案的正確性和有效性,從而最大限度地降低架構開(kāi)發(fā)風(fēng)險。
前構與重構(Prefactoring over Refactoring)
...
(待續)
聯(lián)系客服