[译]提高编码技巧的关键要点

原文:http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/
译文作者:过来摸摸头丶
链接:https://www.jianshu.com/p/f5aec1637786

当你学会写程序时,会有一个时刻认为一切都开始改变。在Firehose网站,我们把它叫做编程之路的拐点。这一段时间后,作为一名开发者你的所有操作都会有很多不同。建立拐点是写程序中变得自立的过程,到达这个拐点的你不再需要任何帮助。它也可能是一个痛苦的经历,但是一旦你坚持到这个拐点,你将会变得难以置信的强大。

在Firehose网站,我们的目标不仅仅是教会你Ruby语言,还要讲给你如何构建web应用,怎样写测试。尽管我们会讲述很多技术,但我们主要但目标是使得求学的人尽管到达拐点,学会自行解决所遇到问题的能力。我们认为可以自行解决问题的能力是非常厉害的,这里的教学将带着你进步一学会怎么样快速去构建app。

辅导阶段(3到8周)

当你一开始学习编码时,有太多到你还不了解的Domain层。例如:在ruby中怎么写循环语句,怎么样用ruby从库中提取数据。Domain层包含唯一的确定编程环境的协议。

自我独立的第一步是学会怎么样制定计划。因为完成了一些计划,一个一个计划拼凑在一起将会是很明显的提升。

对于初学者来说,最重要的技巧就是学会注重细节。

密切关注细节是很重要的载你阅读资料如文档或者教学的时候。甚至是一个很小的拼写失误都会造成的错误或者故障。一开始看到错误信息真的很烦人,但是它也是学习编程过程中最重要的一步。处理错误和问题这一时期讲教会你在安全环境中重要的编程本领之一:面向细节。

调试错误信息真的非常重要。事实上,调试错误只是编程的一部分:它们是无经验的或者老练的程序员都会遇到的。唯一的区别是:你处理错误的经验越多,花费的时间越少。一下是原因:

随着时间的推移,你将学会怎么样阅读错误信息并迅速提取出问题的相关细节。第一次看到错误信息时,会花费大量的时间去解码它到底意味着什么。但是在你解决过几百个粗错误信息后,你就可以精确定义到是哪里出的问题和相关的细节以便去解决它。

你应该从你解决的每一个错误信息中去学习。而不是去修复错误并完成它;要理解你修复的错误有什么问题。从你的每一个错误中学习,下次在遇到相同错误的时候,你可以快速的修复它。

起初,你可能看到每一个错误信息都去寻求帮助。随着时间推移,你会很少需要帮助通过频繁的检查你的代码和去谷歌只能检索问题。

在教学阶段,你要遵循指令。首先,你会发现遵循指令很有挑战性,错误信息会频繁发生。随着时间推移,你处理故障错误的技能将会提升,并且会更加注重在那个细小的细节,当然你也会更快的取得进步。当你结束教学阶段的时候,你会发现你可以更快的速度编写代码。

在这个拐点,一些人是很自信的。他们要准备放弃教学,开始不用结构化的指导去构建项目,并且愉快的钻入程序的深区。其他的求学者会寻找更多的“完全理解”的教程,试图去获得更多领域特定的知识。不幸的是,教程只能带你到这里,并且在教程或者指导中是找不到真正的自信的。真正的自信来自于你对不知道如何解决的问题的挑战,是你自己发现解决问题的办法。

编程不好的小秘密是……

你完全不知道你在解决问题中需要了解什么。在这个深坑中,你可能最终会设想你学会了你需要学习的所有知识,然后平方增长。这个是绝不会发生的。

写程序是终生学习的经历。有经验的程序员也会寻求他们还没有解决的问题的办法,因为这一会给他们学习更多的机会。如果你发现你自己想要等一个时刻(你感觉你了解了所有代码的知识的时刻),要知道:你所等待的这一天永远不会到来。真是一件美妙的事情。

你要准备好进入下一个阶段:

在你遇到过足够多的错误信息后,它们不再对你吃惊。相反的,你知道怎么样破译它们,以及问题出在哪个地方。

