翻译-快速提升编程能力的关键

原文链接 http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/

当你学习编程时,有一个阶段你发现万物都在改变。在消防带培训中心,我们叫做编程的转折点。过了这个阶段,你开发的方式会显著不同。越过转折点,将会进入一个自给自足的编程阶段-你不在需要手把手的指导。那将是一个令人沮丧的经历,但是一旦你越过,你会有难以置信的能量。
在消防带,我们的目标不仅是教你 Ruby,如何构建 web 应用程序或编写测试用例。尽管我们确实会教那些技能,而且更多。我们的主要目标是促进学生穿过转折点,之后他们将获得解决他们遇到问题的能力。我们相信,能够解决自己的问题是一个无价的技能。这种教学方法相比于简单的学习构建一系列 app 能伴随你走得更远。

辅导阶段(3-8 周的认真编程)

当你开始学习编程时,有些信息你不知道。这些信息叫做特定领域知识。例如:如何用 ruby 写一个循环或如用 Ruby On Ralis 从数据库提取一些信息。每个编程语言环境都包含的独一无二的领域专业知识。
成为自给自足的开发者的第一步是学习如何处理特定的任务。一旦你胜任某些任务的处理,你就会知道如何将多个任务协调处理。过了一段时间,你会开始意识到一些编程范式,最终,一开始感觉困惑和陌生的东西会变得习以为常。

对于初学者,获得的最关键的技能是注重细节

开始过文档和指导材料时,最重要的是密切关注细节。甚至是那些错别字和拼写错误都会导致报错和 bug。一开始,看到报错信息会令人沮丧,但是这是学习过程中一个重要的阶段。在安全的环境中处理报错和问题会教会你这一阶段最重要的技能:注重细节。
排查故障信息是非常重要的。事情的真相是,报错信息是就是编程的一部分。对新手和经验丰富的人都一样。唯一不同的是,你处理报错信息的经验越多,你修复他们花费的时间越少,那是因为:

  • 一段时间后,你学会了如何快速阅读错误信息和提取问题的相关细节。第一次看见错误信息,会花费你一定的时间去理解是什么意思。当你看过了成百个报错信息后,你会指出问题的所在和修复问题需要的相关细节。
  • 你会从每一个你处理过的问题中积累经验。不要只是修复问题就完了,你要要明白代码哪里错了。每一次从报错中学到的,都会让你在下一次处理问题时更快。
  • 最初你对每个你遇到的问题都要去寻求帮助,一段时间后,你会减少错误代码直接 google 搜索的频率。

在初学阶段,你会跟随教程。最初你发现不容易跟上教程并且错误频发。一段时间后,你会提升你排错的能力并且更关注细节,编码会更快。当你经历过了初学阶段,你会注意到你编码更快。
在这个时候,部分人感觉充满自信-视乎可以离开学步车开始在没有指导手册情况下构建一些东西-乐于深入其中。另一些人会寻找更多的辅导,尝试掌握更多的专业领域知识以期望“完全掌握”。不幸的是,入门手册只能带你走这么远,在入门手册中不能找到真正的自信。真正的自信源于不断解决你不知道答案的问题,自己独立的找到解决方法。
关于编程,不幸的小秘密是…
你永远不会知道你需要解决问题的全部知识。你大概期望你学完了你需要学习的所有知识,然后全副武装的出发。这个时刻永远不会发生。
编程是一个终生学习的过程。老练的软件工程师会寻找那些他们还没有解决过的问题去解决,因为这让他们有机会学习更多。如果发现你一直在等待你感觉 ok,学会了所有关于编码知识的时刻,你要认识到这一天永远不会到来。这真是美妙的事情。
你会开始进入你旅程的下一阶段,当你:

  • 你遇见了足够多的报错,报错不再惊吓到你。相反,你知道如何破解报错信息,哪里去寻找代码里的问题。
  • 你能够专业的 google 解决方案。当你增加新功能或看到令人沮丧的错误信息是,你知道搜索什么来找到你需要的信息。
  • 你能够参考你应用程序中其他部分中的代码并且遵循编程范式,而不是一步一步跟随指导。

转折点(2-4 周正确的心态)

