该怎么去系统的学ruby on rails

Python023

该怎么去系统的学ruby on rails,第1张

好了,有针对性的就你的几个问题简单做一下答复:

资料陈旧的问题

资料陈旧是客观存在的问题,这的确可以理解,不过我要澄清一个误区:学习 Rails 一定要有最新的书籍或资料吗?答案是否定的。

Rails 的发展和版本迭代速度比较快,写书的是很难完全追上它的步伐的。但是无论 Rails 发展的多么快,它的核心框架与基本功能都没有发生太大的变化。《Web 开发敏捷之道》作为 Jolt 获奖书籍是值得一看的,现在市面上最新的中文版本对应的 Rails 版本是……3.2吧,如果我没记错的话。

然而这已经够用了,特别是对于初学者来说,你没有必要一下子掌握所有的细节,如果书中的 API 用法和 Rails 4.1(最新的版本)有出入,直接看一下最新的 API 手册即可。另外还可以参考许多 Rails 社区发表的很多版本更新的文章,比如我曾经在 Rails 4 发布后写的一个:《拥抱 Rails 4 —— 详述 Rails 4 的新变化》。拿着敏捷那本书,对照这些参考资料,你可以掌握 Rails 核心至少八成以上的内容。

另外我不得不说的是,作为一个较为前沿的、小众的社区。Ruby 和 Rails 在书籍的丰富程度上是无法和 Java/C++/C# 之类相比的。书籍不是我们获取 Rails 知识的唯一途径,甚至都不是主要途径。如果你选择 Rails,你必须要融入到整个社区去,很多新鲜的、使用的咨询都是直接来自于社区的所有成员(比如中国的 Ruby/Rails 社区)。等这些东西都汇聚成册出书,你就已经落后了很远了。不过对于初学者来说,落后不要紧,追起来也很快,重要的是基础和全面性的涉猎,这才是本答案的重点——

Rails 是一个框架,而不是一个工具

这意味着什么呢?这意味着,Rails 把几乎所有 Web 开发用得上的、时髦的、前沿的最佳实践都整合在了一起(当然,保持了精简,更多的特性可以用第三方 Gems 来扩充),但是他并不负责告诉你这些最佳实践都是怎么回事?它们在整个 Web 开发里扮演着什么角色?它们的具体用法?

这些东西 Rails 没有直接给你提供答案(这不是它的职责),因此就导致很多初学者一听:十五分钟开发一个博客?!卧槽,这么简单?冲啊……

很遗憾,你错了。抱着这个想法去的,你也许只能学会十五分钟开发一个博客了(这件事对 Rails 来说几乎谈不上技术含量),问题是你不知道这十五分钟里 Rails 都帮你做了哪些事情,所以你始终都觉得在门外徘徊,却无法真正的走进去。

接下来我谈几个重点,前提是你的目标是开发一个 Web 应用,你想学会使用 Rails(系统的学会),那么你需要自行补充下列知识点,最终串联起来形成一个知识体系。到了那时你再用 Rails,才会有登堂入室,融会贯通的感觉。

转载,仅供参考。

外交部长幽默地说,汉语是世界上最容易学的语言。其实,这个问题争论了近一个世纪。鲁迅甚至说,汉字是中世纪的茅坑!作为一个学术问题,对语言文字进行比较研究无可厚非,可是常常有人把这个问题上升到民族荣辱,甚至政治立场的角度来看待,这就大可不必了。你说汉语优美,可以写出红楼梦、牡丹亭,人家也可以说英语漂亮,有哈姆雷特,失乐园……

还有人缺乏正确的科学观念,以一代全,以点带面,所以绝大多数网上的争执都是公说公有理,婆说婆有理。

其实,争执哪种语言先进是毫无意义的,我可以告诉你什么语言最先进,最科学。它既不是英语,也不是法语,更不是日语。最先进的语言是世界语!单词简单易学,语法符合逻辑。那么全世界都放弃本民族的语言而学习世界语?看看世界语目前的处境就知道了。

