在全职工作的9个月内,我是如何从新手转到软件工程师的

在这篇文章中,我将分享我如何在九个月内从零(ish)变成六位数的软件工程工作,同时全职工作和自学成才。

每当我开始阅读成功故事时,我都会立即寻找作者的背景,希望与我的背景相符。 我从未找到与我背景相同的人,而且我的极有可能与您的背景完全不符。

尽管如此,我希望我的故事能够启发他人,并作为一个有价值的数据点,可以添加到您的成功故事数据集中。

我在高中(九年前)上了Visual Basic for Applications(VBA)课程。 在我的一年级工程学课程中(七年前),我学习了一些C,Python,Matlab和Labview。 我毕业于一所拥有化学工程学位和良好GPA的优秀大学(三年前)。 直到我决定去年想学习之前,我都没有在校外,高中或大学里做过任何编程工作。

大学毕业后,我在一家炼油厂找到了一名工艺工程师。 我在那里工作,直到将职业转到软件工程。

我很喜欢解决技术问题,但是我知道我想在某个时候进入业务/初创公司。 我一直想着MBA的想法,但是每次查看顶级学校的价格时,我的兴趣都在减弱。

2017年5月27日,我发现自己再次涉猎MBA,并且偶然发现了软件工程专业。 看起来很合适。

软件工程师的需求在不断增长,薪水也很高,这是无需花费大量初始资金即可进入创业世界的理想行业。 您所需要的只是一台计算机,您的机会是无限的。

在任何其他工程学科中,您只能有一个主意,就可以开始构建它,向用户展示,并以很少的资本和较低的进入门槛进行迭代。 在化学工程中,如果您有新产品的想法,则本质上您需要运行中的工厂或大量资金来设计工厂。

我听说有人辞职并参加训练营,但我在网上阅读的内容越多,我越意识到,只要您有决心和专注,就可以完全自己学习。

您可能会争辩说,您正在失去训练营提供的网络和职业建议。 的确如此,但是我很幸运,因为我住在海湾地区,这使我得以参加几次聚会,所以我以这种方式建立了网络。

此外,最糟糕的情况是我意识到自己不能自己做,然后我辞掉工作去参加训练营。

您需要有一个目标。 特别是如果您想全职工作学习。 如果没有任何外部压力会很容易让您的学习陷入困境。 因此,您需要产生内部压力。 您的目标应该是简单而定量的。 您应该进行足够的研究以得出合理的目标。 我的是:

在一年之内以与我现在相同或更高的薪水获得软件工程工作。

一旦有了目标,就需要一个计划来帮助您实现目标。 在这里,您可以尽可能多地获取成功案例。 它们都不适合您的实际情况,但是您可以从每个人那里获取一些建议。 我使用诸如learningprogramming subreddit,freeCodeCamp论坛和Medium之类的资源开发(并迭代了)我的计划。

在2017年5月27日,我决定要进行编码下降,并且我先入为主。 那天,我决定开始每周不超过40个小时的工作时间,以便在下班后和周末有时间进行编码。 幸运的是,我在记录进度方面做得很好。

经过多次迭代,我的计划最终看起来像这样:

  1. 参加CS入门课程,以获得对CS核心概念的扎实基础
  2. 关注freeCodeCamp,直到我可以自己构建投资组合级的全栈Web应用程序为止
  3. 重构以清理代码,添加测试,关注高级概念
  4. 贡献开源
  5. 准备面试

首先,我的计划很简单。 当时,我以为我会遵循Google的技术指南,所以我从他们推荐的入门课程Udacity CS101开始。

做出这个重大决定的高昂能量使我充满了精力。 我下班回家后会立即开始编码,直到上床睡觉都不会停止。 然后整个周末又一次。 Udacity CS101跟踪了完成百分比,这对我来说是一个很大的动力。 编码后,我每天记录完成率。 我在10天内完成了前75%的任务。 最后25%的递归繁重,对我来说有点难。 总而言之,我花了20天才能完成Udacity CS101。

当我使用Udacity CS101时,我已经开始大量阅读learningprogramming subreddit。 我读到,对于希望改变职业生涯以在线活跃的自学成才的开发人员而言,这很重要。 我决定使用我的全名创建新的Twitter,Reddit,Stack Overflow,Medium和Quora帐户,以便建立在线形象。

