使用 Python、Perl、PHP、Ruby 等指令碼語言開發 Web 程式,跟使用 Java 開發 Web 程式相比有什麼優勢?

來源:互聯網
上載者:User

回複內容:

兩行python鳴翠柳,一坨java上西天。。。呵呵噠大家都提到了開發快,我再提另一個:調試、測試都更加便捷。

一方面,靜態語言編譯時間比較長,無論是調試和測試都不如動態語言快捷。我記得前段時間寫 Android 程式,調試和跑測試都要經過漫長的編譯、構建打包,我只好一邊看電影一邊等(編譯一次半分鐘左右,就先看個半分鐘電影)。
另一方面,靜態語言為了可測試性,已經往“動態”的方向做了許多努力。最明顯的例子就是諸多 Java 開發架構都使用依賴注入容器來生產對象,以增加可測試性。看看它們是如何?依賴注入的——寫 XML 設定檔(或者 Annotation,一回事)然後運行時 DI 容器用反射 API 來動態執行個體化對象。想到這裡我就想笑——靜態語言將編譯期-裝載期-運行期三段嚴格分離,結果架構卻費盡心思將裝載期的動作轉移到運行期。繞這麼大一道彎,為何不直接使用動態語言呢?

動態代理實現 AOP 什麼的,在 Java 架構中能炒出一堆概念,這在動態語言中早就是大家的日常了。靜態語言打的多數是“有編譯器檢查”、“效能更優”兩個旗號。這兩個旗號中,前者根本保證不了什麼——沒有測試僅僅靠編譯器的檢查,後果是不堪設想的;後者在上述第二點中已經消磨得很厲害了,DI 容器、AOP 容器實現的動態化,效能上是沒有辦法和原生動態語言在 VM 核心中的實現相比的。加上 Web 應用程式一般不是處理器密集型,瓶頸一般在 IO 而不在運算,所以語言層面上跑迴圈、調函數高出來的那一點點效率根本算不了什麼。

這些問題其實在大多數開發中都存在,不過在 Web 應用程式開發中暴露得特別明顯,我想這和 Web 應用程式的快速生命週期有關。Web 應用程式的開發中,極快速迭代、大量依賴測試兩個特點使上述問題被放大了,所以我想這也是為什麼 Web 應用程式的開發大家更喜歡選擇動態語言。總的來說並不是Web程式的問題,而是Java這種語言在現在的編程時代已經過時了。

Java誕生在那個OOP(物件導向編程)的時代,它的設計初衷是用來完成一些非常巨大的軟體工程的,在那個時代人們相信模組化、正常化、可重用性比什麼都重要,而OOP是這些問題的唯一解決方案。而在互連網時代,代碼規範性和重用性的重要程度下降了,快速、可用比任何指標都重要,因為慢意味著死。甚至,互連網時代的許多開發是允許一部分bug存在的,只要他們沒有嚴重到影響使用者體驗。而FP(函數式編程)概念的興起也在劇烈衝擊Java的“一切都是對象”的世界觀。

Java程式通常是冗長、有非常多個檔案組成,而且不把他們全部閱讀一遍根本無法理解這些代碼。很多檔案僅僅定義了對象應遵循的規範(也就是interface),而沒有做任何實際的工作,但如果不做這樣的工作就無法實現代碼重用。許多個物件僅僅包含了一組資料而沒有任何實際的方法,而這些資料必須首先定義儲存變數、然後為每個變數來定義一組getter和setter來確保良好的存取控制能力。
即便你遵循了這些所有的原則,當你發現原來的interface定義並不能滿足實際需要,而需要增加新的介面函數的時候,你將面臨著修改所有interface實作類別的窘迫情形。如果這個新特性僅僅在一部分實現這個介面的類中存在,那你的麻煩就更大了,你必須要定義一個新的interface並實現舊interface,然後將帶有這個特性的類重新實現新的interface。這使Java程式員變得不願意修改介面實現,而是通過添加各種hack來完成功能,導致本來應該模組分明、結構清晰的代碼變得模組間強耦合、難以理解,越來越多的hack最終讓程式變成一場災難。

相對的,指令碼語言都是強調實際功能的,基本上不存在不完成實際功能的代碼。動態語言特性使得修改資料結構變得異常容易,尤其配合json等序列化演算法,很大程度上對於沿襲自C/C++的“不是嚴格定義的資料結構便無法儲存”的概念是一場革命。動態語言甚至可以更簡單的實現可複用性,比如對於python來說,很多庫函數並不要求傳入的參數是某個資料類型,而是只要具有某個名稱的屬性或介面便可以使用。最根本來說,指令碼語言用定義的嚴格性來換取程式設計的靈活性,這樣的程式不僅代碼量少,而且“船小好調頭”,才能適應互連網時代需求經常發生變化的快節奏的開發模式。

Java、C/C++這類編譯語言在開發非常複雜的系統的時候仍然是很有用的,但是對於互連網應用來說,這麼複雜的系統不多。說動態語言開發快的還算可以接受,說測試調試快我覺得真的是有些扯淡了。

無論是Java和C#,大家說起調試,預設的一定是IDE,斷點,單步,動態語言呢?恕我對這些動態語言不熟,js這些年總算是可以在瀏覽器裡面單步了,服務端的node有好用的單步debugger嗎?python呢?pdb?ruby用什嗎?我真不知道,順口問了一下旁邊喜歡ruby的同事,回答是,好像有吧。說動態語言調試快的,你們真的覺得println的調試方法比IDE的斷點單步快?