每一种语言都有它的优点,也不可避免地存在缺点。我们应该用科学理性的观点研究这一现象,目地是推动人类的语言朝积极的方向发展,以适应现代社会的人际交往以及未来人类与机器的对话。

以此为目的,判断一种语言的优劣,不外乎三个标准:

一.是否容易掌握,便于学习;

二.是否容易表达,结构是否严谨;

三.是否方便与其它语言交流。

有人说汉字是象形文字,每个汉字都包含了一个特定的意义,所以好学好认。可是,像“囚”、“人”、“口”、“山”这样的象形字少之又少,会意字也不多,二木成林,三人为众,可是三女却是……,品字难道是三个人在接吻,器字难道是四张嘴在和狗做什么吗?

绝大多数的汉字只能靠死记硬背。且不说“魑魅魍魉”这样笔画繁多的字,就是“戊、戌、戎、戍;己、已、巳;未、末”这样“简单”的字一般人不下点儿功夫是弄不清的。

虽然英语并不是会读就会拼(如marijuana, diarrhea等等)但大多数字看见了就基本上能读出来。一个正常的英美小学生虽然没有太大的词汇量,但他/她能看整部的Harry Porter。中国孩子则困难得多。例如“魔术”两个字没有学过的话,中国学生无论如何是不会认识的。反之,“Magic”对于英美孩子来说,即使没有学过,看到了,也差不多能读出来。

的确不少汉字很奇妙,“休”,人靠在树上就休息了,但这也不能就断定英语枯燥乏味呀,且不说英语中的拉丁文、希腊文词源,就比如说“family”这个词,不也可以分解成“Father and mother I love you!” 吗?

汉字的另一个优点是能“望文生义”,也就是说汉字有高度的组词能力,所以简单易学。

比如英语关于车的单词有上百个,什么Car, Sedan, Hatchback, automobile, pickup, SUV, Truck, Bus, Van, Jeep, Trailer, Taxi, Cab, Coach, Buckboard...... 这些词从读音和拼写上都毫无关联,非得一个一个学才能知道它们指的是什么。汉语能 触类旁通:一个车做尾巴,任何人一看都知道是车,,即使是新造出来的一种车,你也知道个八九不离十。当然,如果我们的老祖宗将汉字都做成会意字的话一定是功德无量了。可惜的是,不少汉字的组合叫人感到莫名其妙:“射”是“寸身”,矮子也;“矮”是“矢委”,射箭也!“重”是“千里”,意为“出”,“出”两山重叠意为“重”!

对于新出现的概念,汉语往往可以用先有的单字“造词”,比如用“火”驱动的“箭”,是火箭,会“计算”的“机”是计算机。还有“四环素”、“变阻器”、“碳酸钙”、“七边形”、“五面体” 这些都是原有的汉字组新词。英语则需要另起炉灶组新词。

不幸的是,我们还有很多词汇你若望文生义就会一头雾水:烟花是植物吗?电报是电子报刊吗?辞海里有水吗?秘书可以看吗?还有,什么是“利息”?什么是“秋千”,什么是“会计”?什么是“行李”?

不错,英语的专业词汇如“malachite”,“amber”,“ruby”都不如对应的汉语容易识别,但汉语中也有类似的词汇如“大黄”,“陈皮”,“天麻”等等,不做解释是无论如何不辨其意的。

那么汉字每个词包含的信息量大,初学者只需掌握两三千汉字就能看书读报是否真实呢?不错,常用的汉字不过3000个,《毛选全五卷》105万字,只用了3273个汉字。但是现代汉语使用的多是多音节的词组,认识了单个汉字不等于认识了词组,“秋千”是个明显的例子。再比如“打”字,相对的英语是“beat”,可是汉语有“打架”、“打电话”、“打球”、“打官司”、“打酱油”、“打听”、“打伞”、“打字”……,一个洋人你要他正确掌握这个“打”字,他还不“打哆嗦”,“打退堂鼓”啊?

