ejb、spring,這不是java界最有名的兩大冤家,何以把它們扯在一起。其實(shí)spring乃是ejb1.x、2.x的繼承者,正如ejb之前的com、corba。他們的思想一脈相承,那就是企業(yè)級(jí)的組件化思想,也可稱之為理想!
一、非組件化的國(guó)內(nèi)軟件行業(yè)
各個(gè)行業(yè)的企業(yè)總有一些核心業(yè)務(wù),長(zhǎng)久保持不變,新時(shí)期的新業(yè)務(wù)基本上都是圍繞核心業(yè)務(wù)展開(kāi)。很長(zhǎng)時(shí)間以來(lái),it技術(shù)的變化與企業(yè)業(yè)務(wù)的擴(kuò)展存在著很大的矛盾。當(dāng)企業(yè)的新業(yè)務(wù)開(kāi)展之后,如何保證原有業(yè)務(wù)穩(wěn)定運(yùn)行的同時(shí),新業(yè)務(wù)能夠得到it的支持與擴(kuò)展?當(dāng)it技術(shù)有重大進(jìn)展后,如何保證原有業(yè)務(wù)的同時(shí)進(jìn)行新技術(shù)改造?在以上兩種運(yùn)動(dòng)中,如何重用原有的技術(shù)成果?這是每一位負(fù)責(zé)任的系統(tǒng)管理員、cio與及開(kāi)發(fā)商所關(guān)心的事情。遺憾的是,組件化思想及實(shí)踐產(chǎn)生以前,這個(gè)矛盾基本上是極難解開(kāi)的死結(jié)。絕大多數(shù)的做法就是重寫(xiě)。
譬如dos時(shí)代,很多單位都使用了單機(jī)foxbase版的財(cái)務(wù)系統(tǒng),界面雖簡(jiǎn)但穩(wěn)定實(shí)用;到了windows時(shí)代,流行vb、pb,于是系統(tǒng)重寫(xiě);再到b/s時(shí)代,系統(tǒng)再次重寫(xiě);到最近熱炒的ria,系統(tǒng)是不是要再次重寫(xiě)?對(duì)于很多小產(chǎn)商的作品而言,答案肯定是yes。
很多同道可能會(huì)說(shuō),這樣正好???我們才可以不斷地賺錢(qián)。錯(cuò)!
這樣的狀況叫“低水平重復(fù)”,這個(gè)術(shù)語(yǔ)經(jīng)常被國(guó)人用來(lái)痛斥社會(huì)經(jīng)濟(jì)領(lǐng)域的很多不合理現(xiàn)象??上覀冞@個(gè)自認(rèn)為高智力的行業(yè),很多時(shí)候就是在干這種愚事。每到技術(shù)革新,各企業(yè)要重花一次錢(qián)、重學(xué)一次操作、重轉(zhuǎn)一次數(shù)據(jù),折騰得半死;而適應(yīng)不了新技術(shù)的產(chǎn)商,隨被淘汰的代碼一同退出市場(chǎng);適應(yīng)不了新技術(shù)的程序員,只能轉(zhuǎn)行。要想不被淘汰,就必須緊跟時(shí)代風(fēng)潮,不停地把精力放在新技術(shù)上,在領(lǐng)會(huì)業(yè)務(wù)上花的時(shí)間太少,最后導(dǎo)致我們的系統(tǒng)與企業(yè)的業(yè)務(wù)總是差半拍。因?yàn)樵瓤彀褬I(yè)務(wù)搞清楚的程序員大多升官或離職了。
筆者以為這是軟件界,尤其是國(guó)內(nèi)軟件界混亂的根本技術(shù)原因。由于技術(shù)長(zhǎng)期得不到積累,我們不得不一次又一次吃外國(guó)的人剩飯。
那我們終究需要怎樣的軟件才能解決這些問(wèn)題。
其實(shí)答案早就在我們身邊晃了太多年,偏偏我們視而不見(jiàn)。大家接個(gè)新外設(shè),要不要換主機(jī)?加根內(nèi)存條、換塊顯卡、聲卡要不要換主板?os是不是只能用幾個(gè)特定的硬件,跑幾個(gè)特定的程序?而大家在os下寫(xiě)的程序,是不是在系統(tǒng)新版本運(yùn)行不了?答案基本上是否定的。
os可以適應(yīng)全世界數(shù)以萬(wàn)計(jì)的程序及其發(fā)展,為什么我們的應(yīng)用程序不能適應(yīng)哪怕一個(gè)特定單位的變化和發(fā)展。為什么我們的應(yīng)用系統(tǒng)到了新環(huán)境下就要重寫(xiě)?
原因就在于我們大多數(shù)應(yīng)用程序規(guī)范性太低、耦合度太高。
要提高規(guī)范性、降低耦合度,就要不斷地設(shè)計(jì)、不斷地分層、不斷地抽象、不斷地重構(gòu)。當(dāng)我們終有一日把有用和成熟的代碼封裝成jar或是dll,不僅自己能重用,別人也能重用的時(shí)候,代碼其實(shí)才算合格。
現(xiàn)在大家都習(xí)慣用開(kāi)源產(chǎn)品了,外國(guó)人熱衷的就是不斷地制造這樣的零件(組件)或技術(shù)。而我們中國(guó)人,熱衷的卻是組裝人家的零件和技術(shù)(一如其它涉及技術(shù)的產(chǎn)業(yè))。很多外國(guó)人十多歲就做出了了不起的組件,而我們中國(guó)人卻把“不重復(fù)發(fā)明輪子”這種搬來(lái)的話掛在嘴在,結(jié)果是既不制造舊輪子,更沒(méi)有能力發(fā)明新輪子。很多人從業(yè)十多年都寫(xiě)著亂糟糟代碼。
項(xiàng)目,不是說(shuō)東西扔到客戶手上套足了錢(qián),拍拍屁股就走人。成功的項(xiàng)目,要對(duì)客戶負(fù)責(zé)任。就算自己退了,也該把工作交接好。前面的工作成果后面用不上,只能說(shuō)前面的工作不合格。
國(guó)內(nèi)應(yīng)用軟件界一直在走rad的道路,一開(kāi)始吃著爽,越到后面越不是滋味。不是說(shuō)rad不能用,而是說(shuō),一上來(lái)就rad,注定被養(yǎng)成懶漢,早晚淪落成編碼機(jī)器。rad誘使我們逃避思考,誘使我們逃避設(shè)計(jì),最終讓我們被早早淘汰!
二、ejb、spring的組件化實(shí)踐
在ejb之前,大家所知的com和corba已然火過(guò)一頭了。這說(shuō)明國(guó)外企業(yè)在經(jīng)過(guò)長(zhǎng)時(shí)間的信息化實(shí)踐后,已經(jīng)深受上面所說(shuō)“低水平重復(fù)”的非組件環(huán)境之苦。com和corba的確解決了一些問(wèn)題,但還沒(méi)有成為那種完整、成熟的體系。所以當(dāng)初ejb出來(lái)的時(shí)候,業(yè)界瘋狂熱炒。這一方面是商業(yè)原因,更重要的是企業(yè)及開(kāi)發(fā)者對(duì)組件化的熱切理想。其實(shí)ejb的確是成功地解決了很多問(wèn)題,但由于一開(kāi)始就定位在高端,技術(shù)上相當(dāng)復(fù)雜,導(dǎo)致眾多開(kāi)發(fā)者真正未能掌握,由此而產(chǎn)生了很多失敗的項(xiàng)目。
這個(gè)時(shí)候,ms的.net開(kāi)始熱了起來(lái)。.net其實(shí)整個(gè)思想體系都是參照j2ee的。不過(guò)沿襲了ms產(chǎn)品一貫的易用風(fēng)格,中小系統(tǒng)實(shí)現(xiàn)比較容易。但凡事有利有弊,ms為了迎合初學(xué)者偷懶的心理,架構(gòu)上的rad風(fēng)格是相當(dāng)明顯的。很多人不知不覺(jué)中又被養(yǎng)成了懶漢。這導(dǎo)致很多開(kāi)發(fā)者拿著.net這種oop的企業(yè)級(jí)技術(shù),繼續(xù)做過(guò)去那些高耦合的系統(tǒng)。最終結(jié)果,不論是開(kāi)發(fā)者還是公司,都將重蹈以上筆者所說(shuō)的覆轍。
應(yīng)該說(shuō),j2ee一上來(lái)就強(qiáng)制開(kāi)發(fā)者考慮oop、分層、解耦、重用,這些很復(fù)雜但最重要的事情,最終必然后落得個(gè)“曲高和寡”的結(jié)果。但如果開(kāi)發(fā)者真能以程序設(shè)計(jì)作為自己的畢生事業(yè),就一定可以在java的世界里經(jīng)過(guò)痛苦摸索,掌握軟件的精髓。
而后,火熱的spring運(yùn)動(dòng)開(kāi)始了。rod集多年企業(yè)級(jí)開(kāi)發(fā)的功力,創(chuàng)造性地開(kāi)創(chuàng)了簡(jiǎn)化版的ejb:spring framework。這里有個(gè)前提,那就是rod多年企業(yè)級(jí)開(kāi)發(fā)的實(shí)踐,包括ejb的實(shí)踐。正是這個(gè)精通ejb的天才人物,才可能對(duì)ejb進(jìn)行簡(jiǎn)化和發(fā)揮。國(guó)內(nèi)很多人自此運(yùn)動(dòng)后,把ejb以至于sun形容得一文不值,卻忘了自己每天都在用java這一偉大的語(yǔ)言,并實(shí)踐ejb這一技術(shù)所傳承的組件化思想。而初學(xué)者在不明就里的階段,只記住了spring的簡(jiǎn)化,卻不知實(shí)踐組件化的根源所在。也就是說(shuō),不是spring不好,而是說(shuō)大家應(yīng)該充分領(lǐng)會(huì)spring所一脈相承的組件化解耦思想,而不只盯住spring的簡(jiǎn)化。
自此,java界開(kāi)始了無(wú)盡的混亂。人們每天都在考慮如何“簡(jiǎn)化”j2ee,以至于把j2ee簡(jiǎn)化到web+db,簡(jiǎn)化到php那樣高耦合的程度,或者騎墻式的ror。歷史再度倒退,組件化面臨嚴(yán)重危機(jī),甚至于堅(jiān)持組件化的java也被殃及池魚(yú)。
這里不得不稱贊一下jdon和當(dāng)家人banq。其實(shí)有一陣筆者也是spring運(yùn)動(dòng)的熱心擁護(hù)者,對(duì)banq的ejb論調(diào)相當(dāng)不感冒。待自己暈頭轉(zhuǎn)向了兩年,重回jdon,這才體會(huì)到banq的苦心。
正如眾所周知的英語(yǔ)學(xué)習(xí)無(wú)捷徑,好的程序設(shè)計(jì)同樣沒(méi)有捷徑。
banq這幾年冒天下之大不韙,一再堅(jiān)持重申這個(gè)世間最簡(jiǎn)單的真理,的確是值得敬佩的。
三、堅(jiān)持組件化,打造真正的軟件工業(yè)
軟件發(fā)展到今天,其實(shí)應(yīng)該并且能夠進(jìn)入到工業(yè)時(shí)代了。
前面所說(shuō)的企業(yè)軟件危機(jī),既是技術(shù)問(wèn)題,也是產(chǎn)業(yè)問(wèn)題。
今天,地球人的各種產(chǎn)業(yè)都是大分工、大合作的工業(yè)化產(chǎn)業(yè)鏈。生產(chǎn)效率提高了,就業(yè)人群也隨之增加。在封建時(shí)代,大家都搞小作坊和行會(huì),總覺(jué)得如果放開(kāi)了,分工后大家會(huì)沒(méi)飯吃。但資本主義的實(shí)踐表明,越是分工合作程度高的產(chǎn)業(yè),規(guī)模越大。原因很簡(jiǎn)單,在生產(chǎn)效率提高的同時(shí),消費(fèi)被極大地刺激,以至于產(chǎn)業(yè)膨脹的速度仍趕不上消費(fèi)。像現(xiàn)在的汽車,分工合作程度極高,使發(fā)達(dá)國(guó)家的人們買(mǎi)了一輛再買(mǎi)一輛,換了一輛再換一輛,結(jié)果是整個(gè)汽車產(chǎn)業(yè)的繁榮。
我們軟件業(yè)(尤以國(guó)內(nèi)為甚)其實(shí)也一樣,表面上是沒(méi)事可做,事實(shí)上是由于軟件業(yè)整體的低效率,導(dǎo)致人們用不起軟件,或不敢用軟件。成天忙于低水平重復(fù)導(dǎo)致的低水平局部競(jìng)爭(zhēng),企業(yè)真正關(guān)心的很多需求得不到滿足。長(zhǎng)久之后企業(yè)在信息系統(tǒng)得到的回報(bào)太小,自然不愿意花錢(qián)在信息系統(tǒng)上。
其實(shí)大多數(shù)開(kāi)發(fā)人員和開(kāi)發(fā)商,都想充分滿足客戶的需求??上銕资?hào)人,打個(gè)比方,如果從種橡膠、挖鐵礦、到設(shè)計(jì)車型,焊接,推銷。什么都要做,只怕是連小推車也造不出來(lái)的。
所以我們一定要分工合作。
現(xiàn)在電腦有了,os有了,db有了,編程語(yǔ)言有了,這些最難做的基礎(chǔ)工作外國(guó)人都做了。但進(jìn)入企業(yè)級(jí)領(lǐng)域仍有無(wú)數(shù)的工作在等著你。國(guó)人在這一點(diǎn)上缺乏合作精神的劣習(xí)暴露無(wú)遺。明明只是精通業(yè)務(wù),非要對(duì)設(shè)計(jì)指手劃腳;不過(guò)是分析專家,非要對(duì)不熟的技術(shù)挑三撿四;明明可以沿用原系統(tǒng)的精華部分,非要替換以示高明;更有不懂事的毛孩子,自以為可以用rad搞定一切。很多國(guó)人的牛人都一種普遍的“超人”意識(shí),老子天下第一,其他人都是垃圾。殊不知軟件業(yè)太大太復(fù)雜了,再新手的同道,也有很多你不知道的重要知識(shí)和奇思妙想;再高的所謂大蝦,也有無(wú)數(shù)的盲點(diǎn)和愚見(jiàn)。
所以要分工合作,一定要學(xué)會(huì)尊重他人,實(shí)事求是。
至于技術(shù)上的問(wèn)題,其實(shí)以筆者愚見(jiàn)。至少spring已經(jīng)基本上解決了“解耦”的重大難題。大家只要不偷懶,把自已寫(xiě)的、別人寫(xiě)的、書(shū)上看的,網(wǎng)上下的,好好琢磨透了,以spring這種大體上“無(wú)侵入”的框架裝配起來(lái),即可基本上解決組件化的難題。
至于ejb,包括現(xiàn)在相當(dāng)簡(jiǎn)化了的ejb3,由于筆者所知甚淺,不便多述。望高手指點(diǎn)。
每一個(gè)程序員,不要想偷懶,努力實(shí)踐解耦自己的代碼。
每一個(gè)開(kāi)發(fā)商,不要太急功近利,要努力提煉產(chǎn)品的類庫(kù),盡力與其他產(chǎn)商互通互聯(lián)。
每一個(gè)系統(tǒng)管理員、cio和企業(yè)領(lǐng)導(dǎo)更要謹(jǐn)記:高耦合的系統(tǒng)不能要、無(wú)類庫(kù)封裝的系統(tǒng)不能要,無(wú)測(cè)試的系統(tǒng)不能要、無(wú)類庫(kù)文檔的系統(tǒng)不能要。
這樣才可以杜絕國(guó)內(nèi)急功近利的低水平軟件橫行市場(chǎng),早日迎來(lái)中國(guó)軟件的組件化時(shí)代,形成健康、有秩、高效的軟件行業(yè)。
新聞熱點(diǎn)
疑難解答
圖片精選