說Java打包發布要半天的,這個不算錯,可你拿android來舉例算什嗎?我們好像是在說web開發對不?先說說android,android慢是因為google做的android模擬器太慢,我當初做android的時候,用vbox做模擬器,從改完代碼點debug按鈕到停在斷點處一般不超過20s,喘口氣的時間是有的,要說喝咖啡看電影,還真來不及。

再說web應用的打包重啟問題,跟動態語言完全不用重啟比起來,我每天重啟個七八次還是有的,但是,誰告訴你們每次修改代碼一定要重啟的?eclipse內建的tomcat外掛程式每次都要你重新發布jsp才會生效那是因為那個外掛程式太爛,還有很多好用的外掛程式,幹嘛非要用那個殘廢?java代碼誰告訴你要重啟才會生效的?說這話的人肯定沒聽說過jrebel吧?就算不用jrebel,hotspot本身支援代碼熱替換,你們知道嗎?哦,你們公司的java程式員告訴你不行?那就是為什麼他工資沒我高的原因(如何在java web開發中避免重啟: http://www.zhihu.com/question/20218920/answer/34155532 的後半段)。

再來說說編譯檢查的問題,說編譯檢查沒什麼用,反正有測試保證的,你們的代碼做重構嗎?在IDE裡面對Java代碼做重構,所有的參考關聯性都可以得到正確保證,這都得益於靜態類型和編譯檢查,動態語言的重構有怎麼容易嗎?search and replace?別說有什麼特牛x特強大的重構工具之類的,自己摸著良心說一句,有Java/C#這種靜態語言這麼方便,這麼安全嗎?你還在修複測試的時候,我已經push代碼了好嗎?

動態語言的好處就只有一個,開發快,可以快速的做出能用的原型來,這個在互連網時代是有重要意義的,誰也抹殺不了,但我們為什麼還要用java來做web?因為java的靜態特效能夠給代碼提供更長的生命週期,java好用的IDE能夠大幅度提高代碼調試的效率,當code base大到一定規模後,好用的IDE單步斷點調試的優點是非常重要的,因為通讀代碼理解前後關係的效率是絕對比不上一個斷點的。

好吧,我其實就是吐槽。開發速度快?其實未必,java web開發有最成熟的架構吧,我覺得不是開發塊。

而且java又比較強大的ide,如eclipse,調試之類的非常方便的。

指令碼開發的話,我覺得主要是輕量,即不需要外圍的許多工具即可,而且部署也簡單,比如使用perl開發:

1. 下載mojolicious 這個模組:cpanm Mojolicious 然後就裝好web架構了。
2. 使用mojo generate lite app 然後就產生一個web網站的模板了。
3. 你稍微改改,根據需要寫點東西。
4. 使用 perl script/myapp.pl 就啟動這個網站了。

ps: perl web開發還是很高效的,推薦用Mojolicious這個架構,代碼風格非常好,即時,非阻塞,基於事件,依賴少,安裝便捷:)優勢就是開發快,很多人提到了。DHH(Rails的創造者)也寫過一篇文章說他為什麼不用Java而發明Rails進行Web開發。

我只說一下調試的問題,既然有人問起。其實Ruby/Python這類語言的命令列調試工具就跟GDB差不多——用過GDB的就知道,其實也很好用的。當然如果想用IDE那也是有的,Eclipse就有外掛程式,或者用其他一些Ruby/Python的IDE即可。其實對Web開發而言,能用IDE調試的情況非常少見——除了在本地測試環境下調試代碼,其他情況基本沒用。我做Web開發這麼些年,沒用過IDE調東西。命令列調試器可以讓你在遠程機器上,比如staging 甚至 production環境的機器上,比較方便地調代碼,因此實用性更高一些。不過話說回來,在Web debug時,絕大部分情況下是看日誌,各種日誌,來分析問題,由於分布式系統的複雜性。真正需要用debugger的時候只是最後你通過日誌把問題根源基本鎖定了在一個很小的、可調試的範圍了以後。

Anyway,你熟悉的工具對你自然有優勢。你不熟悉Ruby,只熟悉Java,那Ruby再快你也用不到。更多時間寫代碼,更少時間配環境。
在一台只有標準 Python 環境和 JDK 環境的 OS X 系統上,pip 安裝 flask 寫好一個 hello world 的時間,估計 Tomcat 還沒下載啟動完成……沒什麼優勢。
關鍵看你熟不熟。
  • Java 世界也有快速開發架構,其底層更加成熟,懂的人照樣快速開發。比如 grails 和 play
  • 指令碼語言架構剛開始提供了腳手架和模板,讓你快速搭建原型,但真做起應用來你要是不熟還是兩眼一碼黑,速度慢下來。
  • xml 被很多人吐槽臃腫沒錯,但定義好的 xml 可以在很多 IDE 或者編輯器裡輕鬆實現 DSL 代碼提示,嚴謹又方便。
總之運用之道,存乎一心。rails敲兩行命令,模型增刪改查和資料庫表建立都做完了,30s。前者能夠流行起來最重要的是輕量。

Java 當然很強大,但是太端正了。
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.