炒冷飯:關于選擇框架(或稱通用成熟技術)
(加Java少許)
一直以來都習慣性的使用成熟的框架來進行開發工作,卻沒注意過為什么要這么干,仿佛只是“從惡如崩”。最近在維護一個遺留系統時,完全是jsp+servlet來做的。思考使人進步,小弟不才,在郁悶之余就是抓著頭發胡思亂想。結果就是,俺對成熟框架技術的傾向性更加明顯了。
為什么要用框架來工作
單單用最簡單的技術不好嗎?比如jsp,或者進一步再加一點servlet。偶認為,做個測試,驗證個事情,這些簡單的東東,用的技術越簡單越好,簡單上手快,從頭到尾2分鐘就驗證完了;要是用框架,恐怕先把架子搭起來就10分鐘過了。
簡單的驗證可以天馬行空隨心所欲,但是做應用做產品就不一樣了。對于一個企業級的應用系統來說,可維護性、可測試性和團隊開發的便利性等等等等是更重要的。顯然對于這些特性,公開的框架技術比私有開發的技術有更多的優勢,(或許)更重要的是現在流行的這些框架技術同時還提供了很多企業級特性,比如日志、事務,這些特性經過了很多人的驗證,基本來說肯定比自己簡單實現的要更可靠。
開源框架技術相對私有簡單技術來說,有一個突出的優勢,使用人群。使用人群大明顯的意味著兩點好處:一、更多的問題別人都遇到過,可能都有辦法解決了已經;二、更多的文檔,哪怕很少的人把他們的經驗寫下來,因為人群基數大,文檔總數也會是驚人的。
不光是開源的框架,很多大企業也有自己內部的應用框架,江湖傳聞東軟就有:),這種公司內部的基礎架構也是很有優勢的,是公司持續的投資,技術的積淀。當然積淀下來要變成糞堆您別找俺,俺離那好遠好遠:)。俺親歷過Jade,IBM的一個類似Struts但歷史應該更悠久的MVC框架,做的很不錯,活的很好,IBM很多應用都是這個東西在下面頂著。
如何選擇一個合適的框架
在偶看來,如何選擇 一個合適的框架,要從幾個方面綜合考慮。
首先,目標框架是不是被大眾廣泛接受的,拿大家見的最多的MVC框架來說,SpringMVC、Struts、webwork2、Struts2、Tapstry、JSF都符合這一條件,他們都各有廣大的使用群。
其次,開發人員是不是對目標框架比較了解,移植到新技術框架上開發的成本有多大,不能為了嘗試新的框架技術而拿新項目來做試驗,除非客戶的銀子和周期可以任意揮霍,或者能完全引導客戶。
然后還有就是要考慮到項目的可維護性,不能一個項目采用一個框架,后期維護起來還要額外的熟悉技術的成本。當然單純從開發人員的角度來說,這樣或許也不錯,可以熟悉各種技術,做萬金油比較容易。對于一個大項目分幾個組來分別共同完成時,很容易在這點上出問題。林子大了什么鳥都有,用的技術太多了,換個坑蘿卜栽不下去,工期耽誤肯定難免了。(最近俺是深受其害呀:()
還有一種情況,其實沒的選擇,比如你進入一個公司,他們恰好有自己的一套東東,這時候就只好用了。非要另起爐灶,估計你就得被掃地出門了。不過這種情況一般都會有人培訓下:),不會上來就讓你胡來的。
加強選定的框架
依托一個框架工作久了,自然而然的就會遇到一些情況。比如,需要一個新的功能,而選擇的框架本身沒有提供;已有的功能用起來總是覺得別扭,和自己的思路不太對應等等。舉個比較遙遠的例子來說,2003/2004的那個年末年初struts大概在0.9版,那個時候是沒有DispatchAction可用的,于是乎江湖中出現了若干實現這一功能的方式。(大體都是走反射的路子,直到1.1版本出現,具體"歷史-版本"可能對應不夠準確,但這個事件確實經歷了:))。
但對公司內部應用框架來說可能比較麻煩了,不一定有源碼可改啊(更甚者,改了被人罵啊)。只能一邊反映問題、一邊找彎路了。或許還要偷偷祈求寫基礎框架的人不是那么的SiBan,能很快出活。
選用框架可能面臨的風險
對于一個穩定的團隊,貿然選用不熟悉的技術肯定是存在風險的。其實這種情況在軟件開發來說很常見,畢竟新技術層出不窮,這時候除了公司給予必要培訓(很少有公司培訓你)以外,就只能靠“積極加自我修養”了。
開源技術有個特點--版本更新快,尤其在剛推出的時候。這時就有個問題了,APIs的穩定性,不同版本之間的兼容性。舉例來說,Hibernate大家都用過,2和3之間別的不說,包名都變了。另外開源框架的技術支持也是個問題,畢竟沒有商業支持嘛,出了問題更多的只能靠埋頭鉆研、前輩提攜和江湖救急了。
對于有內部基礎框架的公司來說,其實這個不是問題,唯一的問題就是,這個基礎框架夠不夠結實,可千萬別豆腐渣了,讓干活的兄弟們受罪啊。
使用框架技術是一種流行,但是不應該像流行感冒一樣,莫明其妙就讓它流行,否則這么多的框架技術就會弄你個百毒俱侵,必須加以甄別,。希望本文能夠對迷茫的人有所幫助,至少這碗冷飯能讓您打個牙祭。
btw:冷飯吃壞肚子原則上偶不承擔任何法律責任,但愿意提供無償紅十字援助。
--- 很久之前的一篇文章了,忘了什么原因沒貼出來。今晚整理垃圾箱的時候翻出來的。