Ruby on Rails的缺点和警告[关闭]


25

这不是RoR打击的开端-老实!

我正在学习Ruby和Rails框架。从表面上看,它看上去很酷,与PHP相比,它是一种很棒的体验。(实际上,这让我想起了使用C#和.NET的美好时光。)

但是,进入这个过程,我对这种框架或语言没有任何经验,而且我很好奇-开始时希望知道哪些当前的缺点或事情?

(也许这应该做成社区Wiki?)


我尝试过一次rails,并在意识到难以实现数据库优先实体设计时停下了脚步。
猎鹰

5
avdi.org/devblog/2011/08/22/your-code-is-my-hell值得一读。我要补充一点,对于任何动态类型的语言,拥有80%或更多的测试覆盖率非常重要,否则重构几乎是不可能的。
埃里克·威尔逊

使你的问题更具体和平衡(即“切换从PHP和Ruby on Rails的-优点和缺点)将删除需要否认扑的自己和社区的wiki的愿望。
托马斯·兰斯顿

2
@Thomas但这不是我的问题!PHP的优缺点是众所周知的。RoR的优点很容易找到。但是,作为新来者,RoR的缺点并不容易发现,我怀疑只有多年的经验才能发现它们。其目标是从别人的经验中学习。我读过的许多CW在本质上都是非常具体的。
马蒂

Answers:


32

这是从经验学习,继续学习以及在Rails中编写相对简单的应用程序中获得的。

1)学习曲线

Rails看似简单。这些教程,视频和书籍都展示了您可以多么迅速地获得一个正常运行的应用程序(如果很丑),但是这些实际上只是表面上的问题。他们倾向于严重依赖代码生成和“脚手架”,这在学习时固然是一个很好的工具,但很快就超过了它的用处。

毫无疑问,Rails很难掌握。一旦您掌握了最基本的知识(稍后会详细介绍),如果您需要做的事情远远超出您所吹捧的极其简单的“演示应用”功能,那么您将无所适从。您可以在学习时掌握Ruby的基本知识,但是很快就需要学习Ruby,否则,DRY如果您需要脱离Rails的限制,就会变得无所事事。

我喜欢用一种爱的方式来称呼它,Rails是用数字编程绘画的。如果您100%遵守约定(即保持习惯并使用被告知要使用的颜色),则可以快速轻松地制作出不错的应用程序。如果并且当您不得不偏离时,Rails可以从您最好的朋友变成您最大的敌人。

2)当你所有的都是锤子时...

Rails非常擅长简化CRUD应用程序。当您的应用程序要做的不仅仅是从数据库读取/写入时,就会出现问题。现在,为了记录在案,我使用的上一个Rails版本是2.3.4,因此此后可能有所变化,但是当业务需求更改时,我遇到了主要问题,因此该应用程序必须内置一个小型工作流系统并与之集成旧版PHP应用程序。Rails的“一种形式,一种模型”约定对于琐碎的应用程序和数据输入应用程序很好用,但是当您需要执行处理逻辑,拥有工作流或不是典型的“用户将数据输入到一些文本字段,点击“提交”类型的内容。它可以做,但它绝不是“易”,或者说:这不是什么

另外,Rails不喜欢与其他未使用其首选数据访问方法的应用程序很好地兼容。如果必须与不具有“ Web 2.0”样式的API的应用程序接口,则必须解决Rails而不是与其一起使用;我再次根据经验讲,这就是发生在我身上的事情。

3)这是新的

最终,Rails在许多领域仍然是“新手”。这对于个人使用或“我认为很酷并且想学习”这种类型的场景都没有关系,但是如果您不在Rails所在的位置,请作为愿意在我的日常工作中使用Rails的人讲话作为一个Rails开发人员,要找到全职工作可能非常困难。在大多数大都市地区,它仍然主要是“ hip,新创业公司”的领域,而不是主要参与者。在这方面,您的行驶里程可能会有所不同,但是我知道我所在的区域(坦帕)的Rails本质上是不存在的。

4)火与运动

