記上海Python社群聚會,談Python和Ruby

robbin發表於2009-08-10
8月9日週日,上海Python社群舉辦了一次成功的技術交流活動。這次活動的會議室本來預定80個座位,但是來得很多人都沒有座位,預計來了將近100個人,其中絕大多數人都是通過JavaEye網站了解到本次活動的資訊。

本次活動的發起人和主持人支曉勇邀請了很多Python社群的開發者,進行了相當密集的topic介紹:

第一個演講的嘉賓是介紹一個python在手機應用上的協議庫實現,可以通過程式設計來實現手機上的很多應用,不過演講者的聲音太小,我沒有聽太清楚;

第二個演講的嘉賓是介紹Python單元測試的Mock框架,他介紹了幾個不同的Mock框架的實現,不過我對這個topic不是特別感興趣;

第三個演講的嘉賓是Leon董,Python社群的大牛,介紹用Python的開源庫寫垂直搜尋引擎,其實真正寫一個好的搜尋引擎是很不容易事情。

第四個演講的嘉賓是沈崴,也是Python知名的牛人,介紹Eurasia開源專案。[url=http://code.google.com/p/eurasia/]Eurasia[/url]是一個用Python編寫的支援長連線的Web框架,可以支撐1萬個以上的併發連線和百萬級別的線上使用者。JavaEye網站以前也發表過採訪稿件[url=http://www.iteye.com/news/3529]Eurasia3 支援百萬級使用者的伺服器和框架 - 國內開源專案介紹(五)[/url]。Eurasia3的程式碼很精煉,他除了是一個支援長連線的Web框架,他還是一個Socket Server,還帶有一個物件導向的資料庫(用gdbm實現)MissileDB,以及自己開發的模板系統等等。Eurasia是一個相當領先和前沿的專案,比較適合作為Web遊戲的伺服器,Web IM伺服器等高效能場合。

我對這個topic的印象比較深的是,沈崴還特別介紹了Python的協程,他說到高併發程式設計的實踐,一開始是用多執行緒,然後是非同步模型,接著是事件驅動,而今後會更多的使用協程的程式設計模型。協程是在一個執行緒當中同時執行多個任務,和多執行緒相比,沒有執行緒切換context switch的開銷,並且協程的任務切換是當任務發生IO操作的時候,因此可以更加有效利用執行緒資源。說到協程,Ruby1.9也開始支援協程的概念,Ruby1.9帶有一個Fiber的庫,叫做“纖程”,也可以實現協程的高併發程式設計。

這次活動大家參與的熱情還是很高的,也確實聽到了很多有價值的觀點。國內的Python應用在最近兩年之內有了飛速的發展,很多網際網路公司都開始使用Python,對Python人才的需求也越來越多了。不過國內的Python社群相對來說比較沉寂,因此希望這次活動是一個良好的開端,JavaEye也會更多的支援和推動國內Python社群的發展。

最近幾年以來,動態指令碼程式語言在國內的得到了越來越多的普及應用,其中Python和Ruby更是佼佼者,經常拿來被比較,我覺得兩者倒是各有特點:

[size=medium]一、Python從語法上來說更質樸一些,而Ruby更性感一些[/size]

Python的語法相對其他指令碼語言來說,沒有太多花巧的地方,顯得比較死板一點,其實從Python強制程式碼縮排也可以看出來Guido設計語言的取向。語法死板的一面就是不容易玩出來更性感的東西,比方說Rails這樣的框架,另外Python也無法做DSL這樣的事情,但是語法死板的另一面就是比較規範,相對來說,更加適應軟體開發的工程性要求,更容易組織大規模的團隊進行開發。

Ruby的語法非常靈活,Matz設計ruby的出發點也是為了coding for fun,因此可以用ruby玩出來很多花樣,運用足夠的技巧,可以用Ruby寫出來逼近自然語言的DSL,對於程式設計師來說,玩ruby確實充滿了樂趣。Rails能在ruby社群誕生,而不是Python社群誕生絕對和程式語言有直接的關係。不過ruby語法靈活的另一面就是程式設計實現風格的多樣性,這對於大規模團隊的協作和管理是一個挑戰。

[size=medium]二、Python的解析器實現更成熟,第三方庫質量高[/size]

Ruby1.9解析器儘管已經有了很大的效能提升和很多新的功能,但是從原始碼實現的角度來說,基本上是通過在Ruby1.8原始碼上打patch來增加功能的。從原始碼的結構來說,Ruby的實現太古老了,Ruby擴充套件起來比較困難,只能不斷打patch。這也是為什麼現在Ruby社群湧現出來那麼多新的Ruby解析器實現的原因。從很大程度上來說,這制約了Ruby的發展速度。相對而言,Python解析器更成熟,也比較穩定。

在第三方類庫的數量上來說,Ruby並不比Python少,但是高效能高質量久經考驗的第三方類庫Python要明顯比Ruby多,事實上很多Ruby的第三方類庫都不太成熟,因此這也很大程度上制約了Ruby的發展。

[size=medium]三、Python的應用領域非常廣泛,而Ruby目前主要侷限在在Web領域[/size]

Python應用的領域非常廣泛,除了web開發以外,還被廣泛用在伺服器後端的高效能伺服器實現,伺服器後端的各種密集運算,全文檢索,各種文字處理,系統管理等等,另外桌面應用領域wxPython也是一個很成熟的跨平臺GUI框架。對於某些特殊的應用,比方說呼叫作業系統核心API,Python也可以完成的很好,比方說[url=http://blog.daviesliu.net/2008/04/24/sync/]大量小檔案的實時同步方案[/url],就是用Python直接呼叫Linux Kernel的inotify特性來實現的。所以可以說Python是軟體開發領域的瑞士軍刀,什麼事情都可以做。

正是由於Ruby解析器和Ruby類庫的制約,Ruby的應用主要侷限在Web開發領域,目前Ruby的應用還無法延伸到web開發領域以外的很多地方。據說豆瓣早期就考慮過Ruby on Rails,但是因為Ruby不能做其他事情,而Python可以大包大攬,最後放棄Ruby選擇了Python。

[size=medium]四、在Web領域Ruby是王者[/size]

隨著網際網路應用更進一步滲透到軟體開發的各個領域,其實web開發佔整個軟體行業開發的比重也是越來越大。儘管Ruby在其他領域很受制約,但是在Web開發領域就是絕對的王者了。Rails框架的領先程度已經遠遠甩開了任何一個潛在的競爭對手十萬八千里。因此儘管Ruby可能有這樣那樣的問題,但是說到Web開發,Rails幾乎就是無可爭議的唯一選擇。

而Python儘管十分全面,卻偏偏在web開發領域不彰,web框架雖然眾多,卻沒有一個真正可以挑大樑,Django雖然在Python社群比較流行,但很多方面也有缺陷。現在的網際網路應用往往都是多種語言混合程式設計,Ruby在Web以外的缺陷也可以用其他語言來彌補。

[size=medium]五、Python的包管理不如Ruby[/size]

儘管Python的第三方類庫更高質量更成熟,但是Python社群缺乏Ruby Gem這樣一個良好的包管理軟體和包釋出的網站。因此應用的構建顯得不如Ruby那麼方便,那麼人性化。特別是在類庫的版本升級上,就會遇到很多麻煩,不如Ruby Gem那麼簡單。

不過總的來說,Python和Ruby還是相似度極高的兩種程式語言,即使兩種程式語言都學習一下也不會浪費太多時間。如果我個人選擇的話,會首選用Rails來構建web應用,再根據情況選擇Python或者Java處理一些伺服器後端的運算。總之,未來還是一個混合程式設計的時代,我們需要多瞭解一些程式設計工具,然後根據需要看菜吃飯才行。

相關文章