据美国国务院外交学院(Foreign Service Institute)的统计,一个以英语为母语的成年人要学会一门与英语相近的语言(法语、西班牙语),需要花费600个学时;而学会一门与英语完全不同的语言(日语、汉语)则需要2200个学时!(见图)这里有拼音文字之间相通的因素,但汉语本身难学,汉字难记也是不争的事实。

那么就学习母语而言谁更容易些呢?

我手头没有现成的资料,不过就个人的观察来看,中国孩子在学习语文上所花的时间要多于欧美学生,因为汉字不一个个地抄写,反复练习是记不住的。汉字的读音和书写没有必然的联系,所以即使是成年人,长期不写汉字,偶尔写封家信都会“卡壳”的现象不足为怪。

小结:就认知难度而言,拼音文字比汉语略胜一筹。

语言的产生和发展是一个伴随人类社会的发展而不断演变的过程,语言的规则不同于科学定律,不管哪一种语言都不能用科学手段来判断其逻辑构造和内在联系。语言是艺术,需要人脑去判断,去欣赏。

汉语的“救火”和“救命”;“大胜”和“大败”;“好容易”和“好不容易”都不合逻辑。同样,英语的“loose” 和“unloose”;“ravel”和“unravel”;“slow up”和“slow down”也莫名其妙。

有人说联合国所有文件的版本中汉语本是最薄的,故此汉语简练准确。且不提目前海外很多汉语文件都是繁简两套并行,文字是否简练准确,并不在于篇幅长短。目前的文字处理已经完全数字化,篇幅的长短不再是一个诱人的长处。那一种文字能用最少的语素(最小的语法单位)来最大限度地表达一个概念,也不是简单地举几个例子就能说明的。

小结:就逻辑结构和表达能力来看,汉语和英语各有特点,也各有不足,算是打个平手吧。

人类社会进入了一个前所未有的发展阶段,地球村已成为现实,不同国家之间的交流日趋平凡,语言的相互借鉴与交流也就越来越重要。

就吸收外来语而言,拼音文字之间十分方便,从一个舶来物到某个外国人的名字都可以直接用原文,一个新词汇可以立刻被接受,交流起来也通畅。而汉语就麻烦了,因为汉字跟西文没有丝毫兼容,只能用现有汉字组合生造。

这样造成的结果是,同一个概念或名称,往往因不同人的翻译就有多种叫法,造成不必要的混乱甚至误解(布什、布希、布殊;雷射、激光等等)。

其次,由于中国科技的相对落后,当今大多数的科技名词都产生于英语国家。这样一来,每当一个新词出现,我们必须挖空心思设计一个新词来与之对应。是音译还是意译或是半音半意。往往一个新词从酝酿到定型要经过一个漫长的过程。比如从得律风到电话就走了几十年吧?

汉语的常用词汇少是好事,也是坏事。好在学习起来不比记忆太多的生词,坏在当一个全新概念出现的时候就很难造出相应的词汇。比如网络专用的“socket”,在中国的大学里叫“网络套接字”,居然还有什么“安全套接层”等等,学生起早贪黑好不容易学会了,再看外文资料又是半天对不上号。

普通英美人士可能不认识“Octacyclic”(八边形),可是看看下面的“现代汉语”,没受过大学专业训练的人会不会一头雾水呢?:

“Java开发者利用它简单,便利的API就能够读取Excel电子表格, 进行修改并能够把修改后的变化写到任何output stream中(如:Disk, HTTP, database, 或任何socket)。”

这段话的英文原文对一个具有电脑知识的英美中学生来说不算困难吧?

“纳米”可以吃吗?“爱滋病”是做爱得的病吗?这样的翻译不能不说是一个遗憾。

至于“No Stop”和“No Parking”;“Taxi”和“Rental Car”似乎还没有令人满意的翻译。

现今的媒体中要么是可笑的“粉丝”,要么是大量的“CT,MTV,CD,DVD,DOS,KTV,VCD,IT,MBA,NBA,HIV”原版英语入侵。汉语大有危机重重之感。

