一位RoR企業(yè)開發(fā)者的經(jīng)驗(yàn)分享
用ror開發(fā)b/s已有3年了,早在2006年初接觸ror(Ruby on Rails)的時(shí)候,當(dāng)時(shí)國(guó)內(nèi)沒有一點(diǎn)中文資料,但一句“比java高10倍的開發(fā)效率”;讓我去四處尋找ror的英文資料,一個(gè)月以后我就已經(jīng)開始嘗試用ror寫點(diǎn)小東西,然后徹底拋棄java,轉(zhuǎn)向ror。到現(xiàn)在,我已經(jīng)擁有了3年的ror開發(fā)經(jīng)驗(yàn),這三年來,ror讓我的技術(shù)水平上了一個(gè)大臺(tái)階,在開發(fā)的過程中也讓我遭遇到了很多懷疑的目光,與經(jīng)理頂撞,甚至因此失業(yè)。但是我相信真理,相信技術(shù)能改變社會(huì),所以我一直堅(jiān)持ror道路。
做ror開發(fā)最麻煩的就是沒有人可以交流,從網(wǎng)上查詢的資料也甚少,而且國(guó)內(nèi)ror技術(shù)大多用在網(wǎng)絡(luò)社區(qū)上,而我是做企業(yè)開發(fā)的?;旧蠠o人可以交流。既然如此,干脆就把我這幾年的企業(yè)開發(fā)經(jīng)驗(yàn)說出來,與大家共分享。
何謂企業(yè)開發(fā)?
對(duì)于這個(gè)問題,似乎并沒有明確的規(guī)定,不同的人似乎也有不同的理解。從技術(shù)層面來說,我覺得企業(yè)應(yīng)用與一般的網(wǎng)絡(luò)應(yīng)用相比就是多了工作流與報(bào)表這兩個(gè)大的模塊。從技術(shù)特點(diǎn)的比較上來說,一般的網(wǎng)絡(luò)社區(qū)應(yīng)用講究界面人性化,功能點(diǎn)多而雜。而企業(yè)應(yīng)用則不然,企業(yè)應(yīng)用對(duì)界面不太講究,有一個(gè)固定的風(fēng)格即可,功能點(diǎn)少而深。重視數(shù)據(jù),重視流程。所以我重點(diǎn)講講我在ror上運(yùn)用工作流與報(bào)表的經(jīng)驗(yàn)。
舉一個(gè)簡(jiǎn)單的例子,用戶想做一個(gè)采購(gòu)申請(qǐng)單的功能。他會(huì)給你一張紙質(zhì)的采購(gòu)申請(qǐng)單表格(也可能是excel格式的),告訴你采購(gòu)申請(qǐng)單的審批流程,然后要你用軟件實(shí)現(xiàn)這個(gè)業(yè)務(wù)。這是一個(gè)典型的企業(yè)應(yīng)用實(shí)例,拿到這個(gè)需求后來我們?cè)趺磳?shí)現(xiàn)呢?
對(duì)于這個(gè)需求,在真正的企業(yè)開發(fā)中我們需要用流程設(shè)計(jì)器設(shè)計(jì)采購(gòu)流程,用表單設(shè)計(jì)器設(shè)計(jì)每個(gè)流程點(diǎn)上的表單界面(注意在不同的流程點(diǎn)上對(duì)于單元格的可寫權(quán)限不同),設(shè)定好每個(gè)流程點(diǎn)上的權(quán)限,這樣擁有權(quán)限的人才可以進(jìn)入這個(gè)點(diǎn),發(fā)起采購(gòu)申請(qǐng)或者進(jìn)行采購(gòu)申請(qǐng)的審批。然后我們還得有一個(gè)查詢統(tǒng)計(jì)界面,能夠查詢以往的采購(gòu)申請(qǐng)單數(shù)據(jù)。同時(shí)我們***擁有網(wǎng)頁精確打印功能,這樣可以將申請(qǐng)單打印出來蓋章存檔。當(dāng)然表單導(dǎo)出excel和pdf是不可缺少的。別忘了,我們的系統(tǒng)是不能做死的,因?yàn)椴少?gòu)申請(qǐng)單是可變的,也許明年表單格式發(fā)生變化,也許審批流程會(huì)變化。還有,查詢模板也是可增減可變的,天知道領(lǐng)導(dǎo)哪天想查什么報(bào)表。
考慮到上面這些,是不是有點(diǎn)抓狂了?呵呵,企業(yè)開發(fā)確實(shí)比較麻煩,想知道我怎么實(shí)現(xiàn)那就繼續(xù)往下看吧。
對(duì)于上面這個(gè)需求,采用我寫的框架,實(shí)現(xiàn)這個(gè)需求快則10分鐘,慢則30分鐘就可以實(shí)現(xiàn)。我不會(huì)單獨(dú)為這個(gè)功能編寫代碼。所有可變的業(yè)務(wù)邏輯我都用設(shè)計(jì)器來實(shí)現(xiàn)。我的框架很好的實(shí)現(xiàn)了業(yè)務(wù)邏輯(變)與技術(shù)功能(不變)的分離。
我的實(shí)現(xiàn)方式:
1:用我開發(fā)的工作流設(shè)計(jì)器(vc開發(fā),保存為xml格式,遺憾的是改格式不符合國(guó)際標(biāo)準(zhǔn)),設(shè)計(jì)一個(gè)采購(gòu)申請(qǐng)流程,依據(jù)用戶的要求在每個(gè)流程點(diǎn)上指定權(quán)限。保存為xml文件后發(fā)布到系統(tǒng)上。
2:用我開發(fā)的表單設(shè)計(jì)器(vc開發(fā),類似excel,保存為xml),設(shè)計(jì)流程點(diǎn)上的表單,依據(jù)用戶的需求在每個(gè)流程點(diǎn)上表單的只讀屬性可能有所不同,所以可能會(huì)設(shè)計(jì)若干個(gè)表單。保存為xml文件后發(fā)布到系統(tǒng)上,與先前發(fā)布的流程的流程點(diǎn)對(duì)應(yīng)上。發(fā)布表單的時(shí)候系統(tǒng)自動(dòng)解析xml格式,動(dòng)態(tài)建立數(shù)據(jù)庫(kù)表格,添加字段。
3:用我開發(fā)的報(bào)表設(shè)計(jì)器(與2是同一個(gè)東西),設(shè)計(jì)基本的查詢模板,寫好sql語句,保存為xml文件后發(fā)布到系統(tǒng)上。
做完上面3步后,這個(gè)需求就算是實(shí)現(xiàn)了,用戶新建一個(gè)采購(gòu)申請(qǐng)單后看到的表單是純html的類似excel的格式,這個(gè)web form可以在線編輯(這個(gè)地方難度比較大,都是手寫的javascript),點(diǎn)擊保存后后臺(tái)自動(dòng)處理,將其保存到新建立的表中。下一步怎么處理,與其他的工作流引擎是一致的。用戶打開一個(gè)已經(jīng)寫好的采購(gòu)申請(qǐng)單,可以導(dǎo)出為excel或pdf,進(jìn)行二次加工。也可直接網(wǎng)頁打印,是精確顯示的,可直接簽字后蓋章存檔。在查詢界面,用戶點(diǎn)擊一個(gè)查詢,輸入相關(guān)條件后可顯示查詢結(jié)果,以純html方式展示,也可導(dǎo)出excel或pdf(稍微遺憾的是查詢結(jié)果界面沒有圖表功能)。
ok,用戶的需求我們很好的完成了,用戶應(yīng)該很滿意了
下面介紹一下我的框架,也為大家提供一條ror上企業(yè)開發(fā)框架的思路。
擁有企業(yè)開發(fā)框架需要的權(quán)限,日志,工作流,報(bào)表,這是需要具備的基本要素。當(dāng)然還有很多瑣碎的小功能。其中最重要的2塊就是工作流與報(bào)表。
工作流
rubyforge上有一些工作流組件,但逐個(gè)分析后發(fā)現(xiàn)沒有一個(gè)可用的。所以只能靠自己了,我用vc開發(fā)了一個(gè)報(bào)表設(shè)計(jì)器,保存為xml文件后由ruby來解析流程。用自己寫的表單設(shè)計(jì)器設(shè)計(jì)表單,保存為xml,ruby解析后翻譯為html的一個(gè)table,方便精確顯示到網(wǎng)頁上,還要寫一個(gè)復(fù)雜的javascript腳本,讓這個(gè)table可以在線編輯,輸入數(shù)值,字符串,或者顯示下拉列表選擇值。
報(bào)表
我的前公司是做報(bào)表工具的,有c++版的報(bào)表查詢統(tǒng)計(jì)庫(kù),為了能在ror上也使用報(bào)表組件,我做了一個(gè)移植工作,將c++代碼轉(zhuǎn)成ruby代碼,這是一個(gè)比較大大的工程。報(bào)表模板的文件格式(xml格式)遵守之前的格式,這樣,同樣的查詢模板既能在c++程序上使用,也能在ror上使用。
我的ror開發(fā)框架從建立到完善,陸陸續(xù)續(xù)經(jīng)過了1年多的時(shí)間,完成了幾個(gè)真實(shí)項(xiàng)目,有政府的,事業(yè)單位的,公安部門的,甚至還有一個(gè)軟件開發(fā)商直接花10萬買走,后來跟經(jīng)理鬧不快,影響了更多成功案例的涌現(xiàn)??梢哉f我的ror技術(shù)是在他人懷疑的目光中成長(zhǎng)的,但是卻得到了用戶的認(rèn)可。所以我會(huì)一直堅(jiān)持ror道路。
我用ror所遇到的一些問題:
#t#部署。java程序部署方式比較穩(wěn)定,一般很少出現(xiàn)java服務(wù)堵死,需要重啟的情況。但ror部署后沒那么穩(wěn)定。最近幾個(gè)月,我用ror為公司寫的一個(gè)oa部署后發(fā)現(xiàn)外部并發(fā)訪問多的時(shí)候mongrel容易出現(xiàn)僵死的情況,幾經(jīng)折騰后無奈我只好切換到了82端口,總算穩(wěn)定了。以前我的系統(tǒng)一般部署在企業(yè)內(nèi)部機(jī)房中,有硬件防火墻幫我攔住了非法訪問。但是換了其他的環(huán)境mongrel總是會(huì)提示有非法訪問,非法訪問多了以后mongrel就死翹翹了。這相比于iis簡(jiǎn)直差的太遠(yuǎn)了。ror的部署我還需要繼續(xù)探索穩(wěn)定的方式。
ruby代碼加密。企業(yè)應(yīng)用一般都是把系統(tǒng)賣給客戶了。企業(yè)知識(shí)產(chǎn)權(quán)保護(hù)是個(gè)大問題。我想我肯定不是***個(gè)遇到此類麻煩的人。我做了一個(gè)工具,專門加密ruby代碼。找到ruby的源代碼,稍微做了一下修改,遇到加密的代碼先解密再執(zhí)行,解密后的文件不保存在磁盤上。***的解決了ruby代碼加密的問題。這和php的zend加密方式似乎差不多。