在这篇文章里,我想分享自己如何在 9 个月内一边做着全职工作,一边自学编程,从一名小白成长为年薪六位数软件工程师。

每当阅读别人的成功故事时,我的第一反应都是查看作者的背景,希望他们的经历和故事也发生在自己身上。可是我并没有发现和我背景一样的作者。所以,很可能我的经历和故事也不会发生在你的身上。

尽管如此,我还是希望我的故事能够对你有所启发,成为你通往成功之路的一个有价值的参考。

概述

9 年前,我在高中学习了 Visual Basic for Applications(VBA)课程。7 年前,在刚接触工程课程的时候,我学习了 C、Python、Matlab 和 Labview。3 年前,我大学毕业,获得了化学工程学位,成绩还不错。 所以,在去年我决定学编程之前,除了高中和大学里的课程以外,我没有接触过任何编程。

大学毕业后,我在一家炼油厂找到了一份工艺工程师的工作。在我转行从事软件开发之前,一直在那里工作。

我为什么想转行

我喜欢解决技术问题,但我知道自己将来某个时间会涉足商业或创业。我一直有读 MBA 的想法,不过这个想法一直都因为名牌大学高额学费被搁置。

2017 年 5 月 27 日,我再次在 Google 上搜索 MBA 时,不知怎的,偶然发现了软件工程。这似乎是一个完美的契机。

市场对软件工程师的需求越来越大,这个岗位的工资也很高。而且以软件工程师为起点,不需要大量启动资金就可以进入创业领域。你所需要的只是一台电脑,并且你的机会可以说是无限的。

在任何其他工程学科中,你无法做到:只要有一个想法,就开始构建,向用户展示,迭代需要的资金少,准入门槛低。以化学工程为例,如果你想打造一个新产品,那么你肯定需要有一家在运行的工厂,或筹集大量资金来开设工厂。

我听说有人辞掉工作去参加编程培训班,但是随着我在网上了解更多,我意识到如果一个人态度坚定而且专注,那么完全可以自学成才。

你可能会说,培训班可以提供找工作的人脉和职业建议。但我很幸运,因为我住在湾区,我可以时常参加技术聚会,通过这样的方式拓展人脉。

另外,最坏的情况也不过是我自学失败,然后辞职去参加培训班。

目标

640?wx_fmt=jpeg
图片来源:Unsplash,摄影师:Robert Baker

首先你需要一个目标,特别是如果你想在全职工作的同时学习编程,没有任何外部压力的推动,学习计划就可能一拖再拖。所以你需要创造内部压力,定一个简单且可以量化的目标。

我做了充分的调研,定了一个合理的目标:在一年内拿下一份软件开发的工作,薪水和我现在的工作一样或更高。

计划

640?wx_fmt=jpeg
图片来源:Unsplash,摄影师:Glenn Carstens-Peters

有了目标之后,你需要制定一个计划来实现目标。你可以大量阅读别人自学编程成功的故事。每个人的情况都与你的不同,但你可以从每个人那里获得一些建议。在制定计划时,我用到的资源包括:

2017 年 5 月 27 日这一天,我决定开始学习编程,并一头扎了进去。那天我决定每周在工作上花费的时间不超过 40 小时,这样下班后和周末我才有时间编程。我很好地记录了自己的学习进展,所以现在才能分享给你们。

经过反复修改,我的最终计划如下:

  • 学习计算机科学的入门课程,深入了解计算机科学的核心概念
  • 在 freeCodeCamp 学习,构建全栈 Web 应用程序,制作自己的作品集
  • 重构代码,添加测试,专注于高级概念
  • 为开源项目做贡献
  • 准备面试

刚开始时,我的计划很简单。当时,我觉得应该遵照 Google 的技术指南,所以我开始学习他们推荐的入门课程,Udacity CS101。

第 0 个月:Udacity CS101, Harvard CS50

做出这个重大决定后,我顿时感觉充满干劲。每天下班一到家我就开始编程,直到上床睡觉。而且整个周末都在编程。Udacity CS101 可以显示出课程的完成百分比,这给了我很大的动力。每天在编程后我都会记录完成的百分比。我在 10 天内完成了第一个 75%。最后的 25% 讲解的是递归,对我来说有点难。我一共花了 20 天才完成 Udacity CS101。