你现在是使用谷歌搜索的专家了。当你正在新加一个功能或者看到疑惑的错误信息,你已经知道你需要搜索什么来获取所需要的信息。

你可以参考你所写的其他部分的代码并遵循他们的模式,而不用总是寻找一步一步的说明。

一个拐点(2-4周中,要有正确的心态)

这个阶段是学习编码最令人沮丧的阶段之一,但在很多方面,它也是唯一最重要的阶段。这是你不使用教程开始解决问题的时段因为没人帮你解决问题了。

在某些时候,你将感到你还没有准备好去度过这个时间就像你想要回到有什么事情都要教你的时候。不要成为这个沮丧感的牺牲品,原因是:

在这个时间端,你会重复编码10到20次比上个阶段更慢。

你可能会开始质疑自己并且想知道你是否可以成为一名真正到程序员。这个时候,不安全感和怀疑是普遍存在的。

尽管你感觉到学习和完成一些事情有更慢了,事实上,你正在实现最重要的事情。当你的特定领域的知识到达拔尖的程度时,你所学的一切知识都是程序知识。

程序性的知识可以教会你一路上你不知道的。当你需要实现一个新功能时,你应该做什么样的谷歌搜索?这个时间段,当你想到许多想要完成的事时会让你感觉在黑暗中。学到怎么样找到适合自己的点是至关重要的,因为你绝不可能任何事情都了解,所以你需要教会自己如何解决手头上的问题。

大多数的人没有意识到你需要学会特定领域的知识和程序性的知识为了能够编码。

在你的余生中,每一天都要超越你的极限

一些程序员找到自己的步子后会安于现状。这类程序员被称为维护程序员。这个并不是你应该努力做的事情。相反,你应该尽量每天都超越你的极限。程序员最普遍的辞职原因是“自从我解决了所有的有趣的问题后,它不再具有挑战性了。”

不要试图把编码项目拉到你的舒适区,而应该去寻找超越你当前技术范围之外的问题。这是扩展你的技能的唯一的途径。

用一位Firehose学生的一句话来表达他的拐点:

“我还是感觉我进到了困境!我只是变得更舒服了,这是我必须到达的地方!”

在web开发领域,其实会同时到达两个拐点。

web开发领域的拐点是:当你有能力构建你想要做的任何数据驱动的应用的时候。这意味着你可以做一个包含许多页面、可以存储和从简单的数据库中提取信息的web应用。web开发者把它叫做:CRUD。在这个阶段,你应该学会去集成通过从github或者一个blog下载的第三方类库。

算法和数据结构的拐点是不太明显的,但它的确是很重要的。已经到达这个拐点的人精通他们所掌握的编程语言底层,除了编程基础和拥有解决复杂编码更深的知识。

精通算法和数据结构的人可以做到以下:

写排序算法;反转列表;理解并写出程序堆栈、队列、和树;使用递归写电脑程序

简单来说,一旦你通过这个拐点,你已经精通了数据操作并理解了代码决定性能的含义。传统的计算机学位仅仅关注的是过去的算法和数据结构的拐点。许多大学生教他们编程语言通常不再行业中使用,例如方案,规划,LISP。

在很多技术面试中,面试官会认为你已经通过web开发的拐点,因为这很容易做到,并且他们的关注点放在你对算法和数据结构上的了解上。这些问题通常集中在我们上面提到的主题:排序算法,反向链表,是哟哦那个栈、队列和树。

一旦一个开发者通过了web领域拐点和算法与数据结构的拐点,他会成为一名闪耀点。
这些程序员有能力解决两个相交的挑战:需要在高级web应用程序上下文中构建的复杂算法。这是专业web开发人员每天在做的核心。

达到这些拐点的结果
最大的成果就是在你第一次听到有些反直觉。深呼吸:

当学习编码时,领域特定知识在食物的宏图中并不重要。

我没有开玩笑,这根本没什么。一旦你通过拐点,这些概念将流畅的翻译一个星期或者两个教程,甚至是几天。

最终重要的是:

你对web开发框架有很强的理解力。

你可以写出复杂的算法无论使用什么语言。

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