Rails不断变化。这既是好事又是坏事。这是件好事,因为社区在不断发展并接受新的概念。这很糟糕,因为社区不断发展并接受新的概念。对于Rails的新手来说,这可能是非常不堪重负的,因为通常当您遇到问题并四处张望时,您会看到有人推荐这样的宝石来修复它,或者说这种方式很不好,您不应该如果不使用它,这是一个更好的方法……您最终将获得一份额外的工具清单,以与Rails一起学习,以跟上Rails的认知。之类的东西GitBDD/RSpecCucumberHaml/Sass,以及其他各种事物的聚宝盆,它们在Rails-land成为“正确的做事方式”,并被推而广之。从经验上讲,您可能最终会被淹没,试图 Rails 之外学习更多或更多的技术,因为使用标准的Rails工具包感觉“不正确”。

Rails 3.1现在使Sass和CoffeeScript成为所有事物的默认值,这使情况更加复杂,因此,一个总的Rails新手不仅必须学习Ruby和Rails,而且还需要Sass(如果您知道CSS的话可以说很简单)和CoffeeScript(并不疯狂,但可以肯定)至少与原始JavaScript完全不同),并且可以假定为Git。即使不考虑RSpec和朋友,以及通常会遇到的十几个或更多宝石,在认真开始编写Rails应用程序之前,您还必须学习4种不同的东西。将此与C#,Java,甚至PHP的语言进行比较,您的HTML / CSS / JavaScript / SQL知识不会改变,您只需要学习该语言本身,也许还可以学习框架的细微差别。


3
WRT Rails 3.1 Sass&CoffeeScript是可以轻松关闭的默认设置。实际上,由于Rails 3.1使用SASS的SCSS语法,“普通” CSS才可以使用。您可以使用它们,但不会受到任何强迫。WRT Git我认为Linus可以更好地解释为什么无论使用什么框架,您都应该真正使用像Git这样的DVCS。youtube.com/watch?v=4XpnKHJAok8
Shreyas Satish

噢,我同意,只是说Rails的默认设置通常会被大肆宣传,因此新手会感到压力很大(我知道我有这种感觉)
Wayne Molina

3
为#4 +1 ...如果您离开Rails一年,当您回来时,每个人都会在太空飞船中飞来飞去,并且您会在乘船游览中思考wtf吗?在发布Rails 3之前,Rails 2的语法已经过时了。
jimworm 2011年

-1不错的重击帖子,但您甚至不建议其他选择。“嵌套表格”是一个棘手的问题,Rails可能比任何人都能更好地解决它。
scottschulthess 2012年

13

文档。

尽管Rails Guides是很好的学习资源,但是Rails(通常是Ruby)库参考并不容易浏览。假设您想进一步了解belongs_to方法。尽管它用在ActiveRecord::Base子类(一个人的模型)上,但没有记录在ActiveRecord::Base文档中,而是记录在该类导入的mixin中。本质上,您看不到可以在一个位置上对一个对象使用的所有方法的完整列表(除非您启动irb并检查该对象本身)。

对于像Ruby这样的高度动态的语言,要说出您所使用的方法从何而来并不容易。这可能是个问题,特别是对于那些试图掌握新技术堆栈的学习型程序员。


这对我来说是杀手。每当我需要调试一些Ruby / Rails代码时,我总是花太多时间来弄清楚给定方法的定义位置。甚至即使这样,也必须始终牢记这个主意,就是因为我可以看到方法定义,所以可能在其他地方重新定义了该方法定义。
2011年

9

Ruby on Rails具有重要的学习曲线。首先,您必须学习语言的特殊性,然后学习框架,然后学习Rails的处事方式,然后了解许多常用的Gems。

但是,当您了解了这些内容后,它的确会自然而然地出现。实际上,其他框架开始让人感到负担。

Rails非常面向TDD / BDD,因此,如果您不是这样,那么在成为合格的Rails程序员之前,您还必须学习两件事。您没有编译器和IDE来备份您,因此测试覆盖率很大程度上是您的后备。

许多TDD倡导者,包括我本人在内,都会认为这是RoR的优势之一,也是它的诅咒。一旦开始编写TDD,您会发现测试覆盖范围提供的安全性优于编译器提供的安全性。然后只需要编写代码来取悦编译器就成了负担。

TDD在RoR中感觉不像是一项额外的任务,而是唯一的工作方式。

Rails存在一个严重的性能问题:每个请求都在当前活动的请求之后排队,而不是像大多数框架那样对它们进行线程化,或者像Node.js和Twister那样允许阻塞事件释放其他请求。这意味着您必须编写代码以缩短响应时间,但是在大多数情况下这很容易做到。