在学习 Udacity CS101 的时候,我开始大量阅读 learnprogramming subreddit。我读到,对于希望通过自学转行成为程序员的人来说,积极在线非常重要。所以我决定用我的全名创建新的 Twitter、Reddit、Stack Overflow、Medium 和 Quora 帐户,时常在线上活跃。

此外,我决定停止浏览分散注意力的媒体,比如 Instagram,Facebook 和与编程无关的 subreddits。我只会查看手机上与编程相关的新闻和帖子。这对于确保我找到最佳学习路径和学习资源至关重要。正因为如此,我才在 edX 上发现了 Harvard CS50 课程。

原本我只想上一个入门课程,但是似乎每个人都推荐 Harvard CS50,所以我决定深入研究。其他学校计算机科学系的学生也参加了这门课程,而且他们表示在 CS50 学到的知识比在大学计算机科学系一年或两年学到的东西更多。大家普遍认为,虽然这门课程很难,但很值得学习。到第 0 个月结束时,我完成了前 5 个讲座和作业。

第 1 个月:Harvard CS50,Linux,第一次聚会,freeCodeCamp

我花了半个月完成 CS50,我就不在这篇文章里详细写这部分体验了,你们感兴趣的话可以看我的另一篇文章

简而言之,这是一个很棒的课程,我强烈推荐。David Malan 是一位优秀的讲师,有大量的资源可以帮助你学习。 你从 C 开始学习,然后学习 Python,直到完成 Web 开发。课程内容非常多,而且还有很多材料,但我认为非常值得一看。

在学习完 CS50 之后,我决定在我的 XPS 15 上安装Windows 和 Ubuntu。那个周末让我非常沮丧。我弄乱了分区,差点把笔记本电脑搞废掉。我恨不得把它扔了,换一个新的。

我慢慢地不再使用 Windows,只使用 Ubuntu。我想强迫自己适应命令行,而且感觉进展还不错,但我还有很长的路要走。

我开始了 100 天编程挑战,让自己每天都保持专注持续编程。记录你的进度非常重要。 如果每天你都在学习,虽然每天的进步似乎并不多,但是在一个月或几个月后蓦然回头,你会发现自己已经取得了相当大的进步,这可以鼓励你继续前进。

我知道人脉可能帮助我,也可能干扰我,所以我鼓起勇气去参加我的第一次编程聚会。我从来没有参加过任何聚会,更不用说编程聚会了。当我开车到那里,停车,走到门口时,我非常紧张,几乎想转身回家。

图片来源:Unsplash,作者:Artem Sapegin

还好那是那个群体的第一次聚会。我很快意识到没有理由紧张,大家互相都不认识,没有人会对你评头论足,每个人都渴望学习。我在之后的 9 个月内参加了 50 多次聚会。我很高兴自己很早就开始参加聚会。大多数人在寻找工作时才开始参加聚会,但那时已经太晚了。需要尽早开始参加聚会的理由有很多,比如:

  • 发展人际关系需要很长时间,早点开始参加聚会,这样你可以认识一些人,在你以后找工作的时候给你推荐机会
  • 与陌生人谈论编程是准备面试的好方法
  • 你可以从前辈那里学习新的框架、工具和学习资源,这可能会影响到你未来的学习计划

那时候,我开始思考自己想做哪方面的开发工作。

最后,我选择了 Web 开发,因为这个领域的需求量似乎很大,而且有很多在线资源。在确定了方向之后,我需要弄清楚下一步该做什么。有些人建议在这个阶段应该考虑想要构建的 Web 应用程序,然后开始动手。有人推荐了 Odin Project 和 freeCodeCamp。

组织每周聚会的那个人很熟悉 Ruby,想用 Ruby 做项目。这是我决定全力投入 Odin Project 的一个重要原因。

两天后,我放弃了这个想法。

这是走自学路线的缺点之一,前一分钟你以为自己知道应该走哪条路,但第二天你开始怀疑这是否是正确的决定。

我看到有文章说 Ruby 已经失宠了,然后我搜索 Ruby 和 JavaScript 的招聘信息,证实了这一点,所以最后我开始在 freeCodeCamp 学习。但 freeCodeCamp 有一件让我感到困扰的事情:他们提供了项目的想法,所以每个学员都在做同样的项目。起初这让我很担心,因为我想从招聘人员中脱颖而出。但是,最终我爱上了 freeCodeCamp,现在我强烈推荐。有关 freeCodeCamp 的经验和建议的更多详细信息,请查看我的这篇文章

第 2 个月:YDKJS,freeCodeCamp 前端,React