当我在PayPal工作时,我的团队雇佣了一个资深的Rails开发人员,他们在Rails没有经验,他在Python、Lisp和Perl中进行了大量的编码。几天之内,他已经产生了巨大的影响。几周内:巨大的影响。他很快就成为了技术团队的领头羊,是我参与过的最好的招聘决定之一。

不要操之过急。很多人会说,“AngularJS这几天很热”,“JavaScript正在上升,”或者“最新的时尚是……”,我对此的反应是:“那么?”当你学习如何编程时,你唯一的目标应该是找到拐点并消灭它。一旦你这样做,学习新的,性感的时尚不会是一项艰巨的任务。

变得自力更生。在没有结构化指导的情况下,有能力学习新的编码技能意味着你不再需要等待任何人来帮助你。这意味着,对于大多数你需要学习的东西,你可以简单地在互联网上搜索,阅读你需要知道的各种材料。

这并不意味着你立刻“知道”了一切,而只是现在一切都“确定”,所以本质上,你是不可阻挡的。

在拐点的时候你将要发展的技能

作为软件开发人员,最好的参考资料是你已经写过的类似代码。当您完全理解编写的代码时,不需要将所有的细节提交到内存中。这意味着在构建一个新的特性时,你应该问自己的第一个问题是:“我以前做过类似的事情吗?”“如果答案是肯定的,请重新访问代码并在代码中逐行遍历代码。重新解释一下自己在做什么,问问自己:“我现在能用同样的方法吗?”

视频很难解释特定领域的细节,因为他们需要长时间观看。假设你想与谷歌地图API集成。一旦您经历过一次这样的操作,在github中打开代码需要花费不到一分钟的时间,复制代码并将其粘贴到新项目中。另一方面,视频通常需要10-30分钟才能看完。

尽快高效的到达拐点的策略

因为达到拐点是最重要的部分,所以你应该让自己尽可能顺利地进行。这意味着你应该开始准备你在教程阶段,并保持正确的心态在这段时间内。在辅导阶段,从结构材料上突破,给自己一路挑战性的问题。

对于每一课,试着去做一些超出你指导范围的事情。如果你正在做的教程提供“挑战”或“自我导向”的部分,那么就去做。解决非指导性的挑战会给你重要的经验,做事情没有结构化指导。

尽量少使用教程。在Firehose上,我们经常让学生通过使用所提供的文档来整合做一些事情。许多学生将遵循文档,并使用教程作为备份,而不是简单地遵循教程中解释的指导,这些指导面向刚刚开始的人。注意文档会把你当成一个已经过了拐点的开发者。在github上获得舒适的阅读和跟踪文档将使你在自己独立的过程中获得成功。

关注要点,重复使用。学习如何做普通的事情,比如从头开始梳理应用程序,把一个新的应用程序推到github上,并在早期建立数据库迁移。

推动拐点可能是具有挑战性的。这里有一些指针让你通过它:

要明白这是一个艰难的过程,让自己轻松一些。同时,设定现实的期望。你无法比较你的“超人”水平的速度,通过教程到你的“蜗牛”-速度学习的东西。记住,你正在学习很多东西,但是在这个阶段,你正在学习一种全新的技巧,一个人独立思考新事物。

如果你在自信中挣扎,就知道你的感觉是完全正常的。继续工作。如果你继续挣扎,试着和最近通过拐点的人交谈。他们将能够与你所处的位置相关联,并向你保证你所经历的只是暂时的。工作要始终如一,但不要过度劳累。在这个阶段,你知道最多只能每天工作6小时左右。在疲惫状态下工作只会延长你花在拐点上的时间。

在这个阶段获得自信最好的方法是通过你的任何怀疑。你的情绪可能会感觉像过山车一样。有时候,你会觉得自己着火了,但是在经历了15个小时的挣扎之后,感觉到效果相反是很普遍的。

如果你不知道某件事会花费你5分钟或5个小时,你会感到沮丧,但是每次你通过并成功地实现一个新的特征时,信心的激增将是你所需要的一切。在解决了一些棘手的问题而没有任何帮助的情况下,你会沉溺于在舒适区之外构建东西的感觉。

如何知道你什么时候通过拐点

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

Comments
Write a Comment