写给Ruby新人的公开信 (我的Ruby学习经历)

11 条评论 , 5 次修正,8225 次阅读,最后更新于 2015年09月20日

写给 Ruby 新人的公开信 (我的 Ruby 学习经历)

分享一点点自己学习 Ruby 的经验吧,主要是给 Ruby 新人。

新人中普遍存在的错误思想:

社区里很多新人 (至少是 Ruby 语言的新人), 貌似都是为了使用 Rails 而捎带的学习 Ruby 的。我觉得这样应该是不妥的。因为我认为,除非你实在是牛叉的不得了 (即使你再牛叉,如果之前没有接触过类似动态语言,Ruby 绝对是一个不小的挑战), 或者只是玩票性质,耍耍就扔掉,否则最终的结果是唯一的。

将来的某一天, 你还是要系统的重新学习Ruby.

很多初入 Ruby 的新人,完全认识不到 Ruby 到底有多复杂,甚至可能他们会认为 Ruby 说白了就是为了 Rails, 为了 web 开发而生的 (就像 php, asp 一样).或者认为 Ruby 仅仅是是一个 shell 下系统维护的脚本语言,只是搞搞字符串处理啥的。这些对于 Ruby 的描述都没错,但是都是不完整的。

(下面谈谈我的学习经历,我这人有些完美主义,我的路线不值得推荐,仅供参考)

首先我决定选择一个称心如意的编辑器。我的选择是 Emacs.

记住,类似于 Ruby 这种解释器类语言,IDE 完全是非必须的。貌似使用 Ruby 的人,都在使用类似于 Emacs(Textmate, 被称为苹果下的 Emacs), VI 之类的编辑器,如果以上编辑器你都没有听说过 (我有理由相信,大把的程序员没听过), 是时候该充充电了。在我看来,选择一个顺手的,完全键盘操控的,高度可定制的,高效率的编辑器,是一个优秀的程序员,需要做好的第一件事情。你如果打算转到 Ruby,不要奢望会有 VS 或 Delphi 之类的全功能大块头 IDE 集成开发环境,那不属于 Ruby。

(随着时间的发展,也有了一些不是那么太小的集成开发环境,听说 Rubymine4 不错, 不过据说,很多 VS 开发人员都在使用 Vim, 而几乎所有的编程大师,都在使用 Emacs.)

有关 GNU Emacs 如何使用,这篇文章内没有什么可说的。(因为,专门写一本书都很难说清)

其次我选择了 Linux 平台,最好 64 位。我的选择是 Slackware 64 位。

你当然可以选择 Mac OS X, 但是我必须警告一点:选择 Unix like 系统,对于学习 Ruby 极其重要 (苹果 OS X 和 linux 都是由经典的 Unix 派生出来的,类似系统统称 Unix Like)。事实上稍后你就会了解,正是我这些 (明智的) 选择,让我在稍后学习 Ruby 的过程中,可以说是相当的轻松。

必须提及的是:在 Linux 下,使用什么图形界面并不重要,无论 Gnome 或 KDE, 无所谓。

(如果你从 Windows 过渡过来的程序员,需要了解的第一件事情就是:并非一定要有一个图形界面才叫做软件,事实上 linux 下几乎所有命令,都是简单直观的的命令行风格)

事实上我完全在 XFCE(类似于 Gnome 的一个轻量级的 Windows manager) 下工作,而之所以使用 XFCE, 主要因为它简单直观,而且定制性较强,其实大把时间,除了 Emacs, 我都是泡在 XFCE 自带的 Terminal 下 (图形界面下的命令行窗口), 图形界面只是为了使用 Chrome 上网而已。

说起学习 Linux, 我推荐鸟哥的两本书,也许你会认为学 Ruby 之前要先精通 Linux 下的 CLI,学习成本太高,但从我的自身经历来说,这绝对是必要的。就算不一定要完全记住或读懂这两本书内介绍的所有命令,但是至少,通过阅读,你应了解在 Linux 的工作方式,或者说,你必须首先具备 Linux的世界观, 例如常说的 K.I.S.S.原则。

在以上两条我认为都足够精通以后,我才开始学习 Ruby。事实上真正开始学习 Ruby 之前,光学习 linux, Emacs, 就花了我半年时间。在开始介绍如何学习 Ruby 之前,有必要先谈下记笔记这个老生常谈的话题。

