编者按:自学成才的开发员之路充满艰辛,也充满了各种不确定性。从新手到完成职业程序员这一蜕变没有捷径,也正因为如此,所有自学成才的开发人员都有自己不一样的经历和故事。在这篇文章里,Victor Cassone 分享了他自学编程过程中的一些经历以及由此收获的经验和教训。希望看到这篇分享之后,有助于让你反思自己的过去,并激励你继续前进。
在我第一次开始学习编程时,我并没有打算让自己走上职业编程人员的道路。当时,我只是想制作一款特别的应用程序。这一想法最早是在我大四那年产生的,当时我刚刚读完了理查德·布兰森(Richard Branson,维珍品牌创始人)的《Losing my Virginity》这本书,可能也是由于我之前通过科技媒体平台接触了大量的创业信息,所以我感觉自己充满了创业的斗志。我看过许多关于大学生利用移动应用程序想法获得高额投资的文章,我想我也可以成为这其中的一员。
一天,在课间的时候,我的脑海中突然出现了一个关于应用程序的想法。这款应用程序的细节并不重要,重要的地方在于这个想法是独一无二的,并且具有很大的增长潜力(至少在我看来是这样)。我确信自己发现了接下来应该会发生的一个大事记,我沉浸在自己的这一想法中,上课之后完全听不到讲师在说些什么。我为自己的这一想法而感到兴奋,很快我就感觉必须要采取行动了。
但是这中间有一个大问题,我想创建一款移动应用程序,但我并不认识什么人可以帮我构建移动应用程序。于是我就想,管它呢,编程能有多难?我当时对我的专业并不怎么感兴趣,将很多时间都用在Xbox 上玩游戏。我想我可以利用一些空闲时间来自学构建这一款移动应用程序。有时候,天真的想法有助于让你采取那些本不会贸然尝试的行动,正可谓初生牛犊不怕虎。
当时的我就是一名没有任何编程、业务和设计经验的大学生,尝试学习 Android 开发来构建一款复杂的应用程序。我买了几本关于 Android 开发的书籍,花了很多时间自学,尝试来开发出这款应用程序。我不在乎它之后的效果怎样,我只想做出一款成品,如果是能通过从其他渠道复制和粘贴代码来完成那就最好不过了。
我认为我可以投机取巧,用最少的编程知识来完成这一目标。我一心只关注最终的结果,是隧道尽头的那盏灯让我不断前进。时间一分一秒的流逝,这款应用程序变成了一大堆复制和粘贴代码的集合体,没有很多的功能,勉强达到了运行起来不崩溃的程度。
后来,直到我偶然间接触了计算机科学课程,我才意识到我应该更多地专注于学习这一过程。由于我自己在编程方面的能力不足导致我放弃了最初的应用程序创意想法,我也意识到了我这样根本做不成什么大事,至少现在还不行。
幸运的是,随着时间的推移,我改正了自己的行为,开始更加认真地学习。我开始喜欢上了编程,并最终走上了专业软件开发人员的职业生涯之路。
收获与所得
有一个好的想法是很棒的一件事,但要留意你的这个想法可能会变得具有吞噬性。这是一股很强大的力量,我就是在很长一段时间之内都被这一力量所吞噬。它让我把关注力放在了最终的结果上,而不是实现这一结果的过程之中。
重要的是记住一点,学习像编程这类复杂的知识需要一步一步的去积累。所以,要想让自己有所学,唯一的方法就是专注当下每一步的学习过程并且掌握每一步所需要掌握的内容。
如果你过于关注最终结果,那你很有可能就会开始走捷径。走捷径可能会让你短期之内取得不小的进展,但从长远来看,对于基础知识的缺乏迟早会成为你的绊脚石。学习一样新知识就像盖房子一样,你要先建好地基,然后万丈高楼方能平地起。如果地基不牢,整座建筑迟早会坍塌。
有时要想搭建一个坚实的地基就需要你放慢速度。不要因为自己进展缓慢而感到羞耻,一次性完全掌握基础知识的人最终会领先于那些走捷径、但必须回头重新学习的人。我就是一个反面例子,外表看上去我可能像是一位编程天才,但其实我根本就无法构建起一款像样的应用程序。
专注于每天的学习过程,最终你会为自己取得的进步而感到惊讶。
在我学习构建应用程序的过程中,Stack Overflow 成为了我最好的朋友。每当我遇到什么困难卡住的时候,我都会到 Stack Overflow 社区提出问题,平均一周都会有好几个问题。我不仅会在这上面提出问题,而且也会将从上面所得到的答案视为救星。我会花费大量的时间进行搜索工作,试图找到可以解决我当下问题的那个代码块。一旦找到答案之后,我会将其复制并粘贴到我的代码库中,尝试让其发挥作用。我根本就没有投入时间让自己尝试去理解这些代码,我只是粗暴的通过这种蛮力形式进行尝试。
这种模式持续了有一段时间,直到最后,我醒悟过来,最终意识到了这种方法的缺陷所在。
收获与所得
在学习编程过程中,复制与粘贴是最可怕的一种方式。Stack Overflow 可谓是一把双刃剑,它非常适合帮助你解决问题,但如果你不多加小心,它就会成为你总是想要依赖的那根拐杖。
有的时候,可能是由于 Stack Overflow 太擅长于帮助你解决问题,你也会因此产生一种不切实际的自信心,而这未来只会给你带来更多的麻烦。
如果遇到问题你只是一味的想通过求助来寻求答案,那你学不到多少东西。在访问 Google 之前,确保自己尝试过解决这一问题。如果你发现自己正在进行复制、粘贴代码这一操作,那也要确保自己至少投入了一些事件去理解这些代码块。毕竟,在学习的过程中,没有捷径可走。
在我决定自学编程之后,我做的第一件事就是买了两本 Android 开发方面的书。一开始,我严格按照书中的练习去做,并完成了所有的示例项目。但很快我就感到厌倦或者说沮丧,不想再继续跟着这本书学下去。我决定走自己的路,自己来搞定编程。但正如我之前所说,这样做的结果就是会慢慢的让自己陷入灾难之中。
我会自己一个人长时间的待在我的房间或咖啡店里。我将自己与外界隔离,我感觉没人可以帮助我,因为我认识的人都没有任何 Android 开发的经验。日子一天天过去,我却没有取得多大的进展。
有一次,我想到了一个好主意,那就是下载一个名为 FFMPEG 的大型 C 库。我想要构建的应用程序需要对视频进行编辑,因此我认为如果能够利用这一 C 库的强大功能那应该是一个不错的主意。其实在当时,这并不是最明智的举动,因为当时我的 Android 应用程序几乎还无法正常运行。我浪费了很多的时间去阅读 C 代码,试图弄清楚该怎样在我的应用程序中用到它。慢慢的,我又开始变得沮丧,最终放弃了这个主意。
幸运的一点是,大约在同一时间,我报名参加了面向对象编程(OOP)的一门课程,也不知道怎么就被录取了。在所有报名的学生当中,我是唯一来自非计算机科学专业的一位。我也不知道自己怎么就被选中了,可能是报名软件中有 bug 吧。
这门课程给出的第一项任务就是创建一个 Blackjack 程序。当时,我自学编程已经有 5-6 个月的时间了,因此我对自己可谓是信心满满。我很快完成了这一任务,并自我感觉良好的样子。但很快,这种感觉就消失了。我的整个程序是用一种很笼统的方式去写成的,而班上的其他人都知道这一程序应该分成几个类别。这种感觉太差了!
收获与所得
好在,老师给出的课堂作业和指导意见可以让我先搁置我的 Android 应用程序,专注于反思自己的开发能力。我开始更加重视学习,并重新找回了自己最初的想法,那就是制作一款完整的应用程序。
如果我在早期阶段就能有幸同那些经验丰富的开发人员交流,那他们就会了解我在做些什么,从而给出优先顺序建议,让我可以更加理智的采取行动。当我走入没有什么出口的死胡同时(比如尝试利用FFMPEG),他们也会帮助我及时的调整路线。经验丰富的开发人员就像是指南针,他们虽然无法直接带你到达目的地,但他们会确保你所选择的是正确的方向。他们的这一帮助往往会成为你扭转败局,走向成功的关键所在。
事后回想起来,其实当时我有很多种方法可以寻求他们的帮助。我可以尝试在大学里找一位拥有Android 开发经验的教授/学生,也可以尝试寻找一个在线 Android 社区。但那时的我却只是将自己隔离了起来,隔离是一把双刃剑。一方面。它可以让你专注于手头上的任务,另一方面,它会让你远离外界,无法获得关键性反馈。
确保自己可以获得过来人的经验指导,这将为你节省不少的时间,并减少一些不必要的挫败感。
在我自学编程的过程之中,这可能是我唯一做的还算对的事情。在我整个学习生涯之中,无论是在家备战考试还是做作业对我来说效果都很糟糕,好像总有很多的干扰因素。所以,我通常都会去图书馆或者咖啡馆来寻得一方清静。幸运的是,在我自学编程的时候,我也是这样做的。
我成为了镇上几家当地咖啡馆的常客。较之其它学习地点,我更喜欢咖啡馆的原因在于咖啡馆的选择性更多一些,你可以选择一家你不会碰到认识人的店面。如果我在家学习,那我必须要关上门,这样我的室友才知道在一段时间之内不可以打扰我。其实无论在哪里,我都会确保耳机里的音乐声音足够大,这样我就听不到周围的任何声音。那种没有歌词的欢快音乐类型最适合我。
收获与所得
寻找合适的环境往往是学习过程中容易被忽视的一个环节,要知道在这个过程中你应该保证不会有其他的干扰因素,这样你才能长时间的保持专注状态。专注是保证记忆力和技能获取效果的基础组成部分,当你尝试将新信息输入大脑中时,输入效果的强度直接与你的专注程序相关。如果你的注意力不集中,那新信息的粘性会降低,导致学习速度变慢,学习时间也会因而增加。
看看那些世界水平的表演家平时是如何训练的就知道了,他们是会每五分钟就看一次手机吗?肯定不会吧。
要想提高专注力,最简单的一个方法就是寻找一个对你来说干扰力最低的环境,具体可以参考以下几种方式:
找一个没人会打扰你的地方
将手机设置为飞行状态
利用某种定时网站拦截器来管理社交媒体和新闻网站的浏览权限
戴上耳机听一些不会让你分心的音乐(最好提前设置好歌单列表,这样就不必经常切换歌曲)
避开周围有电视或者是其他会导致你分心因素存在的环境
随身携带一个笔记本,可以记下突然出现在脑海中的任何想法
只有你自己可以决定何处才是适合你的学习环境,并且正确的去选择这一类的环境。确保自己在环境选择上费点精力,因为它值得你这么做。
我的第一份编程工作其实来的有些偶然。当时,我刚刚搬到内布拉斯加州的奥马哈,距离我开始自学编程已经过去了一年的时间。我在奥马哈几乎没什么认识的人,于是我通过 Meetup.com 进行搜索,试图找到对同样 Android 开发感兴趣的人。幸运的是,当时我找到了一个相关的聚会活动,涉及 iOS 和Android 开发。于是,我鼓起勇气,决定前去参加。
万事开头难,第一次去之前我在车里犹豫了大约有十分钟的时间,不知道是该进去还是直接开车走人。我怯场了,我对自己的编程技巧没有信心,我知道在场的每个人都比我有经验。最后,我把心一横,管它呢,我就直接走了进去。我也很高兴当时我做出了正确的决定。
之后,我开始定期参加这一聚会。不久之后,在聚会上我认识了一位招聘人员,他正在寻找一名安卓开发人员。我们就此事谈了一会,之后我接到了这一岗位的面试通知。在参加面试前,我感到信心满满。但在面试过程中,我却表现得有些不知所措。面试官介绍着这一职位需要负责的项目,我发现这一切都超出了我的理解范围。我试图让自己跟上节奏,但他们显然能够看出这超出了我的能力范围。
面试结束之后,他们让我先随便逛逛,再同其他人谈一谈。我知道自己这次搞砸了,于是我在市中心逛了一会,让自己冷静下来。之后,我又参加了一次面试,不久之后,他们向我提供了一个实习岗位。因为当时公司的 CTO 自己负责所有的 Android 工作,他需要有人来替他分担一下。
当时的我甚至不敢相信自己拿到了这个机会,在签署了所有的相关文件之后,我又跑到 CEO 那里,问他这是否是一份带薪实习的工作。最后,我从实习转为全职工作,我作为软件开发人员的职业生涯也正式开始了。
收获与所得
如果在某种技能方面你是自学成才,那应该不会有招聘人员主动来找你。你需要走出去,主动寻找机会。那些毕业于四年制大学和编码培训学校的人可以利用学校资源来找到工作,但对于自学人群可说,这一便利条件并不存在。也就是说,对于我们这样的人来说,要想找到一份工作,最好的办法就是走出去,认识更多的人,你可以通过像 Meetup.com 这样的网站去寻找那些每个月或每两个月聚会一次的相关小组。
尽你所能鼓起勇气去加入这些群体。保持友好的态度,同其他人分享你的经历,确保他们了解你找工作的长期目标。让自己进入可能带来积极影响的情景之中,如果你不买彩票,那你永远也中不了大奖。认真看待你所拥有的任何机会,即便它看上去像死路一条,但峰回路转也说不定呢。
关键是要让自己眼光放长远一些,实习或者兼职工作可能当下给不了你想要的薪资待遇,但他们能够帮你打开走向未来的大门。
如你所见,我在自学过程中犯过许多错误。要掌握一门新技能,绝对不是一路坦途,其中会有转弯,也会有起伏跌宕。希望我的经历和我的所思所得能够帮助你继续前进。
原文链接:https://medium.freecodecamp.org/lessons-learned-from-my-journey-as-a-self-taught-developer-41b97067730
编译组出品。编辑:郝鹏程