查看原文
其他

从石油工程师到程序员,我做了哪些努力?

脚本之家 2022-04-23
 关注
脚本之家
”,与百万开发者在一起

作者 | DANIEL LESKOSKY    
译者 | 弯月
出品 | CSDN(ID:CSDNnews)

如果你正在考虑转行,而且想成为一名软件工程师,那么一定要读一读本文。关于如何成为一名合格的软件工程师,互联网上有很多很棒的资源,但是甄别优劣是一项挑战。因此,我希望通过本文分享一些我学习编程的经历,为你提供参考。

#1

石油工程师出身


我本科就读于宾夕法尼亚州立大学,并获得了石油与天然气工程学士学位。当初这个专业最吸引我的地方是高就业率以及到全世界各地旅游的机会。石油工程师的薪水也相当不错,所以这当然也是一个因素。

然而到了大四,我对石油工程师失去了热情。主要是因为我意识到即便有机会到处旅游,大多也是去偏远山区,而且还需要工作很长时间。于是,我决定在完成学业以后,尝试一下寻找其他工程领域的工作。

做这个决定并不容易,原因有几个。首先,我的大学成绩并不太好,GPA只有2.72(满分5分)。其次,我不太擅长面试(当然可以通过学习提高)。再者,一般来说,因为专业不对口,所以非石油工程职位的面试有点难。

很幸运,在这段时间里,我住在父母家。我还做了一些不同的兼职工作来偿还我的学生贷款。此外,为了把简历写得漂亮一点,我还参加了当地社区大学的两门课程。与此同时,我还通过了工程基础考试。

不过这些统统没用。经过两年的苦苦挣扎之后,我决定重返学校。


#2

重返学校


在找工作时,我看到了很多工业工程师的招聘广告。在做了一些研究之后,我觉得自己就是一名工业工程师。于是,我报名参加了利哈伊大学的工业与系统工程的研究生课程。

老实说,我考虑过学习计算机科学。但是,当时的我对计算机一窍不通。虽然大学期间我也学过 C++ 的课程,但成绩不是很好,所以我选择学习工业工程。

我记得有一天,在图书馆服务台值班时,我与一位同事交谈,他恰好跟我是同专业。他谈到了大数据,他说我应该认真考虑参加工业与系统工程的课程,还说我可以成为一名数据科学家。他的话很让我动心,但我依然没能下决心。

第二学期,我在 Mack Trucks 实习。在实习期间,我发现这种规模的公司传输的数据量居然如此之大。我决定给上面提到的那位朋友发电子邮件,了解更多关于大数据的信息。

在接下来的学期里,我参加了可以让我更多地了解数据科学的课程。我下决心克服我对编程语言的恐惧。我参加了一门 Python 数据挖掘课程、一门使用 R 语言的商业分析课程,还有一门使用 AMPL(一种编程语言)的线性代数课程。

在那个学期中,我阅读了很多 Barron 杂志,还收听了不同的技术播客。通过阅读 Barron 杂志,我了解到技术行业有很多就业机会,尤其是在软件工程师领域。通过收听CodeNewbie 播客,我了解到即便没有计算机科学学位也可以成为一名软件工程师。

毕业之后,我下定决心,成为一名软件工程师。接下来,我只需要弄清楚该如何努力。


#3

下决定


2019年 12 月,我毕业了(顺便说一句,我以 3.52 的成绩毕业,与本科的成绩相比,我感到很自豪)。2020 年 3 月,我在Westport Axle 找到了一份工业工程师的工作。虽然我真的很想毕业后立即找一份软件工程师的工作,但我知道我不具备实现这一目标所需的技能。

那时,我仍然不确定下一步应该做什么。我最大的疑问是究竟应该参加培训班,还是靠自学。或者也可以继续从事工业工程的工作(很高兴这个选择我并没有坚持太久)。

参加培训班的计划很吸引人。实际上,我一直在给一些培训班发电子邮件,而且还认真地考虑了报名。培训班会给我一个系统的学习,有很多伙伴,而且还有机会接触潜在的雇主,但是培训班当然也需要很多钱。那时我还有学生贷款没有还清,因此不敢承担更多债务。

不过,自学太难了。虽然我没办法享受培训班提供的一切,但是省钱。

