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