对每一个决心学习编程的程序员来说,入坑之前,你也许只是一个“穿着正装在办公室里上班”的人。
你的学习历程可能是这样:如同一片树叶,开始被各种建议拽着走,直到学完了每一个你能想象到的在线课程。
最后,虽然你成功拿下了一份软件开发的工作,但也对程序员有了新的认知:“那些看似正常的程序员们其实都是些“反社会”的怪人,鬼才知道他们经历了什么样的精神创伤。”
一份常见的编程学习过程:先从Ruby着手。很快,开始穿梭在Scala, Clojure和Go等其他语言中了。学习了Emacs,接着是Vim,甚至还了解了Dvorak键盘布局。接着又学习了Linux,甚至还涉猎了Lisp,以及用Python编过代码,后来一直在命令行驻足半年多。
一起来看一下学习编程要经历哪几个阶段:
阶段一: 手把手蜜月期
我们从小就听说过编程如何难学的谣言,就像那些拿来吓唬小孩的无稽之谈,最后把孩子们逼去学了社会科学一样。而另一方面,“学会编程”运动的推广效果确实十分成功,因为它让人们相信,这一行并没有那么高的进入壁垒,而且学习编程毫无坏处。像Codecademy,Treehouse,以及Code School这类机构,以最温柔的方式告诉普通大众,一定会教会任何人学会编程,并让其成为一名资深的开发人员。
所以,对于进入编程这行抱有过高期望的人,真的没有办法去责怪他们。
在很大程度上,这些介绍性的工具手牵手地引导我们穿越那些可怕的参数、条件语句、早期的编程语法阶段,确实给了我们很大的帮助。当我们征服了一个又一个游戏化的挑战,自信心也开始迅速膨胀。我们觉得最终一定可以做到,这并没有什么难的,我们以为自己已经成为一个开发者了。
(图例纵轴为信心值,横轴为能力水平,虚线区间展示了蜜月期信心随能力增长而增长的曲线图)
但问题是,我们这个时候的状态正处在“手牵手蜜月期”的阶段,我们以为很快就要走到终点了,但其实只是走了一部分,路才刚刚开始……
规划前方的路
在我们深入了解到第二阶段之前,一起来看一看宏观的局面。在这篇文章里,会介绍一段典型的编程学习之旅必经的四个阶段,以及应该如何应对。我们将了解资源的密度以及所需知识的广度这两大要素是如何定义这段旅程的。
就业准备之路可以用下图曲线表示,它描绘了信心水平如何随着能力增长而变化。
(图例“编程信心与能力”:纵轴为信心值,横轴为能力水平,虚线从左至右依次分割出手牵手蜜月期、混沌悬崖、绝望沙漠、令人兴奋的上升期四个阶段,第5条虚线标志着工作准备就绪)
下面将会介绍在剩余的3个阶段会面临的独特挑战,这是每个阶段的核心内容:
1. 手牵手蜜月期:这是一个充满喜悦的、非常容易取得成功的过程,借助精雕细琢的资源,你会解决那些看似很难,但在网络导师的强大支援下完全是可以攻破的问题。你会掌握基本的语法结构,对于取得的成就很开心。
2. 混沌悬崖:这是一个痛苦的自我实现的过程,比蜜月期难过得多,你会觉得凭自己的力量似乎什么也做不了。你的首要挑战是不断地调试,同时你还不太知道该怎么问正确的问题,来找到一种可以积聚能量的办法。
3.绝望沙漠:这是一段很长又很孤独的旅程。在广袤的沙漠里,没有一条清晰的道路,每一个方向似乎都是正确的。你总是绕圈圈,对于穿越沙漠所需的资源如饥似渴。请小心来自“海市蜃楼”的诱惑,它好比沙漠里的汽笛声,会让你误入歧途。
4.令人兴奋的上升期:终于,你找到了一条穿越沙漠的路,对于如何构建应用软件有了自己的理解。但是你的代码仍然像是地窖仓库,脆弱得像纸牌屋。网站的良好运行给了你信心,你掌握了一些有用的模式,朋友们认为你的界面很酷,但你根本不敢直视界面底下糟糕的代码,最终你还是不知如何得到“可应用于生产环境”的代码。那么怎样才能填补这段距离一份真实工作所需能力的空档?
在过去几年间,我们采访了成百上千名优秀的开发人员,反复听到了相似的故事。而发布这篇文章的目的,就是希望大家在设计学习路线的时候,既要眼观六路又要做足计划,以绕开前人踩过的坑。
阶段二: 混沌悬崖
当我们在第一阶段细数着自己获得了多少徽章与完成了多少挑战的时候,自信心和能力也在不断增长,这被叫做“过度不理智的尖峰”。在这个悬崖险境一面,很多高手都跌在了里面,从而跌落到“编程太难学”的阵营。想要跳跃这个险境,需和第一次坐在电脑前一样,打开文本编辑器,从0开始,在没有任何“浏览器内置编辑器”、搭建好的代码、或是暗示性的帮助下,尝试创建一个项目。
不要再想着上几个特别的教程来拓展能力,没有任何一个人可以在不飞离对面的前提下触及天空,必须要要经历在一张空白文本文件上施展魔法的过程。
(图例纵轴为信心值,横轴为能力水平,虚线标亮的第二个区间-即沿曲线顶点向右下滑-为第二阶段“混沌悬崖”)
这个时候,我们的信心会跌落谷底。有时会为了达成一个几乎不起作用的解决方案日思夜想,仍然感觉缺失一些东西。如同在一场消灭BUG的战役里面,这些BUG与星舰战将相比都让后者显得十分和蔼可亲。我们开始感觉每次胜利都是因为在谷歌搜索时运气好而找到了答案,解决问题的信息开始一落千丈。
Buuuuuuuuuuuuuuuuuuuuug!!!
从教育者的角度,以及对于这一行的从业者来说,这是让人十分恼火的阶段。编程可能并不适合每个人,但我们希望你取得进步,因为有时看似最不可能的故事却成为了最伟大的成功事迹。当这个手牵手辅导期结束,学生们被推下悬崖被迫飞行,有太多高潜力者在还未学会挥舞翅膀的情况下,低空盘旋不一会,就撞向了挫折的岩石。
最可怕的是,你还没有走到实质性内容上。混沌悬崖这个阶段对你来说还为时尚早。当你最终消灭了足够多Bug以结束“埃及的第八次瘟疫”才标志着第二阶段的尾声,这还只是刚刚开始。
对于那些真正有志于投身该行业的人来说,跨越“混沌悬崖”通常是决定倾其所有地去开启新生活的关键点,然而有太多人没能坚持过来。即使坚持了下来,你又要踏入“绝望荒漠”的阶段。
两个关键点
所以究竟什么代表着某一阶段和下个阶段的不同呢?为什么第二阶段(混沌之崖)相对于第一阶段(手拉手蜜月期)这么烦人?理解这些会帮助你明白,如果你有上述的相似经历,那完全不是你的错。
大体上,在每个阶段有两个关键因素:资源密度和知识体系。在我们了解阶段三之前,先来看看这两个关键因素究竟是什么。
因素一:资源密度
如之前所说,刚开始时,仿佛有千千万万的资源在等你去深入了解编程。而且事实正是如此,搜索一下“学习编程”,会找到很多有用的工具、文章、视频和教程。
不幸的是,在之后阶段资源的饱和度很快开始降低。任何人从初学者到中级阶段都能感受到,可用资源在学习编程与独立应用阶段的差距非常大。
当知识量累积到阶段三的时候,这个问题更加严重,这也是为什么我们称这种情况为“绝望的沙漠”。但一旦你克服了这个阶段并且开始明白你真正想问什么,那么你的资源又会很快充裕起来,你开始有效利用技术工具,例如编程的博客和屏播。所以,这一阶段的关键就是明白真正想要问什么。
下图是资源密度在每个阶段的分布(更密的线代表更多的资源):
因素二:知识体系
现在我们来谈一个相关的话题:知识体系。这代表每个阶段新知识的宽度。它看起来是这样的:
刚开始学习时,你需要理解的东西很少。不论什么目的、语言或背景,只需要明白一个“for”循环是什么、如何用条件逻辑框架以及编程语言的基本语法。而且基础知识终究没有那么多,所以知识体系在一开始并不复杂。但一旦掌握基础,需要学习的知识面就一下变宽了,因为你需要了解更复杂的问题,例如了解程序错误以及什么时候用哪些代码。这跟回答普通的问题截然不同,这个特殊的问题并没有一个正确的答案,事情开始复杂起来。
当进展到第三阶段,知识面开始像气球一样膨胀。现在你开始知道需要什么工具、用什么编程语言、相关的计算机常识、如何写模块化的程序、面对对象编程、好的格式以及如何寻求帮助(这只是列举了一些)。每次去谷歌搜索或者骇客新闻,你就会发现更多你不知道但感觉要学习的知识。你产生了一个永远不知道还有什么不知道的念头。
当终于找到牵引力并离开了这个“沙漠”之后,你需要的知识才会减少。到那时,你会看明白你所选择的技术和它所处的生态系统,你最终也会了解你不知道什么并去找到解决办法。在事业刚起步的过程中,你的关注点会更加集中。
阶段三:绝望的沙漠
理解这些因素后,我们会发现,“混沌之崖”其实只是一个转折点。来自于需要学习的知识面的急剧增加和资源密度的减少的痛苦,会让人进入这种被称之为“绝望的沙漠”的阶段。
从本质上讲,我们知道这个沙漠肯定有尽头,但却不知道如何走出去。
并且,这个沙漠长而充满了危险。你会发现自己陷入“狂热的海市蜃楼”,即很多资源看似找到了答案,但这个答案却将你带到一个迷失之地,充满了未知。
这时候,也许你会从Coursera、Udacity或edX注册了一系列MOOC课程。又或者找到一个课程声明会从头到尾带领你学习。你开始坚信除了这个“手拉手蜜月”课程之外,其它的都不能带领你完成课程的学习。但是,一个人不可能在短短一周,一个月或者一门大学课程里去学会这么多东西。所以,不论别人怎么宣传,一定不要再掉入陷阱!
一个人需要学习的知识会比我们想象的多得多。即使你能够开始运行一些app,在想要成为一个真正的行业专家这个远大的计划下面也会变得迷茫起来。因为我们不知道需要学习什么甚至是不是真正在学需要的东西?
即使有了正确的方向,了解自己的学习进展也很难。我们可能会感觉到完全迷失了,但最终还会完成一些我们想要的或者预期的结果。但有了足够的积累和好的导向之后,我们会开始接触几个“真正”的项目,虽然直到目前依然困难重重,但这些网络开发的东西看起来并没有那么难。
阶段四:令人兴奋的上升期
我们成功地穿越了沙漠,自信心逐渐提升。又因为谷歌功力实在惊人,我们可以理解那些深入的编程博客和屏播了。并且有的人成为了某种语言或者框架的达人,并且开始有信心制作正常运行的程序。这就是令人兴奋的上升期:
虽然我们表面看起来胸有成竹,但我们深知还有很多需要学习的内容。比如:你能让程序运行却不知它到底在如何工作;你的代码或许杂乱无章,最可怕的是你不知道哪里写的不好哪里还行;偶尔觉得自己是个编程天才,却并不明白到底程序是如何实现的,并且很快被愚蠢的错误和自我猜疑击退。
这是一个感受差异两极化的阶段。你感觉有时候自己是一个无坚不摧的码农而有时候又觉得自己是一个蒙着眼在道路上摸索的新手。
你觉得你应该早已是个合格的码农,但是你在写的代码和一个专业的工作环境相差甚远…
但最终我们会做到的,因为有太多的动力让我们停不下来。绝望的沙漠被我们抛在了脑后,困惑之崖也早已成为了久远的记忆。我们开始提升的很快,也比以前更加明智,慢慢掌握了足够的联系去把知识结合起来应用到实际中去。
到达令人兴奋的上升期总是会比预期花更长的时间,并且这种感觉是无止尽的。因为在这条正确的道路上坚持不懈下去,我们就离成功很近了。并且我们的努力使得别人相信我们,愿意付钱支持我们继续学习,工作也不再是问题。
现在我们已经知道了步入编程行业的整个历程,并了解到为什么这么难。当把上述的四个阶段过程与各个因素都整合在一起后,得出了下面的图:
图例说明(从左至右):信心、资源密度、知识领域、胜任力、手把手的蜜月期、混沌悬崖、绝望沙漠、快速成长期、专业水平
“知道”和“会做”是两回事,我们终于迈出了正确的第一步。
如何完成历炼
坦率地说,整个过程看起来很艰辛,尤其是当我们独自前行时。但我们并不是一个人在战斗,实际上在很多时候是有捷径可循的。学习编程并不像人们想象的那么容易,但也不是绝望的深渊。
在这一部分,介绍一些关键策略来引导大家沿着正确的方向行进。
图例说明(从左到右):完成学代码的历练、信心、胜任力、构建、合作、设定目标、专注、获得反馈、专业水平
要学会享受“手把手的蜜月期”。因为有大量的资源可以令你在手把手蜜月期中感到乐趣无穷,使我们建立今后必不可缺的逻辑性思维。所以尽量享受这个过程,并牢记以下两点:
1. 尝试多种资源以确定最适合你的学习方式。开始阶段尽可能开放思路,不要在意你想具体学哪一种计算机语言,因为所有的语言在这一阶段都是一样的。
2. 一旦选择一个适合自己的资源,坚持下去,完成他们的介绍性课程,你应该可以掌握到编写基本脚本和app的基础知识,并开始准备自建程序了。
如何在“混沌悬崖”阶段坚持
几乎所有码农都体验过“困惑悬崖”,因为这是成手的必经之路。你可以假装注册了几门课(或扮作“已经完成”了这些课程)期望完成了这个阶段,但那只是想法拖延,这个阶段无法避免。那些课程的确提供了更高频次互动的介绍性内容,但你必须要摆脱这些“安抚奶嘴”,在某些时刻面对真实的世界。
以下三招可以让我们更好的过渡到自建程序阶段:
1. 和其他人共事,即使是另一个新手。你将会惊诧到原来互相检查出被自己忽视的错误是那么简单。
2. 多看看其他人编写的代码,多学习好的编码方式。尽量去理解作者为什么这么做。就像你若想成为作家,必须要多读书一样。我们将在即将发布的文章中重点介绍这一点,但是现在请关注他人为解决任意一个微小的问题或项目所编写的程序。
3.从小事入手,不断的做下去。你的目标虽然要成为做大项目的高手,但目前却需要着眼于寻找、调试小型的项目。这种经历是不可代替的。
如何在“绝望沙漠”阶段生存
一旦你具备了调试程序的能力,最大的问题将是面对着大量需要掌握的知识却感到无从下手去将它们统统学完,即“绝望沙漠”。这种情况下,你需要的就是沿着既定的大路坚定地走下去。看似有趣的小路、令人好奇的“兔子洞”和号称快速提高技巧的把戏实际上都是浪费时间的海市蜃楼。
所以尽快逃脱“绝望沙漠”的关键是:
1. 为实现你的期许而抱有强烈执着的信念,否则你会陷入对所有好奇的事都插上一脚但却原地打转的怪圈,徒劳无功。但如果你有的是时间,好吧,请忽略这条……
2. 确保你行进的方向明确的通往你的目标。这个目标可比那些营销口号、在线课程网站上的笑脸或书皮上“将帮助你实现……”的要深刻、严肃得多,需要你深思熟虑。
3. 保持专注,避免分心。因为如果你是一个对编程感兴趣的人,那么你一定也对其它很酷的事感兴趣。当编程进入到攻坚阶段,你需要调整自己保持向前的动力而不是半途而废去寻找其它乐子。
只有“咬定青山不放松”,你才可以进入下一个阶段,而不是花上数月甚至数年去追逐“镜中花、水中月”。
如何在“快速成长期”中学得更多更好
快速成长期是最棘手的过渡期之一。你虽然能够开发应用了,但你更想成为一名真正的网页开发工程师。想要度过这个阶段并达到入行工作的标准,你需要完成以下三件事:
1. 做最棒的编程练习题。你需要理解解决方案和最佳解决方案之间的差距。这些好的练习题可以帮助你达到生产出符合专业级别的高质量代码的标准。
2. 检查你的程序,因为你可能已经写了好多代码,而这些代码中藏着你甚至都不知道的漏洞。你需要诊断并修复它们。
3. 解决那些很少被处理但是转换到专业环境时却是高度重要的一板一眼的技能。包括测试、数据建模、架构和配置,这些技能看似简单,但对于良好的开发工作来说是非常重要的基础。
完成上述工作并顺利度过快速成长期的关键是获得反馈。那些完全依靠自学的学生或许富有成效,但却缺乏专业级别的那种清晰的、模块化的、易维护的代码写作能力。你需要和其它人一起质疑你的假设、提出尖锐的后续问题,并迫使你去解决这些漏洞。
那么,你能做到吗?
上述内容看起来相当繁重,但想想那些已经走过这些历程的前辈们。虽然本文没有详细解释每一个阶段,或者提供大家迫切需要的具体建议。但通过对本文介绍的各个阶段的理解,大家知道了如何安排合理的计划,从而获得合适的帮助,已经处于一个有利的位置了。