加速你编码技能的关键

作者:KEN MAZAIKA

译者:尹星

2021-03-28 22:04:34

这篇由 KEN MAZAIKA 写的文章(英文版)告诉你如何有效地提高自己的编码能力,我把整篇文章翻译如下,希望给你一些启发。

备注:[idea]标注的内容为译者的注释,非原作内容。

当你学习编码时,有那么一个瞬间一切都发生了改变。在 Firehose(作者所在公司名),我们把它叫做编码的拐点。 在这个阶段之后,你作的编程之路将大不相同。到达拐点的过程就是在编程中变得“自给自足”的过程,此时你不再需要手把手指导。这个过程可能让人感到沮丧,但是你当把它甩在了身后,它将给你带来难以置信的力量。

the graph of learning when you learn to code

学习编码时的学习图

在 Firehose,我们的目标不仅仅是教你 Ruby,如何构建Web应用程序或如何编写测试代码。尽管我们教授这些技能,但我们的主要目标是让学生加速超越拐点,从而使他们能够解决遇到的任何问题。我们认为,能够自行解决问题是一项宝贵的技能,这种教学方法将带给你更多的知识,而不仅仅是学习如何构建一系列的应用程序。

[idea]这是一个培训公司,此处介绍他们的培训理念,从中我们可以得到启发:“应该重点学习本质的东西,不仅仅是表面的使用(如如何具体开发 App)”。

1.辅导阶段(认真编码 3-8 周)

当你开始学习编码时,有很多你尚不了解的信息。这些信息叫做特定领域的知识。比如:知道如何用Ruby编写循环或如何使用Ruby on Rails从数据库中取数。特定领域的知识涵盖了特定编程环境所独有的协议。

[idea]比如每一种编程语言都有自己独特的语法。

在成为能自行解决问题的开发人员之前的第一步就是学习如何完成特定的任务。一旦掌握了某些任务,各个部分如何组合在一起的轮廓就会开始显现出来。随着时间的过渡,你将开始识别出模式。最终,最初那些看起来令人迷惑和陌生的事物将成为你的第二天性(即一种自然而然的行为)。

对于刚起步的学生来说,最重要的技能是关注细节。

在阅读文档或教程之类的材料时,关注细节非常重要。即使是最细微的拼写错误也会导致错误消息或 bug。首先,看到错误消息会令人感到沮丧,但这恰恰是学习过程中至关重要的一步。在这个阶段处理错误消息和 bug,可以教会你在安全环境中编程最重要技能之一:注重细节

调试错误消息非常重要。实际上,错误消息只是编程的一部分:没有经验和有经验的开发人员都会看到它们。唯一的区别是,你处理错误消息的经验越多,则花在修复这些错误消息上的时间就越少。原因如下:

  • 随着时间的推移,你将学会如何阅读错误消息并快速提取问题的相关详细信息。当第一次看到错误消息时,你需要花费一些时间来理解其实际的含义。但是,在你看到数以百计的错误消息之后(你将遇到数以百计的错误消息!),你就能够指出问题的位置以及修复该问题所需的相关详细信息。
  • 你应该从解决的每个错误消息中学习。不要解决错误之后就结束了;理解你要修复的代码出了什么问题。通过从每个错误中学习,下次你犯同样的错误时,你就可以更快地解决它。
  • 起初,你可能会针对看到的每个错误消息寻求帮助。随着时间的流逝,你将学会仔细检查代码并进行精准的 Google 搜索,从而减少寻求帮助的频率。

在教程阶段,你将按照说明进行操作。一开始,你会发现遵循说明也颇具挑战,同时错误消息也会经常发生。随着时间的推移,你将学会调试错误的技巧,同时更加注重小细节,从而能够更快地解决问题。这个阶段结束时,你会注意到你能够以更快的速度编写代码。

在这一点上,有些人会感到很自信——就在他们准备抛弃训练在没有结构化指导的情况下开始构建东西一样,也会乐于钻入更深的领域。其他学生将获得更多的教程,寻求更多特定的领域知识,以寻求“全面理解”。不幸的是,教程只会带你越走越远,但在教程或指南中找不到真正的信心。真正的信心来自于努力解决自己不知道如何解决的问题,并能够自行找到解决方案。

编程令人厌恶的小秘密是……

你永远不会知道解决所有问题所需要的一切知识。在这段旅途中,你可能会设想自己最终会学到所需要的所有内容,然后离开。这一刻永远不会发生。

编程是终生的学习经历。经验丰富的软件工程师寻求找到尚未解决的问题的解决方案,因为这会使他们有机会学到更多。如果你发现自己正在等待这个时刻,即最终感觉自己对编码的一切都了解,请知晓一点:你等待的这一刻永远不会到来。这其实是一件很棒的事情。

[idea]无论是学习编程和其他技能,重点不是知晓一切知识(那肯定比不上计算机),而是掌握解决问题的能力。

the graph of learning when you learn to code

当出现以下情况下,说明你已经准备好进入下一阶段的旅程了:

  • 你已经看了足够多的错误消息,不再感到惊讶。相反,你知道如何解释它们的含义并在代码中查找问题的位置。
  • 你是 Google 搜寻解决方案的专家。当你尝试添加功能或看到令人困惑的错误消息时,你知道要搜索什么才能找到所需的信息。
  • 你可以引用在应用程序其他部分编写的代码并遵循其中的模式,而不必总是寻找一步接一步的指示。

2.拐点(心态正常的 2-4 周)

拐点阶段是学习编码中最令人沮丧的阶段之一,但在许多方面,它是唯一重要的阶段。即你逐步使用教程并开始解决没有人为你找到问题解决方案的关键所在。

有时,你会觉得自己还没有准备好应对这个阶段,并想回到构建具有明确工作和轮廓的东西。不要受这种心态影响。你会感到沮丧的原因是:

在蜕变阶段,你将比上一阶段的编码速度慢10到20倍。

[idea]其实所谓的拐点,就是一种“从量变到质变”的阈值点。

你可能会开始质疑自己,并怀疑自己是否真正有能力成为一名程序员。在这个阶段,不安全和怀疑的感觉非常普遍

尽管你会觉得自己正在以慢得多的速度学习和完成任务,但实际上,你正在做最重要的事情。当在你的特定领域知识正在感到不知所措时,你正在学习的所有内容都将与程序性的知识相关。

程序性知识(也叫做隐性知识)是一种在学习过程中教会自己不知道的东西的能力。当你需要实现一项新功能时,应该进行哪种类型的Google搜索?在这个时间点,当你想要完成许多事情,你会感觉自己像在“黑暗中”一样。学会如何自己找到光源至关重要,因为你永远无法知道所要了解的一切,因此你需要能够教会自己如何解决眼前的问题。

[idea]非常形象,学习编程时有个阶段脱离了别人的指导,自己会觉得不知所措和非常沮丧,只有尽自己的能力跨过这道坎,才算真正进入到编程的新世界。

大多数人没有意识到,要学习编码,你需要同时学习特定领域知识和程序性知识

3.在你的余生中,每天都超越自己的极限

一旦找到立足点,一些软件工程师就会留在自己的舒适区内。这种程序员被称为 maintenance programmers(维护程序员),这不应该是你努力做到的目标。相反,你应该每天都努力超越自己的极限。程序员辞职的最常见原因是“自从我解决了所有有趣的问题后,它不再具有挑战性。”

不要尝试将编码的项目拖入到你的舒适区,你应该寻找超出当前技能范围的问题。这是建立和扩展技能的唯一方法。

用一个 Firehose 学生的话说,当他的拐点通过时:“我仍然觉得自己处于深渊!知道这就是我要做的事,这让我感到更加自在!”

在Web开发中,实际上存在两个拐点。

web开发的拐点是你有能力构建所需的任何数据库驱动的应用程序。这意味着能够构建具有众多页面的 Web 应用程序,这些页面用于存储和检索来自简单数据库的信息。Web开发人员称之为:“掌握 CRUD”。在这个阶段,只需遵循 GitHub 或博客文章上提供的文档,你还应该能够与任何第三方库(例如ruby gem)进行集成。

算法和数据结构是更深层次的拐点,但实际上更重要。征服了这一点的人将精通他们正在使用的编程语言,不仅精通编程的基础知识,而且具有解决复杂编码难题的丰富知识。

克服了算法和数据结构拐点的人们将能够做到:

  • 写排序算法
  • 实现和反转链接列表
  • 利用堆栈,队列和树来理解和编写程序
  • 使用递归或迭代解决方案编写程序

简而言之,一旦你通过了这个拐点,你就将掌握数据操作并理解代码决策对性能的影响。传统的计算机科学学位只专注于让学生超越算法和数据结构的拐点。许多大学使用行业中通常不用的编程语言(例如Scheme,Racket或LISP)来教授这种知识。

在大多数技术面试中,面试官会假定你已经通过了Web开发的转折点,因为这样做更容易,并将他们的问题集中在评估你在算法和数据结构上的技能。这些问题通常集中在我们上面提到的主题上:排序算法,反转链表以及使用堆栈,队列和树。

一旦开发人员通过了Web开发和算法和数据结构的拐点,他们便掌握了编程领域的关键。

这些开发人员将能够解决与两者相关的挑战:需要在高级Web应用程序的上下文中构建复杂算法。这是专业的 Web 开发人员每天工作的核心。

4.拐点的重要性

当你第一次听到拐点时,最大的感受可能是听起来有点违反直觉。深吸一口气:

在学习编码时,特定领域的知识在宏大计划中无关紧要

没错。我不是在开玩笑——真的无关紧要。一旦你通过了拐点,这些概念只需要用一两个星期的时间,甚至几天就可以流畅地解释!

最终真正重要的是:

  • 你对Web开发框架有扎实的了解
  • 你可以熟练地用任何编程语言编写算法复杂的代码