另外,我决定停止阅读分散注意力的媒体,例如Instagram,Facebook和非编程subreddit。 我只会检查手机中与编程有关的新闻和帖子。 这对于确保我能找到最佳学习途径和学习资源至关重要。 因此,我在edX上找到了关于哈佛CS50的信息。

本来我只满足于做一个入门课程,但每个人似乎都推荐哈佛CS50,所以我决定再学习一门。 其他学校的CS学生参加了这门课程,并说他们在CS50中学习的知识比在大学学习CS的大学学习了一两年以上。 普遍的共识是,这门课程很难,但值得。 在第0个月末,我已经完成了前5堂讲座和作业。

我大约在本月中旬完成了CS50。 我不会在CS50的使用经验上发表过多评论,因为我在这里撰写了一篇有关其使用体验的深入文章。

TLDR:这是一门很棒的课程,我强烈建议您这样做。 大卫·马兰(David Malan)是一位出色的讲师,有大量资源可以帮助您顺利通过。 您从C开始,转到Python,然后完成Web开发。 它非常密集,并且有很多材料,但是我认为这是值得的。

在CS50之后,我决定将XPS 15设置为双启动Windows和Ubuntu。 那是一个令人沮丧的周末。 我弄乱了分区,几乎把笔记本电脑弄成砖了。 我快要拿起笔记本电脑并换一台新笔记本电脑了。

我逐渐从Windows断奶,最终仅使用Ubuntu。 我想强迫自己适应命令行,在某种程度上我认为这行得通,但是我还有很长的路要走。

我开始进行100天的编码以确保我每天都专注于代码编写,这对记录您的进度很重要。 如果您每天都在进步,那么看起来似乎并不多,但是当您回顾一个月或几个月时,您将意识到您实际上已经取得了很大进步,从而激励您继续前进。

我知道网络会成败我,所以我鼓起勇气参加了第一次编码聚会。 我从未参加过任何聚会,更不用说编码聚会了。 我非常紧张,以至于开车去那儿,停车,走到门口之后,我差点掉头回家。

这是该小组的第一次聚会,这很有帮助。 我很快意识到没有理由紧张。 没有人彼此了解,没有人有判断力,每个人都渴望学习。 这是聚会狂欢的开始。 我在9个月内参加了50多次聚会。

我很高兴我很早就开始参加聚会。 大多数人只是在寻找工作时才开始参加聚会,但是那时已经太晚了。 有很多理由提早开始。 仅举几例:

  1. 建立关系需要很长时间。 尽早开始意味着您拥有可以在以后找工作时为您提供担保的人脉
  2. 与陌生人谈论编程是准备面试的好方法
  3. 您可以从前面的人那里学习新的框架,工具和学习资源。 这会影响您未来的学习计划。

目前,我的编码过程存在一些不确定性。 这是关于何时需要确定自己想成为哪种软件开发人员的。

最终,我选择Web开发是因为它似乎需求很高,而且在线资源也很多。 一旦弄清楚了,就需要弄清楚下一步该怎么做。 有人建议在此阶段,我应该考虑要构建的Web应用程序,然后继续进行。 有人推荐了Odin Project或freeCodeCamp。

我参加的每周一次聚会的家伙认识Ruby,并想与Ruby进行项目。 这是我决定全心投入The Odin Project的重要原因。

然后两天后,我放弃了这个主意。

这是走自学路线的缺点之一。 有一分钟,您认为自己知道应该走什么路,但是第二天,您就想知道这是否是正确的举动。

我读到Ruby不再受欢迎,我通过搜索Ruby vs JavaScript作业来证明了这一点,所以我最终启动了freeCodeCamp。 关于freeCodeCamp困扰我的一件事是他们提出了项目构想,因此每个露营者都执行相同的项目。 首先,这让我感到担心,因为我想在招聘人员中脱颖而出。 但是,我最终爱上了freeCodeCamp,现在我强烈推荐它。 有关我的经验和有关freeCodeCamp的建议的更多详细信息,请在此处查看我的文章。

我开始阅读“您不知道JavaScript”,因为每个人都推荐它来补充freeCodeCamp。 我不得不重新阅读几节内容,因为它非常密集,但是它是学习词汇范围,闭包,promise和您听说过但想学习但由于困难而从未做过的JavaScript所有部分的理想资源。

