有人说,每一个看起来与正常人无异的工程师,其实都是在学习程序开发的途中熬过、压抑过、并且创伤过的反社会人士(sociopaths)。面试
在学习程序开发的过程当中,经常看到网络上的「甘苦谈」,也听过身边前途一片光明的工程师朋友们分享过学习历程,总以为不一样的人、一样的故事却不断的重复,像是狼叫声般,从远处传来一声又一声的回响。算法
最近读到Erik Trautman在Viking Code School部落格中的文章《Why Learning to Code is So Damn Hard》,文章里将学习写程序(Learn to Code)的过程分红了四个阶段,并解释了两个影响各阶段造成的关键因素「资料密度」以及「知识广度」,最后集合成这张图:网络
这篇文章颇有趣也十分符合我所听闻的那些「工程师辛酸史」,所以决定将这四个阶段介绍给你们,但愿程序初学者们在进入这条不归路以前,眼睛要放亮、计划要周详,清楚明白在前方等大家的是什么,作好彻底心理准备吧!架构
接下来我将介绍从刚开始写程序到成为一名工程师,Erik Trautman所归类必经的四个阶段:框架
想成为工程师,请作好准备迎接这段必经之路编辑器
先假设你学写程序的终极目标是要靠这行吃饭��进入相关领域工做或是自行创业,你是否作好万全准备能够从你的信心(Confidence)跟能力(Capability)散�图中看出:ide
随着你具有的知识跟技能愈来愈多,你的自信心也会随之而增减,最后达到能力够信心足的「Job Ready」点。在Job Ready前则能够分红四个阶段:工具
第一阶段:手牵手心连心蜜月期post
刚
开始进入程序开发界的朋友们老是怀抱着远大的梦想跟抱负,这不能怪他们,毕竟一方面,你们小时候听多了「写程序很难」、「电脑科学很硬」这种传闻,从一开
始就把很多人吓去念社会科学(…没有冒犯社会科学专业人士的意思);另外一方面,「全民写程序」这项运动实在太成功,坊间许多工具跟学习平台让程序开发变得
超好理解、上手容易,像是Codecademy、Treehouse、跟Code
School等线上平台,或是麻省理工的Scratch语言、Google的Blockly等程序语言工具,成功地营造了人人都能写程序并且靠这行吃饭的
假象形象。学习
忽然间咱们的问题再也不是「困难度」,而是「比天高的指望」跟「比地大的梦想」。
最重要的是,以上提到的这些工具跟
平台实在太有用,带领毫无程序开发经验的初学者们一步步认识变数、条件语句、程序语法。当你一路过关斩将把程序语言基本逻辑跟语法学会的同时,你就会超有
成就感、自信心大增,开始有「原来我也行嘛」、「写程序也不过就这样」的感受,基本上以为本身已经跟「工程师」相差不远了。
这个阶段将充满喜悦与成就感,在各类线上工具、网络教学的帮助下,你享受着用指尖下指令、电脑就能准确执行的主导感,你赞叹着程序语言的神奇与强大
之处,从Hello
World到简单回圈,每完成一道练习题你的成就感又增长几分,不少人会在这个时候认为本身已经爱上了电脑科学(并且以为电脑科学也爱他们),正处于能力
提高,自信心也大增的「蜜月期」,这时你可能会以为世界真美好、人生大概就会今后飞黄腾达,但我得残酷的告诉你:
这段旅程才刚开始而已。
第二阶段:困惑之崖
就跟大部份的情侣/新婚夫妻同样,蜜月期会结束,你会慢慢发现「相爱没这么简单」。
做
业难度一增长(重点是程序码长度也会跟着增长),程序错误警告就频频出现,开始不停的除错(Debug)。并且一般最大的挑战是��当错误出现时,你根本
不知道错在哪里、该问什么问题。你的学习进度在这个阶段开始停滞不前,像路走到一半忽然遇到悬崖而无路可走般,开始对以前的认知感到困惑,跟着信心大失。
一般这个阶段会在你完成线上的基础教学后发生。以制做我的网站(Portfolio Website)为例好了,W3
School平台提供了一系列HTML、CSS、JavaScript等网页制做相关的程序教学,让初学者一单元一单元的学习语法跟功能,每单元还有例子
示范用法,看似好简单!所有跟着学一遍以后,你准备好动手打造本身的网站,打开文字编辑器,……,而后写没两行就卡关了。
也许靠
Google搜寻可让你撑到完成网站基本架构,但当你想实现本身的创意、加上我的化的设计时,网络上的回答跟示范老是和你内心所想的不太同样,因此程序
码不能全抄,然而左拼右凑出的程序码看似可行但实际上差得可远了!恰恰还不知从何debug起,可能投资了大半的时间程序码还「有减无增」,毫无进展可
言。
这是一个尤为挫折的必经阶段,想成为Programmer就必须经历这个关卡,勇敢跳下悬崖、逼本身展翅高飞(固然在这个阶段摔死的小雏鸟数量十分可观)。
但
即便你消灭了无数的bug,终于完成了几个小专桉后,你也别高兴得太早,将来的路仍是很是长远并且挑战性更高!对于想进入这行吃饭的人来讲,「困惑之崖」
一般是你决定是否全心全意进入这一行的转捩点,而当你投资全部的时间心力在写程序上时,你将进入最让人心灰意冷的第三阶段。
你可能会很好奇,到底为何牢牢相连的第一阶段(蜜月期)跟第二阶段(困惑之崖)会差这么多?若是你也正在经历以上两个阶段,你要知道,形成阶段转换的缘由跟你一点关�都没有,并不彻底是由于你比别人笨或比别人不努力,而是由于「资源密度」改变的缘故。
因素1:资源密度Resource Density
在第一阶段中有提到,当零经验零基础的你开始学习写程序时,身边有着无数的资源跟工具等着你来运用。到Google搜寻打「Learn to
Code」你会查到超多程序学习平台、教学文、教学影片、甚至经验谈,让你感到万分的亲切及温暖,其「手牵手心连心蜜月期」的称谓当之无愧。
然而到了第二阶段时,这些教学资源的数量将大为骤减,任何一个刚脱离初学者的程序学习者都可以证明我此言不假。初学者一开始遇到的障碍都是「通常常
见问题」,教学文、教科书里就会注明了;后期因为做业难度以及我的需求,问题才渐渐复杂起来,要从Stack
Overflow或是一些程序人的部落格中去找寻解题线索。一直到在你遇到的问题已经棘手到网络上根本找不太到线索的时候,你便进入了下一个阶段。
第三阶段:绝望沙洲
要了解进入第三阶段的关键,就要了解另外一项影响着各阶段变化的重要因素:知识广度。
因素2:知识广度Scope of Knowledge
「知识广度」也就是度过每一个阶段你所必备的知识领域范围。刚开始时你须要吸取的知识很集中,无论用哪一种程序语言、无论功能是什么,首先都要学会变数型态、宣告语法、回圈及条件判断式等等,这时随便请一个工程师教你都是同样的,由于「重要须知」就是这几点而已。
然而学完基本功后,你所需的知识领域会一会儿扩展不少,像是开始学习物件导向或是着重演算法的效率,你会须要扎实的电脑科学背景来应付,并且每个应用均可以牵扯出更多的变化…相信我,这不是几堂MOOC课程就能救得了你的。
在
这个时期,万能的Google也只会丢给你更多你不懂的东西,根本查不到相关的线索!最糟的是你根本不知道你什么不知道。(You don’t know
what you don’t know.)。因而「学也学不完、越学越不懂」的无力感排山倒海而来,进入最最难熬的第三阶段��「绝望沙洲」。
这
个阶段顾名思义像是在横越沙漠般,是一段很是长且寂寞的旅程,让你有不知何年何月才能走出来的绝望感。在无边无际的沙漠里,根本搞不清楚东西南北,资料查
了半天毫无斩获,还不时被海市蜃楼(错误资讯或看似可行的解决方桉)给误导,搞得灰头土脸、头昏眼花,在这个阶段晒死、渴死、绝望死的有为青年更是不可胜数。
但只要在绝望沙洲里熬下去,接下来就会自在许多了!累积足够的经验,程序的错误就会大量减小、达到必定知识水准,就能准确判断问题的方向切入核心,工做效率于是有所增进,知识广度也会慢慢聚焦。等你拖着一身的疲惫终于走出这荒漠时,就进入了最后的阶段。
第四阶段:创伤后的恢复期
踩着千万人的尸体成功横越了沙漠,你的自信心开始回升,Google功力也能够说是神人的等级。到了这个时候,Hacker News的新闻以及超硬的MOOC课程都不成问题,你也选定了某个程序语言跟框架来专研,并且有能力制做出能够正常运做的应用程序了。
但你内心深处总有着隐隐的不安,以为程序能「用」但其实代码凌乱无章,工程师的头衔下实际上是误打误撞进这行的半调子,虽然你彷佛具有了一切就任条件,却总惧怕面试官发现你根基薄弱的电脑知识…你正在经历「创伤后的恢复期」。
在
飞越困惑之崖、横越绝望沙洲以后,你应该已经学会该学的、作了该作的,成为一个名符其实的工程师,却总以为自已资质平庸根基不稳,虽然有成功打造出一个个
专案而信心回升,但总是感叹本身与心目中「专业工程师」仍有一大段差距…,这些都是「冒牌者症候群」(Impostor Syndrome)在做祟!
在这创伤后的恢复期中,你可能会常常自我怀疑,但只要顺着这波效率提高信心也回升的潮流继续努力,在能力与自信达到一个程度时…恭喜你:
You Are Job Ready! or I learned the value of hard work by working hard.