当你开始学习编程的时候,你身边的所有事情都在开始发生变化。在Firehose里,我们喜欢把它叫做拐点。在这个阶段之后,作为开发者的你的操作方式将会有很大的不同。建立拐点是一个从自我编程到不需要手把手指导的过程。那将是一个痛苦的过程,不过一旦一突破了这个点,你将会得到快速的成长。
在Firehose,我们的目标不仅仅是教会Ruby,教你如何完成一个web应用,或是教会你如何写测试。虽然这些技能我们也教,甚至教的更多,但我们最主要的目标是帮助学生突破拐点并且掌握解决具体问题的能力。我们坚信独立解决问题的能力是十分宝贵的,并且这种教学方法将会比简单的学会如何完成一系列的APP对你的帮助更大。
学习阶段(3-8周的严格代码训练)
当你决定开始编程的时候,你仍然有很多东西不知道。这些东西被称为是专业知识。例如:如何在Ruby中写一个循环或是如何在Rails中使用Ruby来获取数据库中的数据。这些知识还包括特定编程环境下的特定的协议。
首先,你需要学会如何完成特定的任务。一旦你掌握了这些知识,这些知识如何组合使用将变得越来越清晰。随着时间的推移,你将会开始认识到模式,并且最终哪些曾经令你感到困惑或是经常忘记的东西将变得习以为常。
对于刚开始学习的学生来说,最应该关注的就是细节
当你在查阅一些文档或是学习一些教程的时候,最应该关注的就是细节。即使是再小的错别字或是拼写错误都将导致错误警报或是产生bug。浏览错误信息是一个非常痛苦的事情,但它也是学习编程过程中关键的一步。在处理错误信息和问题的过程中你将会学会一个非常重要的编程技能:以细节为导向。
调试错误时非常非常重要的。事实上,错误信息是编程过程中的一部分,不管你是没有经验或是有经验的开发者一样会碰到。唯一不同的是,你解决的问题越多,你将会话费更少的时间来解决问题。以下是为什么:
- 随着时间的推移,你将会学会如何阅读这些错误信息,并且能快速地获取这些问题的细节。当你第一次看到这条错误时,你可能需要花一会时间来理解它到底是什么意思。但是,当你已经碰到过数百条错误信息之后(你将会看到数百条的错误!),你将能找到出问题的位置和解决该问题需要的相关信息。
- 你应该在每一条错误信息中学习。弄清楚你的错误代码的问题所在,而不仅仅是修复一个错误。通过这种方式学习,当你下一次碰到这个问题的时候,你将能更加快速的解决这个问题。
- 起初,对于你碰到的这些错误信息你可能需要寻求一些帮助。随着时间的推移,你将学会通过检查代码和使用G Goolge搜索来减少你求助的频率。
在学习阶段,你需要跟着指导一步一步来。首先,你会发现跟着指示来并没有那么简单,并且你会频繁的碰到许多错误信息。随着时间的推移,你将培养你调试错误的能力并且将关注到更小的细节,你也将得到非常快速的进步。当你完成这个教学阶段,你会发现自己能够更快速的编写代码。
在这一点上,有些人会过于自信,好像他们已经不需要训练和系统的指导一样,并且乐此不疲的陷入深渊。另一些学生通过学习更多的教程,通过学习更多的专业知识来使自己全面理解知识。不幸的是,教程也就只能教你到这里,真正的自信并不是来自教程或是指导。真正的自信来源于你与哪些你不知道怎么解决问题的斗争当中,并且你通过自己将它解决。
关于编程必知的小秘密
你不可能了解所有的知识,你需要知道的是如何解决你碰到的问题。在编程的旅途中,你可能会想象自己已经掌握了所有你需要学习的知识,并且***。这是不存在的。
编程是一个长时间的学习过程。有经验的软件工程师总是主动去解决那些他们还没有解决的问题,因为这些问题能够让他们学会更多的东西。如果你发现自己正在等待你有一天将了解到编程的所有知识,你应该知道这一天永远也不会到来。这多么具有挑战性啊。
当你满足下面条件是你将进入你旅途的下一个阶段
- 你已经接触过太多的错误警报了,这些错误警报已经吓不到你了。并且你知道这些错误提示的具体意思,知道去哪里解决这些问题。
- 你能熟练的使用Goolge来解决你的问题。当你正在添加一个新的功能,或是解决一个错误警报时,你知道如何搜索你需要的信息。
- 你已经能在你的其他程序中引用你之前写过的代码并且能够使用这种方式,而不是总是寻求指导。
拐点(2-4周保持正确的心态)
瓶颈期使我们学习编程过程中最痛苦的阶段,不过在许多方面,这也是非常重要的阶段。当你不再使用那些教程,并且能在没有人为你准备解决方案的情况下解决问题的时候,这才是重点。
在许多方面,你感觉自己好像还没准备好应对这个阶段,并且想回去建立一个有明确要做的事情的大纲。不要被这种心理困扰。你感到沮丧的原因是:
在瓶颈期,你的编码速度会比上一个阶段慢10倍-20倍。
你会开始问你自己是否能成为一个程序员。在这一阶段,没有安全感或是怀疑自己是非常普遍的心态。
尽管你感觉自己学习东西或是处理事情的速度非常慢,但事实上,你正在处理这些问题的关键点。
尽管你发现你自己在以一个更慢的速度学习知识和完成任务,但事实上你正在完成最重要的事情。While your domain-specific knowledge is screeching to a putter, everything you’re learning will be about procedural knowledge.
实践性知识是一种能力,这种能力能够教会你在这条路上你所不知道的东西。当你需要实现一个新的功能的时候,你需要使用那种类型的Goolge搜索?此时此刻,当你需要完成许多事情的时候,你会感觉自己身处与黑暗之中一样。学习如何通过自己找到出路是十分重要的,因为你不可能知道所有事情,因此,你需要教会如何着手解决问题。
大多数人都没有意识到,为了学习编程,你需要学习专业知识和实践性知识。
在你今后的生活里,每一天都超出你的极限。
一些软件工程师们在他们找到自己的立足点之后便一直待在他们的舒适区里。这种类型的程序员被认为是维护性程序员,这不应该是你应该努力的方向。然而,你每一天都应该努力超越你的极限。程序员们辞掉他们工作最普遍的理由是:“我已经解决了所有有意思的问题了,这已经不再有什么挑战性了”。
你应该主动去发现那些超出你现在技能范围之外的问题,而不是努力将这个程序项目推进你的舒适圈。这是唯一提升和拓展你能力的方法。
In the words of a Firehose student upon passing his inflection point:
I still feel like I’m in the deep end! I’m just getting more comfortable knowing that’s where I’ve got to be!
在web开发中,你将会遇到两个拐点。
web开发中的拐点是什么时候你能够建立任何你想完成的数据库驱动的应用。这意味着你完成的多个页面的网页能够从简单的数据库中存取数据。网页开发者把这叫做掌握了CRUD。在这一阶段,你应该能通过使用GitHub或是博客上的参考资料整合任何第三方的库。
算法和数据结构的拐点是一个更深层次的拐点,它也非常重要。那些克服了这个拐点已经掌握他们工作中使用的语言,并且掌握了编程的基础和解决复杂编程问题的深层次的知识。
那些克服了算法和数据结构拐点的人能够:
- 编写排序算法
- 实现和反转链表
- 理解和编写堆栈、队列和树的程序
- 使用迭代和递归的方法编写计算机程序
总之,一旦你突破了这些拐点,你将能够掌握如何操纵数据,并且理解你的代码如何实现它的。传统的计算机科学学位特别注重学生突破算法和数据结构的拐点。许多大学在教授这一点的时候常使用那些在行业中不常用到的语言,像Scheme、Racket、或是LISP。
在许多技术面试中,面试官们会自认为你已经通过了第一个拐点,应为那个相对更容易,特们会更倾向于问和评估你算法和数据结构方面的能力。这些问题普遍集中在以上提到的主题中:排序算法、反转链表、使用堆栈、队列和树。