快速提升编程能力的关键
本文是我看陈皓专栏《左耳听风》推荐的文章翻译(并非完全按照原文翻译,干货部分原文翻译),原文链接The Key To Accelerating Your Coding Skills。
当你开始学习编程的时候,你身边的一切都开始发生变化。在Firehose,我们称其为编程的拐点时刻。在这个阶段之后,你作为开发人员这一身份的行为将发生巨大的改变。你达到这一拐点的过程就是你在编程学习中发现问题解决问题的过程,当你达到这一阶段,你将不再需要任何的帮助。这可能不是一个轻松的经历,期间你可能会感到很沮丧,但是一旦跨过这一阶段,你将获得无穷的力量。
在Firehose,我们的目标不仅仅是教你Ruby,如何构建Web应用程序或如何编写测试程序。 尽管我们确实教授这些技能,但我们的主要目标是使学生更快的超越拐点,从而使他们能够解决遇到的任何问题。 我们相信,能够自己解决问题是一项珍贵的技能,这种教学方法将使你走得更远,而不仅仅是学习如何构建一个应用程序。
教程阶段(3-8周的认真编程)
当你开始学习编程的时候,有很多知识你还不知道。这些信息称为领域的专业知识。举例包括:了解如何用ruby编写循环,或者如何使用ruby on Rails从数据库中提取内容,专业领域的知识包括特定的编程环境和特有的协议。
成为自给自足开发人员的第一步就是能够完成具体的任务,一旦你真正完成并掌握了具体的任务,你将大致了解任务的各部分如何组合在一起完成功能。随着时间的推移,你将开始认识到模式,最后那些最初看起来令人困惑和陌生的事情将成为你的第二天性。
对于初学者来说,最重要的技巧就是注意细节
在阅读文档或教程等材料时,密切关注细节是很重要的。即使是最细小的拼写错误也会导致错误信息或bug的产生。一开始看到错误消息是令人沮丧的经历,但这是学习过程中至关重要的一步。在此阶段处理错误消息和问题将教会你在安全环境中进行编程的最重要技能之一:面向细节。
**调试的错误信息是非常重要的。**错误的信息虽然只是编程的一部分,不管是熟练的还是不熟练的人都会遇到,但是两者的区别就是:熟练的人处理了越多的错误信息,他们就会花费越少的时间来修复他们。
- 随着时间的推移,你将学习到如何阅读错误信息并快速提取问题的相关细节。第一次看到错误信息时,需要一段时间才能理解它的真正含义。但是,在你看过数百条错误信息之后(你将看到数百条错误消息!),你将能够准确定位问题的位置,并找到解决问题所需的相关细节。
- 从你解决的问题中学习。不要只是修正了错误就结束,彻底理解你解决的问题,通过从你遇到的每一个报错中学习,当你再次遇到它时你将能很快的解决它。
- 最开始你可能解决不了你遇到的任何问题,每个问题都要寻求帮助,随着时间的推移,你将学会通过二次检查代码和网上搜索减少寻求帮助的频率。
在教程阶段,你将按照指导内容学习。首先,你会发现按照指令很有挑战性,错误信息也会经常发生。随着时间的推移,你将掌握调试错误和更好的关注细节的技能,并且能够更快地取得进展。在结束教程阶段时,你将注意到你能够以更快的速度编写代码。
在这一点上,有些人感觉很有信心,好像他们已经准备好抛弃训练阶段,在没有结构化指导的情况下开始构建东西,并且可以愉快地深入到最深处。其他学生将寻求更多的教程,试图获得更多的领域特定知识,以寻求一个更完整的理解。不幸的是,教程只会带你走这么远,真正的信心不是在教程或指南中找到的。真正的自信来自于在一个你不知道如何解决的问题中挣扎,并且自己找到解决方案。
编程肮脏的小秘密。。。。。。
**你永远不会知道解决问题所需要知道的一切。**在这个过程中,你可能会想象自己最终会学到所有你需要学习的东西,然后开始准备就绪。但是,这一刻永远不会发生。
编程是一生的学习经历。有经验的软件工程师会寻找尚未解决的问题的解决方案,因为这给了他们更多学习的机会。如果你发现自己在等待那一刻的到来,那一刻你终于觉得自己对编程了如指掌,那么你要知道:你等待的那一天永远不会到来。但这是一件十分美妙的事情。
当你准备好进入下一阶段的旅程时:
- 你已经看到了足够多的错误信息,你对报错也不会有任何震惊。相反,你知道他们的真正含义,以及在哪里查找代码中的问题。
- 你是搜索解决方案的专家。当你正在添加一个特性或看到一个令人困惑的错误信息时,你知道要搜索什么才能找到你需要的信息。
- 你可以参考应用程序的其他部分中编写的代码,并在其中遵循模式,而不是总是寻找一步步的指示。
编程拐点(2-4周心态端正)
拐点阶段是学习编程过程中最令人沮丧的阶段之一,但在许多方面,这是惟一重要的阶段。这就是你逐步开始停止使用教程并开始解决没有人再为你准备好问题的解决方法和思路的时候。有些时候,你会觉得你还没有准备好有能力解决这个阶段,你想要回到建立一些东西的轮廓学习他们到底是做什么而不是用他们去解决实际的问题。不要成为这种心态的牺牲品,你会感到沮丧的原因是:
在编程拐点阶段,您的编程速度将比前一阶段慢10-20倍。
你可能会开始质疑自己,怀疑自己是否真的有能力成为一名程序员。不安全感和怀疑感在这个阶段很常见。
尽管你会觉得自己学习和完成事情的速度要慢得多,但实际上,你正在完成最重要的事情,这也是你最需要花费时间的地方,这个阶段总是会想着掌握更多特定领域的知识,但是你要明白所有你学习的内容都是这个过程中必须要学习的知识。
程序性知识是一种能力,可以让你在学习过程中自学你不知道的东西。当你需要实现一个新特性时,应该如何进行关键性搜索?在这个时候,当你想要完成很多事情的时候,你会觉得自己身处黑暗之中,学习如何自己发现光明是至关重要的,因为你永远不可能知道所有你需要知道的事情,因为你可能都不知道你需要他们,所以你需要能够解决目前遇见的问题。
大多数人意识不到学习编程需要专业的领域性知识和程序性知识。
在你的余生中,每一天都要超越自己的极限
一些软件工程师一旦找到自己的立足点,就会呆在自己的舒适区。这些类型的程序员被称为维护程序员,你不应该努力成为这样的人。相反,你应该每天都努力突破自己的极限。程序员辞职最常见的原因是,自认为解决了所有有趣的问题,认为它就不再具有挑战性了。不要试图把编程项目拉入你的舒适区,你应该找出你当前技能范围之外的问题,这是建立和扩展你技能的唯一方法。
一位优秀的程序员会说:
我仍然觉得我身处困境之中,我只是越来越坦然的知道,那是我必须要去的地方。
在web开发中,实际上有两个拐点会同时出现
web开发拐点是你能够构建任何数据库驱动的应用程序。这意味着能够构建一个包含许多页面的web应用程序,它可以从简单的数据库中检索和存储信息。Web开发人员称之为:CRUD。在这个阶段,你还应该能够通过遵循GitHub上提供的文档或一篇博客文章将任何的第三方库(例如ruby gem)集成到应用程序中。
算法和数据结构拐点是一个不那么容易的拐点,但实际上更重要。除了掌握编程的基础知识和解决复杂编程挑战的深度知识外,征服这一点的人还将掌握他们正在使用的编程语言。
那些征服了算法和数据结构拐点的人将能够做到这一点:
- 编写排序算法
- 实现反向链表
- 理解和编写堆栈、队列和树的程序
- 使用递归或迭代解决方案编写计算机程序
简而言之,一旦你通过了这个拐点,你就已经掌握了数据操作并理解了代码决策的性能含义。传统的大学计算机教育只关注学生算法和数据结构的学习,许多大学用通常不被业界使用的编程语言。
在大多数技术面试中,面试官会假定你已经通过了web开发的拐点,因为这比较容易做到,他们的问题会集中在评估你在算法和数据结构方面的技能。 这些问题通常集中在我们上面提到的主题上:排序算法、反向链表、使用堆栈、队列和树。
Web开发+算法与数据结构 == 编程新世界的关键
这些开发人员如果能够解决这两个方面的挑战:在高级web应用程序中构建复杂算法,这是专业web开发人员每天工作的核心内容。
“在学习编程时,领域特定的知识在整个过程中并不重要”
一旦你通过了拐点,这些概念将流畅的翻译只需一周或两周的时间,甚至几天。
最终真正重要的:
- 对Web开发框架有深入的理解
- 用任何编程语言编写复杂的算法代码,都有扎实的基础
招聘经理希望开发人员具有扎实的web开发和算法技能
当我在PayPal工作的时候,我的团队雇佣了一位资深的Rails开发人员,但是他在Rails方面没有任何的经验,之前一直使用Python、LISP和Perl编写代码。几天之内,他就完成了一个巨大的成果。更令人震惊的是,在几周内,他就成为了技术团队的领导,这是我参与过的最好的招聘决策之一。
不要操之过急。很多人会说,AngularJS最近很火,JavaScript正在崛起。对于新兴技术的崛起我是这样认为的:当你学习如何编程时,你唯一的目标应该是找到拐点并消灭它,一旦你这样做了,学习新兴的、热门的、时尚技术就不会是一个困难的任务。
自力更生。在没有系统性指导的情况下学习新的编程知识,意味着你不再需要任何人的帮助。这意味着,对于大多数你想要学习的东西,你只需要简单地在网上搜索和阅读各种你知道的材料就能完成。
但这并不是说你马上就知道所有的事情了,而是说现在所有的事情都是可以预测的,所以本质上,你是不可阻挡的。
在拐点中培养的技能
作为一名软件开发人员,最好的参考资料是你已经编写的类似代码。当你完全理解你所写的代码时,你就不需要把所有的细节都记在脑子里了。这意味着在需要构建新功能时,你应该问自己的第一个问题是:我以前是否实现过类似的功能? 如果答案是肯定的,那么重新审视代码并在你的头脑中逐行覆写代码。重新解释它在做什么,然后问自己,我现在可以用同样的方法吗?
视频不擅长解释特定领域的细节。因为视频需要花很长时间,假设你希望与谷歌映射API集成。一旦你有过这样的经历,在GitHub中打开代码、复制代码并将其粘贴到一个新项目中只需要不到一分钟的时间。另一方面,视频通常需要10-30分钟才能重新观看。(新手看不懂书也没办法,笔者这是建立在非新手说的,可以理解)
高效通过拐点策略
在依据教程学习阶段,阶段性给自己一些问题的挑战
- 对于每一节课,试着做一些超出你正在学习的教程范围的事情。如果你正在学习的课程提供了挑战或自我指导,完成所有的,即便它很简单。解决非指导性的挑战将给你在没有系统学习的情况下工作的重要经验。(锻炼思考解决问题能力)
- 尽量少使用教程。在Firehose,我们经常指导学生如何集成某些gem或使用提供的文档进行操作,但许多学生并不会简单地按照教程中的说明去做,这些教程是针对那些刚刚开始学习的人的。通过拐点的学生会遵循文档,并将这些教程作为辅助工具。请注意,文档将把你视为已经通过拐点的开发人员。当你独自一人的时候,在GitHub上阅读和跟踪文档会给你带来巨大的帮助。
- 专注于要点并重复使用。学习如何做一些常见的事,比如从头开始开发一个应用程序,将一个新应用程序推向GitHub和Heroku,以及尽早实现数据库的迁移。
突破拐点可能颇具挑战性,以下是一些帮助你度过难关的建议:
- 要明白这是一个艰难的过程,对自己要宽容。同样,设定现实的期望和目标。你无法将你和行业大牛的超人水平相比。要坚信你学到了很多东西,在这个阶段,你正在学习一种全新的技能,自己去学习新事物得能力。
- 如果你正在怀疑自己,并且有些失去了自信,要知道你的感觉是完全正常的。继续工作。如果你还在挣扎,那就试着和那些刚刚度过难关的人谈谈。他们将能够回答与你所处的阶段相关的困惑,并向你保证你现在所经历的都只是暂时的。坚持不懈地学习,但不要过度劳累。在这个阶段,你要知道你一天最多只能工作6个小时。在筋疲力尽的状态下工作只会延长你到达拐点的时间。
在这个阶段获得自信的最好方法就是克服你的怀疑。你的情绪可能会像过山车一样,有时,你会觉得自己像着了火一样,但在同一个问题上挣扎了15个小时后,你会发现情况恰恰相反。
不知道某件事花了你5分钟和5个小时哪个更令人沮丧,但每次你完成并成功实现一个新特性时,你所需要的一切都将是信心的迸发。在没有任何帮助的情况下解决了一些困难的问题之后,你会沉迷于在自己的舒适区外建造东西的感觉。
如何知道你何时越过了拐点
拐点过程的最后阶段是接受。接受软件开发是一个不断学习的过程。接受你已经成功学到了一切的感觉意味着你应该开始思考解决更复杂的问题了。(坦然面对你还差得远这个事实)