小结:在吸收外来语能力上,汉语大大落后于拼音文字。如果我们仍然生活在一个固步自封的年代,语言也不过是一个供市井小民茶后饭余聊天说笑,文人墨客附庸风雅的工具,那么汉语不失为一种优秀的语言,我们大可不必理会别人说什么话,用什么名。然而历史已经证明作茧自缚无异于自杀,我们的语言工作者应当有一种时代的紧迫感,与其呼吁维护汉语的纯洁,不如迎接挑战。女书的灭亡应该对我们有所启示。

设想:汉语的改革是否可以从改革现有的拼音方案开始。目前的拼音过于拘泥于北方方言的发音,违背了南北兼顾的原则,造成“普通话”推广困难。是否可以考虑淡化“z,c,s”与“zh,ch,sh”的区别,以及前,后鼻音的区别。比如“重新”可以是“chongxin”, “congxin”或“chongxing”。

另外,承认某些约定俗成的南方发音(台湾国语发音),如“风”为“fong”.“风景”可以是“fengjing”, “fenjin”或“fongjin”。“普通话”中应该引入入声,并采纳部分吴语因素。这样,中国人的英语发音会准确得多,洋人(包括海外的小假洋鬼子们)说汉语也不会那么生硬了(Sofa, Cement等吴语发音几乎和英语完全一样!)。

其次,可以考虑使拼音字母成为汉字的一部分,而不仅仅是注音符号。这样,汉语可以堂而皇之的把外来语“拿来”使用,不必挖空心思寻找不伦不类的翻译。“Taxi”、“Party”原封不动地拿过来用就好。

语言既然是发展的,拼音文字可以不断的造新字,汉字为什么不能创新?武则天已经做了探索,现代人的智慧应该在其之上,难道不能创造出比“曌”、“埊”更优秀的字来吗?刘半农创造了“她”,从此“叫人如何不想她”,今天有谁能造一个新字来对应“cool”? (口+夸?)

总结:

1. 不要武断的说哪种语言最先进。自有人类历史以来,出现过许许多多语言。今天,“落后”的自然淘汰了。既然存在,就有一定的道理。何况语言和文化密不可分,以一种文化观来衡量另一种语言极不合理,更欠公允。何况证明了哪种语言最先进除了让“愤青”们爽一把,意义又何在?我早说过,最先进的语言是世界语,全世界的人都说世界语?傻子才会那么做。倒是可以建议台湾独立后以世界语为其官方语言,就算是为推动世界语做一点贡献吧。

2. 比较两种语言,比如英语和汉语,或者要真正理解汉语的优势,就必须对英语有相当深的理解和运用能力。网上大多数参与讨论的人,汉语仅限于日常的运用,英语也只是对“托福”和“GRE”的了解。对英语语言文学没有足够的理解,就谈不上真正认识汉语的价值。

3. 具体来说,有一个很常见的误解,即认为汉语易学:一个人只要认识三千个汉字就能阅读《人民日报》。这句话最多只能倒过来说:看懂了《人民日报》,最多只能掌握三千汉字。《人民日报》常用的汉字只有三千多,但绝不等于看懂人民日报只要三千汉字。

现代汉语是以词为基本语义单位的。汉字的信息量大,组词能力就强,要掌握每一个汉字所包含的信息,绝不是“认识”这个汉字就可以了的。比如,认识“秋”和“千”不等于明白“秋千”和“千秋”。还有“行李”、“利息”等等。所以要读懂汉语文章,仅仅认识汉字是远远不够的。要理解“胸有成竹”,远不止认识这四个字。

4. “中国落后,都是汉字惹得祸”。 这个论断实在太武断。中国不是永远落后的,历史上也有辉煌的时候。“事在人为”,人的作用是关键。“汉字限制了中国人的思维”,这一观点也值得商榷。这里要注意区分汉字和汉语的区别。汉字不会妨碍中国人的思维,甚至有实验说明学习汉字能提高思维水平。还要注意一个简单的事实:是先有了中国人,后有了汉字。中国人用自己的智慧发明了汉字,中国人的思维习惯导致中国人用特有的逻辑方式使用汉语。所以这不是汉字的问题,而是汉语,或者说是汉语的词法和语法的问题。中国人特有的逻辑思维如何导致了相对松散的汉语语法结构,汉语的语法结构又如何反过来影响中国人的思维习惯,(好容易、好不容易;养病、养花;救命、救火、恢复疲劳……)。科学从来没有在中国得到真正的发展,这与中国人的思维习惯有没有必然的联系?这个问题是值得深入研究的。