我完成了freeCodeCamp的前端部分。 清单格式和估计的完成时间有助于我快速完成工作。 我也很想继续下一节并学习React。 但是,这也意味着我的项目具有最小的样式。 我尽了一切努力来满足用户的需求,仅此而已。

事后看来,也许我应该专注于使项目更具吸引力。 也许,这将有助于我更深入地学习CSS。

下一步是学习React,我非常兴奋。

我已经听到了很多,我已经准备好适合酷孩子。 但是,当时我对许可问题有些犹豫。 我真的很高兴这不再是一个问题。 学习React对我来说很困难。 那时我还没有任何好的教程(但是现在看来好像有很多教程)。

我尝试阅读文档,并跟随Facebook的Tic-Tac-Toe教程学习,但是我不太了解所有内容。 有人告诉我这是否对我不起作用,那意味着我对JavaScript的理解不够。 因此,我又回头读了《 You’t Know JavaScript》,但那对我来说太密集了。

最终,我只是决定我将通过freeCodeCamp React项目来研究它的进展。 这段代码很难看,但是确实帮助我更好地理解了React。

我每周参加的见面会决定他们要使用全栈JavaScript而不是Ruby构建项目,并且他们决定第一个项目将是为见面组CodeClub.Social建立一个网站。

我使用React和Meetup API开发了卡片,允许用户从我们的网站上注册接下来的三个聚会。 快速脱离freeCodeCamp做到这一点对我来说有点困难,但这是我不能错过的机会。 我很高兴能与一小群人一起从事一个项目。 它还帮助我学习了Git和Github。

在本月结束之前,我开始研究freeCodeCamp的后端部分。

我在freeCodeCamp中处理了所有API项目,但是在图像搜索抽象层项目中我开始偏离freeCodeCamp。

我很想制作全栈Web应用程序,所以一看到这个项目的标题,我就对自己的项目有了一个主意。 我将制作一个节点应用程序,该程序将在数据库中存储随机imgur URL,然后制作一个前端,以输出用户指定数量的那些随机图像。 每个人都说的是对的:在做属于自己想法的项目时,您会更加努力并取得更大的成功。

一旦开始工作,我为自己感到非常自豪。 这是丑陋且笨拙的,但确实有效。

当我通过freeCodeCamp工作时,我正在学习哪些项目将在我的能力范围内。 当时我经常跑步,所以我会想出跑步时的想法,并在回家时写下来。 这样,当我准备就绪时,我将获得一份项目构想清单。

我终于感到准备好开始制作自己的有用且完善的全栈Web应用程序,以便与用户共享并加入我的投资组合。 我已经准备好开始了。

在寻找新餐厅时,我总是发现自己打开Yelp查看评论,然后打开Maps查看他们的评论。 如果我制作的应用程序将两者进行了比较,该怎么办?

所以我做了Yeggle。 我使用了Node / Express / React以及Google Maps和Yelp API。 我认为无法克服一些障碍,但最终我完成了,我为自己的应用感到非常自豪。 然后我将其发布到Reddit,没有人在意。 那真是个无赖,但我没有让它失望。

本月我没有做太多事情,因为我开始了去日本和泰国的两个星期假期!

但是我确实开始并完成了下一个项目。 我一直在读关于成为一名自学成才的开发人员的工作有多困难,所以我认为我需要做一些独特的事情。 我记得有一款游戏,道琼斯(Dow Jones)股票图开始流行,您有一次购买机会和一次出售机会,目标是击败市场。 该游戏的目的是向您展示如何击败市场。

我的想法是制作一款与之类似的游戏,但是要取代市场,您将不得不使用机器学习算法。 因此,我创建了StockIT。

我观看了有关Pandas和Scikit Learn的视频教程,其中涵盖了多种机器学习技术。 我最初想做一些很酷的深度学习技术,但是我意识到这花了大量的数据集和更多的时间。

相反,我坚持使用简单的线性回归模型。 我以为那将是困难的部分,但事实并非如此。 使D3与React结合起来是困难的部分。 这两个库都希望控制DOM。 还有其他一些库帮助将两者结合在一起,但是我觉得它们太过肿了。 我最终使用D3生成了SVG,并使用React处理了DOM,这对我来说非常好。

这次,当我与Reddit分享时,每个人都喜欢它!

事实证明,就像VC一样,redditor都是关于机器学习的。 Reddit的所有热爱极大地增强了信心。 人们在玩我的游戏并享受它!

