如何学习Ruby

Published on:

提示:本文是学习方法论,不喜勿看。

我是从06年底开始关注Ruby的,07年的时候投入到了Ruby的开发中,并持续到今天。我从毕业到现在,除了Ruby还使用过VB、Java、JavaScript, 大学里也学过C/汇编,因为我是学电子专业的,偏硬件一些,所以没有很好的学习算法相关的内容,所以本文也不会涉及算法学习的内容, 这是我作为一个程序员的硬伤,当然我还在学习算法的路上,并未放弃它。

和大多数的Rubyist一样,我也是从学习Rails开始去了解Ruby的,在学习Rails之前,我正在使用JavaEE的SSH框架(struts+spring+hibernate), 当时也算是Java入门的阶段,并没有做的多深,各种XML配置,搞的我眼花缭乱,对Java顿时有点绝望:是不是我以后的编程生涯就和XML打交道了呢? Rails的约定大于配置,DRY(Don't repeat yourself)等概念,深深的吸引了我,使用Rails,再也不用去烦那一大堆XML配置了,我只要专心写我的Ruby代码就可以了,这才是快乐的程序员嘛。呵呵,不知道有多少人和我的经历类似呢? 我想应该也有不少人吧。

说到Rubyist, 我曾经也不理解,为什么叫Rubyist,而不叫Rubyer或者其他? 后来我才明白了, Rubyist,有点Artist的意味。Ruby语言算是编程领域里最具艺术气息的了,所以我们把Ruby程序员叫做Rubyist。但实际上,很多人离真正的Rubyist还很远,包括我自己啦。


懵懂:

正是经历过这个阶段,所以我很了解现在的初学者的心情:「不是15分钟开发一个blog吗? Rails很好学,很好用,很好玩,我要快速精通它」。 很多Rubyist的入门书就是「Agile web development with Rails」和 「Programming Ruby」, 基本上,如果通读这两本书并练习以后,基本就可以上手了。当然现在也涌现出很多学习Rails的优秀书籍,比如 「Ruby on Rails Tutorial」和最近kickstarter上面众筹的「Learn Ruby on Rails」,还有官方的「Ruby on Rails Guides」, 在我开始学习的时候,官方的文档可没有这么好。

有这么丰富的资料,我们对于Rails的入门,基本没有什么困难了。 但是你有没有发现,你已经陷入了一个巨大的细节里面去了。我所说的这个巨大的细节,就是指Rails。

我们最初学习Ruby的目标是掌握Rails, 所以潜意识里,Ruby的学习,放到了第二位, 而Rails成为了第一位的学习目标。在你通读各种参考书入门之后,也许你可以开发一个简单的web站点,也可以把自己的Rails技能运用于一般的工作中,但是你会发现,你终会达到一个学习的瓶颈。 Rails社区的一个好处,就是有很多的Gem,各种各有的Gem让你快速的开发,但是你真正的了解这些Gem吗?开发,并不是一个简单的功能堆砌。

当你听说现在流行Cucumber,所以对自己该选用Cucumber或者是Rspec感到迷惑了起来,MiniTest的崛起,又让你感到更迷惑了,我该用哪个?
当你听说Rails4默认了线程安全,那么你是否知道什么是线程安全?Rails3不也是线程安全的吗?默认的意义何在?
当你听说sidekiq比resque更省内存的时候,就马上想去尝试改用sidekiq,有没有想过,为什么?sidekiq比resque写的好?
。。。
等等

这个时候,我们仅停在了使用阶段!因为你已经陷入了Rails的细节里,你忽视了Ruby。

所以,此时,你仅仅是个Ruby码农,离Rubyist,还差很远。


深入

如你所见,你所用到的一切,都是Ruby构建起来的:Rails、Sinatra、Cucumber、RSpec、Sidekiq、Resque等。
Ruby + Web开发知识 + 架构思想 -> Rails/Sinatra
Ruby + TDD/BDD等敏捷实践 -> Cucumber/Rspec
Ruby + 多线程/多进程并发 -> Sidekiq/Resque
Ruby + Actor并发模型 -> Celluloid
Ruby + Socket+Reactor -> eventmachine/Goliath
...
等等等

所以,你要想深入掌握上述各种工具,你就需要系统的去学习Ruby,并且在学习Ruby的过程中,去学习相关的领域知识,这是一个良性的循环过程。

Ruby是一个面向对象并同时兼有函数式编程特性的神奇语言,所以在你随着Ruby的深入学习,你同时可以深入学习面向对象和函数式编程两种范式的特性。

所以,当我们说深入学习Ruby的时候,不是在说Ruby的语法该如何用,而是在说:

1 Ruby背后的设计哲学及其底层实现。
2 Ruby与系统(包括其他领域,比如web)的交互
3 Ruby如何根据它的面向对象和函数式编程特性、及其元编程能力去构建漂亮的DSL

达到这个阶段,你可能脱离了Ruby码农的层次,达到一个新的境界了,离Rubyist已经很接近了。


哲学

如果说算法是一个合格的程序员必须掌握的,那么哲学,也是一个合格的程序员必须要领悟的。

我不是一个哲学大师,请不要误会。

哲学是我们学习和解决问题的灵魂,我只在这里分享几条我用到的哲学经验:

1. 重是轻的根本,静是躁的主宰.

Ruby,只有基础扎实了,才能用的灵活。
当我们碰到问题的时候,着急没用,静下心来思考,顺藤摸瓜,找出问题。
当我们学习的时候,不要急于求成,静下心来学习,慢就是快。

2. 存在即合理。

对于这句话,我的理解就是, 当程序出现了诡异的bug,或者,当你的项目在你机器上能用,而到服务器上不能用的时候,你应该想想,这个问题并不诡异, 程序是按你的指令执行的,肯定是你哪里出问题了,而且可能是个严重的问题!请认真对待这个问题!
学习的时候,碰到一个概念,应该多想想这个概念产生的合理性,比如TDD/BDD, 有了TDD为什么还会有BDD?

3. 哲学经典三问: 你从哪里来?你是谁? 你要到哪里去?

当我们学习新技术的时候,我们就该问了:
这技术是基于什么情形产生的,或者是这技术是为了解决什么问题而出现的? (你从哪里来?)
这技术是如何实现的?这项技术如何去使用? (你是谁?)
这技术要解决的问题是永久性的吗?未来的发展会如何?和这种技术类似的有哪些技术,它们的发展如何?(你要到哪里去?)


总结:

本文,与其说是「如何学习Ruby」,不如就说是「如何学习」,因为以上方法论,适用于你学习任何东西。


P.S 附带「诱人的Ruby」课程规划简要:


最后,

希望大家关注微信公众帐号:RubyStudy,与我讨论任何问题,包括对本文你自己的见解。

Comments

comments powered by Disqus