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

来源:互联网 发布:茶叶淘宝网 编辑:程序博客网 时间:2024/05/07 15:09

来自

http://ruby-china.org/topics/2003

写给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是公认的ios中的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文档打印编录成书, 方便随时查阅.

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