招聘经理希望开发人员具备扎实的Web开发和算法能力。

当我在PayPal工作时,我的团队聘请了一位没有Rails经验的高级Rails开发人员——他已经在Python,LISP和Perl中进行了大量编码。在几天之内,他已经产生了很大的影响,并在数周内产生巨大了影响。他迅速升任技术团队负责人,这是我参与过最出色的招聘决定之一。

  • 不要汗流浃背的盲目追求热点。很多人会说诸如“ AngularJS如今很火”,“ JavaScript正在兴起”或“最新趋势……”。我对于这些问题的回复是:“是吗?” 当你学习如何编程时,你的唯一目标应该是找到拐点并战胜它。一旦完成,学习新的、有吸引力的技术一点也不难。

  • 变得自强不息。不需要结构化的指导就能够学习新的编码技能,意味着你不再需要等待任何人来帮你。也就是说,对于你需要学习的大多数内容,你只需搜索互联网并阅读各种需要了解的材料即可。

这并不意味着你需要立即“知道”所有内容,而是现在所有内容具备“弄清楚的能力”,因此从本质上讲,你已经势不可挡。

拐点期间你要开发的技能

作为软件开发人员,最好的参考资料就是你已经编写的类似代码。当你完全理解所编写的代码时,无需将所有详细信息提交到内存中。这意味着在构建新功能时,你应该问自己的第一个问题是:“我之前是否构建过类似的东西?” 如果答案是肯定的,请重新检查以前的代码并逐行浏览。重新向自己解释它在做什么,然后问自己:“我现在可以使用相同的方法吗?”

[idea]也是优先复用代码,而不是重复造轮子。

视频很烂,无法解释特定领域的细节,因为它们需要花了很长时间观看。假设你想与 Google Maps API 集成。一旦经历过一次开发,就可以在不到一分钟的时间里在 GitHub 中打开代码,将其复制并粘贴到新项目中。然而,视频通常需要10到30分钟才能重新看完。

尽可能用有效的策略通过拐点

因为通过拐点是学习编码的最重要的部分,所以你应该做好准备,使这个过程尽可能顺利。这意味着你应该在进入教程阶段时就开始准备,并在此期间保持正确的心态。

在教程阶段,停止学习结构化的材料,并一路给自己设置挑战难题

  • 对于每堂课,尝试完成超出你正在学习的教程范围之外的事情。如果你要学习的教程提供了“挑战”或“自我指导”的部分,请全部完成。在没有结构化指导的情况下,解决没有指导的挑战将为你提供重要的工作经验。
  • 尽量少使用教程。在Firehose,我们经常引导学生学习如何集成某些 gem 或使用提供的文档进行操作。许多学生不仅会按照针对刚入门者的教程中的说明进行操作,还将遵循文档并使用这些教程作为备份。请注意,文档一般把你看作已通过拐点的开发人员。独自阅读时,在GitHub上阅读和遵照文档会变得很轻松,这将使你有所收获。
  • 专注于基本要素并重复使用。了解如何进行常见操作,例如从头开始分解应用程序,将新应用程序推送到GitHub和Heroku,以及尽早构建数据库迁移。

推过拐点可能是具有挑战性的。以下是一些指导你完成操作的建议

  • 理解这是一个困难的过程,对自己要轻松一点。另外,设定切合实际的期望。你不能把你的“超人”水平的学习速度和你的“蜗牛”水平的自学速度相提并论。请记住,你正在学习很多东西,但是在这个阶段,你正在学习一种崭新的技能,并可以自行解决新问题。
  • 如果你在自信方面感到挣扎感,要知道你的感觉是完全正常的。继续努力。如果你仍在挣扎,可以尝试与最近通过拐点的人交谈。他们能够与你所处的位置相关,并告诉你所经历的状态只是暂时的。始终如一地工作,但不要过度劳累。在这个阶段,要知道你一天最多只能工作6个小时左右。在疲惫的状态下工作只会延长你花费在拐点上的时间

在这个阶段获得信心的最好方法是解决你的任何疑问。你的情绪可能开始变得像过山车。有时,你会感觉自己很火大,但是在同一个问题上苦苦挣扎了15个小时之后,感到两极分化是非常普遍的情况。

不知道是需要花费5分钟还是5个小时跨过拐点会让你感到有些沮丧,但是每次你通过并成功实现一项新功能时,急需的就是信心。在没有任何帮助的情况下解决了一些棘手的问题之后,你会沉迷于在舒适区域之外构建东西的感觉。

如何知道何时已经通过了拐点

拐点过程的最后阶段是验收。接受一个观念:软件开发是一个不断学习的过程。接受已经成功学完了一切的感觉,这意味着你应该开始考虑解决更复杂的问题

你经历过拐点了吗?将这篇文章分享给你的朋友并与他/她开始交谈——你会惊讶地发现有很多人已经到达并超越了这一刻。


完结

posted @ 2021-03-28 22:08  Alan-Yin  阅读(142)  评论(0编辑  收藏  举报