你在学习编码时,会发现,有那么一刻,一切都变得不一样了。在 Firehose 里,我们喜欢称之为编码技能的“瓶颈”。这个阶段之后,你的行为方式将会大有不同。到达“瓶颈”的过程中,你需要不断的的丰富自己,直到完全独立。过程中可能充满了挫败感,但有朝一日,当你获得成功,你将无比强大。
在 Firehose,我们的目标不仅仅是教授你如何使用 Ruby 语言,如何构建 Web 应用或者如何写测试用例。尽管我们也会教授这些知识,但我们主要的目标是帮助你快速的突破“瓶颈”,从而让你收获解决任何问题的能力。我们相信,能够自己解决问题是一项非常宝贵的技能,教授这个技能远比简单的教授如何构建一个应用程序更有价值。
教程阶段(需要三到八周的编码技能训练)
你刚开始学习编码时,一定有大量知识点需要了解。这类信息被称为专业知识。比如:如何在 Ruby 中编写循环语句?或者如何使用 Ruby 中的 Rails 从数据库中提取内容?专业知识在特定的编程环境中有着不同的协议。
成为独立开发人员的第一步是学习如何完成特定的任务。一旦你实践并掌握了这些任务中所用到的技能,那么,实践过程中零碎的知识点将会逐渐组成一个完整清晰的知识图谱。慢慢的,你最终将会识别其中的模式,那些最初看起来陌生和令人困惑事物,最终也将有合理的解释。
对于刚起步的学生来说,最重要的技能是对细节的关注。
在阅读文档或教程等材料时,密切关注细节很重要。即使是最细微的拼写错误也会导致错误日志或者程序漏洞。最初,看到错误日志是一件令人沮丧的事情,但在学习的过程中,这是关键的一步。在这个阶段,通过处理错误日志和程序漏洞,你将学会如何在安全的环境下运行稳定的程序,这个重要的技能就是:注重细节。
调试错误日志非常重要。事实上,错误日志只是编程的一部分,没有经验的开发人员和非常有经验的开发人员都会看到它们。唯一的区别是,你处理的错误日志越多,经验越多,你尝试修复它们的时间就越少。原因如下:
- 随着时间的推移,你会学习到如何阅读错误日志并快速提取相关的细节。当你第一次看到一条错误日志,你会花费一段时间去解码这段消息真正的意思。但是当你无数次的看到错误日志(你必将无数次的看到错误日志),你就会精确定位到错误日志的相关细节,并且知道如何修复它。
- 你应当从你解决的每一个程序问题中学习。解决问题不是结束,你要明白问题是如何发生的。从你遇到的每一个问题中学习,当你下一次遇到类似的问题,你会更加快速的理解并修复它。
- 刚开始,你可能会寻求帮助在那些你遇到的错误日志上。随着时间的推移,当你学会了重复检查自己的代码以及如何使用谷歌浏览器,你寻求他人帮助的频率会越来越少。
在学习教程的阶段,你会跟随教程来编码。刚开始,你会发现跟着教程编码,也是一个巨大的挑战。慢慢的,你会更加关注细节,解决问题的能力也逐渐提高,然后整个过程越来流畅。当你学习完教程,你会发现你写代码的速度会非常快。
有时候,一些“自信”的同学会抛弃教程,尝试没有结构化的构建,最后愉快的跌入深渊。还有一些人,会学习很多的教程,试图从教程中”完全理解“这些专业知识。不幸的是,教程能够提供的场景非常有限。真理不在文档里,真理来自于你不断的与未知进行“搏斗”并最终获得“胜利”的过程。
关于编程一个不可告人的小秘密是.....
你永远不会知道解决所有问题的答案。在编码的旅程中,你可以允许自己偶尔想象,想象自己已经学会了所有需要学习的内容,但之后,请抛弃这个想法。这个时刻永远不会真的到来。
编程是一个终生学习的过程。有经验的软件工程师会主动寻找那些尚未解决的问题,因为这让他们有机会了解更多的信息。如果你还对“学习的终点”抱有一丝幻想,你需要知道,你所期待的那一刻永远不会到来。而且,这是一件非常美妙的事情。
如果你有如下情况,说明你已经准备好进入下一阶段了:
当你看到大量的错误,你不再感到惊慌。取而代之的,你知道如何“解码”这些错误,并知道在哪里寻找问题的答案。
你能够很专业的通过搜索引擎解决问题。当你的工作内容是需要增加一个新功能,或者,你看到了一个令人迷惑的错误日志,你知道如何通过搜索引擎找你所需要的信息。
你能够在项目中的其他位置,引用你之前的代码模式,而不总是按部就班的跟随教程。
如果你有如下情况,说明你已经准备好进入下一阶段了:当你看到大量的错误,你不再感到惊慌。取而代之的,你知道如何“解码”这些错误,并知道在哪里寻找问题的答案。
你能够很专业的通过搜索引擎解决问题。当你的工作内容是需要增加一个新功能,或者,你看到了一个令人迷惑的错误日志,你知道如何通过搜索引擎找你所需要的信息。
你能够在项目中的其他位置,引用你之前的代码模式,而不总是按部就班的跟随教程。
瓶颈期(良好的心态下需要二到四周的时间)
“瓶颈”期是你在学习编码的过程中最令人沮丧的时期,但这也是最重要的时期。在这阶段,你开始慢慢停止使用教程,并开始解决那些没有标准答案的问题。
有时候,你会觉得自己没有准备好面对这个阶段,你会怀念当初按照大纲和确定的方法完成一件事的过程。不要成为这种心态的牺牲品。你之所以会沮丧,真正原因是:在瓶颈期,你将会比之前编码慢十到二十倍。
你会开始自我怀疑,然后问自己是否真的有能力成为一个工程师。不安和怀疑是这个阶段是很普遍的。
事实上,尽管你学习和完成事情的速度非常慢,但你正在完成非常重要的事情。当你想要强迫自己学习更多的知识,你要明白,所有你学习的内容,都是成长的过程中必须要学习的知识。
系统知识是一种能力,尽管你意识不到,但它常伴你左右。当你需要开发一个新的功能,你会在谷歌里输入什么?当大量的问题都等着你去解决,你可能会感觉自己“身处至暗时刻”。学习如何独立找到光明非常关键,因为你不可能知道所有的知识,因此你必须拥有独立解决问题的能力。
大多数人都不知道如何学习编程,你必须同时学习专业知识和系统知识。
每一天,都要去探索自我边界以外的东西
一些软件工程师一旦找到自己的立足点,就会留在他们的舒适区内。这些人被称为“码农“—不是你努力的方向。相反,你应该每天都坚持超越自己的极限。程序员停滞不前,最通常的原因是“我已经解决了所有有趣的问题,再也没有挑战了”。
与其不断重复你项目开发中的代码,你应该寻找你技能之外的事情。这是唯一构建和扩展你技能树的方式。
用一位 Firehose 里已经突破瓶颈的学生的话:
我始终觉得自己身处深渊!我接受了这件事,并知道接下来该如何去做。
在 Web 开发中,实际上有两个瓶颈会同时出现。
Web 前端开发的瓶颈是当你能够构建任何你想构建的数据驱动的项目。这就意味着你有能力构建一个 Web 应用,它可以通过缓存和重试机制,用简单的数据结构渲染分页。Web 开发者称之为:“掌握了增删改查”。在这个阶段,你应该有能力整合任何第三方库(例如 gem 库),无论这个库的文档来自 Github 还是博客。
算法与数据结构的瓶颈并不容易发现,但实际更重要。如果有人能够掌握它,就可以掌握任何他想从事的编程语言,并且了解程序的底层架构,了解更深层次的知识,解决更复杂的问题。
那些征服了数据结构与算法瓶颈的人能够:
- 实现排序算法
- 实现链表和链表反转
- 理解并且在写代码里使用堆栈、队列和树
- 使用递归或迭代算法编写计算机程序
简而言之,一旦你突破了瓶颈,你将会掌握数据的操作方式,并且清楚代码决策对性能的影响。传统的计算机科学学位只关注帮助学生通过数据结构与算法的瓶颈。许多大学教授数据结构与算法并不使用工业级的语言,他们会使用 Scheme、Racket 或者 LISP。
在大多数的技术面试中,面试官会假设你已经通过了编程语言的瓶颈,因为编程语言的瓶颈更容易达到,然后他们会更多的考察你算法和数据结构的能力。这些问题通常会集中在我们刚才提到的几种类型:排序算法、反转链表、使用堆栈、队列和树结构。
一旦开发人员突破了 Web 开发的瓶颈和算法和数据结构的瓶颈,他们就掌握了通往王国的钥匙。这些开发人员将能够解决两者相交的挑战:需要在高级 Web 应用程序中构建的复杂算法。这是专业的 Web 开发人员每天工作的核心。
突破瓶颈之后
当突破了瓶颈之后,结果可能有点儿违反直觉。深呼吸:
在学习编码时,专业知识对整体而言并不重要。
是的,我没有开玩笑,绝对没有。一旦你突破了瓶颈,这些概念将在短短一两周甚至几天的时间内迅速转化。
最终真正重要的是:
- 对开发框架有扎实的了解
- 用任何编程语言实现复杂的算法
招聘经理希望开发人员具有扎实的开发和算法技能
当我在 PayPal 工作时,我的团队雇佣了一位高级工程师,他没有任何 Railshe 的经验,但写过很多 Python、LISP 和 Perl 的代码。在一段时间后,他已经可以独挡一面。又过了几周,他就可以掌控全局了。他很快就成为了技术团队的负责人,这是我参与过的最好的招聘决定之一。
不要让堆栈溢出。许多人会说,“AngularJS 最近很火爆”,“JavaScript 的热度正在提高”,或者“最近流行的是...”我的反应是“所以呢?”当你正在学习如何编程,你唯一的目标应该是突破这个技术的瓶颈。当你成功了一次之后,就去学习新的东西,流行的的东西并不难,一味的跟风没有任何意义。
变的独立。当你不需要结构化的教程就可以学习新知识之后,你就不需要等着其他人来帮助你。这就意味着,当你想要学习一门新知识时,你通过搜索引擎和阅读相关材料就可以。
这并不意味着你可以瞬间“学会”任何事,但现在一切都是“可以解决”的,所以从本质上讲,你是不可阻挡的。
你在瓶颈期练就的技能
作为一名软件开发者,最好的参考资料就是你曾经写过的熟悉的代码。当你已经完全理解了你所写的代码,你不需要耗费过多的时间去回忆细节。这就意味着,当你开发一个新的功能时,第一个问自己的问题应该是“我是否构建过类似的代码?”如果答案是“没错”,就一步一步在你的脑袋里回想代码,并不断的思考“是否有更好的办法?”
视频很难解释清楚专业知识的细节,因为它需要大量的时间去观看。比如你想整合谷歌地图的 API。一旦你体验过用一分钟时间,在 Github 上打开源码,将内容粘贴在代码里,你将再也不会用三十分钟时间去重复观看视频。
高效突破瓶颈的策略
突破瓶颈是学习代码的过程中非常重要的一步,因为,你应该用一种更加高效的方式。这意味着,你在看教程的阶段就应该开始准备,并从始至终保持坚定的信念。
在看教程的时候,一边学习,一边尝试解决一些有挑战的问题。
- 对于每一节课,尝试做出一些超出你所学教程之外的事情。如果你正在学习的教程提供了“练习”部分,请全部认真完成。这样解决问题的经历将会带给你重要的收获。
- 更少的使用教程。在 Firehose,我们经常引导学生利用提供的文档当作“积木”完成特定的事情。与视频简单的引导不同,这样会增加学生自主学习的兴趣,许多学生会跟随文档学习,仅仅在看文档觉得迷惑的时候,才会去看视频。请注意,文档会将你视为已经突破了瓶颈的人。当你自主学习时,通过在 Github 上阅读文档会给你带来巨大的帮助。
- 把时间和经历花费在重要的事情上面。学习如何做一些全局的事情,比如从头开始启动和运行程序,将项目推送到 Github 和 Heroku 上,提前构建数据库迁徙。
突破瓶颈可能具有极大的挑战性,这里有一些提示可以帮助你完成它:
- 明白这件事很难并且告诉自己放松。此外,设定更符合现实的预期。你既不是超人,也不是蜗牛。你一定要记住,你需要学习的东西很多,但是在这个阶段,你需要学习的是,独立解决问题的能力。
- 如果对于自己是否能够通过瓶颈不够自信,请知道你的感受是正常的。只要继续保持工作就好了,如果你还是很纠结,请尝试和那些已经突破瓶颈的人进行沟通。他们能够根据你现在的状态给出合适的建议,并一定会告诉你,这样的情况只是暂时的。请继续保持一贯的工作方式,不要过度劳累。在这个环节,你需要知道,你每天最多工作六个小时左右就足够了。在精疲力竭的状态下工作只会事倍功半。
这个阶段获得自信最好的办法尝试处理焦虑。你的情绪可能会像过山车一样跌宕起伏。有时,你心急如焚,但是挣扎了一段时间后,你的情绪通常是完全相反的。
不知道何时“归期降至”是令人沮丧的,但你每次的成功,都会积攒你所需要的信心的“洪流”。在你独自解决了一个棘手的问题后,你就会开始享受这个过程。
如何知道你已经突破了瓶颈
突破瓶颈之后的阶段就是接受。接受软件开发只是一个持续学习的过程。接受每一次的成功,接受成功后面临的更加复杂的问题。
你是否当下正在经历这个“瓶颈”?分享这篇文章并和你的朋友讨论吧,你会惊奇的发现,有很多人都曾经历并且打破了自己的瓶颈。