在使用StockIT之后,我立即进入了下一个个人项目。 我想制作一个工作板,以汇总较小的以技术为重点的工作清单网站,例如Stack Overflow,Github和Hacker News。 为了给自己添加独特的功能,我决定根据用户在工作中想要的技术以及他们对每种技术的渴望程度对其进行排序。

例如,假设我正在寻找一份工作,该工作正在寻找了解JavaScript,React和/或Python的人,而我确实很想与JavaScript和React一起工作,但我不太关心Python。 然后我可以给JavaScript赋予3,React赋予3,也许给Python赋予1。然后,清单将进行相应的排序。

我在这个项目中遇到了种种障碍,不得不改变路线几次,但是最终我得到了一个令我满意的产品。 我最终的技术堆栈是React / Node / Express / MySQL。 我将该项目发布到了cscareerquestions subreddit上,并在撤消之前获得了650次视图,因为它们不允许个人项目。

“最终”产品就在这里,如果您有兴趣了解有关我的挣扎和重构的更多信息,请在此处查看我的文章。

由于我的问题,jobSort()占用了本月的大部分时间。 我最终和第一次见面时遇到的朋友喝咖啡,他建议我现在开始申请工作。 我到处都读到每个人都说他们等了太久才申请。 另外,每当我看到一则帖子询问何时申请时,最高的评论总是“现在”。

在我的脑海中,我将按照自己的结构化计划进行工作,以建立个人项目的投资组合,然后进行开源贡献,然后准备面试,最后开始申请工作。 这位朋友说服我放弃该计划并开始应用。 因此,本月我做了一份投资组合和一份简历。 下个月,我将开始申请。

这个月,我专注于修饰我的项目并申请工作。 我还想学习测试和Redux。

我将flexbox添加到CodeClub.Social中以使其响应。 我在jobSort()上改进了移动UX。 我用mocha / chai / enzyme在jobSort()中添加了测试,该测试难以设置,易于入门,然后很难获得100%的覆盖率。

到月底,我已经申请了63个工作。 我认为这是一种自我评估。 我的投资组合/简历足够好吗? 如果是这样,我需要做些什么来准备面试? 首先,我向《黑客新闻:谁在招聘,确实如此》提出了申请。

在Hacker News上,我使用jobSort()确定要申请的清单。 在“确实”上,我尝试了非软件公司,看看是否能在任何地方接到电话或接受采访。

刚开始时,我的申请很快,没有对简历/求职信进行个性化设置。 然后,我决定个性化我的求职信和简历,然后尝试向公司的某人发送电子邮件。 这种方法显然比the弹枪方法更好。

我当月接到了五个电话,其中两个来自招聘公司,三个来自软件公司,其中包括:

  • 在互联网公司担任承包DevOps /测试角色
  • B系列食品分析公司,以及
  • 一个相当大型且成功的创业公司,最近被一家大公司收购

我在其中两个中通过了HR屏幕,但没有一个进行现场采访。 我对这三个电话很满意,从中我学到了很多。

每个人都在网上提到,初级开发人员从一开始就不应该了解那么多,他们只需要学习就变得充满激情和兴奋。 所以我想,容易。 我对学习充满热情和兴奋。 我从这些电话中学到的是,没有人在寻找初级开发人员。 他们希望您从第一天开始就知道自己在做什么。

这些电话告诉我,我需要

  • 从第一天起就足以增加价值
  • 有足够的信心说服他们我从一开始就可以增加价值

我本月开始在全职工作的夜班工作40天-每周6天,每天12小时,从下午5点到凌晨5点。 啊。

我知道本月我将无法完成很多工作,但是我有一个目标,而且我想实现这一目标,所以我不能休假一个月。

我将jobSort.tech重构为使用Redux,这并不像我想象的那么难。 我听了很多关于它的播客,并阅读了有关它的博客文章,在我开始使用它之前,这对我来说从来就没有意义。

我真的很喜欢Redux的数据流。 现在看到人们抱怨Redux很有趣。 我认为我没有资格强烈表达自己的观点,但我确实喜欢减速器模式。

对我来说,这应该是开源的月份。 我将做出我的第一个开放源代码贡献,这将对一个出色的图书馆做出巨大的贡献。 我要为React贡献力量!

每个人都说这是一个很难阅读的代码库,更不用说贡献了。 但是我需要脱颖而出,我必须与众不同。 我知道我的贡献不会很大,但是我仍然想这样做。

