喜欢ruby编程语言的几个原因

Ruby编程语言是由日本人松本行弘开发,是一种简单快捷的面向对象编程语言,今天主要跟大家聊聊ruby框架——ruby on rails(http://www.maiziedu.com/course/ruby/),可能有些朋友不喜欢ruby,但是作为一门语言,我觉得 Ruby 还是很值得掌握和学习的。

先说说学好 Ruby 有什么好处吧。

Ruby on Rails 的最大优势我觉得有四个:

1. 语言灵巧轻便,适合快速开发和部署。

2. 各种本身自带的 “magic” 以及可以通过 gem 或者 vendor code 加载的 magic。让代码美观简洁。

3. 很容易与各种前端 JS 框架集成(包括Backbone,Ember,React等等)

4. 有一个 Rails console 可以让 test 和 debug 变得异常轻松。

如果你不相信我说的话,可以去各个中小公司走走看看,很大一部分最原始的第一个代码库都是基于 Ruby on Rails 的。尽管后期会有各种拆分和重写,对原来的 Ruby 代码能够很好的把握也是一项极为重要的技能。我早年是写 C++ 和 Python 的,最近三年多,却是有百分之六七十的时间写的是 Ruby,偶尔写写 Java 和 Scala,但是 Ruby 依然是我写的最顺手的语言,没有之一。因为 Square 和 Airbnb 两家公司 Ruby 都用的很多,所以对 Ruby 熟练也成为我在工作上的一个小小的优势。

虽然很喜欢 Ruby,但是却除了上面四点不想写太多废话来解释 Ruby 为什么好。不如说点有用的,了解并如何尽可能的避免 Ruby on Rails 里面的坑。

Ruby on Rails 最大的问题可能就是这个语言写代码开发起来快,维护起来却很困难。什么原因呢?怎么避免呢?

首先,Ruby 是动态类型的。什么意思大家都懂,就是一个变量没有类型声明,run time 的时候给它什么值它就是什么类型。语言的官方说法叫做 duck typing:

“ 如果一个对象和鸭子一样走路一样说话,那么Ruby就很欣然地认为这就是一只鸭子。”

没有类型申明的代码写起来简洁方便,尤其是不同对象间有可继承重用的关系的时候,如果换了 Java 这样的强类型语言就必须使用 interface 或者 abstracted class 来严格按照 design pattern 来处理。而在 Ruby 里面,你只要心中想要给一个变量什么值,那么只要后面赋值正确,这个变量就可以有什么值。这就必然引来两个麻烦:

1. 不小心赋错值,Ruby 依然将计就计,也不抱怨。只不过在实际运行中让你找不着北,得到一个完全出乎意料的结果。

2. 需要 refactor 代码,也就是代码重构的时候。这几乎可以说是一场灾难。试想下你有一百把钥匙一百把锁,有类型申明的语言可能对于不同型号的钥匙和锁有所区分,而无类型申 明的语言所有的钥匙和锁几乎都长的一样。代码重构就好像把所有配对打乱,又要以新的形式组合。最后结果就是看着重构后利索无比的新代码,一不小心就给你 exception 了。

一个很有效的解决办法是,对一些重要的,尤其是 API 的参数类型进行强制类型检查和断言。比如在 Airbnb,我们会用一个 validation gem 对所有需要的变量去用代码来检测其类型,类似于 “validate count is_a Integer” 这样的断言。

第二,很多人对 Ruby on Rails 的 ActiveRecord 一知半解。ActiveRecord 可能是 Rails 里最强大的 magic 之一(或者没有之一)了。ActiveRecord 是对代码中数据库访问和业务逻辑访问的一个混合体。如果写的好,可以事半功倍,写出 DB 访问效率高且干净利落的数据库访问相关的代码,比如它的 scope 和 association 的运用。然而,如果对于 ActiveRecord 怎么实现似懂非懂,加上对 MySQL 的 execution plan 一知半解,很可能写出的代码一到 production 就会各种崩溃。举三个常见的例子:

1. 老实说,我觉得不知道 N+1 Query 是啥的程序员都应该好好去了解下。N+1 Query 几乎是我见过的引发 production 问题的最常见的错误之一(也许没有之一)了。

2. Rails 的association。最便利的 wrap 对象间 1对1、1对多、多对多等关联的 magic。很多别的语言应该都没有这个概念。Rails 的官方文档上有,强烈推荐深入了解。这也是平常见到的被错用最多的 magic 之一了。

3. Rails 中的一些 job 需要在数据库中找到满足某些条件的 records 并进行处理。Rails 常用的有 find、find each、find in batch 等等,虽然不一样的查询语句都能给你一样的结果,但是因着他们对应的 SQL 语句的转化不一样,很多的时候效率天差地别。这也是 Ruby 代码中可以看出一个程序员对 Rails 的了解的一个常见的点。

例子还很多,坐下来可以慢慢写,这里也只是顺手写几个最先想到的。所以我们也不用一边写着低效的 Ruby 代码一边骂 Ruby 这不好那不好了。我琢磨 Ruby 可能觉得更怨。

第三,因着 Rails 中这样那样的 magic,写好 Ruby 的 RSpec 测试例可能是一件比写好 Ruby 代码还难的事了。写好 RSpec 其实有很多的技巧,最常用的:

1. 各种 stubbing,包括对 FactoryGirl 和 Fixture 等的应用,好的 Rspec 其实可以帮助避免很多 Rails 里面的坑。怎么写好 Rspec,这个也不是一篇能说清的,有兴趣的可以留言,以后我如果有好的资料可以分享给大家。

2. 这一条也适用于所有的程序语言的测试例的编写。是自上而下还是自下而上,怎么保证覆盖率,先写代码还是先写 test,很多好书。别的语言的写 test 的思想到这里也是适用的。

老实说我学写 RSpec 可能当初花的时间和写 Rails 代码本身花的时间一样多。即使是现在,我也不敢说我能把 RSpec 写到很好,只能说我愿意花时间精力努力把 spec 写好罢了。

第四,Rails 本身已经是一门语法极其精炼的语言了,没有必要为了把代码变得更紧凑而使用一些很炫的偏僻的语法。记得我刚开始写 Ruby 的时候,喜欢干的一件事就是把整个函数我用一行 Ruby 各种技巧就写出来了。然后呢?不仅可读性差,有的时候时间长了,自己都忘了是怎么玩的了。后来越写越老实,怎么容易懂就怎么写。有一个写程序的原则我觉得 实用所有的语言:好的程序是不应该需要太多注释的。这包括结构的清晰和最合适的命名。这个原则对 Ruby 尤其重要,因为 Rails 本身已经各种 magic,很容易把代码写的出神入化,然后可读性极差。尤其是即使如 RubyMine 这样的 IDE 在跳转到函数定义或函数应用的这一功能上也不可能做到准确,因此可读性差的代码几乎注定早晚就成了个坑。所以当你写了一段 Ruby 代码你觉得有必要加一段注释来说明你想干什么的时候,可能应该先想想是不是应该重写这一段代码了。

其实还有第五第六第七……, 因为一门语言可以聊的东西太多了。记得以前 Square 的时候每周都有 Rails 的专门的研讨班,每周聊都聊不完,何况一篇文章?Square 两年于我最大的收获也是学会写 Ruby,记得我还曾半开玩笑的和朋友说过:“工作做的越久,越是什么技能都不敢往简历上写了,因为不断见到真的牛人。以后我找工作,简历上只写我会写一 点 Ruby 代码吧。” 因为很喜欢 Ruby,我的微信号都取了在 Mac 上写 Ruby 代码的含义。当然,Java 和 Scala 我也很喜欢。

时间: 2024-10-07 16:52:42

喜欢ruby编程语言的几个原因的相关文章

what' s ruby?(ref: ruby编程语言)

q1: irb(main):001:0> tmp=(1..10).to_a => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] irb(main):002:0> tmp.each.class => Enumerator irb(main):003:0> tmp.select.class => Enumerator irb(main):004:0> tmp.map.class => Enumerator irb(main):005:0>