5. “汉字的同音字多,不可能拼音化”。常常有人用赵元任的“施氏食狮史”来证明拼音化不可取,殊不知这是赵老先生的一个幽默,当不得真。任何一种文字的表达都要借助上下文( context)。如果说汉语不能拼音化,那么等于说汉语就只能书写,无法用口头表达了。不信你把“施氏食狮史”读给一个从没听说过这段故事的人听,你还没读的牙齿和舌头打架,别人已听得双耳冒烟了。汉语究竟该不该走拼音化的道路,看来要留到下一代人解决了。

6. 某一种语言成为强势,不仅仅是因为该语言是否“先进”。“钱”能说话( Money talks.)。科技经济强盛了,语言自然跟着沾光。中国人现在全民学英语毫不奇怪。现在中国经济发展了,洋人学汉语也“热”了,等有一天全世界的科技文献70%是用汉语写的,洋鬼子还不乖乖地坐下来把戊、戌、戎、戍;己、已、巳;日、曰;未、末背个滚瓜烂熟?

Docker技术在Ruby社区是有影响力的,我所知道的一些创业团队很早就在运用它来解决环境管理、持续集成以及部署的问题了。但是,也有一些同学尚未注意到这个技术,或者了解过后认为它不是很重要,所以我想讨论一下Docker对Ruby系技术的帮助。