最后,我在网上搜索了一番,然后发现网上也有很多课程。我觉得可以参考培训班的课程,然后建立自己的学习计划。虽然这需要费一番功夫,但我愿意,因为毕竟可以省很多钱。所以,最终我决定靠自学。


#4

自学


我的计划是一边继续工作,一边利用晚上和周末的时间学习编程。我计划好了,攒6个月的工资,然后辞职,专心地学习。

于是,从 2020 年 3 月~ 2020 年 8 月,我一边工作一边学习;然后从 2020 年 8 月~ 2021 年 7 月,我就靠自己的积蓄生活,直到我找到了一份软件工程师的工作。

学习资源

下面是两个优秀的资源,涵盖了广泛的编程主题:

  • 终极编程资源列表:https://github.com/PizzaPokerGuy/ultimate-coding-resources

  • 编程面试:https://github.com/jwasham/coding-interview-university

省钱

为了顺利地转行,我需要做一些生活的预算。在 Westport 工作期间,我花的钱很少。受疫情的影响,我外出的频率降低了,这对我来说是好事。

我没有外出就餐。没有出去玩。我把所有的钱都存起来了,所以辞职后,我的生活没有太大问题。我还去了一趟加利福尼亚,放松一下。

唯一的一次差点超支是我想买一台新的笔记本电脑。

我有一种误解,认为要成为真正的开发人员,就需要一台精美的笔记本电脑。至少我是这样认为的。但老实说,我认为软件工程师的工作需要的计算能力非常强大,笔记本电脑根本应付不来。所以,在花了 2000 美元买了一台新笔记本电脑后,我一晚上都没睡好,第二天起来就取消了订单。

后来,我只是换了操作系统,我换成了 Ubuntu。在通往软件工程师的路上,我需要在笔记本电脑上完成的工作主要包括在Visual Studio Code、NetBeans 中编程,或者在 LeetCode 上解决难题。事实证明,我的笔记本电脑足以应付这些任务。

建立人际关系

当我刚开始在 Westport 工作时, LinkedIn 上有大约 40 个联系人。我也没有推特账号。我收听的所有播客都强调在网上建立人际关系的重要性,因此我肯定需要在这方面做一些工作。我开始在推特和 LinkedIn 上与开发人员接触,我努力尝试与科技行业的工程师建立联系。

我承认,刚开始的时候,面对陌生人,我很胆怯。但是,我发现实际情况并没有那么糟糕。

一般,我只需要发送一个连接请求,通过几句话来说明我的情况。我经常会征求他们的意见。大多数时候,对方都非常乐于助人。有些人甚至会通过电话或视频聊天与我交谈。我通过这些对话学到了很多,而且也吸收了很多很棒的建议。

 通过这些交谈,我总结出了两点:

1.    要想获得面试的机会,必须有实际的项目经验;

2.    要想通过面试,必须掌握数据结构和算法。

大约 80% 的工程师推荐利用 LeetCode 来准备面试。我只用过 LeetCode,而且非常喜欢这个平台。但是,还有许多实践算法的网站。你可以自行研究一下,然后选择一个最适合自己的网站。

我当时没有意识到的另一个好处是,后来这些人愿意推荐我到他们的公司去工作,太感动了。

可见,建立人际关系网多么重要。

100daysofcode