随后,我开始阅读《You Don't Know JS》,因为每个人都建议将它作为 freeCodeCamp 的补充。这本书的内容非常多,有几个部分我不得不反复阅读。如果你想掌握作用域、闭包、Promise 等等所有 JavaScript 中你听说过的,想学的,却太难的概念的话,这本书是最佳选择。

我完成了 freeCodeCamp 的前端课程,在这个过程中,任务清单和时间表起了很大作用。我迫不及待地想开始学习 React。但是,我做的那些项目只有最简陋的样式,所以,我花了很大力气实现了用户故事中定义的需求,就没有下文了。

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

下一步是学习 React,我已经迫不及待了。

我听说过很多关于 React 的消息,已经准备好迎接挑战了。 但是,当时考虑到版权问题,我有点犹豫不决。很高兴现在这已不再是问题。学习 React 对我来说很难,当时我并没有很好的教程(现在当然有很多了)。

我尝试阅读文档,以及 Facebook 的 Tic-Tac-Toe 教程,但我没能完全了解里面的内容。有人说如果我无法理解 React 的话,那么意味着我对 JavaScript 的了解不够深入。所以我又回去阅读《You Don't Know JS》,但这本书对我来说还是太难。

8第 3 个月:freeCodeCamp React、CodeClub、开始在 freeCodeCamp 上学习后台开发

最终,我决定通过 freeCodeCamp 上的 React 项目来学习。

我每周参加的那个聚会的成员决定用 JavaScript 全栈来取代 Ruby 构建项目。他们决定第一个项目是为我们的聚会小组建立一个网站,CodeClub.Social

我的工作是用 React 和 Meetup API 开发界面,允许用户在我们的网站上注册接下来的三次聚会。对我来说,暂停 freeCodeCamp 的学习来做这项工作,有点困难,但我不能放弃这个机会。 我很高兴与一小群人一起开展一个项目。在此过程中我还学习了 Git 和 GitHub。

在这个月底,我开始在 freeCodeCamp 上学习后台开发。

第 4 个月:完成 freeCodeCamp 的后台开发课程,Yeggle

我完成了 freeCodeCamp 所有的 API 项目,但是在 Image Search Abstraction Layer 项目的时候,我有了自己的想法。

我迫不及待地想创建全栈 Web 应用程序,所以当我看到这个项目的标题时,我想做另一个项目。我可以创建一个节点应用程序,将随机图片的 URL 存储在数据库中,然后创建一个前端,输出用户指定数量的随机图片。有句话说的没错:当你根据自己的想法做一个属于自己的项目时,你会更加努力工作并取得更大的成功。

图片来源:Unsplash,摄影师:Christopher Gower

开始做这个项目之后,我为自己感到骄傲。虽然我做的东西丑陋而笨重,但至少可以正常工作。

在 freeCodeCamp 学习的时候,我了解了在自己的能力范围内可以做什么样的项目。那个时候我经常跑步,在跑步时我会思考,有什么新的想法就等回家后写下来。所以,慢慢的我就有了一份项目创意清单。

我终于准备好开始制作属于自己的,实用而且精美的全栈 Web 应用程序了,而且我可以与用户分享这些应用,并把它们放到作品集里。我已经准备好开始了。

在搜索餐厅时,我总是会打开 Yelp 查看评论,然后再打开 Maps 查看评论。如果我创建一个应用程序,可以将两者并排做比较,怎么样呢?

所以我做了 Yeggle。我使用了 Node / Express / React 以及 Google Maps 和 Yelp API。 中间我遇到了一些我以为自己无法克服的障碍,但最终还是完成了,我为我的应用程序感到非常自豪。然后我把它发布到 Reddit,结果却没有人关注。这有点令人失望,但我没有因此而气馁。

第 5 个月:StockIT

这个月我没有太多进展,因为我去日本和泰国玩了两个星期!

但我确实开始并完成了我的下一个项目。我一直在阅读了解自学成才的开发人员找工作有多困难,所以我认为自己需要做一些独特的事情。我记得有一个游戏是这样的:根据道琼斯股票的趋势图表,你有一次买入的机会和一次卖出的机会,目标是击败市场。游戏的目的是向你展示击败市场有多么困难。

我的想法是制作一个类似的游戏,但不是市场,而且与机器学习算法对抗。所以我创建了 StockIT

