编者按:无论从近期还是远期来看,传统制作业的一般岗位都面临着萎缩或者钱景不佳的情况。很多从业者都面临着职业转换的问题。而软件开发将是很长一段时间内前景最光明的职业之一,是很多人改行的首选。但是缺乏基础想要改行谈何容易?如果为了打下基础而放弃手上的工作专心进修但最后还是找不到工作怎么办?从化学工程师成功转行软件工程师的AustinTackaberry也许能给你启迪。在这篇文章中,他详细介绍了自己是如何一边工作一边自学最后成功找到一份软件工程师的工作的。
每当我开始阅读成功故事的时候,我都会马上去查找作者的背景是什么,希望能适合我。但是我从来都没发现那些人的背景跟我一致,所以我的很可能跟你的背景也不一致。
不管怎样,我希望我的故事能够激励其他人,同时能够充当一个有用的数据点补充到你的成功故事数据集上。
充分披露
高中的时候(9年前)我上过VBA的课程。我在新生工程课程(7年前)中学习了一些C、Python、Mathlab以及Labview的知识。我从一所很好的大学毕业,拿到了化学工程学位,我的GPA成绩也不错(3年前)。离开学校(高中或者大学)以后我从来都没有编过程,直到去年我决定要去学一下。
大学毕业后,我在一家精炼厂拿到了一份工艺工程师的工作。在我改行到软件工程之前我一直在那里工作。
为什么我要换职业
我喜欢解决技术问题,但我知道到了某一刻我还是要进入商业/初创企业世界的。我一直都有读MBA的想法,但每次看到顶级商学院的价格时,我的兴趣马上就没了。
年5月27日,我又上去Google了一下MBA,但是不知怎的就看到了软件工程方面的东西。而且这东西看起来挺适合我的。
对软件工程师的需求日益旺盛,工资水平也很高,而且也是进入到初创企业世界的完美行业,并不需要太多的启动资金。你需要知识一台计算机,而且你的机会(几乎)无限。
在这里你只需要有个想法,开始开发,然后展示给用户,再用一点点资金进行迭代就行,进入门槛也很低,其他任何一个行业都做不到这一点。在化学工程,基本上你需要有一间运营的工厂,或者需要很多钱去设计一家工厂,如果你有个新产品的想法的话。
我听说过有人辞职去参加训练营,但是我在网上看到这些情况越多,我就越意识到其实我完全可以自学,如果我够投入和专注的话。
你也许会提出不参加训练营的话岂不是会失去那里提供的关系网络和职业建议?的确,但是我很幸运,因为我生活在湾区,所以可以去出席一些回忆,在那里我建立了自己的关系。
此外,最糟糕的情况也只是我发现自己一个人学不来,真这样的话我再辞职参加训练营也不迟。
目标
你需要有目标。尤其是如果你想一边干全职一边自学的话。如果你不给自己额外的压力的话你的学习就会一拖再拖。所以你需要给自己施加内部压力。你的目标应该是简单的、可量化的。你应该进行充分研究,提出合理的目标。我的目标是这样的:
在1年之内拿到一份薪水跟我现在相同或者更好的软件工程工作。
计划
一旦你制订了目标,就需要一份计划来帮助你实现。这个时候你需要尽可能多地去了解别人的成功故事。当然他们的情况都不会跟你一致,但你可以从每个人身上吸取一些经验。我利用Reddit的子版块learnprogramming、FreeCodeCamp论坛以及Medium等资源来制订我的计划(并且不断修订)。
年5月27日,我决定开始我的学习编程之旅,下定决心之后我可以说是一个猛子就扎了进去。我决定每周的工作不能超过40小时,这样我就有时间在工作之后以及周末去进行编码。你很幸运,因为我把我的整个学习过程都详细记录下来了。
我的计划经过多次迭代之后,最终大概是这样的:
上一门计算机科学入门课程,对核心计算机科学概念有可靠的基本了解。跟着freeCodeCamp学直到我自己可以开发出组合层面的全栈webapp。通过重构来清理代码,增加测试,专注于先进的概念。给开源做贡献准备面试
我的计划一开始是非常简单的。那时候我认为自己应该按照Google的技术指南去学,所以我选了一门他们推荐的入门课程,UdacityCS。
第0个月——UdacityCS,HarvardCS50
做出这一重大决策让我充满了能量。我一下班回到家就迫不及待开始编码而且直到上床前都不愿停下来。然后整个周末都是这样。UdacityCS会跟踪完成百分比,这对我是一大激励。我每天编程完之后都要记录我们的完成百分比。在10天内我就完成了前面的75%。最后的25%侧重在递归方面,这对我来说有点难。总而言之,最后我用了20天完成了UdacityCS。
我在上UdacityCS的同时,还一边开始相当频繁地上Reddit的learnprogramming子版块去看。我我在上面了解到正在寻求改变职业的自学开发者在网上活跃是非常重要的。我决定用自己的全名在Twitter、Reddit、StackOverflow、Medium以及Quora上面开设新的账号,以便在网上刷存在感。
此外,我还决定不再看Instagram、Facebook以及非编程方面的Reddit子版块,以免造成分心。我只有在查看编程相关的新闻和帖子时才会翻看我的手机。这一点很关键,因为可以确保我能找到最好的学习路径和学习资源。正是因为这样我才在edX上发现了HarvardCS50。
一开始我只是满足于上一门入门课程,但每个人似乎都推荐HarvardCS50,所以我决定再试试这门课程。其他学校计算机科学的学生也上了这门课,并且说他们在哈佛的CS50上面学到的东西比在自己的大学学习1、2年的计算机科学所学到的东西都要多。大家的普遍共识是这门课程很难但是值得。到了第0月的月末,我已经完成了前5节课以及家庭作业。
第1个月——HarvardCS50,Linux,第一次聚会,freeCodeCamp
大概到了这个月的一半时间时我终于完成了CS50。关于学CS50的体会我不想谈太多,因为我已经在这篇文章详细谈了我的经历。
总而言之:这是一门很棒的课程,我高度推荐。DavidMalan是一位优秀的讲师,而且有很多资源可以帮助你通过这门课程。你从C语言开始,然后再到Python,最后完成web开发。安排非常紧凑,涉及大量材料,但我认为是非常值得的。
在CS50之后,我决定把我的XPS15配置成Windows和Ubuntu双启动。那是一个令人沮丧的周末。我把分区搞砸了,笔记本几乎变成了一块砖头。我差点就想把那台笔记本扔了买台新的。
我慢慢放弃了Windows,最终主要以Ubuntu作为平台。我想强迫自己适应一定程度上可行的命令行方式,但是仍然有很长一段路要走。
我开始了百日写代码之路,以确保自己保持专注和每天都写代码的节奏。记录自己的进度非常重要。如果你每天都能取得进展,尽管看起来似乎不大,但是日积月累之后回过头,你就会意识到其实你已经走了挺远了,而这又会激励你继续前进。
我知道,关系网络决定了我的成败,所以我鼓起勇气参加了自己人生中的第一次编码聚会。我此前从未参加过任何聚会,更不用说编码聚会了。所以一路上我都非常紧张,以至于开车到那里停好车走进门之后,几乎就想转身离开回家了。
这是那个团体的第一次聚会,这一点很有帮助。我迅速意识到自己没理由紧张。大家谁都不认得谁,没人来这里是为了给别人下结论的,每个人都渴望学习。而这只是一场聚会狂欢的开始。在9个月内我最终出席了超过50场聚会。
很高兴,我很早就开始参加聚会。大多数人只是在寻找工作的时候才开始出席聚会,但到那个时候几乎已经太晚了。要早点参加的理由太多了。这里仅列举少数:
培养关系需要很长的时间。早点开始意味着后面找工作的时候你保证可以有关系可以依赖。跟陌生人讨论编程时准备面试的很好手段。你可以学习新的框架,了解到走走你前面的那些人的学习资源。这些会影响你的未来学习计划。
我的编码之旅走到这个时候出现了一点不确定性。到这时候我需要决定自己想要成为什么样的软件开发者。
到最后,我选择了web开发,因为它的需求似乎非常旺盛么热切网上有很多资源。一旦我想明白了这一点,我就需要弄清楚接下来要做什么。一些人建议到这一阶段我应该考虑想要开发什么样的webapp然后继续。一些人向我推荐TheOdinProject或者freeCodeCamp。
那个负责筹划我每周都参加的聚会的家伙会Ruby,也想用Ruby做项目。我决定全身心投入到TheOdinProject里面,这是其中的一大原因。
然后2天之后我又决定放弃这个想法了。
这就是走自学路线的缺点之一。一分钟前你以为你已经找到了前进的方向,然后第二天你又会怀疑你有没有走对路。
我了解到Ruby正在失宠,并且通过搜索对比Ruby和JavaScript的就业机会来证实了这一点,所以我最后决定开始freeCodeCamp。freeCodeCamp比较令人困扰的一件事情是项目的想法是他们想出来的,所以每一个参加训练营的人都做相同的项目。然而,一开始我感到担忧的是我希望能做应聘者当中脱颖而出。然而,我最后还是爱上了freeCodeCamp,现在我高度推荐你们要学这个。要想了解更多我关于freeCodeCamp的体验和推荐,请参考我的这篇文章。
第2个月——YDKJS,freeCodeCamp前端,React
我开始读《你不懂JavaScript(YDKJS)》,因为每个人都推荐它作为freeCodeCamp的补充。我被迫重读了好几个章节,因为它的内容特别紧凑,但这是学习词法范围、闭包、预定等你听到也想学到但因为很难从未试过的有关JavaScript的一切的完美资源。
我完成了freeCodeCamp的前端部分的学习。其检查表格式以及估算完成时间起了不小的帮助作用,这激励了我要迅速完成。我还恨不得马上进入下一章节去学习React。然而,这也意味着我的项目都是极简风格。我除了竭尽所能去实现用户故事之后就不再做别的东西了。
事后看来,也许我应该把精力放在让项目更吸引人上面。也许这会让我更深入了解CSS。
下一步就是学习React,我忙得差点缓不过气来。
我已经听说过React的很多,并且已经准备好要成为酷小孩的一员了。然而,我还有一点踌躇,因为当时的许可问题。我真的很高兴这不再是问题了。学习React对我来说很困难。当时我还没有发现任何好的教程(但是现在似乎到处都是)。
我尝试阅读文档,按照Facebook的一字棋教程去做,但我其实不是很理解它是怎么做的。我被告知这不适合我,这意味着我对JavaScript的理解还不够。于是我又返回来继续读《你不懂JavaScript》,但再次地,里面的内容对我来说太高深了。
第3个月——freeCodeCampReact,CodeClub,开始freeCodeCamp后端学习
最后,我决定去做freeCodeCampReact项目练手,看看它究竟是怎么做的。写出来的代码很难看,但的确帮助我更好地理解了React。
我参加的每周聚会决定全栈都用JavaScript而不是Ruby来做项目,并且他们还确定了第一个项目将是给这个聚会小组开发一个网站,CodeClub.Social。
我利用React和MeetupAPI开发了卡片,让用户可以通过我们的网站注册报名参加接下来的3场聚会活动。这对我来说有点难,因为我得暂停freeCodeCamp学习来做这个,但这是一个我不容错过的机会。我很高兴能跟一小群人一起做项目。这也帮助我学习了Git和Github。
在这个月结束前,我开始在freeCodeCamp学习后端开发。
第4个月——完成freeCodeCamp后端学习及Yeggle开发
我练完了freeCodeCamp所有的API项目,但我开始从freeCodeCamp抽身出来做ImageSearchAbstractionLayer这个项目。
我迫不及待想要开发全栈web应用,所以我看到这个项目的名字时马上就有了自己的项目想法。我想做一个节点app,用来存储随机imgurURL到数据库上,然后再做一个前端来输出这些随机图像的用户指定数字。大家的说法是对的:当你做一个自己想出来的项目时,你会更用功也更成功。
当我把项目做成了之后,一股自豪感油然而生。虽然它很丑很笨拙,但是最重要的是能用。
我在freeCodeCamp的学习过程中,还了解到了哪些项目是我的能力范围之内的。当时我经常会去跑步,在跑步过程中我时不时会冒出一些想法,等我回到家就把那些想法写下来。这样等我准备好时就有了一个项目清单了。
最后,我终于感觉自己已经做好准备,可以把自己的有用且光鲜的全栈webapp分享给用户并且纳入我的组合里面了。我已经摩拳擦掌,迫不及待。
在找新饭店的时候,我总是会打开Yelp去看看别人的点评,然后再打开地图看看别人的点评。如果我做一个app来把这两个一起比较一下呢?
于是我做了Yeggle,这个东西用了Node/Express/React,再加上GoogleMaps和YelpAPI。当时有好几个障碍我认为自己是没法克服的,但到最后我还是设法完成了,我对这个app也感到非常自豪。然后我把它发到了Reddit上,可是没人在意。这有点令我失望,但我是不会被这种情绪打倒的。
第5个月——StockIT
这个月我做的东西不多,因为我跑到日本和泰国度假去了,整整2周!
但是我还是开始并完成了下一个项目。我不断读到自学开发者找到工作是多么的难,于是我认为自己得做点独特的事情。我记得有一个游戏是当道琼斯股票走势图开始活动时,你有一个买入的机会和卖出的机会,其目标是击败市场。这个游戏的目的是想让你看清楚击败市场有多困难。
我的想法是做一个类似的游戏,但是你的对手不是市场,而是机器学习算法。于是我创建了StockIT。
我在Pandas和ScikitLearn上面学习了一些涵括多种机器学习技术的视频教程。我原先是希望做一些很酷的深度学习技术,但我意识到这需要大规模的数据集和时间,那些是我耗不起的。
相反,我采用了简单的线性回归模型。我以为这会是困难的部分,但其实不是。让D3跟React配合工作才是。这两个库都想控制DOM。还有一些别的库可以帮助把这两个库凑合起来,但是我认为引入新的库会让项目太臃肿了。我最终用D3生成SVG,用React处理DOM,情况看起来相当不错。
我再次把它分享到Reddit上面,这一次大家都很喜欢!
结果表明,就像VC一样,上Reddit的人也都对机器学习着迷。Reddit用户的厚爱让我的信心有了极大的提升。大家都玩我的游戏并且喜欢上了!
第6个月——jobSort(),找工作前的准备
在StockIT之后,我又开始了下一个个人项目。我希望做一个岗位看板,把一些小规模的面向技术的职位列表网站,比如StackOverflow、Github以及HackerNews上的就业机会都集中起来展示。为了增加它的独特性,我决定根据用户对职位的技术需求以及需求程度进行排序。
比方说,假设我正在寻找一份需要了解JavaScript、React及/或Python的工作,并且招聘者对JavaScript和React的需求非常迫切,对Python就没那么