(注:这篇文章是在我上一篇文章“学会学习”的基础上发展起来的,并且引用了几次--不过,如果你错过了第一篇,这篇文章应该还是有意义的。此外,这不是教程,而是我学习Ruby on rails的经验记录。)。
我最近发现自己有7天的时间学习Ruby on rails。这在我上一篇博客文章中有过简短的提及,但我现在想花点时间详细说明一下这段经历。
我上一篇博文都是关于如何学习,以及采取最好的学习方法。这篇博客文章是关于将这些想法付诸实践的-一个案例研究。
首先,我正在面试。那是一个星期五的下午,下周五我将参加一个现场编程练习。本练习的大部分内容都涉及到使用Ruby on rails应用程序。这意味着我有7天的时间来学习这个框架。
你可以推测一下我是如何发现自己处于这种境地的。也许这是某种伪造或欺骗的结果。也许我谎报了我的经历,好让我的脚踏进这扇门,而现在我只能手忙脚乱了。但是,唉,不是的。这并不是那么令人兴奋。没有不诚实的行为,也没有邪恶的行为。相反,我和面试官之间有一个共同的理解,那就是我没有带来任何预先存在的Rails知识。
协议是我将学习一项新技术,他们会根据我学得有多好来评判我。我会学习,但不会掌握技术,他们会在评估我的知识时考虑我的环保程度。
因此,我推断我对Rails框架的知识并没有真正接受测试。当然,当时机成熟时,我必须表现出一定程度的功能知识。然而,如果这就是他们想要的全部,他们可以直接对我进行测验--给我一次能力测试或类似的东西。但相反,他们想调查一项更重要的技能-他们想看着我学习。
然而,尽管它可能很重要,但衡量一个人的学习能力是困难的!从一份简单的简历或求职信中,你不可能完全理解一个人或他们可能拥有的软技能。而技术面试,不管有多严格,最终也没有抓住要点。
我从来没有感觉到自己被技术评估或遵循愚蠢方法(比如明星方法)的采访所代表。但是通过在面试中加入一个学习过程(即学习Ruby on rails),它给了我一个完全展示自己的机会。这对我们两个都有好处。他们能够测试我一些非常重要但又很难量化的技能,我能够以一种我通常无法做到的方式来表现自己。
当我思考面试以及我真正被评估的内容时,我开始形成一种策略--一种思维定势。
我开始采取更高层次的学习方法,并在整个过程中提醒自己把重点放在概念、更大的图景上,以及我正在学习的东西如何与我现有的知识相联系。这对我来说是新的领域。在我的职业生涯中,我第一次不仅意识到我在学什么,而且意识到我是如何学习的。
例如,以继承的想法为例。低级思考听起来可能像是,“所有其他类都在添加<;ApplicationController,如果它们想使用这个方法,所以我也需要这样做。否则它会抛出错误。‘’
但是高层思考可能更像是,“我需要访问ApplicationController类的方法。Ruby支持继承,所以我将把<;ApplicationController添加到类定义中,让编译器知道我在继承它。“。
这可以是非常简单的事情,比如“在Python中是None,在Javascript中是Null,但在Ruby中是Nil”,或者建立连接,比如“哦,这就像Rail版本的pip,或npm”。
“我还没有看到任何关于字符串插值的东西,我想知道Ruby是否支持某种版本的字符串插值?”
“我怎么用Python做这样的事情呢?JavaScript?是更容易还是更难?“
“Rails为您生成了许多代码中没有定义的函数和方法-我打赌这将很难调试。”
我喜欢做手写笔记,以确保我不是在白日做梦,或者只是将目光移到单词上。如果我真的很有目的,我喜欢做教程或教科书中经常包括的一些额外的活动和练习。有时它们很愚蠢,感觉很浪费,但它们确实迫使我积极、思考和运用我所学到的东西。
每个人都有自己的节奏,太快的节奏会降低学习的其他方面。我发现当我速度过快时,我就不再做笔记,开始跳过有用的活动。我变得懒惰,学到的东西也不多。以健康的速度运动,并在需要的时候休息是非常重要的。
能够退一步,在这样的高层次上解决问题,对我来说是一个重要的里程碑。简单地说,当您学习您的第一门编程语言时,您没有任何东西可以与之比较。您唯一可以关注的是低级细节-语法、迭代和数据结构等。
然而,学习者有可能永远不会从这种心态中毕业。开发人员可以在功能级别上了解三种、四种或更多语言,但仍然不了解这些概念。
可能是到现在为止,我只是没有足够的经验来看到更大的图景。或者,尽管我不愿意说,也许我是一个从来没有从记住低级细节的心态中毕业的开发人员。或者可能是我在思考概念,分解信息,对知识进行分类,但我只是没有非常意识到这个过程正在发生。
但是无论出于什么原因,当我开始学习Ruby on rails时,我敏锐地意识到我有了一种新的学习方法。就像我徒步走到了一个新的有利位置。在穿过一片森林后,我只能看到藤蔓和树叶,现在我站在一座山顶上,清晰地看到了我去过的地方,以及我走过的小径。
带着我新的学习心态和方法,我迫不及待地想开始学习。
Michael Hartl的Ruby on rails教程是我学习Rails时使用的主要资源。这是一个非常令人印象深刻的学习工具,它引导你构建本质上是Twitter的克隆。不幸的是,它不是免费的(显然它曾经是免费的--我想我错过了这一点),但我相信,获得在线版本的31美元标价是非常值得的。
当我感到好奇或寻找关于某个Rails模块的更具体信息时,我还查阅了Rails API Docs几次。多亏了本教程,我真的不需要深入研究文档,但我认为熟悉您正在使用的任何语言或框架的源文档总是很好的。
当然还有Google,这让我看到了Stack Overflow、GitHub问题和随机的博客帖子。
首先,我了解到Ruby是一种编程语言!嗯,我大概已经知道这一点了,但在这之前,一些能言善辩的人可能会说服我不这么认为。你知道吗,当你认为你知道某件事的时候,你听到人们在谈论它,但你实际上并不知道它?我从来没有使用过Ruby,也从来没有真正有理由这样做。因此,尽管听起来很简单,但这就是我开始的地方--将Ruby识别为一种语言。
在此基础上,我了解到Rails是一个用Ruby编程语言编写的Web框架。现在我们有进展了!我开始理解组成Ruby on rails的组件了,我可以把它们与我已经知道的联系起来。说Ruby on rails有点像说反应上的Javascript(尽管这听起来不太一样,不是吗?)。
我的下一次怀着好奇心--有没有我应该使用的版本管理器?
我熟悉分别用于管理Node和Python版本的NVM和pyenv,但是我正在学习的教程没有提到任何Ruby版本管理器。我上网找到了人气很高的rbenv。
有了rbenv,安装Rails变得很容易,生成一个项目也是轻而易举的事。我发现rails new命令功能强大、自动化,它为我提供了在浏览器中启动和运行项目所需的一切。看到一些早期的成功总是令人高兴的,即使是“你好,世界!”,或者在这种情况下,“耶!你就在轨道上!“。我将其与我使用npx create-action-app的体验相提并论,npx创建-反应-应用程序生成一个简单的反应应用程序。
我在生成一个项目后的第一印象是--“有很多事情在进行。”
生成Rails应用程序会产生46个目录和子目录,以及89个文件。其中一些文件我很熟悉,比如readme.md,以及包含标准的404.html和folicon.ico的public/文件夹。但其他大部分都是未知领域。
为了让事情变得更简单,我们可以试着去掉多余的部分,专注于应用程序的核心。可以说,最重要的目录-您可以在其中找到应用程序的主要部分-是/app目录。但即使在那里,也很难对正在发生的事情有所了解。
下面是您在生成新应用程序后在/app目录中看到的内容-。
├──APP│、├──Assets│、│、├──Config│、└──清单.js│、│、├──Images│、│、├──JavaScript│、├──应用程序.js│、├──cable.js│、└──Channels│、│、└──Style Sheets│。*│└──Application.css│├──Channels││└──APPLICE_CABLE││├──││└──Connection.rb│├──Controlators││├──Application_Controler.rb││└──Concerns│├──Helpers│For│└──Application_Helper。Rb│和├──JOBS│和│└──Application_job.rb│和├──Mailers││和└──Application_mailer.rb│和├──Models││和├──Application_Record.rb│和│└──Concerns││Views│**└──Layout│*│和├──Application.html.erb│。*├──mailer.html.erb│和└──mailer.text.erb。
这是自动化的阴暗面。当这项工作为你完成时,你不必理解它。
但是,当我按照教程学习的时候,我开始学到一些熟悉的东西。起初,我对项目中散布的.html.erb文件扩展名感到困惑,但后来了解到erb是一个嵌入了Ruby代码的HTML文件。这是有道理的-我熟悉PHP文件中的概念,或者Reaction中使用的JSX。Gemfile等同于我习惯的其他清单/依赖文件,比如Node的Package.json和Python的Requirements.txt。
当然有一个学习曲线,我花了一段时间才适应,但随着时间的推移,Rails目录结构开始变得有意义了。和(剧透警报!)。事实证明,这种标准目录结构实际上是我最喜欢的Rails特性之一。它允许您进入几乎任何Rails项目,并快速了解正在发生的情况。这似乎是Ruby on rails的一个共同主题--有些东西起初看起来非常吓人或令人困惑,但在克服学习曲线之后,它就变成了框架中一个非常有用的元素。
在Rails之前,我从未使用过模型-视图-控制器设计模式。我从Android Studio和Android应用程序开发中听说过这个想法,但还没有真正很好地了解它。它可以被认为是-。
我遵循的教程将mvc描述为“…。体系结构模式,它强制将应用程序中的数据(如用户信息)与用于显示数据的代码分开。“。
由于我试图专注于高层思考,因此Rails应用程序体系结构的这种高级视图显得尤为重要。如果我是懒惰的话,这正是我可能会略过头而不会太在意的那类事情。在没有学习MVC的重要性的情况下,我可能仍然可以设法构建Rails应用程序,但是它们会很混乱。它们不会工作得很好,需要更长的时间来开发,而且更难维护。
所以我从容不迫地做了笔记,让MVC知识安顿下来。
├──APP│、├──Controlders│、├──Models│、└──Views、│和└──(其他几个目录)。
我需要一些实际的动手开发才能实际理解MVC的含义,因为抽象知识通常不同于实际知识,但现在我在开始编程时就意识到了这一点。
后来我学到了“瘦控制器,胖模特”的口头禅,因为我已经进入了MVC的思维模式,这对我来说实际上是很有意义的。我相应地调整了我的发展战略。如果我忽略了高级体系结构,我可能只会将所有逻辑都放到控制器中。我不会理解“瘦控制器,胖模型”是什么意思,我的项目会受到影响,也许最糟糕的是,我可能会在其他开发人员面前让自己难堪!
自从Rails问世以来,这一直是一个很好的讨论话题。Ruby on rails让新手感到困惑,有人形容它“太神奇了”。我一开始也很困惑。在整个应用程序中,都有对我找不到定义的函数或文件的引用。
Rails感觉很神奇,因为它为您做了很多事情。它导入对象、呈现对象、将实例变量从控制器传递到视图,等等。只需将一个资源添加到routes.rb文件(即,RESOURCES:USERS),就会为CRUD操作添加七个不同的路由。有可重用的部分,它们是由文件名开头的下划线指示的特殊类型的视图。甚至不要让我开始讲解向模型添加has_secure_password时所涉及的魔术。
太吓人了!人们可以并且确实会说这样的话:“如果您认为Rails很神奇,那么您只是还没有读过文档。”对于那些能够如此轻松地坐下来、阅读和理解文档的人来说,这是值得称赞的,但我知道,对于我来说,在它开始变得有意义之前,我必须亲身体验过它。
但随着实践和研究,魔力会逐渐消失。Rails中的所有含蓄、抽象和“魔力”都是有目的的。这不仅仅是让人困惑的地方。在变得舒适之后,回报是开发速度快,耗时的任务被解除,开发人员的生活质量很高。能够利用Rails的魔力成为一种超级大国。
话虽如此,但也有潜在的不利因素。首先,对于那些希望使用Rails的人来说,陡峭的学习曲线是进入的障碍。还存在这样的风险,特别是在元编程方面,代码可能变得太复杂,错误太难跟踪。Ruby on rails是一个框架,其中的代码可以做完全相同的事情,但看起来非常不同,这可能会使维护项目变得困难,特别是在多个人参与的开发团队中。
Ruby语言可以有自己的专用帖子,所以我将把自己限制在最突出的三个方面。
这不完全是真的,但大部分是真的。Ruby是非常面向对象的。当然也有例外(比如if语句,或者诸如Break和Continue这样的流控制关键字),但是大多数情况下,所有东西都是对象。并且对象有类。并且类有方法。
作为一个有趣的小实验,我们可以检查数字1的性质-。
因此,整数1和nil对象nil最终都继承BasicObject。而且,任何属于BasicObject子类的对象都可以访问BasicObject的方法。我只是觉得这太酷了。任何事物都有一个共同的祖先-一切都有一种统一性。
在Ruby中,您可以使用PUT“Hello World!”打印到控制台。这本身并不是很有趣,但是如果您检查一下看跌期权的行为,就会发现Ruby的内在阴谋。
Ruby在这方面很奇怪,对于开发人员来说,非常清楚这一点很重要。在Ruby中,所有内容的计算结果都是一个值。PUTS方法必须返回一些东西,所以它返回零。
在您正在编写的方法中,如果没有返回调用,那么最终返回的将是该方法中的最后一段计算代码。
这种行为与我以前使用过的其他语言非常不同,对我来说非常重要--它是Ruby的一个基本元素。不理解这样一种语言的某一方面可能会在以后的道路上造成很多挫折感和心痛。
块是Ruby最令人困惑但功能最强大的元素之一。它们允许您对表达式进行分组,将其保存到变量,甚至将其传递给方法。我还在习惯块,并意识到它们的用处,但总的来说,我觉得它们浓缩了大量代码,也使代码更具可重用性和可扩展性。
[‘h’,‘o’,‘w’,‘d’,‘y’].每个Do|Letter|。
我在前面提到过这一点,但是关于Ruby on rails,我最喜欢的事情之一是目录结构。起初它是压倒性的,但现在它显示出自己是Rails最伟大的品质之一。在不同的Rails项目之间有一个普通的一致性,这对经常在不同项目之间跳跃的开发人员(特别是我们的顾问)来说是一个巨大的好处。
我最喜欢的Rails的另一个方面是充满激情的社区。来自这样一个社区的是坚实的文档、社区支持、非常好的教程和大量的在线讨论。社区的影响也通过编码约定和开发风格的形式渗透到了Rails中。这些约定无论如何都不是必需的,但是它们作为框架在Rails中是如此根深蒂固,以至于它们不能不促进更好的应用程序和激发更好的开发实践。(在这篇博客文章中可以找到许多约定,它们包括Dry原则、测试驱动设计和利用数据迁移。)
最后,在开发过程中,利用Rails的“魔力”已经成为一种乐趣。现在,在Rails中开发感觉比我以前使用过的任何其他框架都要快。
学习曲线。这是一个重要的学习曲线。我不喜欢这样。话虽如此,一旦我渡过难关,我几乎欣赏到了所有原本困难的东西(事实上,大部分困难现在都在上面的我真正喜欢的那一节中了!)。
我一直觉得困难的另一件事是,Ruby代码可能看起来非常不同,这取决于您选择如何编写它,这一点我在Rails的魔力一节中简要讨论过。有可选的括号,可以选择省略返回语句、复杂块、元编程等等。在Ruby on rails中很容易产生一些新奇的东西,缺点是当您看到其他人的代码都很奇特时,很难维护他们的代码。
有办法解决这个问题-始终以最简单的方式做事,使用像RuboCop这样的工具来强制执行语法规则,遵循Rails编码约定,甚至可以在公司内拥有标准的编码约定。
我现在使用Ruby on rails已经有几个月了(谢天谢地我得到了这份工作)。
不出所料,与我在7天的课程中所学到的内容相比,关于这个框架还有很多需要学习的东西。我每天都在学习。
但是现在,虽然我不必担心即将到来的面试的时间紧迫,也不必向别人展示我知道如何学习,但我仍然试图保持我最初学习Rails时的心态-我试图保持对。
.