Rails的设计也非常好,可以很好地处理内容系统,公平地说,这是很多Internet的内容。做一些稍微复杂的事情,例如网络游戏或电子商务系统,意味着学习新的宝石。您很快就会知道所有的宝石都在那里,但是您想要做的事情越模糊,找到好的文档就越困难。


关于性能问题-我似乎回想起曾经读过的内容,其中很多已经在解释器v1.9中得到了解决,但我可能完全错了。有什么方法可以克服此性能限制?
马蒂

1
@Matty:正如我所添加的那样,编写代码以使响应时间尽可能快。可以将任何留给后端进程的操作都这样做。但是,然后您应该使用任何框架进行操作,这很容易做到。而且,jRuby的线程不同,但是它确实有其自身的问题,我的回答已经足够长了。
pdr

7

以我的个人经验,主要的头痛是兼容性

什么时候:

  • x部署轨项目,
  • 每个项目都使用y宝石。
  • 虽然有n护栏的版本,
  • 加上m已安装宝石的版本,
  • several红宝石版本,
  • 在单个Linux机器上作为生产机器。
  • 程序员在另一个OS X开发笔记本上工作。

作为一个自由职业者,谁不奢侈到更新/升级大部分的东西,会面临很多的兼容性问题从上述变量...同时railsgemsruby不断变化/演变。


7
您提到的所有内容都通过使用RVM(或rbenv)和Bundler进行了修复。然后,您可以为每个项目拥有特定版本的Ruby和孤立的gem集。
阿什莉·威廉姆斯

这个答案(现在)是完全不相关的。RVM管理Ruby版本控制,Bundler处理gem版本控制;Capistrano负责处理生产服务器的部署,而Figaro负责处理应用程序秘密/环境变量。我在[Cloud9](c9.io)(一个Web IDE)上开发了应用程序,而部署过程实际上是bundle exec cap production deploy。Capistrano负责对服务器上的应用程序进行版本控制。像其他任何出现的框架(例如Node.js)一样,工具也可以解决您的问题
克里斯·西里菲斯

5

速度绝对是一个问题。Ruby的极高灵活性带来了显着的性能损失。

除了为该任务专门设计的技术外,水平缩放是一项显而易见的任务,通常要权衡简单性才能很好地进行缩放。
如果使用技术A可以处理每台计算机的请求数量是使用技术B可以处理的请求数量的100倍,那么值得考虑使用技术A,前提是您有理由相信可以在一个时间范围内从单个服务器提供数据,从而可以添加之后并行化。
2009年,仍然通过一台Web服务器提供stackoverflow 。当然,这不再是一种选择。但是我认为他们从一项技术开始就很好,该技术可以在单个实例上扩展到很多用户,而不必担心扩展。

相比之下,RoR确实很慢。处理简单请求的时间很重要,因此处理许多客户端是一个问题(这与更快的替代方法有关)。

为了模糊的定位,这里有一些数字,将适用于Web开发的其他各种语言与Ruby进行了比较:

请注意,这并不意味着,如果您将X框架用于Java,它将比RoR快200倍。但是,这些基准测试中测得的速度差异对应用程序的整体性能有重要影响。


4
该答案仅涉及运行时的“速度”。Ruby(和Rails)针对开发速度进行了优化。
Nicolai Reuschling,2011年

5
这不是一个很好的比较。Web请求中花费的大部分时间是从数据库执行I / O。链接到CPU密集型基准会产生误导。
ryeguy 2011年

3
@pdr:很多twitter的问题是他们在所有事情上都使用ruby ,甚至包括 CPU密集型的后端进程。像这样的区域都是静态类型的语言。他们现在使用Scala。老实说,我确实相信在开发时间上使用RoR比C#或Java快得多。我将其用于大多数Web应用程序,然后将C#或Scala用于任何CPU密集型后台工作。
ryeguy 2011年

3
+1,表示有效分数。话虽如此,您可以做很多事情来优化Rails应用程序。机架使自己成为一个相当可扩展的系统,该系统在调用一切方面提供了很大的灵活性。更不用说,Ruby 1.9更快,JRuby更快。我个人是JRuby的忠实拥护者,能够混合使用JVM的能力是一次了不起的胜利(请小心使用异常进行流控制的宝石->大量开销)
Xorlev 2011年