我将从一开始阅读文档开始,然后遍历代码库。 观看每个问题,每个PR。 完整阅读React文档是一个很棒的练习,我很高兴自己做到了。 但是我很快意识到,为React做出贡献的问题在于,没有多少“良好的首要问题”,它们很快就被抢走了。

在我参加的一个聚会中,吴应Anthony(Anthony Ng)建议我尝试一下Downshift,这是Kent C. Dodds的自动完成库。 这是一个改变游戏规则的人。 就在我的驾驶室里。 适当的难度,需要解决的适当数量的问题,没有太多的合作者,超级有用的维护者,干净的经过良好测试的代码。 最重要的是,它是我用jobSort()应用程序遇到的一些问题的完美解决方案。

在本月中旬,我收到了上个月申请的一家公司的电子邮件。 他们设置了初始电话屏幕,然后是技术电话屏幕。 他们正在寻找的技术正是我所学的-React,Redux和D3。 我主要只是谈论我的项目以及为什么做出某些决定。 此后,他们要求我到现场进行采访。 我的第一次现场采访!

我根本没有为面试做任何准备,因此我满怀希望我不会得到这份工作,但是我会获得宝贵的面试经验。 由于我仍在夜班工作,所以我也一直在睡眠三个小时,这无济于事。 幸运的是,技术部分不是白板,而只是一个小时的一对编程会话。 这是一个相当简单的挑战,但我非常紧张。

起初,我担心要确保自己不了解就知道一切。 当我意识到自己不会完成挑战时,我意识到我需要不再担心面试官对我的想法,而只是通过谷歌/堆栈溢出来寻找答案。 我没有结束,我以为我失败了。

因为我以为我没有通过结对编程,所以在接下来的采访中我感到很轻松。 最终,我放弃了采访。 最坏的情况下,我获得了一些宝贵的面试经验,最好的情况下,我得到了我的第一份工作。

我决定在第一天开始工作9个月零7天后才决定接受我的第一份工作,当时我决定打算先去编程,以求改变职业。 第一次面试后我收到了一份报价,我对此充满信心,但是同时,如果我不接受报价,那这是我几个月以来唯一收到的报价怎么办? 我最终接受了报价,对自己的决定感到满意。 我想获得代码付款!

到现在为止,我大部分时间都在分享我的故事,并附有一些建议。如果您正在阅读本文,那么您可能正在考虑改变职业,或者正在学习以改变职业为目的的编码。 我希望以下建议能帮助您制定计划或坚持当前的计划并达到目标。

  1. 找出激发您动机的因素,并利用它发挥自己的优势。 对我而言,这是清单,记录了我的进度,并与各种编程社区进行了互动。 如果您没有动力去实现自己的目标,那么别的都不重要,因为您不会完成任务。
  2. 制定目标并实现目标。 我认为您应该有每月目标,甚至每天目标。 每月目标可确保您按计划实现主要目标,而每日目标可确保您实际取得日常进展。 对我有用的一种策略是在前一天晚上设定我的日常目标。 这样一来,您就不能整天从事非生产性的工作,而实际上却并没有取得进展。 它迫使您将日常成就与日常目标进行比较。
  3. 在您准备好之前就去聚会。 参加聚会可能会让人感到恐惧,但是如上所述。 但是,总的来说,每个人都很友好,乐于助人。 您可能会发现对与您交谈不感兴趣的人,但是他们是少数,没有人会判断。 另外,每个人都喜欢提供建议(就像我现在正在做的那样)。
  4. 在您准备好之前就为开源方式做贡献。 当您第一次开始编程时,Github似乎是一个您永远都不想去的可怕地方。 实际上,它对初学者非常欢迎,并且是查看良好代码并检查您自己的代码的好地方。 如果您仍然不确定,请查看我的帖子“为什么现在就应该为开源做出贡献”。
  5. 在您准备就绪之前就开始申请。 这对我来说很难,因为我认为自己与众不同。 我以为我不需要测试市场就能了解要做什么。 我以为我知道什么时候可以准备申请。 我现在告诉你。 您将不知道何时申请。 因此,您不妨现在开始。 在学习循环之前,您不应发疯并向300家公司提出申请。 但是您应该知道,了解您需要学习的知识的最佳方法是通过应用和测试市场。