如何加速提升编程能力(译)
写在前面
本文主要翻译 Ken Mazaika的博文-The Key To Accelerating Your Coding Skills。
原文来自 网站Firehose Project,旨在提供程序设计方面的新闻、知识,提供2分钟快速阅读等服务,并且提供在线学习编程技巧的服务,请参见quora中一位学员的问答记录,从学习者的角度说的非常明确:点我~~
正文开始
每一个学习程序设计的人,都会有一种感觉,打到一个特定的阶段之后,一切都发生了化学反应。Firehose称之为 编程拐点。
译者:其实所有事情都有拐点,万事开头难就是这个意思吧。
编程拐点之后,开发者的在程序设计方面的能力会有极大的提升,这也会带给自己足够的自信,最终在程序设计方面打到自给自足。达到编程拐的过程可能极其艰辛,但是一旦达到,也会给开发者带来非常大的提高。
Firehose提供Ruby语言的学习,编写web应用程序,编写测试代码。但是这些都不是重点,更加重要的是帮助开发者度过编程拐点,让开发者掌握自主解决问题的能力。自主解决问题的能力才弥足珍贵。在Firehose,授人以鱼不如授人以渔。
教程阶段(3-8周的编码基础学习)
刚开始学习编码,肯定缺少很多必要的知识积累。我们称这些知识为 领域专业知识。举个例子:如何在Ruby中编写循环,或者如何通过Ruby on Rails连接数据库等。领域专业知识的掌握,需要基于整个编程的环境。
成为真正程序的第一步是学习这些技能。随着技能的掌握,零散的知识会逐渐拼接成完整的一块。在这过程中,开发者会掌握一些特定的模式,最终,一开始令人迷惑的这些知识会融汇贯通,甚至称为一种本能。
对于初学者来说,最重要的是细节。
对细节的关注在编程中很重要,比如要注意文档或者教学材料的细节部分。排版或者拼写错误都可能引发不必要的麻烦或者bug。起初,查看错误日志会非常的难,容易让人郁闷,但这却是必经之路。只有亲自处理错误日志,解决问题才能让开发者切身体会到细节是多么重要。
Debugging(根据错误日志找到问题并且解决,统称调试错误)的过程是非常非常重要的,开发者需要意识到,这是编程的一部分,不管经验老道的开发者或者是初出茅庐的新人,这部分信息都是能看到的。区别在于,调试错误的经验越多,针对同一个问题调试的时间越短。原因参见:
随着时间积累,开发者会掌握如何有效的读取错误日志,并且快速的抽取关于问题的有效信息。起初,阅读错误日志会不知所措,但是当看过成百上千(相信我,绝对不是虚报数量)的错误日志之后,开发者一定会迅速定位问题日志并且找到解决方案的。
-
每次解决问题,都要有所收获。千万别仅仅是解决了问题就算完事了。一定要弄明白为什么会发生问题。这样,下次再遇到相同的问题,就可以快速修复。
译者:最好总结发个博文啥的。
起初,开发者针对某个问题需要向其他人咨询,但是后续你会发现,仔细检查代码或者充分利用 Google检索引擎 会更有效率。
在教程阶段,开发者需要根据 instruction 去编写代码。起初,你会发现,跟着教程走怎么还是有那么多异常发生。后续,你会从错误调试中得到一个教训:应该对 instruction 中的细节多关注一些。这时候,你应该可以学习的更快速一些了。结束教程之后,你会发现,可以以更快的节奏去进行学习了。
这时候,一些学生会有一些自信心爆棚的赶脚,觉得已经可以抛弃这些教程内容,然后自己去潜心学习和开发一些东西了。另一些学生则会找一些更加深入的教程,掌握更深层次的领域专业知识,从更加深入的角度去理解。可悲的是,教程的能力是有限的,教程或者指引永远不会给人以真正的自信。自信来源于在问题中努力挣扎,并且最终通过自己的实力去解决的旅程。
不过,编程也是有套路的……
问题是无穷无尽的,同样,解决问题背后的知识也是无穷无尽的,用有限的时间投入无穷的知识和问题是一个伪命题。企图学习完所有的知识再去解决问题,这不可能。
事实上,编程本身是一个终身学习的体验。有经验的软件工程师很乐于解决从没有见过的问题,解决这些问题能让他们学习到更多的东西。如果有一天,你发现自己竟然想等学习完所有再开始动手,赶紧提醒自己清醒过来。清醒过来很重要。
达到以下境界的话,你要知道,该进入下一阶段了
- 错误日志看的太多了,已经无法困扰到你了。同时,你知道如何通过日志可以知道问题在哪里,如何从代码中解决问题。
- 具备了专业的google检索能力。当你准备给项目增加新特性或者是解决一个困扰你的问题,你知道如何有效的通过检索引擎找到答案。
- 在编码中,可以引用之前写的某个模块的代码,并且遵循开发规范,并且不再依赖于那些一步一步指导你开发的指南或者是教程。
编程拐点(2-4周,并且要具备良好的心态)
拐点阶段是编程学习中最令人不能忍受的阶段,但是从很多角度来看,却是最重要的阶段。其实拐点开始在逐步离开教程,并且开始独立解决问题的时候。
某些时候,你感觉无法坚持下去,希望回到教程阶段,有明确的123的学习中去。但是千万别输给自己的心态。我们从头开始分析这种心态的原因:
拐点阶段中,你的编码速度会比之前慢10~20倍。
你也许会质疑自己,重新问自己,是不是真的擅长做编程这一行。这一阶段的感觉通常是不安全感和多虑。
抛开学习进度缓慢的事实不说,事实上,你正在掌握最最重要的知识。虽然领域专业知识进展缓慢,但你所学的一切都与程序的过程知识有关。
过程知识十分重要,随着时间的推移,可以让你掌握自己不知道的知识。比如 " 当我要实现一个新特性,我应该去google怎么检索?"。在这个阶段,很多东西需要推动,你甚至会感觉一片黑暗。学习如何跨过这黎明前的黑暗是关键点,因为人不可能全知全能,所以,你必须学习如何亲手解决问题。
许多人没有意识到,学习编码,其实学习的就是领域专业知识以及程序过程知识。
剩余的人生时光中,勇敢踏出一步,每天进步一点点。
一些软件工程师一旦找到立足点,就会常驻自己的舒适区。我们称呼这类程序员为 “养老”。你不要成为这样的程序员。相反,你应该每天进步一点点。程序员辞职的最常见的原因,应该是“我已经解决了所有有意思的问题,这里已经没有挑战了”。
与其试着将项目推到自己的舒适区,更应该寻求有挑战的解决方案。这是扩展自己技术能力的唯一方式。
用一个Firehose学生的话讲述编程拐点:
我依然感觉处在深渊之中,但是相反,我没有感觉不适,因为我知道,路在哪儿。
在Web开发领域,其实同一时间会遭遇2个编程拐点。
经历过web开发编程拐点之后,你可以开发任何基于数据库(database-dirven)应用程序了。详细的说就是你可以开发一个具有多个页面的web应用程序,具有储存和提取数据库中数据的功能。web应用开发人员称之为 “掌握了CRUD”。这一阶段,你需要掌握通过阅读文档,集成第三方类库(比如掌握ruby gem,或者从github、博客中获取)能力。
算法和数据结构拐点很容易被忽略,但实际上更加重要。一旦掌握这个技能,不仅仅掌握了基础编程,并且具备了解决复杂编码挑战的能力,难能可贵的是,能完全掌握正在学习和使用中的编程语言。
征服了算法和数据结构拐点的人是这样子的:
- 编写排序算法
- 实现链表反转
- 利用栈、队列、树去编写程序
- 使用递归或者迭代的方法确解决实际问题
简而言之,一旦你通过了这两个编程拐点,你就完全掌握了对数据的操作,同时会理解代码实现对程序运行效率的影响。传统的计算机科学学位关注于让学生通过数据结构和算法的拐点。很多大学通过Scheme,Racket或者LISP等语言来教授这些知识,但是通常不会应用在工业化生产中。
由于web编程拐点比较容易通过,很多面试的面试官会假设你已经通过了web编程拐点,而是把问题集中在算法和数据结构中进行。这些问题通常集中在上文提到部分:排序算法,链表反转,已经针对栈、队列、树的使用。
一个开发者同时通过了web开发编程拐点以及算法数据结构拐点的话,就掌握了通向OnePiece的钥匙了(笑)。
这些开发者可以解决这两学科的交叉问题:在web开发的领域中建立复杂的算法。这是专业的web开发人员每天都做的核心事情。
通过拐点之后
通过拐点之后的状态,可能有点有悖常理,深呼吸,看下去:
在学习编程中,领域专业知识再宏观的方案中其实不重要。
是的,我很严肃,确实一点儿也不重要。一旦你通过了拐点,这些概念就变成了透明的流水,一两周的教程就能掌握,甚至几天。
译者:铁打的数据结构和算法,流水的语言。
真正永恒的重要的东西是这些:
- 拥有扎实的web编程框架基础
- 拥有扎实的算法和复杂代码编写功底,可以基于任何语言
面试中的HR经理更倾向于招聘具有扎实web编程以及算法能力的开发者。
当我在PayPal工作的时候,我的团队招聘了了一个没有Rails开发经验的高级Rails工程师,但是他具有丰富的Python,LISP,Perl编程经验。只需几天,他已经有了大的改变。几周之后,则是重大的改变,他迅速为了技术团队的leader。这是我参与在内的最棒的招聘结果之一。
不要对技术栈朝三暮四。很多人会说什么“AngularJS 最近挺火呀”,“JavaScript正在崛起呀”,“最新流行的是……”我的回答是:“哪又怎么样?”当你正在学习编程时候,只有一个单纯的目标,那就是找到拐点并且攻克之。做到这点以后,学习那些新的,流行的东西便是小事一桩。
要自力更生。你需要具备在没有结构化的指导下学习新的编程技能的能力。这意味着你不需要任何人帮助,所有需要掌握的技术,只要简单的通过在Internet检索和阅读一些材料就可以做到。
在拐点期间,你需要具备的开发能力。
作为一名软件开发人员,最好的参考资料应该是和自己编写逻辑相近的代码。当你完全理解了你写得代码,你不需要记住所有的细节。这意味着,每当你准备开发一个新功能的时候,需要问问自己:“我之前有没有类似的代码?“ 如果有的话,重新读读那些代码,一行一行的review一边,重新解释下代码的逻辑,然后问问自己,是否可以复用。
视频很难解释领域专业知识的细节,因为需要看很长时间。比如你想集成Google地图的API,如果你之前已经有过集成经历,从GitHub打开代码可能不用一分钟,但如果是重新看视频的话,至少需要10-30分钟。
使用一些策略可以帮助你高效尽快的通过编程拐点。
由于通过拐点是学习编程中最重要的一点。所以平滑的度过拐点期就成为一件重要的事情。所以,在教程期间就需要开始准备了,同时要将观念摆正,端正态度。
教程期间,利用休息的时间可以过一遍结构化的教程,同时思考一些有挑战性的问题。
- 对于每一节实操的编程课,试着找一些教程之外的东西去练习。如果教程本身提供了一些 “挑战” 或者 “自我导向”的部分,一定都做一次。解决教程之外的问题,会让你有宝贵的体验。
- 尽量少的利用教程。在Firehose,我们让学生通过文档去掌握如何集成某些Gem。与简单的教程相比许多学生按照文档进行操作,教程则作为备选方案。要知道,文档可是为已经通过编程拐点的开发者设计的。在Github上阅订阅和阅读文档,会对日后你独立工作有所帮助。
- 关注要点,注意复用。尽早学会一些常见的操作,比如从头开始编写应用程序,将新的应用程序迁移到GitHub或者Heroku,尽早的介入数据库的学习中。
接近拐点的每一天都非常有挑战性,这里是一些帮助你度过的要点:
- 告诉自己,这本身就会很难,正视自己。同时,设立实际的规划和目标。不能把在教程中 “超人“ 般的学习速度和自己学习 “蜗牛”般的速度昨比较。提醒自己正在学习大量的知识,尤其是这一阶段,你正在学习全新的技巧,能自己解决问题的那种。
- 如果你的自信心不足,要知道,你的感受是非常正常的。继续努力,如果你还是打不起精神来,多和已经通过拐点的人交流。他们肯定有和你相同的感受,可以肯定这个阶段只是暂时的。持续的努力,但是要超过自己的限度。在这个阶段,最好每天不要超过6个小时。过分疲惫反而会降低通过拐点的速度。
这个阶段中,增长自信最好的方式,就是解决自己的疑惑。你的情绪一开始可能想过山车一样,有时候,你会觉得上火,但是通过15个小时的努力,解决了问题的时候,之前有多愤怒,现在就会有多开心。
当卡在一个问题5分钟或者5小时,确实是令人沮丧的。但是每当一独立解决一个问题,或者是实现一个新功能之后,之前的所有沮丧都会变成自信心的来源。尤其是没有任何人帮助的前提下解决了一个非常棘手的问题之后,你会喜欢上这种,在舒适区之外创造的感觉。
如何知道自己已经跨越了拐点呢
拐点的最终阶段是一种认可。认可软件开发是一个持续学习的过程。认可自己貌似解决了所有问题,其实其它的问题才刚刚开始。
译者:《浪客行》武藏:什么是天下第一
你体验过编程拐点了吗?试着分享一下这篇文章,和你的朋友们讨论一下。你会惊讶于有多少人达到并且超越了这一阶段。
作者资料
Ken Mazaika,Firehose的CTO和合伙人。前where.com(PayPal所属)网站技术负责人,所属波士顿PayPal/eBay技术研发团队。