2
@Nicolai Reuschling:“优化开发速度”对Ruby或RoR有何价值?你能否提供可验证的定量的数据红宝石实际上如何提供更高的发展速度比替代品(电梯为例)?其他任何事情都只是无效声明。另外,这个问题是关于RoR的缺点。高开发速度是一个优势,因此不在此问题的范围内。较差的运行时性能在此问题范围内,因为这是一个缺点。
back2dos

3

Rails存在一个严重的性能问题:每个请求都在当前活动的请求之后排队,而不是像大多数框架那样对它们进行线程化,或者像Node.js和Twister那样允许阻塞事件释放其他请求。这意味着您必须编写代码以缩短响应时间,但是在大多数情况下这很容易做到。

我认为这是非常误导的。您可以在多线程模式下运行Rails。在多线程模式下运行时,应仅使用释放GIL的IO库(例如'mysql2'gem),否则它将变得毫无意义。

如果您使用的是jRuby,则只需在多线程模式下运行单个rails进程即可充分利用所有可用的CPU能力。但是,如果您使用MRI(Ruby 1.8.x或1.9.x),则必须运行多个进程才能充分利用CPU,node.js也是如此。


这里有一个澄清问题-是否有一种简单的方法来找到哪个IO库发布GIL?
马蒂

我认为弄清楚这一点的最佳方法是对它进行基准测试gist.github.com/35d4769d8c8c0dfafc56
Pratik Naik


很高兴收到一位核心开发人员的来信!此信息未在任何文档中列出吗?开始测试库来发现这一点有点繁琐(尽管很有趣)。
Matty

3
  • Rails有很多优点,可以使您摆脱复杂性。(ActiveRecord关联,整个验证/保存生命周期,基于提供的标头的请求数据的解释)刚开始时,这很棒。随着您的成长,您会发现您开始使自己的应用适合“ Rails方式”来处理事物-有时这很好,有时这是无害的,有时实际上与您尝试做的事情背道而驰。并非所有数据库表都应建模为对象,验证步骤可能需要在其他地方进行,等等。许多Rails程序员都避免不与框架作斗争(这通常是明智的),但是这样做的长期影响是...您将把Rails的习惯带到您不一定需要的地方。

  • 该社区有一种习惯,即编写被称为“魔术”的软件-缓存可以正常工作的库!先进的I / O神奇地使您更快!魔术魔术!通常这里的情况是为缺乏的技术解决方案提供了非常有吸引力的API,而您被这些漂亮的示例所欺骗,该示例可以满足您的要求,直到后来发现它涵盖了一个不完整的解决方案。这样的周期是相当恒定的,您可以学习滚动它,但是您一定应该熟悉阅读很多依赖的代码的想法(一件好事!)。我说的是,Rails社区的魔术解决方案不像自述文件所建议的那样魔术。

  • 上面的推论:您使用Rails的次数越多,应该阅读的源代码越多。您对框架内部的了解越深,长期的满意度就越高。这并不是真的特定于Rails,但我只是从经验中告诉您。方法名称有时会向您承诺您实际上没有得到的东西。

  • 货物崇拜是与Rails有关的一个问题,但是对于所有框架/语言社区来说,这可能是正确的。在Rails中(对我而言)似乎更明显,因此趋向于使Rails代码看起来很古怪-当您在不同的Rails项目中工作时,您会注意到某些趋向于背离创建它们的时间段。从该声明中可以猜到,社区在采用新解决方案和弃用旧解决方案方面趋向快速发展。您应该真正了解Ruby新闻,只是要了解您每天都会遇到的一些代码。

  • 总体而言,我认为社区通常无法很好地解决数据并发问题-随着应用的发展,当您需要分片数据,物理回滚远程更改并锁定对数据的访问时,解决方案就变成了稍微多一点的手工调整,这会使Rails看起来不错的事情变得更加混乱,而又没有准确性的技术要求。我想我想说的是,Rails并不能解决您使用Web应用程序时遇到的所有问题,尽管创建者当然没有宣扬该信息,但很容易被愚弄以至于暗示它是隐含的。


2

根据您的看法,Rails更改的速度可能对您来说可能是警告,也可能不是。随着越来越多的东西从需要解决的问题中脱颖而出,情况每年都会发生根本性的变化。

如果您处于积极的开发中,那么您将全力以赴。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.