这是一篇意译文,翻译自 DHH( Rails 创始人 ) 在 Quora 上的 Rails 问题回复.
近期,看得出社区里一些人对 Rails 发展失了一些信心,我想为大家找回一些信心。
译者:技术达人李亚飞,现任百分之八十公司 CTO, 团队有 7 位全栈 Rails 工程师。
以下为正文
2004 年,我们选择 Rails, 那么今年,我们也会因为同样的原因选择 Rails.
越是事情变化,他们越是保持不变。
这些年 JavaScript 世界有着大量的进步,但我们也看到了倒退的世界,而这些正在 Rails 前年就为大家解决掉了。
回到当年,J2EE 是商业复杂架构的首选,后来的事,大家都知道了:Rails, PHP 等轻量解决方案占了上风。
但是今天,在 JavaScript 世界里,问题竟与当年惊人的相似。开发者花费数小时,甚至数天,只为完成一个基本框架的设定。他们只是从各种库里找到自己的工具,把它们组装起来,从未满意过。
Rails 的核心原则非常独特,虽然也一直有争议,那就是约定大于配置. 有了它,我们可以移除很多无意义的选择,提供一个默认就非常先进的全栈 web 框架,帮助人们构建先进完整的应用。通过它,开发者可以获得巨大的生产力。
众多所知,Rails 也因此而获取得巨大的成功。不过令我惊讶的是,在这点上,世界上竟然没有多少同类的竞争对手。今天,大多数框架仅停留在给用户提供另一个点菜单,另一个构建系统,或者另一个视图库,再或者另一个 ORM. 很少有框架是提供完整解决方案的。
我想,就标题的问题来讲,答案就是,Rails 的约定大于配置核心原则能够有效帮助开发者减轻选择轮子的痛感。通过减少无意义的选择,接受社区的约定,和按照 web 开发中基本问题的约定,你将变的更出色,更高产。少一些无意义的独特性,不必关注最小剪裁,这些东西根本没有意义。
无论如何,这就是 Rails 核心原则的巨大吸引力。我已经在其他地方进一步详细阐述了在 Rails 核心原则中关于配置的约定方法,以及点菜 / omakase 冲突的说明,和集成系统的吸引力以及 Rails 社区的其他核心价值。笔者注:可以到 DHH 博客里了解一二。
如果读过这些资料之后,你应该能准确判断出 Rails 是否适合你了。如果你还不能意识到其中的争议,或者你只是不喜欢这些争议中提出的解决方案,那么 Rails 技术的细节可能并不重要。如果这些能够引起你的共鸣,或至少对此你有兴趣,请继续。
从 Rails 的这个核心原则之上,我们构建了一个难于置信的无比强大的 web 框架,它是实际用户需求驱动,并且多范式设计,满足大多数人需求,并兼具一定自由度。当人们听到 "web 框架", 有时他们会想,"哦,那只是一些生成 HTML 的东西,是吗?". 在这种看法下,有的开发者可能认为这跟 React 之类前端框架是竞争关系。我认为这或许有点关系,但区别还是非常大,如果因此而错失 Rails, 这个决策真的是因小失大。
正如我上面提到的,Rails 有一个雄心勃勃的终极使命,那就是站在全栈的角度下,帮助开发者处理好过程中的每一块代码,从连接到数据库,到 nosql 数据存储,到业务模型,到控制器,直到最后,输出 HTML. 实际上,最后一步输出 HTML 仅仅是我们关注的很小一部分。
所以,如果你认为客户端的 MVC 框架如 React, Angular 或者其他框架是未来,你仍然是 Rails 的目标用户。因为除了组装 HTML 外,你在后端仍然需要大量的工作:数据库存储,业务模型,计算事情,将任务排队以供日后处理,发送电子邮件,触发推送通知以及所有其他的东西,真正的应用程序需要做的还有很多。
这才是 Rails 的核心所在:处理 POST, PUT 或者 GET 请求之后的事情。虽然 Rails 默认是全栈包括 HTML 端渲染,并且我们缺省提供了 Turbolinks 和 SJR 供大家选择,但如果这条路不那么有吸引力,也可以很容易进行替换。高效安全生成 JSON 数据同样是 Rails 追求的事情。
无论如何,就在 2017 年,Rails 在这两条基本原则下仍然是远超其他框架的:
rails new
开始你的项目时,它将为你提供无与伦比的生产力。而且,最为重要的是,我已经把 "樱桃" 留下了。现在就开始使用 Ruby 吧。就算这些年是人们重新发现函数式编程和不变性数据理念价值的时代,Ruby 仍然是我遇到过最漂亮,最奢华的语言。
相信我,只需给你看几行代码,我就能肯定你会爱上 Ruby.
5.times { puts 'I love ruby' }
原文链接:WinDy 博客
值得学习是肯定的,其实光是过一遍 guides 花不了多少时间。作为曾经 github 上 star 数量最多地项目,难道你就没有兴趣来了解一下它的设计吗?
当初没有深入了解 ruby 的时候认为 ruby 的语法中有 end,是丑陋的,当时很喜欢 python,使用缩进没有 end。
后来因为 rails 学习了 ruby 以后发现 end 是另一种优雅,反而 python 因为受缩进限制而难以实现多行 block。
今天看到一篇博客,有那么一句话:
Good frameworks also have smart defaults and follow the convention over configuration concept. The leader of this is the Ruby on Rails framework, which is one of my favorites
个人观点,Ruby 在国内基本是排挤到边边去的,都得感谢 PHP,PHP 从语言本身就是一个 Rails,不需要写框架,自己本身就是个 SAPI 程序,Rails 是为 HTTP/1.1 而生的,而 PHP 本身就把协议完美地吞并了,开发者不需要了解 REST,不需要了解路由,甚至文件还可以从服务器 a 目录放到 b 目录不需要通过 bind route,学习成本更低。
然后,如果实在需要性能、团队、large code base,很多公司都会采用 Cpp / Java。
这样一来,谁来选 Ruby?
其实 Ruby 是站在 PHP、Java 之间的,没有复杂的 Interface、Generic(泛型)等等从抽象上的难度,继承或 mixin 即可,也不至于弱类型、无法静态分析、无法测试、低智商开发。
市场有一个规则,很多人都是有钱了就买苹果,没钱就买魅族青春版、华为荣耀。比较中规中矩的中端的努比亚没什么人买。
而且,作为中层用户,他们会有一种心理:
第一种情况是他们买了发现不够划算,心想,我买的这个手机,还不如买个 三丧旗舰曲屏,多花点钱买个 iPhone x。
第二种情况就是他们卖了发现亏了,并不比红米、荣耀好到哪里去,而且他们只不过是为了买个备用机而已,并不打算真正用的。
同理:
显得要专业不够专业,我学了 Ruby,哎我还不如多努力一下学 Java 去了,自己显得更专业行内一些,不然都不敢跟别人说我是学计算机的,Java 语言严格很多,而且包多很多,方方面面都成熟,大规模项目也更加好维护,静态编译,所有声明清清楚楚。
不需要专业但是又太专业费时了点,我学了 Ruby,哎我又不是专门搞 IT 的,我只是想做个网站啦,哎,早知道用 PHP 得了。
如果你只是想找一份能养家糊口的工作,那么 Java、PHP 就是你需要的,这两个语言一直占据招聘市场需求的前排。
如果志向不仅于此,希望职业生涯内做出什么闪光的事情,那么我不会选择 Java、PHP 占主导的公司。这类公司通常把开发人员看作可替换的资源,除了金字塔顶部的人有决策权,其余大部分从事劳动密集的工作。另外这类语言有海量应聘者,公司的选择很多,不利于谈到好的薪资。
我会优先选择使用 Ruby/Python/Go 语言的公司,选择这些语言说明公司氛围比较开明,好的品味占据了主导。这类公司更能拥抱变化,容易发挥个人的价值,做出的产品也更有竞争力。
如果看到有公司主要使用 Elixir/Rust/Clojure,那么我会特别留心,这些公司里面都是 Hacker,做着与众不同的事情。这类公司很可能推出 Next Big Thing,或者被大公司高价收购。
就算有一天没有公司招聘 Ruby 了,我也只会选择更强大的语言,而不是大部分人选择的语言。
(以上想法受《黑客与画家》- 拒绝平庸 影响)
个人观点:
Ruby 支持函数式编程风格,但却是用对象实现的,是一种包装,在运行速度上还不如对象运算速度快(这一点可以忽略,python 也很慢)
主要原因:Ruby 在科学计算上面的积累先天不足。
因为凡有的,还要加给他,叫他有馀。没有的,连他所有的,也要夺过来。
这么感觉您在麻醉自己,但是听起来好有道理。没有工作机会就是有好品味的工作机会太少了,这样好像不太对,太过于片面了。
我当初学 ror 只是因为是新人,而公司里正好是用 ror 的,随后尝试过很多不同框架,但是最终都会回到 ror 上,没有其他原因就是因为方便优雅效率,但是我始终会关注最新的技术革新,学习新的语言作为爱好。没有最好,只有最适合,这句话到哪里都通用
一个合格的程序员并不应该被语言绑死,特别职业生涯发展到一定阶段后,同时接触多种语言的工作是很正常的。
我在学校参与科研项目主要用 Java,但是我可以利用 Python 清洗原始数据,第一份工作是写 PHP,但是我用 Ruby 去分析日志更好得完成我的工作(那时候做一些涉及数据库调优的问题修复)。这两个例子里,我的兴趣语言是我解决工作的良好助力
对的,因为 Java 充满了无穷的复杂性,有很多工具需要很长的时间使用和积累你才得知它适合的应用场景。那时候你才算合格的 Java Developer,讨论 Intermediate Java 还远着呢!
Cpp 更不用说了,简单写一个网络程序,基本上从对象的继承风格、template 复用模式、算法复杂度(谈不上数学的算法,而是你对内存 copy 操作啦 IO 之类的)效率,如果稍微不注意你就已经在面试被淘汰掉了。
有个比较私人的问题想问一下您,您成家了吗?成家了的话有孩子了吗? 如果不想公开回答这个问题,能不能私信告诉我答案。 我在意这个问题的原因,是想更加详细的了解您这条回复的角度。
我很奇怪一些人觉得好像选择了 Ruby 就要饿死街头,Ruby 是一门让编程者快乐的语言,不仅同样可以让你养家糊口,也会让你喜欢上这份工作。虽然目前招 Ruby 的公司不像其他语言那么多,但是总是有公司说招不到人。
有时候你发现一个很好的东西,想要和别人分享,但是别人总是不愿意相信世上有这么好的东西。
如果从学习的角度上来说,当然值得学习 Rails,里面的好东西确实不少。但从就业的角度上来说更不适合,毕竟工作还是少数。我想如果是自己有更多的选择权的时候,可以选 Rails。大环境里要找份 Rails 的工作确实不容易。
没想到这篇文章引起了各路高手的争执,这不是本文的目的。
我站在我的角度想讲一讲我的看法和践行的内容。
我已经接触 IT 领域 10 年以上了,也逐步成了别人眼中的“技术大神”, 用过 php, j2ee, 也写过 python, flask, 甚至 perl 等各种语言和框架,深入前端领域好几年。据我的实战经历来看,Rails 仍然是目前最高效的 web 全栈框架
我们团队目前 7 个全栈工程师,全是 Ruby on Rails 系的,还兼顾前端 React, Vue, 做的非常出色。这足以证明 Rails 的生产力价值。
JavaScript 是这些年的新宠,NodeJS 从零发展,进步飞速,虽没有技术包袱,但轮子满天飞,框架天天变,拥有的只有无尽的所谓更好的解决方案,君不见:
npm 最终往 bundler 方面靠进
webpack 没过多久就又开始有新的挑战者了,等等等
现在还没有足够完备的 web 全栈框架,都是快速演进中。
web 世界仍在快速发展,但是 Rails 为什么错过了巨大的风口,这值得我们深思。我个人感觉是由于 Rails 框架的高入手成本与门槛,进而导致了较差的生态,然后互相的影响造就了一个不够健康的生态环境。
现在,Rails 5.1 也做好了接纳 JavaScript 的世界进入的准备,相信会有不错的发展。
更关键的,你最终会发现,那些不成熟的框架最终都会像 Rails 看齐,这才是全栈框架演进的形态。
但是,我们社区的早一批程序员没有放弃,我们仍然在努力建设生态,比如在深圳,大疆,百分之八十,oschina 等还有一批公司在享受着 Rails 带来的好处与便利。
不要被单一的语言所束缚,在 Ruby 世界里,你必须会 3 门以上的语言。
视野要开阔,不断学会全局思考问题,方可无敌于天下。
「如果看到有公司主要使用 Elixir/Rust/Clojure,那么我会特别留心,这些公司里面都是 Hacker,做着与众不同的事情。这类公司很可能推出 Next Big Thing,或者被大公司高价收购」
被使用 PHP、Java 的大公司并购……
然后市场仍是他们的……
欢迎来的真实世界……
做 Web:Ruby、JavaScript、CSS(SCSS 图灵完备,可以拿出来说是一门编程语言了)
个人成长:功夫在诗外,多接触一些典型、有特色的编程语言(这里并不是为了追求新、奇、巧,主流的 Java、PHP 也是值得学习的)对更好的写出 Ruby 代码也有很大的帮助,也对扩展自己的戏路跳出某语言开发帮助更大
工程师解决的难道不是真实世界的问题么,如果把“技术浪漫”理解成研究更高级的技术来解决问题,这不正是作为工程师的职业精神的体现么?
感觉你提到的技术浪漫是有负面的观点在里面,那么你是怎么定义的?
换个角度,如果一个环境能够让工程师去追求技术浪漫,这对工程师而言不应该是一个理想的工作环境么?而 Rei 的观点是,这和一家公司的技术品味(用什么样的技术),有正相关性(尽管没提出什么数据)
09 年接触 Ruby,工作了三年多,由于工作机会太少,还是放弃了 Ruby,现在一直做 Java,不得不承认 Java 的市场的地位目前难以撼动。但是还是很怀恋之前做搞 Ruby 的那段时间,Ruby 的确是一个非常优秀的语言,ROR 也是我认为最优秀的框架。坚守一份自己喜欢的语言,好好继续下去,不要像我!
我接触 ror 有四五年了,本身做运维,想学习一门编程语言,成为更好完成自己工作、实现想法与提升自身能力的语言。这之前我学过 VB、java、C++、php。但都没有坚持下来,因为学完了,能做出一些功能,但是要么低效,要么不完善。最长不超过 2 年就结束了,最多买两本书就完了。而 ror 让我买了不少书,坚持了这么久,还为了学好它一冲动买了新款的 macbook pro。但是直到看完大家的讨论,我仍然喜欢它。因为了解与学习它的过程,让我有了两个收获:一是做好工作远比做完工作重要,这个社团的坚守者让我实实在在感受到了这样的氛围,对我自己的成长起到了深刻影响;二是好工具是做好工作的重要保证,特别是买了 macbook pro 后,这种感受更为明显。rails 好难学,我断断续续学了四五年,但是我仍然坚持下来了,没有放弃,甚至没有犹豫过,因为就是喜欢 ruby 的风格,喜欢 rails 的范,舒服,自然。看了这篇帖子,我觉得一个好的设计非常重要,而任何设计的核心必然要依据哲学来指导、并解决本质问题,越是真理越简洁、越是真理越明了,UNIX 的生命力就直接体现了这一点,我想 ror 与 unix 是否有相似之处,请大家评判。对照 windows 与 unix\linux,大家会发现,前者用户占有率高,用户群体的专业程度比例低,而后者正好相反,对于吃技术饭的人,哪个更好没有绝对的,你所处的人生发展阶段、能力水平与心态决定了你的选择是否适合自己。
ruby 的 rails 生态发展的好,别的在衰退,就像诸位,谈的是 ruby,但几乎句句不离 rails。在 rails 成名之前,ruby 发展也是百家争鸣的,现在啊,大多数跟 rails 无关的库,很多都死掉了,我想用的时候,一查,好几年前就不更新了。 我是业余人士,对 rails 没兴趣,我的个人网站就是用 ruby cgi 做。比较了一下 ruby、perl、pyrhon 的 cgi,还是感觉 ruby 的优雅,好学。
主要是能作为一个职业的,Ruby 目前局限于 Web 开发了,而 Rails 又是最好的 Web 框架。
要说 Ruby 的应用确实很广泛,但是其他的能支撑起一个职业的,就没有什么了
那时候转了 ruby 之后,在知乎回了个帖子,知乎上的回答,讲述了自己 ruby 的经历。当时对 ruby 感觉是未知,带有一点新奇,还有一丝兴奋夹杂着。因为感觉要重新开始一段“弄懂了一个知识点,实现一个功能点,内心的状态是'兴奋的时刻'”,实际上就是如此。那时候每天都记录博客,每每完成了一个博客感觉今天过得很充实,那是做 java 之后好久没体会的感觉。怎么说呢,我总是说自己做了 3 年 java,但是感觉自己是 java 中下水平的程序员,当时我的工作只局限于 web,也没往当时比较火热的大数据方向研究。做 java 的日子里,生活过的比较清闲,早上 9 点半上班,晚上 5 点 20 下班,早上有班车,距离公司也很近,到点下班,上班期间感觉是有充足的时间去聊 QQ 的。
直到在地铁里遇到我的一个校友。他是出来之后找 java 的工作,公司需要他们转 ruby,他就转了,从此他在 ruby 的道路上走着。遇到他之后,我就想着趁着业余时间学一学吧,因为吃完晚饭 6 点半就到家了,我就开始跟一个在 QQ 上认识的一个老师学习 ruby,跟着他的在职课程学习的,那段时光,到今天想想,还是挺美好的,也认识几个不错的 ruby 小伙伴。我觉得相对于 java 来说,首先 ruby 这个社区是个高质量的社区,起码是我遇到过的。里面有 Rei、姜军等优秀的人,社区里的其他人的思想都挺高。我还记得 Rei 在他的一篇博客上写到“我觉得 Ruby 好的地方,是它被设计为让程序员快乐。Ruby 有很多便利的语法,但语法很容易被别的语言借鉴,唯有它的理念独树一帜。Ruby 一直让我觉得编程很快乐。”,感觉自己从此成了 Rei 粉,也想着成为他这样优秀的人。其次 ruby 与 java 相比,真的太简洁了,做 java 的时候想着我只要实现功能就好了,我只要完成任务就好了,做了 ruby 之后除了包含实现功能,还有去优化代码,让代码更加简洁,这得益于现在公司一个 10 年 ruby 的大牛的指导,跟着他学习了很多。
我是降薪才找到了 ruby 的工作,我想着如果不转,我的人生会有遗憾,如果不行大不了重头再来呗。所以辞职之后我是没有投递 java 的岗位,直接去找的 ruby。我想着只要给个好的学习机会,我是可以放弃这一些的。转眼之间做了 ruby 也有一年多了,兴奋感减少了很多,但是还是喜欢 ruby,它不单单带给我工作中的愉悦,也点燃了我的技术热情,让我在原有工作基础上,去学习 Elixir 和 React,让我平凡的日子里过的充实、有力量。
当时看 Rei 聊到了《黑客与画家》,我就去买了这本书。以后的我也会这样做的:“就算有一天没有公司招聘 Ruby 了,我也只会选择更强大的语言,而不是大部分人选择的语言。”
女神:你能让这个论坛的人都吵起来,我今晚就跟你走。 程序猿:PHP 语言是最好的语言! 论坛炸锅了,各种吵架。 女神:服了你了,我们走吧,你想干啥都行。 程序猿:今天不行,我一定要说服他们,PHP 语言是最好的语言。
php、ruby 全栈路过,准备入坑 go ,PS:nodejs 虽然厉害但是异步还是 go 厉害
其实一名合格的工程师不应该挑语言和框架啥的,应该有自己熟悉的工具然后去适应各种各样的环境。Rails 算是一种神兵利器,开发工作中需要的 Web 系统,用 ruby 来写系统的脚本。当然 django 和 python 也能完成同样的事情,谁好谁坏是一个很主观的事情。
golang csp 的 channel 之间的通信其实是 blocking 的,要论异步厉害还是得看 actor model 的,actor 之间的通信完全异步,中间只靠 mailbox 调度。
按照这么说,主流操作系统都是 blocking 的,每秒处理的指令集就那么多,而且核心都是数得出来的。
后续 non-block 都是抽象的,无论 批处理还是分时还是其它。
真正面对的问题是:找到问题对应最高效的解决方式。
为什么还有这样的言论?认为选择小众的语言能提高自己的品位、格调、态度、不可替代性。甚至提高自己的价值。
嘿大伙们,别被这样的言论骗了你。决定一个人的价值的永远仅仅是这个人的能力。因为牛逼的人干什么都牛逼,low B 的人干什么都 low B。
因为你用了 ruby 而不是 java,你就拒绝平庸了,这事是不会发生的。
我们应该聊聊 ruby 的语法怎么优雅,效率怎么高,将来怎么发展。而不是被这种劣质鸡汤混淆视线。
不管你用啥,你在资本家眼里都是可以被替代的,只不过成本不同。我不相信现在的公司离开了你就活不下去了。 其实用什么语言和你喜欢穿什么衣服是一样的,基本都是主观评价。真正在设计产品的时候,语言(符号系统)的选择绝对不是最终要的。