谈谈记笔记。

开始使用 Emacs 以后,养成了使用 Emacs 的 org-mode 记笔记的习惯,光 Linux 相关的的笔记就达到了一万五千多行,在这里强烈推荐如果时间允许,而且和我一样 (忘性非常的大),建议养成记笔记的好习惯,这有以下优点:

  • 记笔记的同时,对于领悟的知识加深了记忆,而且如果能够把书本上的知识通过 自己的方式表达出来,证明你真的理解了它,就算之前的理解是完全错误的,也没关系,将来也可以通过查阅笔记,来修正自己。

  • 方便将来复习以及工作中知识点的快速查询。

  • 经过除错 (整理,归纳), 在适当的时候,然后可以方便的转化为 html 或 pdf 文档,分享自己的心得体会。这是很符合 Ruby 的自由精神的。

  • 最后一条,跟 Ruby 有关。学习 Ruby 并且记录笔记,是非常有必要的。(稍后你就知道为什么)

也正是因为以上精心准备,再加上之前的 OP(Delphi) 基础,面向对象的编程思想非常熟悉,所以,我选择的第一本 Ruby 有关的书是重量级的。是 Ruby 语言的发明者 Matz 编著的Ruby程序语言中文版.

有关Ruby程序语言这本书

有关这本书,网上的评价很多,可以肯定的是:这本书翻译质量相当之高,译者之一就是在社区被热捧的Ruby元编程的译者,凭心而论,这本书绝对不适合初学者,内容相当松散,而且前后跨度非常大。如果之前没有 Ruby 使用经验,想顺序从头读到尾并读懂,几乎是不可能的。

这本书我看了一个月,反反复复,这本书几乎翻烂,中间有半个月没看,结果重新拿起来,完全看不懂了!我甚至看自己半个月前的笔记都糊里糊涂,现在看来,这并非本人很愚笨。

这就是 ruby, 你会真真切切的感觉到那种发自心灵的震撼,对你之前的编程价值观的完全颠覆。

如果一定要用一个词来形容 Ruby 的话,我觉得Ruby是编程语言中的一个破坏性创新.很明显,对于从传统的编程语言转过来的开发者,产生的震撼是极其巨大的,我觉得任何打算学 Ruby 的新人,都必须提前有这个思想准备,因为 Ruby 是那样的不同,以至于最好能单独抽出时间大段的时间来,专心致志的学习 Ruby, 直到入门,掌握 Ruby 的核心价值观,再放手,否则有很大可能的结果就是:半途而废。

要多思考

看这本书,我认为一定要多思考,事实上,看这本的过程中,我经常仰着头,瞪着天花板,反复思考,其实 Ruby 很多貌似复杂的概念,很多其实只是很小的花招而已,需要你自己用心去体会,只要你明白了那个 trick, 很多貌似不关联的概念,一下就完全明白了。

举个例子,以下问题:

"Ruby 到底是如何完美的通过类来模拟面向过程的顶层空间呢?" "所谓顶层空间,到底是不是在 Object 类的内部呢?"

从外部表现看:会有如下表现:

- 在这个特殊的顶层空间'内: - 顶级方法是Object类的私有实例方法 # => (貌似应该在内部) - 顶级self.方法名'是 main 对象的单例方法。 # => (怎么 self 不是 Object?) - 顶级实例变量是 Object 类的实例变量' - 顶级类变量是Object类的类变量'. - 顶级常量是 Object 类的常量' - 顶级局部变量是Object类的局部变量' - 顶级全局变量是 Object 类的`全局变量'

以上第一条和第二条明显冲突,让人很晕,而且也很难记忆,其实,Ruby 只是用了一个小技巧:

顶层空间就是 Object 类的内部,只不过这个类内定义的所有实例方法,实例变量 它们的 self 值并非 (向正常的类那样) 指向 Object 类自身,而是指向了特殊的对象 main.

这本书涉及的内容,远比书里面表面表现出来的要多得多,很多关键概念,只是点到为止,需要读者自己去查看 Ri 文档。说实话,很多关键概念,由于译者和读者之间对于某些汉字的理解不同以及语言组织方式的不同 (不得不惊叹汉字的博大精深), 还是给我带来了不小困扰。好在可以方便通过 Ri 来确认真实意思。