后来,我又做了网站 100daysofcode (https://www.100daysofcode.com/)上面的题目。非常有帮助,我强烈推荐。我只做了两三轮推特的考题,然后又做了 LinkedIn 的考题。这种学习可以让你了解其他人的工作,而且还可以让你感受到社区。

博客

博客、播客、reddit 等,我经常听到有人提到开发人员拥有自己的博客很重要,所以我也决定建立自己的博客。大约有一个月的时间,每逢周末我都在鼓捣我的博客。建立博客的方式有很多种,你可以做一些研究,然后选择最好的方式。

但是,有机会重来一次的话,我不一定会建立一个自托管的博客。我也在 DEV 和 Medium 上发帖,我认为在这些网站上发帖可能就足够了。

然而,从另一个方面来说,在接受面试的过程中,面试官曾多次表扬我的博客。如果我只使用 DEV 或 Medium,就听不到这些表扬了。还有,我在建立博客的过程中熟悉了 AWS 生态系统,我使用 Amazon Lightsail、Route 53 和 S3 构建了我的博客。

我的博客是用 WordPress 构建的,虽然不如自己动手编写代码,但当时我的编程技术还不足以构建一个博客。我无需精通 Web 开发就可以构建一个 WordPress 博客,这在我看来很划算。

Java

接下来,我开始学习Java。当时我学习 Java 的主要原因是:

  • 许多大型软件公司都使用Java;

  • 编程面试中也会用到Java;

  • LeetCode 讲解解决方案的文章中也经常使用 Java。

此外,我还听说 Java 课程是学习面向对象编程语言的好方法。

请不要误会,Java 现在是我最喜欢的语言,但回到过去,我肯定不会选择专门学习 Java。如果我的目标是尽快找到一份软件工程师的工作,则肯定不会选择 Java。

学习 JavaScript 可能更有效率,原因包括:

  • 许多大型软件公司也使用JavaScript;

  • 虽然很多书中都使用了Java,但有些书(比如《Cracking the Coding Interview》)也提供在线 JavaScript 代码;

  • LeetCode 的一些解决方案也提供JavaScript,尽管不像 Java 那样常见。只需搜索“JavaScriptLeetCode 解决方案”,总能找到 JavaScript 的代码。

我对 JavaScript 一直有一些误解。我认为这是一种奇怪的编程语言,专业的工作中都不会使用这种语言。事实证明,我大错特错(虽然说实话 JavaScript 确实有点奇怪)。

在我找工作的过程中,60%~80%的岗位招聘都要求掌握JavaScript 。而且在技术面试中,6次都要求我只使用JavaScript,两次要求我使用 Python,没有面试要求我只使用 Java。

学习 Java、Python 或 C++ 等面向对象的语言没有任何问题(尽管我可能不会选择 C++ 作为第一语言)。这些都是伟大且广泛使用的语言。但是,如果你想尽快过渡到技术行业,那么在我看来,JavaScript 才是最佳选择。

非 Java 课程

如果能回到过去,我肯定不会选择课程(虽然 Java 也很棒,我学到了很多东西),我会从一开始就专注于JavaScript。

我建议你从以下两门课程中选择一门开始:

  • 2021 年 Web 开发新手入门培训班

  • https://www.udemy.com/course/the-web-developer-bootcamp/

  • 2021 年 JavaScript课程:从零到专家!

  • https://www.udemy.com/course/the-complete-javascript-course/

我完成了这两门课程的大约一半,所以向你推荐。这两门课程都有 Slack/Discord 社区,提供了很好的交流方式,你可以看看其他人的学习如何。

React

接下来,我们讨论一下 React。你可能在想,为什么我没有提及 HTML/CSS 和 JavaScript。出于某种原因,我以为我可以走捷径,跳过 Web 开发的基础,直接学习 JavaScript 的库和框架。

虽然这种方式也可以,但并不理想。如果能回到过去,我肯定会先专心学习 HTML/CSS 和 JavaScript。然后再学习库和框架。上面提到的两门课程就是很好的起点。

但是我选择了 一门 React 课程,更具体地说是 MERN 技术栈。这是一门很棒的课程,我强烈推荐。但不要学我,请先学习 HTML、CSS 和JavaScript。说实话,我对 CSS 的了解至今都不太够。

我选择学习 React,但没有提到 Angular 或 Vue,是因为如今 React 的需求更高,所以我的建议是学习 React。当然,这种情况也会发生变化。

赫尔辛基大学

你可能已经注意到,上面我提到的 Java 课程和 MERN 课程都来自赫尔辛基大学的 MOOC。我真的很喜欢这两门课程。我只上了赫尔辛基大学的这两门课程,所以其他课程我无权谈论,但这两门课程真的很优秀。

我最喜欢的是,赫尔辛基大学的课程里有很多练习。网上很多编程教程的问题就在于观看的视频太多,实际的练习不够。所以在选择课程的时候,一定要确保有足够的练习,利用学习到的知识来构建项目。

MySQL

我还上了一门 MySQL 的课程。这个课程不错,但是第一份开发工作可能并不需要。我的两次面试中问到了SQL 查询。

LeetCode

我在完成了 Full Stack Open(https://fullstackopen.com/en/)的学习,并完成了 80% 的Java 课程后,才开始在LeetCode 上做题。我在学习 Java 课程之余,每天还会做一两道 LeetCode 上的题目。在完成 Java 课程后,我就开始集中精力做 LeetCode 上的题目。

刚开始的时候,LeetCode 上的题目对我来说太难了,比我学过的课程难多了。但是,你无需气馁,根据我在 LeetCode 论坛上了解到的情况,几乎每个人在刚开始的时候都会觉得很难。你只需要加油坚持下去。

在学习数据结构和算法时,以下资源给予了我很大帮助:

  • 《Crackingthe Coding Interview》,很好的资源,可以帮助你建立正确的面试心态。

  • 《Elements ofProgramming Interviews》,这本书也很好。

  • Grokking theCoding Interview:强烈推荐这门课程,其中介绍了很多编程考题中常见的模式,可以让你更好地了解有可能遇到的算法问题。地址:https://www.educative.io/courses/grokking-the-coding-interview

  • Grokking DynamicProgramming:动态规划非常难,这门课程给予了我很多帮助。地址:https://www.educative.io/courses/grokking-dynamic-programming-patterns-for-coding-interviews

  • Tushar Roy:Tushar 的YouTube 频道介绍了很多知识,尤其是动态规划的介绍特别好。

  • Back To Back SWE:一个很好的YouTube 频道。极力推荐。

  • Kevin Naughton Jr.:这也是一个很棒的YouTube 频道,介绍了很多解决问题的技巧,而且还提供了很多建议。

  • Base CS:VaidehiJoshi 很好地阐述了算法和数据结构的基础知识。博客地址:https://medium.com/basecs

  • Pramp:面试模拟网站。你应该尽快开始模拟面试。这个网站非常有帮助,而且是免费的。

  • Interviewing.io:虽然需要付费,但很值得。你可以与真人软件工程师模拟面试。

  • JavaScriptAlgorithms and Data Structures Masterclass:这门课程是非常优秀的 JavaScript 课程。

刚开始的时候,Kevin Naughton Jr 的 YouTube 频道给予我的帮助最大。我在开始申请工作之前,做了大约 300 道 LeetCode 的考题。根据我的经验,这可能没有必要。我认为大约 100 道就差不多了。当然,具体还要看你申请的公司以及考题的难度。

系统设计

关于系统设计,有两个非常优秀的资源:

  • Grokking the System Design Interview

  • Gaurav Sen 的 Youtube 频道:

  • https://www.youtube.com/c/GauravSensei/featured

不过,在我的面试中,关于系统设计的问题并不多。我从未遇到过“你会如何设计 X?”之类的问题。最常见的与系统设计相关的问题是:“关系数据库和非关系数据库之间有什么区别?” 

如果重新来过,我肯定不会在系统设计上花那么多时间。

面向对象设计

在第一次技术面试的时候,我需要设计一个国际象棋游戏。当时,我没有学习面向对象的设计,因为我以为这种题目只会出现在高级工程师的面试中。结果可想而知,我的表现并不好。

后来,我下了一番功夫,努力学习如何回答这些问题。《Cracking the Coding Interview》有一部分专门介绍了这些知识。

不过从那以后,我再也没遇到过面向对象的设计问题,所以我认为没有必要花太多时间准备这些问题。

行为问题

实际上,有关如何回答行为问题的准备比我最初想象的更重要。我承认在参加面试之前,我以为面试官只会问一些常见的问题,比如“介绍一下你自己”,而面试还是会以编程为主。然而,我在面试中遇到了一些比较棘手的行为问题。

我发现 Dan Croiter 的 YouTube 频道很有帮助。我建议你使用 STAR 方法写出大约 20 个故事。我就采用了这种方法,而且对我的帮助很大。


#5

面试


从 2021 年初,我就开始发送申请。直到 7 月,我才正式拿到offer,前后经历了大约 6 个月的时间。听说有的人只经历了一次面试就拿到了offer,也有人努力了一年多才拿到。我们应该做最坏的打算,同时怀抱最好的希望。

我的整个面试可以分为三个阶段。

第一阶段:1月至3月

在这段时间里,尽管我已经完成了很多 LeetCode 上的考题,但我仍然没有达到自己想要的状态。其实,这段时间里我并没有发出太多的申请。我一边通过 LoopCV 发送申请,一边继续做 LeetCode 上的考题。

由于我主要依靠 LoopCV 自动发申请,因此在此期间我没有接到太多面试。我的主要精力都放在提高白板编程上。Pramp 和 Interviewing.io 都是很好的资源。第一次在 Interviewing.io 上模拟面试的时候,考官给了我很多很好的建议,而且还介绍了两个很好的资源。

  • REACTO

  • https://www.fullstackacademy.com/blog/how-to-ace-a-technical-interview-reacto

  • 技术面试手册

  • https://techinterviewhandbook.org/

此外,他还向我展示了这个LeetCode列表(https://seanprashad.com/leetcode-patterns/)。

在此期间内,我参加了几次面试,但都没能成功。但是,经过这段时间的锻炼后,我对技术面试更有信心了,于是,我开始花更多时间来发送申请。

第二阶段:4月~5月

三月底,我开始联系我的朋友,求他们推荐。互联网上有很多资源都说,获得面试机会的的最佳方式是通过朋友推荐。我认为这是一个很好的建议,但就我而言,效果并不好。虽然我朋友也推荐了,但仍然被拒绝了。

我还尝试了另一种方法,向我申请的公司发送后续电子邮件。然而,这种方式也不管用。我不确定单独联系每个人所花费的时间是否合理。

最终,我开始手动搜索工作,并尽可能地发送申请。最后证明这招最管用。然而,这种方法要想取得成功有一个关键:量要足够大。那段时间,我的大部分时间都在发送申请,可能 95% 都被拒绝了,但最终我终于拿到了面试的机会。

像这样大规模地发送申请,需要持之以恒,每天都坚持。一旦开始参加面试,就没有太多时间继续提交申请了。因此,在开始面试之前,发送尽可能多的申请很重要。

首个 offer

5月底的时候,我面试了几家公司,最终收到了两个offer,但最终都没能成功,主要是薪资没能谈拢。现在我知道互联网上有很多资源关于如何谈判的资源(比https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/)。我并不是说薪资交涉有什么问题,特别是当你手握多个offer时,就有很大主动权。但我也不得不说,如果是你的第一份工作,还是不要讨价还价的好。你应该尽量拖延,直到你有更好的机会。但是,如果你手头有三个或更多的offer,那么肯定应该谈判。

有一位高级工程师曾对我说,他见过其他软件工程师遇到的情况也与我差不多,而他的建议是,入门级的开发人员,尤其是当你没有技术背景的时候,不要交涉。从那以后,我决定下次拿到 offer,就直接接受,不交涉。

第三个阶段:6 月~ 7 月

我承认眼看着两个到手的 offer 又溜走了,我感到有点沮丧,但是我决心要拿到更多 offer。

在这段时间里,我的经历也差不多。一方面发送大量申请,一方面参加了很多很多面试。

我记得有一次在 LinkedIn 上与一位软件工程师交谈,他告诉我,可能我每天都要参加好几场面试,虽然这在当时听起来很荒谬,但事实证明他的预测非常准确。

尘埃落定

最终,我终于收到了一家公司的 offer,而且我非常高兴。后来,我还是坚持完成了其他公司的面试,甚至还收到了另一份offer,但这次我没有谈判。

我选择了现在的公司,而且我相信自己做出了正确的决定。整个面试的过程很棒,而且我的团队也非常容易相处。非常期待开始新的工作!


#6

祝你好运

 

感谢你阅读本文,我希望我分享的故事能对你有所启发。我知道在找这份工作的过程中,阅读博客文章对我的帮助非常大,所以我希望这篇文章也能够帮助到其他人。祝你好运,不要放弃!

既然我都做到了,那么你也可以!

  推荐阅读:

有哪些表现让你一看就知道他是程序员?

辞去程序员一职,我得到了哪些教训?

一位大厂程序员回老家当公务员了!

四年了,谈谈一个程序员的职场心得

四种代码洁癖类型,程序员看了直呼内行

每日打卡赢积分兑换书籍入口

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存