我在 Pandas 和 Scikit Learn 观看了很多讲解机器学习技巧的视频教程。我原本想做一些很酷的深度学习的东西,但我意识到这需要大量的数据集,而且所需时间也超出了我的预期。

于是,我做了一个简单的线性回归模型。我以为这部分工作会很难,但事实并非如此。结合 React 和 D3 才是最难的部分。两个库都想控制 DOM。有一些库可以帮忙融合这两者,但我觉得这些库都太臃肿了。最终我用 D3 生成 SVG,用 React 处理 DOM,这个方案进行得非常顺利。

当我在 Reddit 分享这个应用的时候,所有人都很喜欢!

Reddit 用户的喜爱很大地提升了我的信心。有人在玩我的游戏,而且还很享受其中的乐趣!

第 6 个月:jobSort()准备找工作

继 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() 占用了我这个月大部分时间。后来,我和一个在第一次聚会上认识的朋友喝咖啡,他建议我现在开始申请工作。我阅读了很多帖子,人们抱怨找工作的时间太长。我看到一些帖子询问应该何时申请工作,点赞最高的评论总是说“现在”。

图片来源:Unsplash,作者:Daniel Fazio

我的脑海里有一些结构化的计划,首先用个人项目来建立我的作品集,然后为开源项目贡献代码,然后准备面试,最后开始申请工作。这位朋友说服我应该放弃这个计划,马上开始申请工作。所以这个月我做了一个作品集,并整理了简历。接下来的一个月我会开始申请工作。

第 7 个月:测试、找工作

在这个月里,我一直在专注修改我的项目,并申请工作。我也学习了测试和 Redux。

我将 flexbox 添加到 CodeClub.Social,实现了响应式。我改进了 jobSort() 的移动端体验,给它添加了 mocha/chai/enzyme 等测试。

到月底的时候,我申请了 63 个工作岗位。我把这个过程当成一种自我评估:我的作品集和简历是否足够好?如果够好,那么我需要为面试做些什么准备?起初,我在 Hacker News 和 Indeed 上投简历。

在 Hacker News 上,我通过 jobSort() 来确定要申请哪个职位。事实上,我试过非软件的公司,看看我能否得到电话面试或其他面试机会。

起初,我只是快速地提交了申请,并没有对简历和求职信进行个性化设计。后来,我做了个性化,然后尝试给公司的某个人发送电子邮件。这种方法明显比漫天撒网更有效率。

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

  • 某家互联网公司的 DevOps/测试职位的合约员工
  • 联锁品牌食品分析公司
  • 最近被一家大公司收购的一家相当大的成功的创业公司

我通过了其中两家的 HR 面试,他们都没有给我现场面试的机会。不过我对这 3 个电话很满意,我从中学到了很多东西。

网上很多人说,企业对于初级开发开发者不会期待很高,初级开发者只要充满热情并对学习保持浓厚的兴趣就行了。所以我觉得,这很容易嘛。我很有热情而且对学习充满兴趣。然而,从这些电话面试中,我明白了没有人会聘用初级开发者,企业希望你从第一天就能胜任工作。

从这些电话面试中,我了解到自己需要:

  • 从第一天起就给公司带来价值
  • 要足够自信地说服他们我可以从第一天起就为公司带来价值
图片来源:Unsplash,作者:Kevin Ku

第 8 个月:夜班、Redux、开源、现场面试

这个月我的全职工作要求我连续上 40 天的夜班,而且要求加班:每周工作 6 天,每天工作 12 小时,从下午 5 点到早上 5 点,天啦!

我知道这个月我干不了太多事儿,但我有一个目标,我需要实现,所以我不能暂停一个月。

我用 Redux 重构了 jobSort,令人惊讶的是这没有我想象的那么困难。我听了很多关于 Redux 的播客,阅读了很多博客文章,可是如果我不实际使用它,那么了解再多也没有意义。

我非常喜欢 Redux 的数据流。现在看到人们抱怨 Redux,我觉得很有意思。我不觉得自己有资格表达意见,但我确实喜欢它的设计模式。

这个月我应该开始做开源项目。我打算将第一次贡献送给一个优秀的库。我打算为 React 做贡献!

人人都说这是一个很难阅读的代码库,更别说贡献了。但我需要脱颖而出,我需要做到独一无二。我知道我的贡献不会很大,但我仍然想试一试。

首先,我需要阅读所有的文档,然后再看代码库,关注每个问题、每个 PR。将 React 文档从头到尾读一遍,是一个很好的练习,我很高兴自己做到了。但我很快意识到,为 React 做贡献的问题在于,那些“适合第一次贡献处理的问题”很快就被别人处理了。

