当你开始学习编程的那一刻,你的世界也会随之产生变化。在 Firehose,我们喜欢称其为编码的拐点。在此阶段之后,您作为开发人员的运作方式将大不相同。建立拐点是在编程中变得自给自足的过程,直到您不再需要任何牵手。这可能是一种令人沮丧的经历,但当它出现的时候,就会赋予你无穷的力量。
在 Firehose,我们的目标不仅仅是教你 Ruby,如何构建 web 应用程序,或者如何编写测试。虽然我们确实教授这些技能和其他东西,但我们的主要目标是加快学生通过拐点考试,这样他们就能获得解决遇到的任何问题的能力。我们相信,能够自己解决问题是一种非常宝贵的技能,这种教学方法将带你走得更远,而不仅仅是学习如何建立一套应用程序。
教程阶段(3-8周的认真编码)
当你开始学习编程时,有很多信息你还不知道。这种信息称为特定领域知识。例如: 知道如何在 Ruby 中编写循环,或者如何在Rails框架中使用 Ruby从数据库提取某些内容。特定领域知识包含了特定编程环境所特有的协议。
成为一个自给自足的开发人员的第一步是学习如何完成特定的任务。一旦你掌握了某些任务,这些部分如何组合在一起的大致轮廓将开始变得清晰起来。随着时间的推移,你会开始认识到模式,最终,那些最初看起来令人困惑和陌生的事情会成为你的第二天性。
对于初学者,最重要的是注重细节
在阅读材料如文档或教程时,密切关注细节是很重要的。即使是最小的打字错误和拼写错误也会导致错误消息或错误。一开始看到错误消息是一个令人沮丧的经历,但这是学习过程中至关重要的一步。在这个阶段处理错误消息和问题教会您在安全环境中编程的最重要技能之一: 面向细节。
调试错误消息非常重要。事实上,错误消息只是编程的一部分: 它们被没有经验和非常有经验的开发人员看到。唯一的区别是,处理错误消息的经验越丰富,花在修复它们上的时间就越少。原因如下:
- 随着时间的推移,你会学习到如何读取错误消息和如何迅速提取问题的相关细节,第一次看到错误消息时,需要一段时间才能解码它的实际含义。但是当你看到数以百计的错误消息之后(你会看到数百次!),您将能够查明问题的位置以及解决问题所需的相关详细信息。
- 你应该要从每个解决过的错误信息中学习,不要只是修复问题,要了解正在修复的代码出了什么问题。通过从每个错误中吸取教训,下次你再犯同样的错误时,你就能更快地改正它。
- 最初,您可能会在错误信息中寻求帮助。然后,你会知道通过反复检查代码或者Google搜索解决问题。
在教程阶段,您将按照说明书操作。一开始,你会发现遵循指示很有挑战性,而且错误消息会经常发生。随着时间的推移,你会逐渐掌握调试错误的技巧,并且更加关注细节,这样你就能更快地取得进展。当你结束了教程阶段,你会注意到你能够以更快的速度编写代码。
在这一点上,一些人感到自信(好像他们已经准备好放弃训练轮,准备在没有结构化指导的情况下开始构建东西)并且会愉快地投入到更深一层。 其他学生会寻求更多的教程,试图获得更多领域特有的知识,以寻求”全面理解”。 不幸的是,教程只能让你到目前为止,真正的自信不是从教程和说明书上得来的。 它来自于在一个你不知道如何解决的问题中奋斗,并且自己发现一个解决方案。
编程中非常恶心的事情是…
你永远不会知道解决所有问题所需的一切。在解决问题的时候,你可能会觉得自己已经掌握一切,接下来就是顺理成章的摆平它。但是这一刻永远不会发生。
编程是一种终生的学习经历。有经验的软件工程师寻求解决他们还没有解决的问题,因为这给了他们学习更多的机会。如果你发现自己正在等待这样一个时刻,当你最终觉得自己已经知道了关于编程的一切,那么请记住: 你等待的那一天永远不会到来。这是一件美妙的事情。
当你准备好进入下一个阶段的时候:
- 你已经看到了足够多的错误消息,它们不会再吓到你了。相反,你知道这些错误的意思,并且可以在代码里面找出问题。
- 你可以非常专业的在 Google 搜索解决方案。当你在做一个功能或者看到一个不会的错误信息时,你知道要搜索什么才能找到所需的信息。
- 你可以参考系统中的其他代码来编程,而不是写一点就查一下资料。
拐点(2-4周,良好的心态)
拐点阶段是学习编码最令人沮丧的阶段之一,但在许多方面,这是唯一重要的阶段。这就是当你逐步停止使用教程并开始解决那些没有人为你准备好解决方案的问题的时候。
在某些时候,你会非常不适应这个阶段,想要建立一个具体要做什么的大纲。不要陷入这种心态。你会感到沮丧的原因是:
在拐点阶段,您的编码速度会比前一阶段慢10-20倍
你可能会开始质疑自己,怀疑自己是否真的有能力成为一名程序员。在这个阶段,不安全感和怀疑是很常见的。
尽管事实上你会觉得你学习和完成事情的速度要慢得多,但实际上,你正处于重要阶段。当您的特定领域知识急速发展时,你所学的一切都是关于过程性知识的。
过程性知识就是一路上教会自己不知道的东西的能力。当你需要实现一个新功能时,你应该使用哪种类型的谷歌搜索?在这个时候,当你想要完成很多事情的时候,你会觉得自己“在黑暗中”。学习如何自己寻找光明是至关重要的,因为你永远不可能知道所有需要知道的东西,所以你需要能够教会自己如何解决手头的问题。
大多数人没有意识到,为了学习编码,你需要同时学习特定领域和过程性知识。
在你的余生中,每一天都要超越自己的极限
一些软件工程师一旦找到自己的立足点,就会呆在自己的舒适区内。这些类型的程序员被称为维护程序员——不是你应该努力成为的人。相反,你应该每天努力超越自己的极限。程序员辞职最常见的原因是“因为我已经解决了所有有趣的问题,这已经不再具有挑战性了。”
与其试图把编码项目拉进你的舒适区,你应该寻找那些超出你当前技能范围的问题。这是建立和扩展你的技能的唯一方法。
一位 Firehose 的学生在通过他的拐点时说:
『我依然身处困境,只是我越发清晰地知道,那就是我必须要去的地方!』
在 web 开发中,实际上有两个转折点会同时出现
Web 开发拐点是你能够构建任何你想要的数据库驱动应用程序的关键。这意味着能够构建一个拥有许多页面的 web 应用程序,从一个简单的数据库中存储和检索信息。Web 开发人员称之为: “掌握 CRUD。”在这个阶段,您还应该能够通过遵循 GitHub 上提供的文档或一篇博客文章来与任何第三方库(例如 ruby gem)进行集成。
算法和数据结构是一个非常重要的拐点,如果有人能够克服这个问题,那么他就已经掌握了他们正在使用的编程语言,除此之外,他还掌握了编程的基础知识,并且对解决复杂的编程难题有着深入的了解。
那些已经征服了算法和数据结构的人们将能够在下一个拐点:
- 编写排序算法
- 实现和反向链表
- 理解和编写利用堆栈、队列和树的程序
- 使用递归或迭代解法编写计算机程序
简而言之,一旦你通过了这个拐点,你将会掌握数据操作,并且理解你的代码决策的性能影响。传统的计算机科学学位专注于让学生通过算法和数据结构的拐点。许多大学教这些程序设计语言,而这些语言通常并不被业界所使用,比如 Scheme、 Racket 或 LISP。
在大多数技术面试中,面试官会假设你已经通过了 web 开发拐点,因为这样做更容易,他们的问题集中在评估你在算法和数据结构方面的技能。这些问题通常集中在我们上面提到的主题上: 排序算法、反向链表以及使用堆栈、队列和树。
一旦开发者通过了 web 开发拐点和算法和数据结构拐点,他们就掌握了通往成功的钥匙
这些开发人员将能够解决交叉在两个方面的挑战: 需要在高级 web 应用环境中构建的复杂算法。这就是 web 网站开发人员每天所做的核心工作。
拐点的意义
当你第一次听到拐点的意义的时候,可能会觉得违反认知。深吸一口气:
『在学习编程这条路上,特定领域知识并不重要』
是的。我不是在开玩笑,这真的没什么大不了的。一旦你通过了拐点,只需要一个星期或两个教程,甚至几天,你就可以将这些概念消化吸收。
最终真正重要的是:
- 掌握 web 开发框架
- 在任何编程语言中编写复杂的算法代码
招聘经理希望开发人员具备可靠的 Web 开发能力和算法技巧
当我在 PayPal 工作的时候,我的团队雇佣了一个没有 Rails 经验的资深 Rails 开发人员——他用 Python、 LISP 和 Perl 编写了很多代码。几天之内,他就已经产生了巨大的影响。几周之内,就产生了巨大的影响。他很快就成为了技术团队的领导,是我参与过的最好的招聘决定之一。
不要为这堆东西烦恼。很多人会这样说,“ AngularJS 最近很流行”,“ JavaScript 正在兴起”,或者“最新流行的是… …”我的回答是: “所以呢?”,当你学习如何编程时,你唯一的目标应该是找到拐点并消灭它。一旦你做到了,学习这种新的、热门的框架就不再是一件难事了。
自力更生。在没有结构化指导的情况下学习新的编程技能意味着你不再需要等待任何人来帮助你。这意味着,对于大多数你需要学习的东西,你可以简单地在互联网上搜索并阅读各种你需要知道的材料。
这并不意味着你马上就“知道”所有的事情,只是现在所有的事情都是“可以弄明白的”,所以,理论上说,没有什么可以阻挡你前进的脚本。
在拐点中你可以升级你的技能
作为一个软件开发人员,最好的参考资料是你已经编写过的相似代码。当你完全理解你编写的代码时,你不需要把所有的细节都记在脑海中。这意味着在做新功能时,首先你应该问自己: “我以前构建过类似的东西吗?”,如果答案是肯定的,那么重新检查代码并在脑海中逐行遍历代码。重新向自己解释它在做什么,然后问问自己,“我现在可以使用同样的方法吗?”
视频在解释特定领域的细节方面很糟糕,因为它们看起来太长了。假设你想整合谷歌地图 API。一旦你有过这样的经历,在 GitHub 上打开代码,复制代码,然后粘贴到一个新的项目中只需要不到一分钟。另一方面,视频往往需要10-30分钟来重新观看。
尽可能高效地通过拐点的策略
因为通过拐点是学习编码最重要的部分,你应该让自己尽可能顺利地完成这个过程。这意味着你应该在学习教程的时候就开始准备,在这段时间里保持正确的心态。
在教学阶段,从结构化的模式中抽身出来,给自己找一些有挑战性的问题
- 每一节课,尝试做一些超出教程范围的事情。如果你正在浏览的教程提供了“挑战”或者“自我指导”的部分,那么就全部做完它。解决没有指导的挑战,你会收获到在没有结构化指导的情况下做事的重要经验。
- 尽量少用教程。在 Firehose,我们经常指导学生如何集成某些 gems 或使用提供的文档做一些事情。许多学生不会简单地遵循教程中针对刚刚开始学习的人所解释的说明,而是把教程作为备份。注意,文档会把你当成一个通过了拐点的开发人员。在 GitHub 上阅读和跟踪文档会让你在独自工作的时候更有优势。
- 专注于要点,并使用重复。学习如何做一些常见的事情,比如从头开始启动一个应用程序,向 GitHub 和 Heroku 推出一个新的应用程序,以及在早期构建一个数据库迁移。
推进拐点可能是一个挑战,以下是一些帮助你度过难关的建议:
- 你要明白这是一个艰难的过程,不用太紧张。同时,设定现实的期望。你不能把你“超人”级别的学习速度和你“蜗牛”级别的自学速度相提并论。记住,你已经学到了很多,但在这个阶段,你正在学习一种全新的技能,自己去发现新的东西。
- 如果你不自信,这是很正常的。继续走下去。如果你还是犹豫不决,试着和最近通过拐点的人交谈。他们能够理解你所处的位置,并向你保证你所经历的只是暂时的。努力工作,但不要让自己过度劳累。在这个阶段,你每天最多只能工作6个小时。在精疲力尽的状态下工作只会延长你提升拐点的时间。
在这个阶段获得自信的最好方法就是克服任何疑虑。你的情绪可能开始感觉像坐过山车。有时候,你会觉得自己像着了火,但是在同一个问题上苦苦挣扎了15个小时之后,你很容易就会感到完全相反。
不知道某些事情会花费你5分钟还是5个小时是令人沮丧的,但是每当你努力完成并成功实现一个新功能时,自信的冲击就是你所需要的一切。在没有任何帮助的情况下解决了一些难题之后,你会沉迷于在舒适区之外建造东西的感觉。
如何知道自己通过了拐点
拐点过程的最后一个阶段是接受。接受软件开发是一个不断学习的过程。接受学会一切只是意味着你要开始思考怎么解决更复杂的问题。
作者:Ken Mazaika
他是 Firehose 的首席技术官和联合创始人。在此之前,他是 WHERE.com 的技术主管(由 PayPal 收购) ,也是位于波士顿的 PayPal/eBay 开发团队的成员