相比於 Django、Pylon 等 Python 框架,Ruby on Rails 是否有很大的技術優勢?
如果有優勢,主要的技術優勢是什麼呢?
我實習時候的指導老師(純潔的白羊座 @清風 )在給實習生上第一節課的時候說過這個問題,大概的意思是:你的應用做的越大,框架能提供給你的東西就越少。新型框架在一開始開發的時候會帶來很大的效率提升,但是往後發展的時候,這種幫助會越來越少,自己的設計會越來越多。
大概是這樣的原因,豆瓣至今還在用 Quixote,因為除了路由分發,其他部分任何框架都已經提供不了太大的幫助。框架提供的是框架的工作模式。
所以我覺得對於一般的應用來說,如果能從框架中得到效率優勢,那麼 Ruby on Rails 也好,Django 也罷,誰多一點誰少一點關係並不很大。反而文檔質量、社區活躍程度、有質量的用戶數量(就是在 StackOverflow 或者郵件列表有中能真正解決問題的用戶數量),這些非技術因素影響會更大。框架和框架之間當然有區別和優勢。
比如 Spring 的事務管理。比如 Rails 的快速原型。另外,「輕型框架 Quixote,Sinatra,node 的一些框架」,甚至「沒有框架」,也是一種框架。
而選擇框架,應該說不是技術人員考慮的問題(現代語言上的差異,有時候小到根本不值得一提)。架構師才需要考慮這些。
考慮 Scalability 下的成本,用 Spring 的伺服器集群來管理事物,是否要比上 Oracla 集群便宜?
考慮快速原型,用 Rails 是否能在一個月內拿出個可用的東西給 VC 看?
考慮用戶有郵件模版編輯和自動分發的需求,因為 PHP 有現成的產品,是否優先選擇他?
考慮系統涉及大量個人數據,基於安全性的考慮是否選擇 Java 的框架?
當需求更多樣化的時候,還可能需要混合多個框架。
Spring 的 API + Rails ?
如果有簡單事物的大量並發,是否考慮加入 Node?
如果有大量數據的簡單索引,是否考慮 NoSQL 資料庫?
為了多種語言下的不同的庫都很重要,是否考慮用 Python 做粘合劑?
今天混合框架已經很常見了。今後,語言和框架恐怕也難以出現大統一。既然大家各占擅場,根據需求組合才是明智的選擇。
個人感受
ruby在DSL上有很大的優勢。用來測試的rspec非常好用。 自動化的測試非常重要,沒有測試,很多東西根本就沒辦法做。
元編程。python的程序員似乎很排斥這個,ruby則覺得這東西很好。
django的源代碼很長,越長就越不好讀。老大要我在many to many表中加個method,我記得我至少改動了3,4個地方才把這個method改過來(不排除我的方法有問題)。覺得理想狀態是只要更改一個地方就好。
Berkeley講開發選擇了rails,而且在berkeley此前的課程完全沒有ruby。而且berkeley的cs61a,人工智慧,都是學python的。
Berkeley在software as a service這門課程的書中說
Why Ruby and Rails? Why Not Java, C++, Python, or Scala?
We want students to understand that in the real world, programmers are rewarded not for the number of lines of code written or for how quickly they can 「bash out」 a feature, but for functionality delivered with high assurance of stability and while keeping the codebase beautiful andmaintainablefor continued growth. To many students, especially 「hotshot」 coders who come into a software engineering course with nontrivial programming experience, the methodologies and techniques we use to do this—design patterns, refactoring, test-first development, behavior-driven design—seem a strange and a dubious use of time.
We have found that students are more likely to gradually embrace these practices if given the best possible tools to support the practices. The Rails community has created by far the most seamless, elegant, and comprehensive tool set to support Agile and XP, and the idea of constantly refining and inventing tools that support testing as well as helping produce beautiful application code is a distinguishing characteristic of the Ruby developer ecosystem. While learning Ruby and Rails will be new to most students, juniors and seniors seem to learn it without difficulty, and far superior tools outweigh the learning costs.
A common counterargument in academia is 「Our curriculum already teaches language X, so upper-division courses should leverage that knowledge.」 We believe this approach optimizes for the wrong thing. First, software professionals are routinely expected to learn new languages by applying concepts from languages they already know, so 「learning how to learn」 new languages is a good skill to cultivate in class. Second, a language that makes it difficult to write and test beautiful and concise code is a poor vehicle for teaching those techniques, so the only investment being 「leveraged」 is syntactic knowledge, a hurdle surmounted with relative ease. Thus, even if our students never use Ruby again, they will have learned how to reduce to practice such important ideas as metaprogramming, higher-order programming, functional programming, and use of closures in the service of higher productivity and more maintainable code. We believe these skills will transfer to new languages, framework, and programming systems. Our survey of alumni of the course that led to this book (see Chapter 13) suggests that our belief is well founded.
有一點我感覺很好用,就是資料庫遷移(migration)功能,Rails是自帶的,而其他Python框架都是通過插件去實現的(Django在1.7版才在核心功能中實現migration,目前還在開發中 Migrations | Django documentation )
在開發中小網站時rails是最快的 rails可以在一分鐘內就可以自動生成原型 這是其他框架做不到的 rails的集成方案封裝很全 是社會化編程的典範 插件和擴展遠超其他的框架 解決方案和資料都跟很豐富 ruby具備其他語言羨慕的完善的元編程機制 會註定它的智能性比其他框架較高
缺點也很明顯 集成度過高會導致臃腫和性能降低 網站規模過大需要依賴架構 ruby社區也在解決這個問題 開發了好幾個精簡和高性能框架 比如sinatra railsapi等 其他的語言也都在學習和模仿rails 差距已經不大了另外一個缺點是國內的雲平台基本都不支持ruby的 歷史原因導致的 隨著國內php的不斷擴張和nodejs的興起 rails在國內已經錯過了最佳發展期了 至於未來rails能否再度火起 就看37signal公司和社區如何面對新的html5浪潮了
Rails在web開發效率上(這裡只說web),我個人覺得要比Python的web framework有優勢,具體都優勢大概有三個方面:
語言上
雖然Ruby和Python在許多方面很像,但是也有不少差別,總體來說Ruby要比Python靈活(特別是meta programming),所以Ruby更容易創造出expressive的框架,框架也更容易把更多的overhead解決掉。
設計上
Rails是典型的C2C,convention可以很大的加快開發效率(當然也有種種弊端),而Python崇尚explicit,所以要寫的代碼會多一些,也沒那麼多的magic,但是學習起來容易些,不會不小心犯錯誤。
Ruby幾乎整個社區都著重在web development上,而且集中在Rails,所以許多新的idea被創造出來(Cucumber, Capybara, Sprocket, Capistrano/Mina),而且gem/bundler讓package management更容易,生態系統更發達。而Python的話,Django自己一套生態系統,但是業有許多其他的框架,資源分散,而且其他框架很難成氣候,加上Python另一大應用實在科學計算上,所以感覺在web開發的生態系統不如Ruby發達。
Rails適合產品的快速開發,但當用戶數量達到一定級別後,效率是很大的瓶頸。
好幾個公司隨著後續的發展,都選擇了拋棄rails,重新覆寫,例如twitter:ruby -&> java,還有前不久說的將rails換成go之後,伺服器從30降到了兩台。
當然,作為一個Rails的學習者,我必須要說的是:如果你是一個初學者,或者是剛作出產品的人,請不要把你的精力放在效率問題上。
關於rails的優勢:
- 強大的gem機制。
- MVC模型設計(好過Django的)。
- ORM方案(開發者基本不用擔心資料庫類型的變化,因為語法一樣,find_by_XXX)。
- ruby本身強大的語法(當然python也不賴)。
優勢很大。rails可以快速做出產品上線,rails提供一個完整的框架和最佳實踐。這是python框架沒法比的。
A輪B輪用 ruby,python
C輪後用 java 重構。
我現在正在寫一個Railss的系統:hot13399/stockshare_rails · GitHub
給我的感覺是Rails確實自動化程度很高,實現RESTful的增刪改查就需要幾行代碼。我僅僅使用過 Ruby on Rails。實際來說,框架往往不是最主要的,用的順手,如果有團隊,適合團隊的技術棧的選擇。所有的決定都不是簡單的好與壞的問題……適合的才是最好的。
框架的優勢一般都在產品初創階段能體現出來,不如 Django 的快速開發。
等業務量上來之後,曾經的優勢往往會變成劣勢。
業務複雜到一定程度之後,都是需要大量的定製,這和語言框架關係已經不大了。
不知道有人是否維護過別人的寫的ROR項目,由於語法的靈活性,加上元編程,幾乎是要了接收人員的親命
優勢不大
ruby的代碼量要少很多,但是效率是個問題,網站大了以後都需要轉java
python的生態不是很了解,但是ruby on rails的優勢在於快速開發原型,不論升級或是適應需求變更,都有很大的優勢,效率是硬傷,不過現在ruby的高手都走更加簡化的框架路線,像sinatra什麼的,也是不錯的選擇。
總的來說,最吸引人的地方,就是快速入門依然喜歡 Rails,只有一個能夠快速檢驗你想法的框架比什麼都重要。
隨便說一嘴,喜歡python討厭ruby,ruby也太隨便了,像個站街女。而python不像java那麼白富美裝逼不好上,也不像ruby一樣給錢想怎麼上就怎麼上,有態度,求簡,但不隨意:我讓你怎麼縮你就得怎麼縮。一言以蔽之,綠茶婊。
我記得前幾年國內用ruby的GEM源網路速度很慢,java 的maven也存在這個問題。好像只有python的django沒有類似的問題。
從一個軟體生命周期來看, 一點優勢都沒, 只是前期開發效率快點, 軟體後期的優化, 性能的提升, 那做什麼還得做什麼, 那點工作量跑不了。
推薦閱讀:
※TensorFlow 如何入門?
※可以用 Python 編程語言做哪些神奇好玩的事情?
※Python 的練手項目有哪些值得推薦?
※在大型項目上,Python 是個爛語言嗎?
※對 Quant 而言 Python 的需求高嗎,除 C++ 外還有哪些流行的編程語言?
TAG:Web 開發 | Python | Ruby on Rails | Django(框架) | Python 框架 |