ruby教程:如何快速入门ruby编程语言

在学习新的编程语言的时候,我们一定要弄清楚一下几个问题: 语言的类型模型是什么? 强类型/弱类型,静态类型/动态类型 类型模型会改变问题的处理方式,控制语言的运行方式 语言的编程范型是什么? 面向对象.函数式.过程式等等 怎样和语言交互? 编译.解释 语言的判断结构(decision construct)和核心数据结构是什么? 哪些核心特性让这门语言与众不同? 因为每门编程语言都有自己的一套惯用方法,各有所长,各有缩短,通过学习不同的编程语言,你会明白,哪门语言最适宜解决自己当下关注的问题.下面

《ruby编程语言》笔记 1

赋值: ruby支持并行赋值,即允许在赋值表达式中出现多余一个值和多于一个的变量: x,y=1,2a,b=b,ax,y,z=[1,2,3] (python同样可以正常上面的语句). Methods in Ruby are allowed to return more than one value, and parallel assignmentis helpful in conjunction with such methods. For example:# Define a method to

哪一种是程序员最不喜欢的编程语言?初学编程者注意了!

近日,全球著名的 IT 网站 Stack Overflow 根据数百万开发者项目标签的使用频率,发布了一份编程语言的调查报告,试图找出最不受欢迎的编程语言.没想到开发者最想规避的编程语言中,PHP.Objective-C 和 Ruby 等语言纷纷上榜. 下图看出,讨厌的编程语言人数最多的是Perl,Delphi,以及VBA,而PHP,objective-c,Coffeescript以及Ruby紧追其后.而r是喜欢人数最多的编程语言. 其实可以看出,发展迅速稳定的语言喜欢的人更多一些,如r,Pyt

