10年感觸:架構是什么?——消滅架構!
架構是什么?昨天下午我坐飛機從西安到太原的路上,不禁在思考這個問題。我做C#開發已經11年了,做過很多項目,經歷了很多項目開發過程中的折磨,在小企業兼職過不靠譜的“技術總監”,在大公司也當過碼工,見識過很多牛人,分析過牛人的代碼,并且也和團隊設計了OSGi.NET框架和iOpenWorks插件倉庫平臺。回想這么多年的軟件開發經驗,我發現自己一直在追逐如何使軟件開發做的更好,如何讓一個團隊開發出一個像樣的軟件產品,而不是像大多數的國人生產的丑陋不堪、經常出現各種古怪問題的企業軟件。
目前除了做軟件開發平臺,我們還深入到熱力、能耗監測等能源監控領域,進入這個領域之后,發現傳統的幾個大廠家,做的軟件都極其的爛,那軟件簡直丑的不能再丑了,送給我我都不要。這些廠家那么有錢,他們做不出好軟件?真是不可思議。因此,我跟我的合作伙伴放出豪言,我們要做這個行業***的軟件,要做到這個領域的***。
哈哈,話說出來容易!當我在一個特定環境下,帶領一個新的、剛剛成立的團隊嘗試來開發這么一個軟件的時候,我卻發現我們軟件的***個版本也是其丑無比。這才恍然大悟,或許那些廠家的軟件開發也是這么的方式來生產的。這樣生產出來的軟件要滿足用戶的需求,那這些開發人員得遭多少罪,才能夠在一個不靠譜的軟件修修補補使其稍稍靠譜。
因此,我開始反思,怎么能使一個新團隊開發一個好的軟件產品?
答案和我的標題是一樣的,我要依靠架構。那么架構是什么?
架構是一個約定,一個規則,一個大家都懂得遵守的共識。那這是什么樣的約定、什么樣的規則、什么樣的共識呢?
我以包為例,我經常出差,雙肩背包里裝了不少東西。筆記本電腦、電源、2個上網卡、鼠標、USB線、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort轉VGA接口、U盤、幾根筆、小螺絲刀、洗漱用品、干凈衣服、襪子、香水、老婆給我帶的抹臉膏(她嫌我最近累,臉有點黃)、錢包、Token卡、耳機、紙巾、USB線、U盤等。這個包有很多格子,最外面的格子我放常用的,比如筆、紙、一盒小的名片等;中間的格子一般放的是衣服、襪子、洗漱用品、香水等;靠背的那個大格子放了筆記本電腦,和筆記本電腦相近的小格子放的是兩個上網卡、Mini-DisplayPort轉VGA接口、大盒名片、記事本,和筆記本電腦相近的大格子放的是電源、鼠標、口香糖等。
我閉著眼睛都可以將我的東西從包里掏出來,閉著眼睛都可以將東西塞到包里!但是,非常不幸的是,一旦我老婆整理過我的包,那我就很慘了,老是因為找不到東西而變得抓狂!更不幸的,要是我那個不到兩歲的“小可愛”翻過,就更不得了了。
這個包就是我放所有物品的“架構”,每一個東西放置的位置就是我的“約定、規則、共識”。倘若我老婆也知道我的“架構”、我的“約定、規則、共識”,那么不管她怎么動我的包,我都照樣能夠輕易的拿東西或者放東西。進一步,如果我的同事也知道我的“架構”,知道我的“約定、規則、共識”,那么他們什么時候動我的包,我也毫無所知!
恍然大悟!我前一個公司Sybase,所有的產品都是基于一個統一的插件開發平臺,每一個產品都是一個插件,每一個插件都按照名字約定好了BO(Controller)、GO(View)、SO(Model/DataAccessor),定義好PropertyPage、PropertyDialog、Wizard。我記得當我確定工作角色后,我就拿到一個開發文檔,里面描述了這些目錄、名字的規則,有UI文字陳述規則、文字的大小規則等,一周內我就能夠修Bug,一個月之后我就能做New Feature,然而,我此時對我們的平臺、框架依然一無所知。過了1年后,產品依然遵守約定不斷進行改進,在維護過程中,我們竟然絲毫沒有感覺到累。基于這樣的框架做產品,我發現不管是什么人,開發的樣式都完全一致。我以前竟然絲毫沒有覺得驚訝!
在公司混了兩年之后,有點成為老鳥了,還很得瑟的整了一個《Flex UI Composition SDK》,就是基于Flex的界面組合組件,搞的老漂亮了,代碼寫的好看,文檔搞的正式,而且這個小SDK功能強大且很靈活。老大很給面子,讓我給美國的架構組Show一下。我很激情的在半夜里用電話會議和那幫很牛的架構師、專家級工程師展示我的SDK。完事后,印象很深刻,一個很資深的老外架構師提了一句,他覺得這個SDK有點復雜。
以前我不太理解為什么他會說復雜。原因很簡單,以他的技術,使用這個SDK我覺得沒有太大的問題,只要稍稍學習就好了。后來,我終于慢慢想通了。這個SDK不好的地方在于太靈活了,靈活到無法構建一個統一標準的、容易讓人遵守的“約定、規則、共識”。在沒有“共識”的支撐下,這樣的系統經過若干人維護后,那絕對玩完了,成“萬人坑”了,誰改代碼就坑誰,以后什么事情都有可能發生的。
于是,我有一點點想明白了,架構就是這么的一個共識。當共識普遍傳遞的時候,架構就消失了,開發好的軟件就成為了習慣。
這就是為什么有高人提出“消滅架構”!哦,天啊,這幫人太變態了,他們這么早就想通了!
談到這,我也有必要繼續分享一下,我在新的團隊是如何消滅架構的。方法很簡單,和Sybase的前同事學習!
***步:使用插件架構
第二步:定制統一的界面框架
這個界面框架如下所示。
該框架約定了統一的界面樣式,比如按鈕、磁貼、標簽頁、導航條、進度條、Form等等。
第三步:定制插件的統一架構
每一個插件都創建5個目錄:Controllers、DataAccessors、Models、ViewModels、Views,如下所示。每一個目錄存放的代碼通過名字都知道是什么了。
第四步:定制開發模板(升華,該步驟不是必須的,是為了更好提高易用性,讓傻瓜也可以開發插件,僅供參考)
在主程序模板可以保護統一數據訪問、統一安全管理等功能模塊。
哈哈,這個方法終于能使新團隊開發出具有較為統一風格、較高質量的軟件產品了!這時候,你會發現,所有人都不需要關心架構了,我們只有共識。
這樣,架構被成功消滅了,架構的目標就是消滅架構!但是,如果架構被消滅了,架構師不也被消滅了嗎?這個搞笑的問題留給讀者吧。
附:關于架構的官方定義,建議參考《Java應用架構設計》,該書很經典。本文關于“架構就是共識、消滅架構”說法,來自于該書。我不是“架構就是共識、消滅架構”說法的***。