2016 年 10 月 11 日
如何在一年之内通过自学找到 Web 开发工作
链接:https://zhuanlan.zhihu.com/p/22213177
来源:知乎
原文链接:How to Get a Developer Job in Less Than a Year
原文作者 Alexander Kallaway(Software Developer at Vretta Inc. One of the FreeCodeCamp Toronto Campsite Leaders.)
背景说明
文中提到的FreeCodeCamp(以下简称FCC)是全球最火的Web开发学习平台,鼓励Learning by Doing的学习方式。你可以在这里学习到前端、后端、数据可视化等几乎涵盖所有的Web开发知识。通过完成一个个循序渐进的开发小项目,像打游戏闯关一样来学习。你还可以加入聊天室或论坛和同学们交流,还可以加入学习小组,现在全球160多个国家已经有超过1000个学习小组,几乎覆盖了全球所有主要城市,国内各大城市也几乎都有自己的学习小组。
FCC在Github上的Star数在一年之内就超越了曾经最火的Bootstrap两倍(bootstrap用5年获得了10w的star,fcc用一年获得了16w的star)我之前在知乎上安利FCC的回答零基础的前端开发初学者应如何系统地学习?在三天内就获得了500 赞。由此足以说明这个项目的火爆程度。
这是全世界学习Web开发最好的地方,Learning by Doing也是最好的方式。
而且这一切都是免费的!
学成之后你还可以参与为公益组织开发Web应用,作为你的项目实践经历,帮助你更好地找到工作。
- 官网:freecodecamp
- 中文网:freecodecampCN
提高你的学习效率
当一个人决定自学写代码时,他面临的最困难的问题是什么?事实上人们通常根本不知道学什么————选择什么语言?怎样去学习?通过什么学习才是最有效率的……
人们总会先搜索一下自己想学的东西,也必然会搜到很多在线的编程教学。接下来我们基本上都会在这些资源里面挑选尝试几种,最后选择一种最适合我们的。有的人喜欢教程指引,有的人喜欢教学视频,有的人喜欢读文档等等……这听起来很正常也很有道理不是么?
不。事实上,有且仅有一种学习方式的效率要远超于其他方式。废话不多说,接下来我将介绍并说服你,为什么你一定要选择这种学习方式。
在实践中学习
我猜你可能也预料到我会这么说。
首先,请把你的成见放到一边。我并没有说你必须抛弃所有别的学习方法。
所有的在线教程和教学视频自然有他们各自的功效,待会儿我也打算展开来介绍一下。先举个例子,有时了解一种新的技术或框架,阅读教程文档就是最有效的办法。
问题的关键在于,我们总会(至少我自己是)把时间耗在那些让我们感觉轻松的学习方式上。即使到了我们该独立完成一些事情的时候,看视频跟教程简直是太轻松了,就好像把饭递到了我们的嘴边。而且让我们自我感觉良好,我明明是在看教学视频啊?我明明是在读教学文档啊?我不是在学习么?谁敢说我在浪费时间?我明明是在填补知识上的空白!
更可怕的是我们总倾向于相信这样的学习方法是最有效的。享受安逸,不思进取是人性的弱点。我也自欺欺人了很久。
把你的头脑放清醒
动手做项目……听起来并不新鲜,我们内心深处都明白这是利用自己时间和精力的最好方式,能够让我们更快地达到自己的目标。但我们为什么不愿意去做呢?懒惰……
我在先前的一篇文章 (要是你正在被惰性折磨可以读读)中谈论过懒惰,所以让我来解释一下为什么我在这个问题上如此坚决,然后说服你把精力集中到开发项目上来。
就好像黑客帝国里的男主角一样,面前摆着红色和蓝色的两个药丸。我们可以选择继续蒙蔽自己,在自我感觉良好和安逸的幻象里继续自欺欺人;也可以选择吃下红色的药丸,然后面对现实,不断接受更难的挑战才能取得真正的进步。(如果你还没有看过黑客帝国,那你最好还是去看看)
下面是我在实践中总结的,一些可以帮助你立即着手开始完成开发实践项目的建议。
事实上你需要的时间可能远远少于一年(难以置信?)
我并不是信口开河,而是和很多Free Code Camp多隆多学习小组的成员聊天,以及遍布全世界的学员们的经验总结得出的这个结论。
我发现在大多数情况下,学员们都能够在完成FCC的前端开发认证之前就找到工作。他们开发了一些课程中的项目,然后开始投简历,很快就找到了一份Web开发的工作。
如果你一直关注着FCC的频道,你一定能够找到很多类似的案例。(译者注:我所了解到最快找到工作的案例是一位来自大连网名叫做浮生的同学,仅用了一个月在FCC上学习前端开发,同时投递简历,就成功地在拉勾网上找到了一份8K每月的工作)
需要注意的是,不同的地区对Web开发者的需求不同。以多隆多为例,这儿有无数的前端开发者岗位等你应聘。(译者注:北上广深一类的也一样,需求还是很大。)
FCC官方建议你应该完成总计2080小时的课程学习。这样你掌握的知识和技能也能让你应聘到更高级的职位。
我们来计算一下:
FCC的前端开发认证课程总计约478个小时,具体完成多快因人而异,一些在此之前有基础的同学完成可能快一点,但我们仍然把478小时作为统计上的平均用时。
为什么你需要的时间少于一年呢?从统计上来看,我们大约需要学习9个月。每月按30天计算一共是270天。
478小时/270天大约是每天学习1.8小时。这个结果意味着我们每天只要拿出不到2小时的时间学习前端开发,9个月后就能胜任相应岗位的工作了。
我知道对于有些人来说,每天拿出两个小时的空余时间学习也很苦难,但大部分人还是有可能抽出足够的时间的,时间比较紧的人可能需要更久学完,但在周末和假期,或者是挤时间,我们总能凑足学习的时间。
如果你想知道该怎么找时间来学习编程,不要犹豫直接来Twitter上找我,我很乐意帮你。
我自己就花了大概14个月的时间才学完。这篇文章解释了其原因————我犯了所有我在文中提到的错误。当我在给你建议时,其实也是在提醒我自己。我们都是一样的。
我在完成FCC的前端课程之前就找到了工作,但我知道FCC可以提升我的技能,所以就回来继续完成课程中的项目。我在我的一些文章中附上了我的Codepen链接,如果你仔细查看就会发现我的进度到底有多慢。所以我们一起来完成FCC的课程吧!在我最近学习编程的所有计划里,完成FCC的任务是最优先的。
这篇文章写给你也写给我自己————来鼓励我们克服苦难,提高效率,更快达到我们的目标。
保证你掌握了一定的基础
我确信,在你刚开始学习的时候,必然要通过一些教程和在线交互学习来奠定HTML/CSS/JavaScript的基础,学习编程的思维方式,熟悉一些最核心、基本的知识点。
如果什么都不了解就开始尝试做项目,必然会很有挫败感。但是掌握基础的时间也不要拖太久,入门其实真的挺快的。
我当初学习HTML/CSS/JavaScript的时候,通过不同的途径学习了很多相似的内容,想着这样也许会让我对知识的掌握更全面。它们确实有所帮助,但我后来才意识到,这些资源挡住了我去学习更具挑战更有趣的知识的脚步。不要陷入死循环,反复地浏览那些你已经了解了的内容。
不要半途而废
当你刚开始开发项目的时候,肯定会遇到很多坑。只要你坚持住,过一段时间你就能克服这些困难,但很快你又会掉进另一个坑。我们每个人都没法逃避这样的事情。
每当处于这种境地时你就会浑身难受————那么就做点别的事情吧,暂时逃避一下,等我掌握更多知识的时候再回来处理,我会回来解决它的。休息是有必要的。
但是我们怕休息会逐渐转变为懈怠,走向学习编程从入门到放弃的道路。为了避免惨剧发生,我们不做实践项目的时候,可以去学习一些相关的教程和在线课程。
人总是很容易懈怠。你不去学编程也没有人会提醒或者批评你。只有你自己才知道到底是怎么回事(胆怯、逃避、懒惰),而下定决心完成开发项目的也是你自己。
相信我,宝剑锋从磨砺出,梅花香自苦寒来。想想拿着中英对照的两本书学外语的人是怎么过来的,他们就是持之以恒地读下去而已。
不要好高骛远
仰望星空是不错,但我们还需要脚踏实地。我总是听人说:“我想要开发一个在线应用,人们可以在上面为他们的宠物创建账户,上传照片,支持地理定位还有别的……我最近才刚开始学写代码,但我已经准备好实现我的想法了。”每每听到这里我整个人都斯巴达了。
我可以很容易地预见这类人先是定下宏伟的目标,充满激情举步维艰地做着努力,逐渐发现他们的才华配不上他们的野心,然后开始感到失落,直到半途而废。
最糟糕的结果是这样的人最后放弃完成开发项目,甚至从此放弃学习编程。
所以我推荐从简单的小项目入手,每当你完成一个,都会积攒起成就感,并且对大项目的结构也能有一个更好的了解。
例如一位作家打算写一部鸿篇巨著,必然要先通过写一些小故事,聆听人们的意见,提升文笔水平,待万事俱备之后才能真正开始。
从哪里找到练手的好点子
我所了解的最好地方就是FCC了。
以前每次我问我的开发者朋友,我着手开发的第一个项目应该是什么?他们总是没有一点新意地回答我说做一个TO-DO List(待办事项)应用吧。要是我们还继续开发TO-DO List,总有一天它们会淹没整个互联网。(译者注:有一个项目,收集了用所有js框架开发的待办事项应用TodoMVC)
FCC提供了很多有趣的小项目,按照从易到难的顺序排列。更妙的是每个小项目都专门教你掌握特定的知识点。例如致敬网页检验你对HTML/CSS的掌握,天气应用教你怎么使用API,JavaScript计算器锻炼提升你的js技能等。
FCC是你尝试开发实践项目最好的地方。你完成的每个作品都能够在社区中得到反馈,在你完成之后也可以看看别的同学是怎么实现相同的功能的。另外你也可以通过搜索引擎寻找酷炫的练手项目。(译者注:有什么利于锻炼技术好玩儿的网站项目?-余博伦的回答)
先规划后动手
每当你着手开始一个项目的开发时,先把你要实现的功能列出来。可以通过罗列用户需求的方式,例如“当用户点击播放按钮时可以播放音乐”“用户可以输入邮箱密码登录也可以通过Facebook登录”。
你的代码最好也保持一定结构,在你正式编码之前。可以先写一些“伪代码”————其实就是用文字描述你开发项目的每个功能模块。
基本示例
//当用户打开页面时,抓取他的地理位置信息
//发送位置信息请求天气API
//获取返回信息
//将温度展示在页面上
//根据天气改变背景图片
但也要把握一个度,不要事无巨细地长篇大论,描述清楚每个关键点就足够了。
有一个很恰当的例子————你在学校写论文的时候,总是要先写提纲,首先是介绍观点,然后通过三个要点来论证你的观点,最后是结论。
写代码前先列提纲有助于你理清思路,避免遇到不必要的麻烦。
遭遇挫折很正常
像我之前说过的,踩坑受挫是很正常的事情。这并不能证明我们的智商有问题,只是我们还没接触过一些知识罢了。不管是在学习还是在工作中,你总有受挫的时候。
你越早坦然面对越好。这将有助于你更快取得进步。编程本身就是一种创造性解决问题的思维。假若你没有遇到难倒你的问题,一定是因为你没去迎接挑战。旱鸭子是学不会游泳的!
最最最重要的,一定不要怀疑自己的智商。我遇到过很多人,他们最开始轻松加愉快地完成基础的HTML/CSS/JS小任务,每天能刷30-40关,然后遇到了初级算法题,结果每天只能做1-5道题,之后他们就开始怀疑自己的智商,认为自己不够聪明,不适合当程序员。
我曾经也是一样。我觉得肯定有人不当回事地就通了关,我难以接受自己缓慢的学习进度。现在我想通了:
我能给你的建议是:
保持循序渐进
你需要找到位于“你能轻松解决的问题”和“企及不了的难度”之间的练手项目。(译者注:就像在用Keep运动软件训练时说的:身体很累但还能坚持,强度就是合适的)
我已经谈论了很多不断重复学习简单知识的危害,现在让我们来看看反面:困难的事情。
当你面对困难的任务时,你首先应该想到的是试着去完成它。
从最基本的结构开始,尝试写出代码。要是你遇到了一连困扰你三天的难题,那么先把它放到一边,在找一些类似但是更简单的事情来做。
我的体会是,当我在做别的事情时,尚未解决的难题仍然在我的潜意识里,我时不时的会思考解决它的方法。也许在我洗澡或者洗盘子的时候,灵光就突现了!
虽然这也时灵时不灵。但我想表达的观点是:不断接受小的挑战才能逐渐取得进步,其余的都是浪费时间。
适应能力
我想和你们分享一个我最喜欢的词:
适应力————一个系统在不崩溃的前提下经受冲击的耐受力,在必要的时候修复,在可能的时候提升自身。
适应能力是作为开发者(或者希望取得成就的人)必备的一项品质。准备好面对困难、迎接挑战、接受对你作品和设计以及解决方案的批评,未雨绸缪。
你会怯场么?去你的当地社区给大家教Web开发基础吧,或者报名参加一些讨论会。
你对你没被聘用的面试结果感到失望?你总是担心太晚开始学习编程了?对你完成了的项目感到不满?
回顾一下:你能从中吸取到什么教训,下次才能做到更好?怎么弥补你的短板并变成强项?
例如,你可能会担心,已经在别的领域工作了好多年再转行当程序员是不是太晚了。换角度思考一下,也许编程行业就是需要接纳来自不同背景的人。是你的到来让IT行业更加丰富多彩!
要是你听到一个声音说“你不会画画,”那么不管怎样你开始画吧,然后那个声音就沉默了。————文森特·梵高
这里推荐你看一些励志书籍。(译者注:原文列出三本英文励志书,书店最不缺的就是励志作品,随便看几本打打鸡血吧!)
为每一天都制定目标
为了更快进步,你需要每天都取得一定进展。
不要制定结果目标(例如今天要完成某项功能的开发),为每天确定一段固定的编程时间,每天不要超出半个或一个小时。
我知道你可能会急功近利定下每天编程3小时的目标还尝试着坚持下去。但这注定是不能长久的。有一个合理的时限————例如每天半小时,你知道你肯定能够达到这个目标,而且你可能还有多的一个半小时用来学习编程。这种感觉很棒,因为很多时候你都算超额完成了。
设定时限目标不仅仅是一种心理暗示。试想你有一个重大任务需要完成,你不停的延误直到最终期限将至,你好不容易拼命完成了,结果差强人意,但你整个人都精疲力竭了。要知道,自学的时候除了你自己,没有人会督促你。
假如你设定的是结果目标的话,你并不能保证自己每天都完成某项功能的开发,而一旦你完不成,便会有挫败感。负面情绪的累积慢慢也会打消你学习编程的热情。
对于时限目标来说,你每天都在取得进展。没有人在意你今天是否完成了某项功能的开发,重点是这一天你确实投入一定时间去学习了。这才是保持你动力的源泉。
另一个妙处是,每当你坐下来写代码,各种点子和解决方案就会思如泉涌,就好像写文章来了灵感一样。这比你强迫自己坐下并抱有不切实际的期望强多了。
复制代码纯属浪费时间
在我们着手开发一个项目的时候,经常会不知道从哪里开始,或者遇到我们自己解决不了的困难————这些时候你都会有一股强烈的欲望,去看别人到底是怎么把那些代码写出来的。这样就能理清自己的思路,并把它们变成自己掌握的知识。但事实上并不会这样。
不要拷贝别人的代码再自己稍微改改,一段,一个字都不要。
如果是项目的完整代码————一开始绝对不要看。如果是你在StackOverFlow上查到的代码片段,确保你真的明白理解了之后,在尝试着自己写出来。这时你就会发现,即使你已经看了明白了,动手去写的时候依然不会轻松。
就像学习绘画一样,这就是临和摹之间的区别。练习的时候必须独立自主。照着模板和现成的答案,你学不会任何东西。有的人随便写个Python脚本就把你照抄的这些工作自动化完成了。要是你陷入了这样的误区,一定要把关注点转移到真正的挑战上。
再说个题外话。当你觉得很难理解一个问题时,试着去把它教给别人,至少是说出你自己的理解。通过这样的形式,在帮助别人的同时,你的理解慢慢就加深了。(译者注:能够教给别人是最高级的学习。)
照抄会让你失去独立学习理解的机会。最好的解决办法是跟着相关的教程去学习。但一定不要就此逃避困难,不要回避挑战。转头去面对那些让你头疼的问题。
只有当你自己完成了某个项目才有资格去看别人的代码。这时候你就可以尽情窥视了,还能学习开阔思路。
每个你独立解决的问题都是你成长路上的进步和飞跃。
不要分散你的精力
每当你在开发一个项目中遇到瓶颈时,你总会想着先把它放到一边再做点别的。
你又会感觉良好一段时间,直到你新开展的项目也遇到了障碍。这样你手头就有两个未完成的项目了,如果放任就会陷入恶性循环。
解决的办法就是,在同一时刻最多只开展两个项目,当其中一个遇到了问题实在解决不了就去做另一个,另一个也遇到问题就放在再回头来看这个。一定不要再分散你的精力了。(译者注:这就好像做作业的时候,写写语文再写写数学就不会那么痛苦。)
如何写好简历
光凭你在简历上写的“我熟悉JavaScript,有四年工作经验”,人力真的很难了解你的真实水平。(Talk is cheap, show me the code!)
写再多废话都不如你发布在网上的项目或者在线的个人简历。这至少能让人相信你确实会你提到的那些东西。
但也不用太担心,并不是说全靠你的这些小项目别人就要考虑录用你。只是为招聘的人提供一个评估你技能的参考。
不需要在你的简历里吹得天花乱坠,老板们更关心的是你真正能够做什么。
有在线作品的好处是:
- 老板一眼就能看明白你确实有两下子。
- 他们能够通过你的项目了解到你在不断进步。
- 他们知道了你还算是一个敢于把自己作品公之于众的开发者。
根据我的了解和切身体会,项目经验是找到工作的最关键要点。
面试时你要更努力
在面试中,你很可能被问到要如何解决一些现实问题/如何开发一个投入使用的应用。
面试官问这类问题只是想了解你解决问题的思路,并不是要你立马拿出理想的解决方案。有时他们甚至会抛出一些无法解决的问题来看你的反应。你需要通过大量的实践练习来应对:其实每一个大的项目都是小的功能模块的组合。
另外你还可能遇到很多需要你动手编码的小题目。这是我之前在面试我现在的工作时被考到的一个例子判断正误小游戏。代码虽然写得不怎么样,但我能够完成它,全凭之前在FreeCodeCamp学习的经验。
取得真正的进步
这就是你没法通过教程学习掌握的东西。你感觉学完了教程就好像掌握了某项技术的所有关键。可当真的让你用这项技术去开发个项目时你就傻眼了。
为什么总是这样?因为教程已经是编写教程的人对某项技术的理解(译者注:学习教程就好像吃别人嚼过的),而且一篇教程根本不可能归纳所有要点。
不断地遇到困难克服困难才能不断进步。
害怕开展新项目怎么办?
我自己就是这样。每当我完成了一个小项目时总会沾沾自喜一会儿,可当我读完下一个题目的要求之后,就开始有点胆怯了。
我开始思考我要从哪里开始?我该先干什么?我上一个项目到底是怎么搞完的?我啥也不懂!
这里有一些办法解决这样的窘境:
首先,看看那些你已经完成的项目吧,它们当初看起来也很令人畏惧。可是不管怎样你都克服并完成了。
回顾自己过去取得的成就可以让你重新获取自信,迎接新的挑战。
另外就是把一个项目拆解成一个个的小问题去解决。从小问题入手很容易就能开展了。
不要完美主义
你并不是要创造什么惊天地泣鬼神震惊整个业界的大发明。
你要做的只是完成题目的要求,通过开发项目来学习编程技术/语言特性/框架功能……
然后再尽力改进你的项目,外观设计也罢,功能品质也好。
但也要适可而止。你并不是在参加国际艺术锦标赛。你只是通过开发这些小项目来练手学习,不要被它们吓着了。
欲速则不达。
要是我在写这篇文章开始时就担心写好写不好,写得不够好,我就写不到这里了。我只是知道这是一个人们都比较关注的话题,我自己也需要总结一下我所了解的,最后能够帮助一些人解决他们在编程学习过程中遇到的实际困难,这就足够了。
要是所有的事情都必须完美,还会有素描在艺术界的容身之处么?正是不完美才造就了独一无二。(译者注:这里最好的例子应该是断臂维纳斯。)
保持你的创造力
不要死板的好像你开发出来的项目必须和题目的示例一样。编程不只是科学更是艺术。
对于前端开发来说就更是这样了。
假如你正在开发随机名言获取器,你完全可以选择自己最喜欢角色的经典台词作为内容。假如你正在开发一个游戏,你可以随意设计界面和音乐。
特立独行,释放真我!在你的项目里烙上自己独特的符号。
除了满足题目要求之外,剩下的事情怎么做完全取决于你。
这是我之前开发的一个禅意计算器,对比一下题目上原本的计算器示例,你完全可以发挥自己的想象力。
Web开发,编程,都给了我们充分的自由,永远不要局限自己。成为你想成为的人,做你想做的事,面对生活中的所有都是这样,包括写代码也一样。
有个性的东西才有感觉!想想超现实主义画家毕加索。一般单独看画你能认出来是谁画的么?但毕加索的你一眼就能看出来。
偶尔可以放松一下
做开发项目的间隙也可以放松一下,但你不能放纵自己。
一般休息最好不要超过一个星期。在这期间你可以看看别的教程或者在线课程之类的。最好是和你现在所学知识或者你在项目中需要用到的知识相关的内容。
另外在上班通勤,上不了网的时候看看编程书籍或者教学视频也都挺好的。
确保你再次坐下写代码时,你是真的把心放到了实践项目上。
获得你开发项目的反馈
开发实践项目还有一个好处,就是你可以把你的作品分享给别人,获取真实的反馈。
但要注意别把你的小项目发给那些爱吹毛求疵的人。试着去找一些真正的开发者,或者比你稍微厉害一点的同学。让他们看看你的代码并给你一些建议。哪里可以提高,哪里写的比较好,哪里不是。
这对你的学习进步大有裨益,因为从别人的角度可以看到那些你遗漏了的东西。
我个人亲身体会到,相较于看视频、读书、参加在线课程这些方式,动手做实践的学习效率是最高的。
希望你在学习过程中也能获得相同的体会。
译者的话:我在这里只能保证通过实践项目来学习,learning by doing是最高效最有效的学习方法,fcc也为此提供了一个最优的平台,但最后通过这种最好的学习方法,真正能够掌握到多少还是要看你自己的努力,这就好像原来上学的时候同样的老师,同样的教学环境但是有成绩好坏不同的学生一样。不要好高骛远,不要心浮气躁,不要自欺欺人。
学习使你快乐,祝你好运!