有一次,在参加聚会的时候,Anthony Ng 建议我尝试 Downshift,这是 Kent C. Dodds 编写的自动补齐库。这是一个重大的转折点。这个项目很适合我,难度适宜,问题的数量适宜,没有太多的协作者,维护者非常给力,而且代码本身干净并经过了良好的测试。最重要的是,它为我在 jobSort() 应用程序中遇到的一些问题提供了完美的解决方案。

在月中的时候,我收到了上个月申请的一家公司的电子邮件,他们邀请我参加第一次电话面试,然后是技术人员的电话面试。他们所需要的技术正是我学习的,即 React、Redux 和 D3。我主要介绍了自己的项目,以及我做出某些决定的原因。然后,他们邀请我到现场面试。这是我的第一次现场面试!

我根本没有准备好接受面试,所以我做好心理准备应聘不上这份工作,但我会获得宝贵的面试经验。那段时间,我仍然在上夜班之后,每天只睡三个小时。幸运的是,技术面试时不是白板测试,只是一小时的结对编程。这是一个相当直接的挑战,但我非常紧张。

起初,我一直在担心不查找任何资料,是否也能回答所有的问题。当我意识到我根本无法完成这个挑战时,我觉得我需要停止担心面试官对我的看法,尽管在 Google 和 Stack Overflow 搜索答案。最终我没能完成挑战,我觉得我惨败了。

因为我觉得我没有通过结对编程,所以在后续的面试中我感觉很放松。最后,我昂首挺胸地离开了面试现场。最坏的情况是我至少获得了一些有价值的面试经验,最好的打算是我可以获得这份工作。

图片来源:Unsplash,摄影师:Nghia Le

第 9 个月:找到工作

在我决定转行做开发的 9 个月零 7 天,我找到了第一份工作。在第一次现场面试后我收到了那份工作的聘用书。我感到很自信,想试试别的工作机会,但与此同时,我担心:如果我不接受这份工作的话,假如这是几个月内我收到的唯一一份工作,怎么办?所以最终我接受了这份工作,我对这个决定很满意。我终于可以靠编程挣钱了!

建议

写到这里,我的故事分享完了,其中我分享了一些建议。如果你正在阅读这篇文章,而且你正在考虑改行,或正在为了改行而学习编程,那么我希望以下建议可以帮助你制定计划,或者坚持当前的计划并实现目标。

  1. 找到可以激励你的动力,并将其转变为你的优势。对我来说,这包括检查清单,记录我的进展,并与各种编程社区进行互动。如果你没有动力去实现你的目标,那么其他的就都不重要了,因为你无法完成目标。
  2. 制定目标并实现。我认为你应该有每个月的目标,甚至每天的目标。每个月的目标可以确保你在朝着实现主要目标而努力,而每天的目标可以确保你每天都能进步。我的策略是在前一天晚上制定第二天的目标。这样可以避免你做无用功,感觉你在用功,实际上你没有。这种方法可以强迫你把每天取得的成果与目标作对比。
  3. 尽快参加聚会。参加聚会可能让你觉得不自在,就像我上面提到的那样。但是,总的来说,每个人都很友好,愿意提供帮助。你可能会发现有些人不想与你交谈,但他们只是少数,没有人会对你评头论足。另外,每个人都喜欢提供建议(就像现在我在给你提建议一样)。
  4. 尽快为开源项目做贡献。当你第一次开始编程时,GitHub 看起来就像是一个可怕的地方,你永远都不想去。但其实它非常适合初学者,你可以在上面看到优秀的代码,而且也有人帮你检查代码。如果你仍有疑惑,那么可以看看我的文章《为什么你应该立刻为开源贡献代码》
  5. 尽快开始申请工作。获得这个经验对我来说有一个艰难的过程,因为一开始我以为自己与众不同,以为自己不需要通过调查市场就能了解应该做些什么,以为自己知道什么时候准备申请工作。但我现在告诉你:你不知道应该什么时候开始申请工作。所以你也许也应该现在就开始。你不需要疯狂地给 300 家公司投简历,但是你应该知道,申请工作与获得市场反馈,是你搞清楚自己应该学习什么的最佳方式。。

好了,沉下心来继续写代码吧!

原文:How I went from newbie to Software Engineer in 9 months while working full time,作者:Austin Tackaberry