paulwong

          軟件架構(gòu)那點事兒(二)

          什么才是軟件架構(gòu)呢?這是一個讓人費神的事情,其實呢我覺得“軟件架構(gòu)”至少應(yīng)該是一個動詞,而不是一個專有名詞。那么什么才是架構(gòu)呢?按照我個人的理解,架構(gòu)這玩意簡約不簡單。“架構(gòu)”的過程是一個把抽象轉(zhuǎn)化為具體,其中的美妙不會低于設(shè)計師創(chuàng)造艾菲爾鐵塔那般的感受。架構(gòu)的過程會讓你變得偏執(zhí)、瘋狂。至少在短時期內(nèi)會為之寢食難安。那時時候你的世界之后架構(gòu)二字了。有點長,希望耐心看完~~~ 哈哈!

          (PS:盡管架構(gòu)是與編程語言無關(guān)的事情,目前采用Java語言作為例子)

          好了,很多人讀到這里會懷疑,難道J2EE業(yè)界流行的那些SSH、SSI 不是架構(gòu)嗎?我的回答是“NO”,如果硬要如架構(gòu)沾邊的話,那也充其量是一個架構(gòu)最最低級的一種。在現(xiàn)在的我看來,那些只不過是一些開源框架的簡單集成,毫無技術(shù)含量可言,對于架構(gòu)者本人而言,那就是通過固化的配置把這些開源框架進行一定程度的粘合,使其能互相配合完成工作。當然不是否認這個配置的過程,但是這個過程是機械化的學習,絲毫看不到自己的想法,這時的想法都被固化的配置所代替。想當年 偶也是這樣子走過來的,所以說呢,現(xiàn)在的我不敢談?wù)摷軜?gòu)的內(nèi)涵,僅僅是表達出我對架構(gòu)的一些想法。文以記之。

          好了,經(jīng)過SSH簡單的粘合之后,感覺自己很偉大,而且看是躍躍欲試的樣子,拿來做項目,這是必經(jīng)的一部,從程序員到架構(gòu)是一個設(shè)想與實踐相結(jié)合的一個過程。你自己架構(gòu)的東西必須通過項目的實踐,才能了解是否有改進的余地。我是比較幸運的,一直以來很多項目都是我架構(gòu)之后在實踐呢,在這里感謝那些曾經(jīng)呆過的公司。是他們給的平臺才讓我有今天坐在這里寫文章的沖動。很多人在使用簡單粘合的SSH框架去架構(gòu)你的項目,你會發(fā)現(xiàn)那玩意不適合做項目,太原始了,仿佛回到了石器時代,當然當時你的水平估計也就是才進化到鐵器時代吧。

          第二階段了,開始嘗試修改SSH搭建的框架,新在而言還是用“框架”來形容比較的貼切一點。通過一輪或者幾輪的項目實施,你會發(fā)現(xiàn)其實SSH等這些也不是很完美,至少還有很多地方可以改進,這時你已經(jīng)不再滿足于SSH的簡單那粘合了,開始嘗試去修改加工SSH的粘合。增加一些與SSH直接交互的隔離層代碼,這樣一來自己項目的代碼干凈了很多,SSH從入侵式到非入侵式(不可能100%),這已經(jīng)是一個了不起的飛躍了。你發(fā)揮了作為人主觀能動性的權(quán)利,現(xiàn)在你收獲了。那改造的SSH繼續(xù)項目到項目中去實踐,也許改造后的架構(gòu)在當時的你看來已經(jīng)很完美了。勇者無懼,Going,開始第二階段的試水,感覺很好吧,現(xiàn)在的你也許長大一點了,不再從單一的技術(shù)去看待項目了,開始考慮項目的開發(fā)計劃了,有了后則一層的考慮說明你是一位勤奮好學的好孩子,已經(jīng)不再是單純的Coder了,面對計劃,在看看自己的架構(gòu)的“框架”,時間緊迫啊。用這玩意盡管目前代碼尤雅了很多,但是對于項目小組成員的開發(fā)進度還是幫助不大,大家需要學習的東西太多了,Spring、Struts、Hibernate ....... 這對于經(jīng)驗不是很豐富的程序員而言,簡直就是噩夢??紤]到這一點,你就開始進入第三階段的進化了

          第三階段,開始思考屏蔽各種框架集成帶來的復雜性,讓不懂SSH框架的人也可以快速上手使用,為了達到這一點,又開始廢寢忘食的框架重構(gòu),增加更多隔離層的代碼。這時的框架有點架構(gòu)的味道了,重構(gòu)之后的你會洋洋得意,認為這是很完美的了,又去屁顛的拿去項目實戰(zhàn)了,這時發(fā)現(xiàn)你隔離之后的反而適得其反,百思不得其解?。渴裁辞闆r呢?因為你對粘合的框架內(nèi)核機制不了解,這時的你要虛心學習那些開源框架了,必須是源碼級別的閱讀,了解他們的內(nèi)核機制,才能寫出更好的隔離層,面對大量的源碼,必須有個入口吧,下面我簡單吧Spring的入口告訴大家:首先是Spring的Ioc容器,這是核心,主要是看init bean以及l(fā)oadbean的這點內(nèi)容是精髓,Aop的話比較深入了,簡單一點就是采用動態(tài)代理方式實現(xiàn)AOP,在高級的就是采用CgLib的動態(tài)代碼切入實現(xiàn)。學好這兩個之后。在學習Spring MVC 了,這是一個難點,你要吧Mvc的解析流程整理好了,在從每一個環(huán)節(jié)思考架構(gòu)為和要多一個這樣的環(huán)節(jié)。(Struts1 太簡單了,Struts2太復雜了)。言歸正傳了,經(jīng)歷一輪源碼的洗禮,你脫胎換骨了,SSH對你而言 使用起來游刃有余了。你再也不用為框架不熟悉費力了,這是的你充滿了自信,短期內(nèi)不再關(guān)注學習框架了,更多的時間分配給了架構(gòu)。這時應(yīng)該進入第四階段了吧

          第四階段,開始用全新的眼光以及思維去粘合SSH,不錯,很多以前的使用不當現(xiàn)在都讓你輕易的化解,而且開始考慮使用SSH特有的一些優(yōu)勢去美化的你的架構(gòu)?,F(xiàn)在的你開始考慮的不是開始了,而是如何保證代碼的質(zhì)量問題了,如何保證呢?好吧,找領(lǐng)導申請資源測試吧,對不起,測試團隊是很昂貴的,公司很少會配備測試團隊的,自測?小弟們才不會如此上心呢?未雨綢繆吧。架構(gòu)時候為何不架構(gòu)一套基于SSH的單元測試框架進來呢,好處呢可以脫離容器去測試功能,基于框架的單元測試進入了你的思考范圍。等從思考到完全融入架構(gòu)的時候,你有進入一個新的階段了。編寫測試架構(gòu)就是為了提高工作效率,目前面向Web的開發(fā),很多測試都需要依賴容器,每次啟動容器調(diào)試是何等的低效啊。好了集成了自己的測試框架,小弟們高興了。也會對你刮目相看,至少編寫單元測試是一個程序員的義務(wù),保證自己的代碼的穩(wěn)定性,現(xiàn)在你輕松了,每天吧小弟的成果用寫的單元測試運行一次。沒問題了,不錯。下班。

          第五階段,也許這一階段你的架構(gòu)開始穩(wěn)定,很長一段時間都會固化不變,也許到達了一個瓶頸了。單位來了狠多項目,每次你都構(gòu)建一個基礎(chǔ)成,1次 2次 。。。N次,O-MyGod,你開始討厭這種重復的的勞作了,得,這是你的責任,你是公司的技術(shù)一把手,這些肯定有你來做。這是你開始考慮吧基礎(chǔ)層與業(yè)務(wù)層開始解耦。解耦出來的東東作為單獨的一個項目存放,自己手動維護,以及版本控制。新建的項目都依賴你的基礎(chǔ)項目在做業(yè)務(wù)開發(fā),現(xiàn)在感覺好多了,不用在為項目每次都搭建了??粗鴦e人在忙,你在一邊抽煙偷著樂吧。新在的你體會到一絲分離的快感。這不是就是所謂的程序的解耦嗎?這不過你解耦的比較徹底了,從功能和物理上都實現(xiàn)了解耦。恩體會到設(shè)計模式的優(yōu)美了,這是你也會才會發(fā)自內(nèi)心的去迷戀設(shè)計模式。這些設(shè)計模式是前輩們精華的抽象,不同的模式用于解決各種現(xiàn)實的業(yè)務(wù)建模。學會是一回事,靈活掌握是另外一回事。關(guān)于設(shè)計模式,是必經(jīng)的過程。不僅僅是學會,關(guān)鍵是靈活使用。在合適的場景下選用合適的模式,才是正解。

          第六階段了,通過之前的積累,你已經(jīng)開始邁出走向架構(gòu)的第一步了,之前都是為這一步的積累。好比是砍柴,之前都是磨刀了,現(xiàn)在才開始踏上砍柴的路途,哼著兒歌、一路進發(fā)?,F(xiàn)在刀不是問題了,估計之前的砍柴都是刀不好,注意力都在刀上了,現(xiàn)在刀是沒問題了,開始轉(zhuǎn)移到觀察柴了,什么柴比較好,砍哪里可以一刀成功,這些多是經(jīng)驗。映射到軟件項目就是,開始關(guān)于業(yè)務(wù)建模,不同行業(yè)的業(yè)務(wù)都有其自身的特性,如何針對這些特有的業(yè)務(wù)特性去架構(gòu)框架呢,在之前的隔離層上在封裝一層業(yè)務(wù)支撐體系,這個體系可以良好的為業(yè)務(wù)系統(tǒng)提供強大的動力。通信、政府、金融、醫(yī)療、企業(yè)、稅務(wù)、電商。。。。等等,每種行業(yè)有有其自身的業(yè)務(wù)特色,干活去吧,都發(fā)現(xiàn)架構(gòu)的不足了,那就繼續(xù)完善吧。coding~~~~~好了,針對業(yè)務(wù)的支撐層也開發(fā)完畢了。通過實踐運行不錯。。。。。 這時你的框架成了公司的某一業(yè)務(wù)線的開發(fā)平臺了 。。。。如果繼續(xù)留在公司,你也許會不斷完善其業(yè)務(wù)建模的支撐體系??上?,你可能換工作,換工作就意味這換行業(yè)。之前積累的業(yè)務(wù)體系完全行不通啊~~~悲劇了,沒辦法,從小弟開始做起吧,虛心學習業(yè)務(wù)基礎(chǔ) 。。。。

          第七階段,跳槽太多也不是壞事,經(jīng)歷了幾個不同的業(yè)務(wù)線,你敏銳的嗅覺開始體驗到一些獨立與業(yè)務(wù)之外的程序處理規(guī)則。如何能搭建一套快速滿足不同業(yè)務(wù)建模的基礎(chǔ)模型出來,說到底業(yè)務(wù)到了底層還是各種流程,只是每個流程節(jié)點處理的內(nèi)容不同(不是工作流,但有其思想)。這時候,你考慮的問題已經(jīng)不是業(yè)務(wù)建模了,而是業(yè)務(wù)之外的東東,這個時候你會忘記SSH這些所謂的框架,這些都是具體的形式體現(xiàn),現(xiàn)在你需要的是高度的抽象,抽象業(yè)務(wù)之外,流程圖是你研究的核心,因為任何程序其實都可以用流程圖去表述,如何開發(fā)一套流程配置解析引擎呢,神碼業(yè)務(wù)都是流程上的一個節(jié)點而已。只要業(yè)務(wù)流程化,按照我的配置寫入,那么他就可以運行。見山不是山的境界吧哈哈~~~ 到了這一步了,感覺架構(gòu)才是正的開始了。當然框架是拋不開的,現(xiàn)在面臨的問題就是如何利用既有成熟的框架是完成你的這些構(gòu)想,現(xiàn)在的框架開始考慮自己的分層了,內(nèi)核層、安全層、緩沖層、ORM層、異常處理機制、國際化機制等等,是不是一項偉大的工程呢,也許Spring就是這樣子走過來的。完成了這一階段的修煉。那么你還不滿足嗎?恩的確有點就是說不出來,總是有點不滿足?,F(xiàn)在開始討論更深層次的話題

          第八階段,架構(gòu)是有了,你的項目規(guī)模也越來越大了,用這個玩意的人也越來越多了,現(xiàn)在考慮的是如何把你的框架能快速推廣,市場是檢驗產(chǎn)品最好的標尺。是否具有可用性。是否能量產(chǎn)程序員(入門級),是否能保證代碼的質(zhì)量、是否能保證出現(xiàn)問題的快速定位,是否能夠滿足業(yè)務(wù)擴張的需求、是否滿足性能的要求………………….. 咳咳~~一口氣說完 太累了??!這些問題是現(xiàn)在需要考慮的問題了?,F(xiàn)在架構(gòu)的推廣不僅僅是你的團隊在用,也許其他團隊也在用,可惜他們無法得到你的親授,腫么辦?開始文檔化、標準化、提供實例Demo,這些夠了嗎?對了 還不夠,100個程序員有100中獨立風格的編程方式,那就意味這有100個風險的存在,你的架構(gòu)如何屏蔽或者降低這些風險呢?答案呢?就是要用你的架構(gòu)去誘導他們盡量編碼風格一致。其好處不言而喻啊,統(tǒng)一的編碼風格意味這每個程序員都是平等的,從項目角度考慮,那就是把人的風險降低了(包括離職風險)。帶來的另外一個好處就是Review代碼的快捷,統(tǒng)一風格的編碼無需講解 ……. 自己體會吧。說再多也是沒用這個要親自體會的。到了這一階段感覺自己是什么?在雕琢一個藝術(shù)品?哈哈~~ 這個時候更加需要實踐,去完善你的架構(gòu)。因為現(xiàn)在你的架構(gòu)是真正的架構(gòu)吧。這個需要天時地利人和多方面的支撐。能達到這一步的程序員需要的不僅僅是自己的努力了,也需要公司的大環(huán)境……………….. 這就是為何什么程序員需要找適合自己發(fā)揮的平臺。公司成了員工技術(shù)發(fā)展的桎梏。其結(jié)果就是讓其平庸,或者釋放去更寬廣的空間。哇塞。好長久的文章啊。讀者看到這里,需要休息休息了,找?guī)讖埫琅畧D片看看吧~~~也許我的文章讓你費力了?,F(xiàn)在OK了嗎?架構(gòu)可以了吧。恩 還是有差距的。

          第九階段,見山是山,再次回歸項目中來,項目的目的是什么,盈利。這是最本質(zhì)的東西。偏執(zhí)也好、狂熱也罷。這是一條基準,違背這一原則的任何架構(gòu)都是失敗的架構(gòu)。盈利不是結(jié)果,而是項目每一步風險規(guī)避的積累。架構(gòu)這是需要考慮的就是如何讓架構(gòu)能在每一階段都能起到規(guī)避風險的功能呢?這是一個比較空洞的概念。但是這是必須考慮的,涉及到架構(gòu)任何一個細微之處的調(diào)整。從項目開始到投產(chǎn)到維護。。。。這個過程,架構(gòu)如何能保證每一階段的風險規(guī)避呢。或者提供解決風險的更好的方法 ………………………..

          上述為架構(gòu)師修煉的過程,架構(gòu)是具有中國特色的架構(gòu)。不同于國外,一些老外閑的蛋疼去研究,我們都是苦逼的項目中提煉自己,利用8小時睡覺,8小時工作之外的時間去完成這一修煉,上面的文字也是本人的程序開發(fā)的成長歷史,拋磚引玉吧~~希望能對開始“架構(gòu)”你提供一些參考。最后濃縮幾個字,算是文章的目的!

          盈利、重構(gòu)、堅持 。

          posted on 2012-02-26 20:47 paulwong 閱讀(269) 評論(0)  編輯  收藏 所屬分類: SOFTWARE ARCHITECTURE

          主站蜘蛛池模板: 九龙坡区| 荣成市| 合川市| 沅陵县| 安义县| 介休市| 清镇市| 阿克苏市| 石城县| 阆中市| 沐川县| 仲巴县| 周至县| 阿克苏市| 张家川| 繁昌县| 寿宁县| 界首市| 东辽县| 灵武市| 大兴区| 疏附县| 玉溪市| 济阳县| 辽宁省| 辽源市| 象州县| 太和县| 哈密市| 平南县| 曲阳县| 东安县| 万荣县| 辉县市| 太白县| 抚宁县| 密山市| 温州市| 聂拉木县| 冀州市| 阳城县|