在编程学习过程中,转折点阶段是一个令人沮丧的阶段。但总的来所,这是最关键的一个阶段。这个阶段,你开始丢掉手册,开始解决没人给你准备好解决方案的问题。
某些时候,你会感觉到你还没有准备好来应付这一阶段的问题,期望回去做那些有精确指导的事情。不要陷入这种心态。你感觉沮丧的原因是:

在转折点阶段,你编程速度会比前一个阶段慢 10-20 倍。

你会开始怀疑自己,疑惑自己是否有能力成为一个程序员。在这个阶段感到沮丧和疑惑是正常的。
事实上,仅管你会感觉到你在学习和完成事情上速度变慢,事实上你正在获得最重要的东西。当你特定领域知识学完后,你将学的所有知识都是过程性知识。
过程性知识是一种一直伴随你的自学能力。当你需要实现某些新功能,该到 gogoole 上去搜索什么呢?在这个时间点上,当很多事情要你完成是时,你感觉自己深处黑暗当中。学会如何自己找到光是决定性的,因为永远不会知道你需要知道的所有事情。所以你需要一边自学一边解决问题。
大多数人没有意识到,为了学习编程,既要学习特定领域知识,也要学习过程性知识。

在余生,每一天都要突破你的极限。

有些工程师在找到立足点后一直待在他们的舒适区。这种类型的程序员被叫做维护型程序员-不是你需要成为的类型。相反,你需要在余生的每一天中都努力走出你的舒适区。程序员辞掉他们工作最主要原因是:“自从我解决了我感兴趣后的问题后,再也没有任何挑战了。”
相比在舒适区编程,你更需要用舒适区外部的技能去解决问题。这是唯一一种扩展你技能的方式。
有一个在消防带度过转折点阶段的学员说过

我至今仍然陷入其中,我只是获得一些我曾经获得过的舒适知识。

在 Web 开发中,确实会有两个转折点同时到来。

web 开发转折点是你有能力构建任何你想构建的数据驱动应用。意味着你能构建一个多页面的 web 应用,并用一个简单的数据库存储和关联信息。web 开发者称这个叫做“精通增删改查”。在这个阶段,你应该能通过 github 上或博客上的文档集成一些简单的三方库。
算法和数据结构转折点是一个更深层次的转折点,但实际上更重要。攻克了这一阶段就会精通他们所使用的编程语言。除了掌握编程的基本原理,也会对解决复杂编码问题有深入理解。
掌握了数据结构和算法的人能够:

  • 写排序算法
  • 实现和翻转链表
  • 理解并借助栈、队列、和树来编程
  • 使用递归和迭代方法来写计算机程序

简而言之,一旦你跨越了这个转折点,你会掌握数据处理方法,并了解影响代码新性能的关键。传统的计算机科学教育只关注于让他们的学生跨越算法和数据结构阶段。很多学校通过已经不在工业界使用的编程语言来教授这些知识,比如 Schema、Racket 或 LISP。
大多数技术面试,面试官会假定你已经越过了 web 开发阶段,考虑到那是更容易做到的。他们的问题更聚焦于考察你的数据结构和算法能力。那些问题通常关注于上述我们提到的话题:排序算法、翻转链表、使用栈、队列和树。

一旦开发者跨越了 web 开发阶段和数据结构及算法阶段,他就掌握了通向编程王国的钥匙。

那些开发者能解决一些交叉问题:在高级 web 应用环境中构建需要的复杂算法。那正是高级 web 开发者每天处理的问题。

转折点结论

转折点最大的结论听起来有点违反直觉,先深呼吸一下:

在学习编程的整个宏大事项中,特定领域知识并不重要

是的,我不是在开玩笑,它真的不重要。一旦你跨过了转折点阶段,那些概念可以在一两周,甚至几天通过入门手册学会。
最后,真正关键的是:

  • 你对一个web 框架有牢固的理解
  • 你对使用任何语言编写复杂算法代码有牢固的理解

招聘经理期望开发者有牢固的 web 开发和算法技能。