还有一点比较郁闷的是:这本书中很多术语,让我郁闷很久,什么內插, 单键, 哈哈。

最后,总结下来还是那句老话,有能力绝对看原版。不过如果你没接触过 Ruby, 第一本书,强烈建议还是老老实实看中文版吧。这里推荐一本入门书籍:我没看过,就凭 Matz 亲自写序,应该不错: Ruby-programming, 向Ruby之父学程序设计.

有关纸版书的优势

这里再谈一点点有关纸版书的优势。

很显然,你可以方便的前后随便翻阅,随便用笔划做标注,所以我强烈推荐,一般只需看一遍或非常基础的书,看看电子版尚可。但是如果是需要反复翻看的书,最好看纸版,如果同时能有电子版,方便关键字搜索,那最好不过了。(中文版电子图书一般扫描版多一些,无法搜索)

再谈记笔记

看完ruby程序语言, 我觉得自己真正的喜欢上了 Ruby. 而且写下了一万多行的 Ruby 学习笔记,而且真真切切的感觉到自己已经跨入了 Ruby 世界的门槛。事实上,直到现在我才感觉到当初自己选择记笔记这个决定是多么的英明, 类似Ruby程序语言这中知识点又散又杂,而且前后呼应的重量级读书,如果不记笔记,我真不知道该如何读下去。

再谈 linux

在学习的过程中,也深切的体会到,之前 Linux 的知识,对于学习 Ruby 发挥了及其重要的作用。可以说没有之前学习 linux 经历,很难有现在对于 Ruby 这门语现代语言的较强,较全面的理解。

事实上,我认为 linux 真的是一个很适合学习,实验的操作系统,如果你真打算使用 Ruby,是时候该考虑换到 UNIX 系统下面了。你可以选择苹果的 OS X, 也可以选择 Linux 或正统的 Unix,但是不要太纠结于所谓的 linux 发行版,随便来一个即可。只要不要太老就行。

另外推荐选择 64 位操作系统,毕竟是未来的主流,不似 Windows, linux 和 OS X 已经完全过渡到 64 位了,而且还要涉及到 rails 的部署有关的问题。很显然,64 位有非常明显的优势。

切记一点:把你的主要精力关注在命令行方面 (Command Line Interface), 这是你在 Unix like 世界畅游的门票,什么包管理啊,各种 WM 啊。至少对于 Ruby 开发者来说,目前都是浮云.(Ruby 有自己的包管理系统 gem, 另外还有管理 Ruby 版本的 RVM. 这俩真不能缺)

最后谈一下 Emacs 和 Lisp.

我无意于挑起 Emacs 和 VI 的圣战 (Textmate 是公认的 mac 中的 Emacs), 但是 Emacs 真的是一个很适合编程的编辑器,(VI 貌似更适合 Linux 管理员,不说别的,在所有 UNIX 机器上,具有相同的操作一致性,以及快速编辑功能,这是 VI 最大的优势), 据我所知,大师级别的人物,貌似都选择 Emacs Like 编辑器?

事实上 Matz 自己也在使用 Emacs, 而且 Emacs 下面的 Ruby-mode, inf-ruby-mode, 就是他本人亲自操刀写的。更重要的是:Ruby 从 Lisp 中学到了太多太多东西。据我所知,Matz 在很多场合,都表达了对于 Lisp 语言的无比推崇,事实上,Ruby 之所以引入了 lambda, 以及闭包的概念,Matz 本人的原话:就是为了向 Lisp 致敬。

  • Ruby 中一切都是对象,Lisp 一些都是列表 (list)
  • Ruby 混入的概念来自于 Lisp.
  • Ruby 中符号的概念,来自于 Lisp, 连定义方式都是原样照搬,:symbol.
  • 连 when 的用法,if, unless 的用法,nil 的含义,都来自于古老的 Lisp.

Matz 自己就是一个 Lisp 绝顶高手,Ruby 远比你表面上看起来更接近于 lisp, 你完全可以把 Ruby 想象成一个 Lisp 的现代面向对象版本。事实上,Matz 最近刚出的那本书里面明明白白的说:

相比较 Python, Perl, Ruby 更接近于 Lisp.(精髓以及精神更多的来自于 Lisp)

所以,我觉得咱社区是不是该加一个 Lisp 版块呢?

我 Lisp 水平相当臭,也没时间学,因为整天用 Emacs 的缘故,仅限于 Emacs 中用到的那一部分,相对比较熟,但将来计划中,Lisp 是 Ruby 之后是我必学的语言之一。

最后小小秀一下 Emacs 的好处:

跨平台,及高度的可扩展,最大化的满足了追求完全个性化的苛刻需求。

例如:我在社区写这篇文章,只需要在 Chrome 浏览器中双击表单,自动打开一个 Emacs frame, 并且自动开启 markdown-mode, (针对 ruby-china 网址才自动开 markdown 格式支持,其他网站是 org-mode) 编辑完以后,直接 C-x C-c 提交。

这种灵活的体验,又有什么编辑器能替代呢?

附录:补上镐头书的介绍:

除了Ruby编程语言, 另一本重量级且经常被人提起的 Ruby 入门图书是:Programming Ruby.出于对大卫.托马斯的景仰之情 (错,现在应该是崇拜), 我也一字不漏的细细的品读了镐头书的前三部分 (除了库引用之外的所有章节), 因为个人都看过,应该具备一定的说服力。

首先必须说明:看镐头书,应该优先看 1.9, 即第三版,如果不愿意读英文,第二版也可以。虽然是讲程序语言,变动不会太大 (相对于 rails 的书来说...你懂的), 不过我强烈建议,与其看镐头书第二版,还不如直接看ruby程序语言中文版。

有关镐头书前三部分

有关镐头书和ruby程序语言, 有一点必须提一下:

如果你第一次学习 Ruby, 而英文还可以,强烈推荐先看镐头书前三部分,因为个人认为,Programming Ruby比起ruby程序语言简单许多,更容易上手。

然后,有时间的时候,再再通读ruby程序语言英文版。

换个说法:如果你真正读懂了ruby程序语言, 镐头书前 21 章,以个人感受而言,没有任何难度可言,所以建议直接跳过,即使第三部分,只需要有选择性的看以下章节:

第 23 章讲解了鸭子类型,ruby程序语言内也有介绍,不过都是一笔带过 (也许是认为鸭子类型是属于太基础的东西了吧), 如果你还不太明白,可以看一下。

第 24 章讲解了元编程的内容,这才是本书的亮点!

如果你真的读懂了Ruby程序语言, 我认为只需要用心读这一章 (第 24 章) 就可以了。这章的核心概念,就是在讲解一个东西:self的含义以及在不同上下文环境的变化,写的是相当精辟,入木三分!! 原先有些不太理解的部分,看过这章之后,有一种恍然大悟的快感,例如:eigenclass 到底是什么?? 它是如何实现的?看过这一章你自然会知道。说了这么一堆,你肯定会问:难道这么厚的一本书,我只需要看第 24 章吗?

答案是否!!

镐头书真正的精华部分是:

第四部分 Ruby 库介绍以及第五部分对应的索引

本书第四部分有 Ruby1.92 完整API的讲解,配合第五部分详细到令人发指的索引(请原谅我找不到合适的形容词来形容,), 才真正让我体会到了这本书的威力。通过粒度已经控制到第几页第几行的索引,以及种类繁多的前后交叉索引,你可以快速的查询 Ruby 中任何你想要的概念。

举例:

  • 可以一眼看出某个类中实现了那些方法。
  • 可以一眼看出某个方法在多少个类中有不同的实现,

然后再配合 Ruby 自带的 Ri 文档,我认为可以解决 Ruby 中遇到的绝大多数问题。

因此我认为,我认为这本书绝对应该人手一本:

首先翻看镐头书 => 查看 Ri 文档 => 上网查或社区提问,这应该是遇到问题最佳解决办法。

强烈建议大家打开 pdf 编辑器,手动编辑这本书的 pdf 文档:

将本书第四部分之前的所有页面都删除,并将第五部分的索引,移动到书的首页部分,如果条件允许,将编辑好的 PDF 文档打印编录成书,方便随时查阅。

最后秀一下我打印的镐头书,绝对是这个世界上的绝版: