写点什么

博文翻译丨提高编程技能的关键(The Key To Accelerating Your Coding Skills 中文翻译)

用户头像
Liuchengz.
关注
发布于: 2020 年 08 月 23 日
博文翻译丨提高编程技能的关键(The Key To Accelerating Your Coding Skills 中文翻译)

原文作者:KEN MAZAIKA 译:Liuchengz

提高编程技能的关键

当你在学习编程的时候,会有那么一个瞬间让你觉得一切都变化了。在 Firehose[1]里,我们称这个瞬间为编程的拐点[2],突破这个阶段后,作为开发者的你,你的开发水平将发生巨大的变化。突破拐点的过程,就是在编程时遇到问题能自己解决,并且不再需要看着教程一步一步做的过程。在达到这个阶段前可能会让你沮丧,但是一旦你突破了拐点,那么你将得到意想不到的成长。

蓝色线为学习具体的知识

红色线为学习自己解决问题

它们的交点为拐点

在Firehose,我们教授学生如何用Ruby编写web应用、测试等知识,但是我们最重要的目的是让学生更快速的通过编程学习的拐点,同时让他们拥有有独立的解决问题的能力。我们认为,能独立的解决问题是一项非常宝贵的能力,这样的教学方法能让学生更有竞争力,而不是仅仅只会写程序。

辅导教育阶段

在刚开始学习编程时,有很多知识你还并不了解。这些知识是特定领域的知识[3],比如,如何用Ruby写一个循环结构,或者如何使用 Ruby on Rails从数据库中导出数据。特定领域的知识是结合实际的应用场景需要了解的知识。成为能独立解决问题的开发者,第一步就是学会完成特定的任务。一旦你能完成某些特定的任务,这些特定任务中所使用到的知识,如何将它们在更大的应用范围中使用,对你来说会更加的清晰明了。随着实际的推移,你会认识到设计模式的重要性,那些一开始你不懂或者陌生的东西,最终你也将信手拈来。

对于刚起步的学生,最重要的技能是细节的把控

在阅读文档和教程的时候,对细节的关注是很重要的。即使是微不足道的拼写错误都会引发错误。刚开始时,查看错误信息是很打击人的,但其实这是学习编程中必不可少的一步。在初学阶段,对于错误信息的处理会让你明白在安全稳定的环境中编程最重要的是要把控好细节。

对错误信息进行调试非常的重要,在编写程序的时候,难免会出现错误信息,这不管是对于新人还是大牛都是不可避免的,因为处理错误信息就是编程的一部分。但是,如果你处理信息的经验越丰富,那你解决错误信息的速度就越快。这是因为:

  • 随着经验的丰富,你将学会如何通过阅读错误信息快速定位问题的关键细节。好比你第一次看见错误信息的时候,你可能会花很多时间才能找出问题,但当你经历过成百上千的的错误信息后(你必定会遇到成百上千的错误信息),你将能立即锁定问题所在并将其修复。

  • 你应该从你处理过的错误信息中积累经验。不要只是单纯的把问题修复就完事了,还要去思考出错的原因。通过从每个错误中汲取经验,在你下一次遇到它时,能快速的解决它。

  • 一开始你可能遇到每个问题都要去求助他人,随着你的成长,你会学会自己检查代码,或有效利用搜索引擎去解决你的问题,这样你可能不会再那么频繁的去求职他人了。

在辅导教育阶段,你会按照一系列的指导去做。刚开始时,你会觉得跟着指导去做似乎也很困难,错误信息到处都是。随着时间的推移,你逐渐掌握调试程序的技巧,并更加的关注细节,这时你将获得更好的进展,当你完成了辅导教育阶段,你的代码编写速度会大幅提升。

在这个时候,有些人觉得非常自信——好像已经不需要任何系统性的辅助,开始试着自己制造一些东西——并乐于其中。另一些人会继续去读更多的教程,试图获取更多特定领域的知识,以求达到“完全理解”的程度。但不幸的是,教学辅导只能带你走到这里,并且无法让你获得真的的自信。真正的自信来源于面对一个你无法解决的问题时,经过一番艰难的尝试后,最终独立的将其解决的过程。

关于编程的潜规则

你永远不会知道解决问题所需要的一切。进入编程之旅后,你也许会设想,终有一天你会学习完所有一切你需要学习的东西,然后一切就绪开始大有一番作为。但事实是,这一天永远不会到来。

编程是需要终身学习的,经验丰富的软件工程师们仍孜孜不倦的寻求着自己未解决问题的答案,因为这能让他们有机会学到更多。如果你期望着有一天能掌握所有编程的一切,你要记住,这一天永远不可能到来。这真是件奇妙的事啊!

大师的失败次数比初学者还多

当你做好下面这些准备时,你就可以进入下一阶段了:

  • 你对错误信息已经习以为常,并能够很好的解决它们,已经知道它们发生的原因。

  • 你已经是一个善用搜索引擎的专家,当你需要增加一个新的功能或是解决新的难题时,你能明白该去怎样搜索并找到它解决方法。

  • 你能明白你所写的代码的意义,并遵循设计模式去解决问题,而不是一步步的去看说明文档。

拐点阶段

拐点阶段是在学习编程阶段最打击人信息的时期,但从另一个角度来说,它却是唯一重要的时期。当你不再依赖于教程,开始解决没人提供现成方案的时,就会遇到拐点阶段。

可能你会觉得你并没有准备好面对这个阶段,从而回过头去继续从系统的知识学起,其实不必抱有这种妄自菲薄的心态,可能会打击你的原因有:

  • 现阶段你的写代码速度比前一阶段慢10-20倍

这时你可能会产生怀疑:自己是否有能力成为一个程序员。其实在拐点阶段产生焦虑和疑惑是正常的。

尽管你会发现你学习和写代码的速度慢了很多,但实际上,你正在完成最重要的事。当你在特定领域的知识足够丰富时,你会发现你所学的东西其实都是执行性知识[4]

执行性知识是教会自己原本不知道的东西的能力。当你想实现一个新功能时,你应该在Google上查阅哪些资料?这时你会发现自己无从下手,就像身处在一片黑暗中一样找不到方向。学会如何在黑暗中找到灯塔是至关重要的,因为你不可能掌握所有的知识,你必须学会如何解决自己手头上的问题。

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

在人生的每一天中都要尝试着挑战自己

很多软件工程师一旦找到了自己的立足点,就停留在自己的舒适区里,这种程序员被叫做只会写代码的程序员[5]——显示不是你应该成为的类型。和他们不同的是,每一天你都应该尝试着去做超越自我的事。大部分程序员辞职的原因是:我已经解决了所有有趣的问题,再也没有什么挑战了。

相比于试图把代码和项目拉到自己的舒适区里,你更应该去解决那些超出你能力范围的问题,这是学习和拓展新技能的唯一方法。

一位突破了自己拐点阶段的Firehose学员说道:

我依然觉得我深陷于深渊当中,但我感觉棒极了,这正是我想要的!

在web开发中,实际上会有两个拐点一同出现

web开发拐点,它出现于你能够创建任何基于数据库驱动的应用时。这意味着你能够创建一个拥有许多页面,从一个简单的数据库进行存取数据的Web应用。web开发者称其为:“精通增查删改”。在这个阶段,你还可以通过阅读文档或者技术博客,将一个第三方库(比如 Ruby Gem)集成到自己的Web应用中。

算法与数据结构拐点,它或许不那么明显,但却更加的重要。突破这个阶段的人,对他们所使用的编程语言掌握程度已经非常高了。意味着,他们了解编程的基础体系,拥有面对复杂问题的深厚知识储备。

突破这一阶段的人通常能:

  • 使用排序算法

  • 熟练链表的使用

  • 理解会应用栈、队列、树

  • 使用递归和迭代思想编写程序

总之,只要你突破了这一阶段,你就掌握了数据结构,了解代码性能优劣。大学里传统的计算机科学教育特别注重让学生突破算法与数据结构拐点。但是很多大学教授的语言,业界已经不流行了,比如Scheme,Racket 和 LISP。

在大部分技术面试中,面试官都默认面试者已经突破了Web开发的拐点,因为这个拐点相对容易度过,所以会将问题集中在评估面试者的算法和数据结构能力上。通常面试问题会集中在上边提到的几个方面:排序算法,链表,栈、队列和树。

一旦开发者突破了这两个拐点,他们就掌握了通往编程王国的钥匙。

这些开发者能够解决两者兼备的挑战:在复杂的高级Web应用内构建复杂的算法。这是专业的Web开发者每天都要做的事情。

突破拐点之后

在突破了拐点之后,你会发现你能获得的东西有点不合常理。深吸一口气,然后明白:

对于编程的学习,特定领域的知识在宏观角度来看并不重要。

我并没有开玩笑,特定领域的知识确实没有那么重要。一旦你突破了自己拐点,你会在一个星期,甚至几天内理解这句话。

真正重要的东西是:

  • 对一个Web框架牢固的掌握

  • 在任何编程语言中实现复杂的算法代码

HR希望开发者同时具备Web开发技能和算法技能。

我在Paypal工作时,我的团队招进来一个高级Ruby Rails开发工程师,之前他没有任何Rails经验,只有Python,LISP和Perl经验。但仅仅在几天之内,他已经给我们带来很大震撼。几星期之后是巨大的震撼。他迅速被提升为技术团队的领导,也是我当时最成功的招聘决定之一。

不要盲目的追求热门技术,许多人说:“最近Angular JS好热门”,“JavaScript上升势头猛烈”,“最近流行用…”。我对这些问题的回答是:“那又怎样呢?”当你在学习编程时,你唯一的目标应该是找到拐点并突破它。一旦你做到了,学习这些新的、有趣的技术易如反掌。

自立更生,当你能力在无需组织性的指导下学习新的编程知识时,意味着你不用等别人来帮助你解决问题了,对于你所需要学习的大部分知识,你可以搜索互联网或者阅读各种材料。

这并不意味着你能马上“掌握”所有的东西,而是意味着所有的东西都是可以“弄明白的”,实际上这时的你已经不可阻挡了。

突破拐点时你将练就的技能

作为一个开发者,最好的参考资料就是你编写过的类似代码。在你完全理解自己编写的代码之后,不必将所有的细节都记在脑中。当你在开发一个新功能时,应该先问自己:“我之前做过类似的东西吗?”如果答案是做过,那么试着重新去看一遍之前代码,在脑中重放一遍并将代码解释给自己听。最后问问自己:“我现在可以用相同的方法吗?”。

视频很难将特定领域的知识讲解清楚,他们往往很长,需要花费大量时间。比如你想集成Google Maps API,一旦你有过相似的经历,在 GitHub 上打开代码,复制代码,然后粘贴到一个新的项目中,只需要不到一分钟。但是,视频指导往往需要10-30分钟来观看。

快速跨越拐点策略

由于突破拐点是整个编程学习中最重要的事,所以你必须尽可能的让自己顺利的度过这一阶段。这意味着你在辅导教育阶段就应该开始准备,并在整个过程保持良好的心态。

在辅导教育阶段,除了学习系统化的指导资料,还应该全程给自己一些挑战。

  • 对于每一课,尝试做超过教学范围的事情。如果书中有“挑战”或者“自己努力完成”的问题,把它们全部做掉。解决没有指导的问题会带来无需组织性的指导便能解决问题的重要经验。

  • 尝试尽可能少的依赖教学材料。在Firehose,我们通常让学生通过文档了解如何集成一些gems或者实现一些代码。对学生来说,他们主要根据程序文档操作,教学材料仅作为备查,而不是单纯的依赖教学材料按部就班的学习。值得注意的是,文档会将阅读者视为已经跨越了拐点的开发者。习惯了在Github上阅读文档,对你自力更生是莫大的帮助。

  • 关注要点与可复用性。比如,从头开始编写应用程序,提交一个新应用到Github或者Heroku。以及尽早构建数据库迁移。

越过拐点可能具有一定的挑战性,下面这些建议能帮你度过难关:

  • 要知道越过拐点是一个艰难的过程,不要给自己太多压力。同时,设立可实现的目标。你不能把在辅导教育时期自己“超人”一般的编写代码速度和这个阶段自己“蜗牛”般的速度进行比较。要明白你一直都在学习知识,你正在掌握的是可以自己搞定全新事物的能力。

  • 如果你觉得自己的信心遭受到了打击,你要明白有这个感受是正常的,然后继续努力。如果你还感到受挫,那么可以试着和已经越过拐点的人交流,或许他们能了解你的情况,并告诉你这种感受是暂时的。你应该坚持下来,继续学习,但是不要过度劳累。在学习编程这个阶段,你能保持高效率学习的时间每天只有6个小时。在疲劳状态下学习只会让你得不偿失。

这个阶段获取信心的最佳方式是解决自己遇到的疑难问题。你的情绪可能会像坐过山车一样。有时候你觉得你自己好像被放在火上烤,但经过在一个问题上15小时的努力之后,你可能有完全不同的感受。

不知解决一个问题需要花费5分钟还是5个小时,这种感觉确实是令人沮丧的。但你每次成功的搞定了一个问题时,那种自信涌上心头的感觉是你最需要的。在不依靠帮助解决了很多困难问题的问题后,你会沉迷于在舒适区外不断解决问题的感觉。

如何知道自己已经跨过了拐点

拐点过程的最后一个阶段是接受。接受软件开发是一个持续学习的过程。接受你觉得你已经成功地学会了一切的感觉只是意味着你应该开始思考解决更复杂的问题。




注释:

[1]:Firehose是国外一个编程培训机构,主要教授Ruby语言

[2]:原文为:「inflection point」  维基百科

[3]:原文为:「domain-specific knowledge」

[4]:原文为:「Procedural knowledge」维基百科

[5]:原文为:「maintenance programmers」

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

封面:Image by Ngo Minh Tuan from Pixabay 

用户头像

Liuchengz.

关注

选择和时间做朋友 2018.09.18 加入

写作新人,请多批评和指正

评论

发布
暂无评论
博文翻译丨提高编程技能的关键(The Key To Accelerating Your Coding Skills 中文翻译)