rails開(kāi)發(fā)與java 編程的比較
rails 開(kāi)發(fā)人員常常把 java 開(kāi)發(fā)人員看作是沉悶而勞碌的老古董。我認(rèn)為 ruby 語(yǔ)言在復(fù)雜性方面會(huì)更易于調(diào)整,因?yàn)樗峁┝藢?duì)更高級(jí)語(yǔ)言和特性(如開(kāi)放類(lèi))的支持,以及具有更少配置需求和更簡(jiǎn)單、集成化編程模型的 rails 框架。rails 視圖框架是從頭構(gòu)建的,以便與 activerecord 集成(rails 持久性框架)。
rails 開(kāi)發(fā)人員常常把 java 開(kāi)發(fā)人員看作是沉悶而勞碌的老古董。而 java 崇拜者則常常認(rèn)為 ruby on rails 只是一個(gè)玩具,根本不能用于任何嚴(yán)肅的軟件開(kāi)發(fā)。作為一名對(duì)這兩種技術(shù)都有著廣泛使用經(jīng)驗(yàn)的顧問(wèn),我認(rèn)為真實(shí)的情形介于這兩種觀點(diǎn)之間。由于跨越邊界 系列文章即將結(jié)束,因此我打算對(duì)它們?cè)僮饕淮伪容^。本文并非考察某種特殊的技術(shù)或語(yǔ)言,而是主要介紹我當(dāng)前正在從事的項(xiàng)目,并將它與我以前從事的 java 項(xiàng)目進(jìn)行比較。另外,我建議您閱讀“跨越邊界”系列的前幾期文章,對(duì)相關(guān)主題作更深入的了解。這種直接的說(shuō)明可讓您在二者之間權(quán)衡利弊,并可能使您在數(shù)據(jù)庫(kù) web 應(yīng)用程序 green-field 的開(kāi)發(fā)中通過(guò)使用 rails 獲益。
業(yè)務(wù)問(wèn)題
關(guān)于本系列
在跨越邊界 系列文章中,作者 bruce tate 提出這樣一種觀點(diǎn),當(dāng)今的 java 程序員們可以通過(guò)學(xué)習(xí)其他方法和語(yǔ)言更好地武裝自己。自從 java 技術(shù)明顯成為所有開(kāi)發(fā)項(xiàng)目最好的選擇以來(lái),編程前景已經(jīng)發(fā)生了改變。其他框架影響著 java 框架的構(gòu)建方式,從其他語(yǔ)言學(xué)到的概念也可以影響 java 編程。您編寫(xiě)的 python(或 ruby、smalltalk 等語(yǔ)言)代碼可以改變編寫(xiě) java 代碼的方式。 本系列介紹與 java 開(kāi)發(fā)完全不同的編程概念和技術(shù),但是這些概念和技術(shù)也可以直接應(yīng)用于 java 開(kāi)發(fā)。在某些情況下,需要集成這些技術(shù)來(lái)利用它們。在其他情況下,可以直接應(yīng)用概念。具體的工具并不重要,重要的是其他語(yǔ)言和框架可以影響 java 社區(qū)中的開(kāi)發(fā)人員、框架,甚至是基本方式。
不論是 ruby on rails 框架還是任何 java 框架都不能解決所有問(wèn)題。為了提高成功的幾率,需要長(zhǎng)期、細(xì)致地考察業(yè)務(wù)問(wèn)題,理解周?chē)母鞣N假定情況,以及了解您的團(tuán)隊(duì)。只有這樣才能選出正確的語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā)。
去年,arvato systems 聘請(qǐng)我?guī)ьI(lǐng)團(tuán)隊(duì)構(gòu)建 changingthepresent.org,它是一種新平臺(tái),用于將非贏利性團(tuán)體和捐贈(zèng)人組織在一起。與很多 internet 公司一樣,我們向客戶展示了可購(gòu)買(mǎi)的實(shí)際產(chǎn)品。與其他公司不同的是,這些 “產(chǎn)品” 指的是提供機(jī)會(huì),比如:一名癌癥研究員一小時(shí)服務(wù)收費(fèi) 50 美元、幫助盲人收費(fèi) 30 美元,或者保護(hù)一英畝雨林一個(gè)月收費(fèi) 20 美元。我們面臨兩大挑戰(zhàn):一份很緊湊的時(shí)間表和長(zhǎng)期的復(fù)雜性。
開(kāi)發(fā)工作從九月份開(kāi)始,要求必須在十一月份之前建立起一個(gè)站點(diǎn),以便有機(jī)會(huì)趕上圣誕節(jié)期間的通信量高峰。(最終我們超出了十一月份這個(gè)期限兩星期。)在其他開(kāi)發(fā)語(yǔ)言中,基于 java 的解決方案可能要花費(fèi) 6 到 18 個(gè)月才能完成這一任務(wù)。因此生產(chǎn)力是一個(gè)很重要的考慮因素,這與 java 部署思想相悖。
通過(guò)對(duì)競(jìng)爭(zhēng)對(duì)手和項(xiàng)目的考察,我們了解到:我們希望能夠每天給站點(diǎn)帶來(lái)幾百萬(wàn)次點(diǎn)擊的通信量。而我們需要每天有幾十萬(wàn)次成功的點(diǎn)擊,因此可伸縮性也是一個(gè)考慮因素。這與 java 部署思想相符。
最后,我們了解到:發(fā)布初始站點(diǎn)只是一個(gè)開(kāi)始。我們只實(shí)現(xiàn)了總體規(guī)劃的百分之三。因此我們所選的技術(shù)需要根據(jù)復(fù)雜性和負(fù)載作出一些調(diào)整。我認(rèn)為 ruby 語(yǔ)言在復(fù)雜性方面會(huì)更易于調(diào)整,因?yàn)樗峁┝藢?duì)更高級(jí)語(yǔ)言和特性(如開(kāi)放類(lèi))的支持,以及具有更少配置需求和更簡(jiǎn)單、集成化編程模型的 rails 框架。
雖然我們面臨著時(shí)間和可伸縮性方面的挑戰(zhàn),但是也擁有一些其他的有利因素。我們擁有一張完全空白的候選名單:可以選擇想要的任何技術(shù)、任何團(tuán)隊(duì)??梢远x項(xiàng)目、培訓(xùn)和全部的技術(shù)。我們可完全自由地作出選擇。
java 語(yǔ)言是一種優(yōu)秀的通用語(yǔ)言。它總是應(yīng)用于新的技術(shù)領(lǐng)域,如嵌入式系統(tǒng)和移動(dòng)設(shè)備。java 語(yǔ)言在廣泛關(guān)注的集成方面也表現(xiàn)優(yōu)秀。它具有高性能、流行并受到平臺(tái)的良好支持。但是正如您在本系列中所了解到的那樣,java 語(yǔ)言并不是用于數(shù)據(jù)庫(kù)支持的 web 應(yīng)用程序的 green-field 開(kāi)發(fā)的最佳選擇。
相比之下,ruby on rails 框架則是新的。并沒(méi)有很多人使用 rails 開(kāi)發(fā)高通信流量的站點(diǎn),并且?guī)缀醪淮嬖谑裁词褂?nbsp;rails 多年開(kāi)發(fā)項(xiàng)目的經(jīng)驗(yàn)。但它仍然是一種高生產(chǎn)力的數(shù)據(jù)庫(kù)支持的 web 應(yīng)用程序開(kāi)發(fā)的框架。最后,盡管我們對(duì) rails 缺乏開(kāi)發(fā)長(zhǎng)期項(xiàng)目的經(jīng)驗(yàn)和并未得到廣泛部署有所顧慮,但那份緊湊的時(shí)間表驅(qū)使我們選擇了 ruby on rails。
作出這個(gè)決定之后,我們發(fā)現(xiàn)招募項(xiàng)目人才非常容易。我們還發(fā)現(xiàn)早期的生產(chǎn)力優(yōu)勢(shì)非常顯著 —— 甚至比預(yù)期的還要好。我們確實(shí)遇到了一些早期的穩(wěn)定性問(wèn)題,因此加強(qiáng)了測(cè)試工作的力度。此后穩(wěn)定性得到了極大的改進(jìn)。
原理
每個(gè)框架設(shè)計(jì)者都使用一組假定來(lái)構(gòu)造該框架的重寫(xiě)原理。學(xué)習(xí)遵守該原理的約束可使您愉快地進(jìn)行編程,而挑戰(zhàn)這些約束則會(huì)使您的編程受挫。rails 框架和 java 框架擁有很多不同的原理。
rails 是一種集成框架,需要使用高度利用 ruby 語(yǔ)言的動(dòng)態(tài)本質(zhì)。rails 開(kāi)發(fā)人員強(qiáng)調(diào)框架的生產(chǎn)力特性而不是工具特性,并且常常將 web 架構(gòu)看得非常簡(jiǎn)單,在本系列的前幾篇文章中您已了解到這一點(diǎn)。java 設(shè)計(jì)者通常必須分塊地組合開(kāi)發(fā)環(huán)境,獨(dú)立地選擇持久性、web 和集成層。他們通常嚴(yán)重地依賴工具來(lái)簡(jiǎn)化核心任務(wù)。web 架構(gòu)設(shè)計(jì)趨向于較為復(fù)雜。
完全集成
java 框架往往是解決一個(gè)小問(wèn)題(比如持久性或查看組織),而 rails 則是一個(gè)集成環(huán)境。rails 開(kāi)發(fā)人員的優(yōu)勢(shì)在于不必解決與許多不同框架集成的問(wèn)題。大多數(shù) hibernate 開(kāi)發(fā)人員陷入了過(guò)早關(guān)閉與 java web 框架之間的連接的陷阱。rails 視圖框架是從頭構(gòu)建的,以便與 activerecord 集成(rails 持久性框架)。當(dāng)您考察用于 web 服務(wù)、配置和插件的 rails 框架時(shí)也會(huì)發(fā)現(xiàn)類(lèi)似的經(jīng)驗(yàn)。java 編程支持各種不同的框架,對(duì)于所有這些框架使用不同的集成策略。
java 開(kāi)發(fā)人員的優(yōu)勢(shì)在于選擇。如果您需要從頭構(gòu)建一個(gè)框架,則可能要考慮使用基于 sql 的解決方案用于數(shù)據(jù)庫(kù)集成(如 ibatis 或 java 編程中基于 jdbc 的包裝框架之一)。反過(guò)來(lái),如果要使用一種古老的模式進(jìn)行編程,則可能要使用對(duì)象關(guān)系映射框架(如 hibernate)。相比之下,如果您使用 rails,則擁有一個(gè)主要選擇:activerecord。這意味著 java 框架提供了更多的選擇,有時(shí)能提供更好的集成開(kāi)發(fā)項(xiàng)目的解決方案。但是由于我們要開(kāi)發(fā)一個(gè) green-field 項(xiàng)目,因此選擇算不上是一個(gè)問(wèn)題。
評(píng)論