如何量化并加速你的编程能力【译】
ref: http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/
加速编程技能的关键
当您学习编程时,有一瞬间一切都开始改变。 在Firehose,我们喜欢将其称为编程的拐点。 在此阶段之后,您作为开发人员的操作方式将大为不同。 达到拐点的过程是使程序变得自给自足的过程,以至于您不再需要任何手动操作。 这可能是很痛苦的经历,但是一旦你通过了这个拐点,你的编程能力就会令人难以置信地增强。
The Tutorial Phase (3-8 weeks of serious coding)
当您开始学习编程时,有很多您尚不了解的信息。 此信息称为特定领域知识。 示例包括:知道如何用Ruby编写循环或如何使用Ruby on Rails从数据库中提取内容。 特定领域的知识包括特定编程环境所独有的协议。
成为自给自足的开发人员的第一步是学习如何执行特定任务。 一旦您掌握了某些任务,各个部分如何组合在一起的大招就会开始显现出来。 随着时间的流逝,您将开始认识模式,最终,最初看起来令人迷惑的事物和陌生的事物将成为自然而然的事情。
对于刚毕业的学生来说,注意从细节中学习是很重要的技能。
在阅读文档或教程之类的材料时,密切关注细节非常重要。 即使是最轻微的拼写错误和拼写错误,也会导致错误消息或错误。 首先,看到错误消息是很痛苦的经历,但这是学习过程中至关重要的一步。 在此阶段处理错误消息和问题,可以教会您在安全的环境中编程的最重要技能之一:一定要注重细节。
调试错误消息非常重要。
事实是,错误消息只是编程的一部分:无经验和非常有经验的开发人员都可以看到它们。 唯一的区别是,您对错误消息的处理经验越多,花费在修复错误消息上的时间就越少。 原因如下:
- 随着时间的流逝,您将学习如何读取错误消息并快速提取问题的相关详细信息。 第一次看到错误消息时,您将需要一段时间来解码其实际含义。 但是,当您看到数百条错误消息后,您将能够指出问题的位置以及解决问题所需的相关详细信息。
- 您应该从解决的每个错误消息中学习。 不要只是为了解决错误而去解决错误; 你要从中学习,学习您要修复的代码出了什么问题。 通过从每个错误中学习,下次您再次犯同样的错误时,便可以更快地解决它。
- 最初,您可能会针对看到的每个错误消息寻求帮助。 随着时间的流逝,您将需要仔细检查代码并进行智能的Google搜索,以减少寻求帮助的频率。
刚开始有些人可能就会有一点小信息来挖掘错误,然后构建一些小项目。然而有些其他人却需要继续的学习,因为每个人学习能力和学习速度不同,但是不管怎样,经过这么多的错误消息之后,你的debug能力肯定经验提升了。
在这一点上,有些人会感到自信-就像他们准备抛弃训练轮并在没有结构化指导的情况下开始建造东西一样-会高兴地跳入深渊。 其他学生将获得更多教程,以寻求更多的特定领域知识,以寻求“全面理解”。 不幸的是,教程只会带您走远,而在教程或指南中却找不到真正的信心。 真正的信心来自于努力解决自己不知道如何解决的问题,并自行找到解决方案。
关于编程的一个惨不忍睹的事实是:(自行翻译吧,不忍心翻译,怕翻译不好破坏了这个惨痛的氛围)
You will never know everything you need to know to solve all your problems. Going into the journey, you probably envisioned yourself eventually learning everything you need to learn, and then being squared away. This moment will never happen.
Programming is a life-long learning experience. Experienced software engineers seek to find solutions to problems they haven’t solved yet because it gives them the opportunity to learn more. If you find yourself waiting for the moment when you finally feel like you know everything there is to know about coding, know this: the day you’re waiting for will never come. And that is a wonderful thing.
你应该随时准备进入下一个阶段,当你:
- 您已经看到足够多的错误消息,它们不再使您感到震惊。 相反,您知道如何理解它们的含义以及在代码中查找问题的位置。
- 您是Google搜索解决方案专家。 当您尝试添加功能或看到令人困惑的错误消息时,您会知道要搜索什么才能找到所需的信息。
- 您可以引用在应用程序其他部分编写的代码并遵循其中的模式和规律,而不必总是寻求逐步说明。
拐点(Inflection Point)(心态正确的2-4周)
拐点阶段是学习编码中最令人沮丧的阶段之一,但在许多方面,它是唯一重要的阶段。 这是您逐步使用教程并开始解决没有人为您找到解决方案的问题的关键所在。
在某些时候,您会觉得自己还没有准备好解决这个阶段,并且想回到构建具有确切工作要做的轮廓的东西。 不要沦为这种心态。 您会感到沮丧的原因是:
在变形阶段,您将比上一阶段的编码慢10到20倍。
您可能会开始质疑自己,想知道自己是否真的有能力成为一名程序员。 在此阶段,不安全感和怀疑感很普遍。
尽管您会觉得自己正在以慢得多的速度学习和完成事情,但实际上,您正在实现最重要的事情。 当您对特定领域的知识日趋紧张时,您所学的都是关于程序知识。
程序知识是指自学过程中不了解的知识的能力。 当您需要实施一项新功能时,应该使用哪种类型的Google搜索? 在这个时候,当您要完成许多事情时,您会感觉自己像在“黑暗中”。 学习如何自己找到光源至关重要,因为您永远无法知道所要了解的一切,因此您需要能够教给自己如何解决眼前的问题。
大多数人没有意识到,要学习编码,您需要学习特定领域知识和过程知识。
在您的余生中,每天都要超越自己的极限
一旦找到立足点,一些软件工程师就会留在舒适区域内。 这些类型的程序员被称为维护程序员,而不是您应该努力做到的。 相反,您应该每天都努力超越自己的极限。 程序员辞职的最常见原因是“自从我解决了所有有趣的问题后,它不再具有挑战性。”
而不是尝试将编码项目拖入您的舒适区域,您应该寻找当前技能之外的问题。 这是建立和扩展技能的唯一方法。
用Firehose学生的话说,当他通过拐点时:
我仍然觉得自己处于深渊! 知道那是我必须要做的事,我感到更加自在!
网站开发中,可能多个拐点会同时到来
当你能够建立一个以任意数据库驱动的应用时,那就意味着能够构建任意存储着相关信息数据库的很多网站了。网站开发称之为:“mastering CRUD.”在此阶段,只需遵循GitHub或博客文章上提供的文档,您还应该能够与任何第三方库(例如ruby gem)集成。
算法与数据结构的拐点要比网站开发的拐点要更难以琢磨一点,但是它更重要。征服了这一点的人不仅会精通所用的编程语言,而且会精通编程的基础知识,并具有解决复杂编码难题的丰富知识。
一个征服了算法和数据结构的拐点,他将能够:
- 写任意的排序算法
- 实现任何形式的链表
- 理解并能应用关于栈,队列和树的相关应用模型
- 使用递归和迭代来编程
简而言之,一旦您通过了这个拐点,您将掌握数据操作并了解代码决策对性能的影响。 传统的计算机科学学位只专注于让学生超越算法和数据结构的拐点。 许多大学都使用行业中通常不使用的编程语言(例如Scheme,Racket或LISP)来教授这种语言。
在大多数技术面试中,面试官会认为您已经通过了Web开发的转折点,因为这样做比较容易,并将他们的问题集中在评估您在算法和数据结构上的技能。 这些问题通常集中在我们上面提到的主题上:排序算法,反向链接列表以及使用堆栈,队列和树。
** 一旦开发人员通过了Web开发的拐点以及算法和数据结构的拐点,他们便掌握基本上所有的关键点。**
这些开发人员将能够解决与两者相交的挑战:需要在高级Web应用程序的上下文中构建的复杂算法。 这是专业Web开发人员每天所做工作的核心。
当你通过这些拐点时:
你在学习任意领域的知识的时候,都将融会贯通,你可能一到两周的时间就会学会一项新技能。
最终真正重要的是:
- 您对Web开发框架有扎实的了解
- 您可以熟练地使用任何编程语言编写算法复杂的代码
现在招人也希望开发人员具备扎实的Web开发和算法能力。
当我在PayPal工作时,我的团队聘请了一位没有Rails经验的高级Rails开发人员-他已经在Python,LISP和Perl中进行了大量编码。 在几天之内,他已经产生了巨大的影响。 并在数周内:产生巨大影响。 他很快就升任技术团队主管,这是我参与过的最优秀的招聘决定之一。
不要盲目跟风,有人说最近AngularJS很火啊,JS也在上升期,我的回应一般是:“SO?”,你的目标是发现编程的拐点而且彻底弄懂它,一旦你弄清楚了,任何新语言新浪潮都将不是问题。
变得自力更生。 无需结构化指导即可学习新的编码技能的能力意味着您不再需要等待任何人帮助您。 这意味着,对于您需要学习的大部分内容,您只需搜索互联网并阅读各种您需要了解的材料。
这并不意味着您立即“知道”一切,而只是现在一切都“可以超出数字”,因此从本质上讲,您是无法阻挡的。
在拐点你需要学习的技能
作为软件开发人员,最好的参考资料是您已经编写的类似代码。 当您完全理解所编写的代码时,无需将所有详细信息提交到内存中。 这意味着在构建新功能时,您应该问自己的第一个问题是:“我之前是否构建过类似的东西?” 如果答案是肯定的,请重新查看代码并逐行浏览代码。 重新向自己解释正在做什么,并问自己:“我现在可以使用相同的方法吗?”
通过看视频无法解释特定于域的细节,因为它们花了很长时间才能观看。 假设您想与Google Maps API集成。 一旦经历过一次,便可以在不到一分钟的时间内在GitHub中打开代码,复制代码并将其粘贴到新项目中。 而视频通常需要10到30分钟才能重新观看。
尽可能有效地通过拐点的方法
因为通过拐点是学习编码的最重要部分,所以您应该让自己尽可能舒服一点。 这意味着您应该在进入教程阶段时就开始准备,并在此期间保持正确的心态。
在教程阶段,请停止学习结构化材料,并一路给自己挑战难题。
- 对于每节课,请尝试做超出您要学习的教程范围之外的事情。 如果您要学习的教程提供了“挑战”或“自我指导”的部分,请全部完成。 在没有结构化指导的情况下,解决无指导的挑战将为您提供重要的工作经验。
- 尽量少使用教程。 在Firehose,我们经常引导学生学习如何集成某些宝石或使用提供的文档进行操作。 许多学生不仅会按照针对刚入门者的教程中说明的说明进行操作,还将遵循文档并使用这些教程作为备份。 请注意,文档将把您视为已通过拐点的开发人员。 独自学习时,在GitHub上阅读和遵循文档将变得很轻松,这将助您一臂之力。
- 专注于基本要素并重复使用。 了解如何执行常见操作,例如从头开始分解应用程序,将新应用程序推送到GitHub和Heroku,以及尽早构建数据库迁移。
推过拐点可能具有挑战性。 以下是一些指导您完成操作的指针:
- 了解这是一个困难的过程,并且要对自己轻松一点。 另外,设定切合实际的期望。 您无法将学习教程的“超人”水平速度与自己学习事物的“蜗牛”速度相提并论。 请记住,您正在学习很多东西,但是在此阶段,您正在学习一种崭新的技能,可以自行解决新问题。
- 如果您在自信方面挣扎,请知道您的感觉是完全正常的。 继续工作。 如果您仍在挣扎,请尝试与最近通过拐点的人交谈。 他们将能够与您所处的位置相关联,并向您保证您所经历的只是暂时的。 始终如一地工作,但不要过度劳累。 在游戏的这个阶段,要知道您一天最多只能工作6个小时左右。 在疲惫的状态下工作只会延长您花费在拐点上的时间。
在此阶段获得信心的最好方法是克服任何疑问。 您的情绪可能开始变得像过山车。 有时,您会感到自己在生火,但是在同一个问题上苦苦挣扎15个小时之后,感到对立是很普遍的。
不知道是不是要花5分钟或5个小时才能让您感到沮丧,但是每次您接通电源并成功实施新功能时,急需信心。 在没有任何帮助的情况下解决了一些棘手的问题之后,您会沉迷于在舒适区域之外建造东西的感觉。
如何知道自己是否已经通过了拐点
拐点过程的最后阶段是验收。 接受软件开发是一个不断学习的过程。 接受成功学习一切的感觉,意味着您应该开始考虑解决更复杂的问题。