有的人可能对Docker技术不太了解,不妨参考论坛里的这篇文章(https://ruby-china.org/topics/22004 )以及肖德时写的系列文章(http://www.infoq.com/cn/articles/docker-core-technology-preview )。 Docker 与 Vagrant

我一直很喜欢Vagrant这个工具,两三年前就用它来进行自己项目的环境维护,那时候主要是做测试,由于Vagrant将操作系统环境进行了标准化,我很容易就能让自己的应用系统以及相关的测试结果保持稳定。

Vagrant还有一个好处,Ruby社区比较偏爱Mac,但是线上的系统基本都是Linux,所以开发环境所做的测试是有疑问的,特别是遇到一些有so依赖的gem,这时一个和线上完全一样的环境就特别重要。

其实上面的表述不太准确,Vagrant也有各种provider,我所说的场景,基本上都是virtualbox的provider,所以这些地方正确的说法是 vagrant/virtualbox。

和Docker相比,vagrant/virtualbox组合的成本还是很高的,无论是setup一个环境还是reset一个环境,都需要一段时间的等待,Vagrant只是把virtualbox的操作DSL了而已,底层的做法没有变化。而Docker由于本质上就是一个进程,因此天生就是轻量级的。对于运行时间在分钟级别的自动化测试工作,Docker显然有很大的优势。

当然,也有人会认为Docker不能模拟完整的操作系统,不过这恐怕是一个优点而不是缺点。我在以前的文章中已经说过了,这里概述一下主要观点——

Docker简化了操作系统这个基础设施,让应用精简为其最核心的形态——携带有限资源的进程,在此基础上更有利于架构上的最佳实践。

而对Ruby工程师而言,这个“最佳实践”中肯定少不了的一条就是——微服务。

微服务

Ruby工程师中有很多就是Rails工程师,而Rails实际上更倾向于单体架构,因此后来社区的工程师们才需要在实际工作中总结1 to 30这样的实践。

其实微服务本身不是个教条,即使没有人教,我们也常常自发的去进行服务化改造,但是这个工作并不容易,主要是会受到一些问题的掣肘,比如运维复杂度和系统测试成本会大幅度上升等等。

处理这些困难,首先当然是看是否必要,一些简单场景我们也可以用单体架构直接搞定,但是我们很容易会注意到,这两年大家越来越多的提到了微服务或者服务化,这背后其实是有趋势的——各种业务形态都在朝着互联网级的用户规模推进,同时大家都在努力从每一个用户的各种维度上挖掘价值(这导致了大数据的需求),这些场景变得越来越常见,单体架构是难以支持的。

既然微服务或者服务化不可避免,那么就要有相应的对策,虽然Ruby社区也有很多人在不同问题点上针对微服务进行改进(比如完善异步化框架,以及对服务协议的探索等),但是在基础设施层面,Docker是最重要的武器,没有之一!

对Ruby工程师来说,Docker能做两件事:约束边界和建立通用基础服务。

约束服务边界

Ruby项目Docker化,并不是简单换个虚拟机那么简单,我们会面对拆分的压力,相信很多人尝试用Dockerfile来描述自己的项目的时候都会觉得束手束脚,但这些地方其实是促使我们想清楚——这个应用到底要做什么?它和外界是什么关系?对于外界的变化它如何响应?失败后怎样恢复?

这类的问题对系统架构非常重要。比如应用到底要做什么,这是让工程师去思考系统的目标,无论是提供web服务,管理调度后台任务,还是提供实时分析,它们都应该有一个尽可能单一的目标,在这个基础之上,我们建立的服务才有可能是易测试、易扩展和易维护的。

其它问题也类似,这些地方以前如果没有留意,很可能不是没问题,而是没意识到,使用Docker有助于我们意识到这些问题。

另外补充一点,由于Ruby项目不能完全脱离动态库依赖(java大都可以),本身的打包机制又没有自包含结构(gem+bundle不包括动态库,相比之下,Golang是静态联编的),在分布式环境中的交付和软件包分发其实是有着先天不足的,Docker的Image恰好补上了这一块,简直是睡觉时候有人送枕头了。 建立通用基础服务

当我们将应用系统分裂为各种服务并明确其边界以后,就出现了“分久必合”的问题,这很自然,服务化改造并不是各行其是,应用之间还是要协作,而对应用的运维——服务发现、水平扩展、容错等等——都需要基础设施的支持。

以前,对于这种运维基础设施,各公司甚至同一个公司的各个团队的做法都千差万别,但是借助Docker以及周边的生态圈,我们可以很容易的得到通用的服务发现框架,享受自动的部署和弹性扩展。

更好的消息是,这些基础服务是通用的——不但不关心是rails还是sinatra,甚至根本不关心是不是Ruby。

这也很好理解,Docker是对进程这个操作系统工作单元进行了简化约束,而进程的概念本来就是与语言和框架无关的。

这使得Ruby工程师以及Ruby项目可以更为自由的选择合适的技术去扩展公司的产品线。

延伸技术框架

Ruby 刚出来的时候,有很多来自 Java 社区的工程师加入其中(我也算是其中之一吧),很多人最大的感受是——视野被打开了。曾经象口号一样的“all in java”变成了落后的标志,大家意识到,一把钥匙开一把锁,用最合适的技术针对性的解决问题才是聪明的做法,单纯排斥某种技术或者语言框架并不明智。

这个道理在Ruby/RoR应用开发中也不例外,但是不少人在使用了几年Ruby以后都会遇到一个问题——“Ruby确实很适合开发Web,但是现在有些问题需要使用XX技术,而我们的系统严重依赖Ruby环境,这该怎么办呢?”

我认为问题就出在“系统严重依赖Ruby环境”上,研发的基础设施,比如配管、自动化测试、打包、部署,不应该仅满足一种技术或是语言,它一开始就要考虑到通用性,否则我们就只能“手里拿着锤子,看谁都像钉子”。

Docker本身和语言无关,它唯一的约束大概就是要运行在Linux上,这个对互联网服务端系统来说也算是标准了,问题不大。所以,我们应该以Docker为核心打造研发的基础设施,这将是未来的一笔重要投资。

当然,为未来画饼是危险的,不过还好,Docker领域的创业很活跃,有很多团队和公司已经做了相当多的基础工作,对于Ruby工程师和Ruby创业团队,去用现成的基础设施其实更方便。