论黑客喜欢攻击地方网络棋牌游戏原因与解决方案

地方棋牌游戏很容易招到黑客攻击,尤其是对于一些比较出名的平台,风险就更高一些.究竟为什么黑客这么喜欢攻击地方性棋牌游戏呢?厦门欧页网络科技有限公司,与你一起探讨. 经过许多被攻击的案例显示,黑客之所以会选择攻击棋牌游戏平台是以下原因: 1. 盗卖游戏币.一般这种情况会出现在比较成熟的平台上,使用这种方式通常都是长期进行的过程.就像蛀米虫一样,慢慢的.悄悄的进行. 2. 勒索行为.这个是绝大部分黑客攻击平台的原因.如果出现这个原因的,黑客就不会专门去挑选平台,无论平台大小.是否成熟.做这种事的也并

Google App Engine10年,支持更多你喜欢的编程语言

2008年4月7日google推出Google App Engine(GAE),时间过得真快,10年过去了,2010年3月google退出中国,一转眼也过去7年了.早在2009年的时候GAE就在中国内陆无法访问了.其实,这10年间,作为云平台服务的PaaS(Platform-as-a-Service)获得了飞速的发展,在国内阿里云.腾讯云.新浪云.华为云.亚马逊AWS各领风骚,但其中很难觅goole云平台的身影.虽然不时有传出google回归中国大陆的消息,但目前看来google回归中国还是遥遥

ruby 编程语言

Ruby(一种面向对象程序设计的脚本语言) Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90年代由日本人松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License.它的灵感与特性来自于 Perl.Smalltalk.Eiffel.Ada以及 Lisp 语言.由 Ruby 语言本身还发展出了JRuby(Java平台).IronRuby(.NET平台)等其他平台的 Ruby 语言替代品.Ruby的作者于19

喜欢一种语言的一个原因

大学毕业十年了,计算机科学与技术专业,为什么选择这个专业,真的是有点被小时候看到的某些电影影响了.那时候感觉计算机技术是一种非常神秘的技术,某某人在键盘上敲几下,天上的卫星就尽在掌握之中了,可以为所欲为了,给人的感觉就是一机在手,天下我有. 刚开始工作没有直接从事软件开发,做的是通讯技术,那个时候正是3G大发展的时候,具体从事的是中国移动 TD-SCDMA网络的优化,在外场测试基站信号,这个工作的一大痛苦之处是需要常年在外出差,的确是有点让人犹豫的. 进了自己家乡那边最大的一家软件公司,刚进去的

TIOBE编程语言排行榜:Ruby 排名创历史新高

Ruby本月Tiobe指数排名第8,这是自2008年12月以来最高的排名,本次峰值与之前的一次峰值是完全相反的.2006年Ruby布道者高喊Ruby将达到顶端,鼓吹Ruby和它的编程环境Rails即将征服世界,他们在某种程度上取得了一定的成功,梦想上市的创业公司非常喜欢使用的Ruby编程语言.Ruby在2006年年度编程语言中甚至被授予“最受欢迎编程语言”,直到2008年受欢迎程度达到顶峰,然而Ruby的可扩展性似乎是一个问题,在处理大数据时性能明显下降,这也是Twitter在2010年开始用J