当我在 PayPal 工作时,我们组招聘了一个没有任何 Ralis 经验的高级 Rails 开发-但是他在 Python、LISP、Perl 方面有很多编码经验。几天后,他已经在组内有较大影响力了。在几周内,有巨大影响力。他很快成为技术组的主管。这是我们做过的最成功的招聘决定。
别迷恋技术栈。很多人都会这么说“AngularJS 最近正火”,“Javascript 正在上升”,“最新的趋势是…”,我的回复是:“那有如何?”。当你学习如何编程时,你主要目的是找到转折点并跨越它。一旦你做到了,学习新的,时尚性感的语言都不困难。
变得独立自主。有能力通过不通过指导手册学习新的编码技能意味着你不再需要等待任何人的帮助。意味着对于大多数你需要学习的,通过简单的搜索和阅读特定的你需要的材料就行。
这并不意味着你会立刻“知道”一切,只是你能“算出”一切。本质上讲,你将无坚不摧。

在转折点阶段你要发展的技能

作为软件开发者,最好的参考材料时你以前写过的类似的代码。当你完全理解了你写的代码,你不需要记录所有的细节到你脑中。这意味着当你要开发一个新功能时,第一个要问自己的问题是:“我是否曾经做过类似的?”。如果做过,在脑中一行一行回顾和检查这些代码。重新理解是怎么做的并问自己“我现在能用相同的方式吗”?
你会花大量时间去看视频因为视频沉溺于解释特定领域细节。例如当你要集成一个 google 地图 API 时,如果你曾经做过,你会花费不到一分钟的时间去打开 github 上的代码,然后拷贝粘贴到新项目中。如果看视频,可能需要 10-30 分钟的时间重复观看。

高效跨越转折点的策略

由于跨越转折点时编程学习中最重要的部分,你必须为自己设置一个尽可能顺畅的流程。意味着你需要在辅导之前准备一下,在这段时间保持正确的心态。
在辅导阶段,从浏览结构材料中跳出来,让自己一直直面问题。

  • 对那些重要的经验教训,尝试着跳出指导手册的范围做些事情。如果你看的指导手册提供挑战和自测部分,完成他们。解决没有帮助文档的挑战会让你解决那些没有结构化手册的问题更有经验。
  • 尽可能的少用手册。在消防带,我们会让学员直接集成某个模块或则按照手册完成一些事情,而不是像大多数初学者那样跟随手册执行命令。很多学生会读文档,入门手册作为备份。请注意到:文档会把你认为是已经跨越转折点的开发着。能顺畅的阅读和跟随 github 上的文档指导能助你一臂之力。
  • 关注重要的事情并尽量代码复用。学会做一些通用的事情,例如:从头开始构建一个应用程序,推送新 app 到 github 或则 Heroku,在早期做数据迁移。

越过转折点是具有挑战性的,这里给出一些建议帮助你越过:

  • 明白这是一个困难的过程并且放轻松,当然要实事求是。你不能拿你过文档的超级速度和自己学习的蜗牛速度做对比。你要牢记,你在独自学习。并且你在这个阶段,你正在用新技能解决新问题。
  • 如果你感到不自信,你要明白这种感觉完全正常,继续努力吧。如果你继续奋斗,尝试着和已经跨越转折点阶段的人交流交流。那有助于你找到当前你所处位置,并确保你正在经历的只是暂时性的。持续工作,但不能过度工作。在游戏的这个阶段,要明白你每天最多只能高效率的工作 6 小时。超负荷的工作只能延长你跨越转折点的时间。

在这个阶段,增加自信的最好方法是打破任何你怀疑的。你的情绪开始像过山车一样。有时候你感觉像着了火一样,但是经过 15 分钟一直专研这个问题,你的感觉会完全相反。
一个问题如果花费了 5 分钟或 5 小时都毫无头绪,会让人感到沮丧。充足的信心是你每一次你越过障碍并且成功实现了一个新功能的保证。当独立解决了很多难题后,你会沉迷于做舒适区外的事情。

如何知道你已经跨越了转折点

转折点最后一个阶段是认同。认同软件开发是一个持续学习的过程。承认成功学会任何事情的感觉,就是意味着开始思考解决更复杂的问题。
你感受到转折点阶段了吗?向你的朋友分享并讨论这篇文章,你会惊奇的发现很多人都曾经遇到并越过了转折点。