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