我是如何在自学编程9个月后找到工做的

昨天在我在国外网站 reddit 上看到一篇文章,做者分享了他自学编程 9 个月后找到工做的经历。文章不到一天就获得3千多赞,2百条回复。我看了下内容,很是中肯,其中有很多建议也是我在编程教室多次提过的。因此我连夜翻译了出来。原文略长,我作了适当的缩减。另外加上了一点个人想法(括号内斜体字)。虽然说国情有不一样,但本质是相同的,对想要入行的朋友颇有参考价值。javascript


长话短说,2017年12月,我处于人生的十字路口,不管是继续完成看不到尽头的化学硕士学位仍是从新寻找本身的出路都令我感到纠结。那时我写了一些代码(也就几百行 Python),感受不错。我决定靠着积蓄来学习编程,直到找到一份开发的工做。php

回顾这个漫长而艰难的旅程,我想分享一些经验,它是如何开始以及如何结束的。个人观点没有特别的顺序,虽然我会先写一些我认为最重要的。html

1)设定一个很是精确的目标。我是指现实的目标。这是你旅程中最重要的方面,你须要对终点线有清晰的认识。你学习编程,是由于想解决一些实际问题吗?也许你想要自动处理你工做/生活中的一些任务,也许你想破解游戏,也许你出于好奇心,也许你喜欢学习新事物,又也许你是一个想开发应用却没有资金的企业家。而本文中,我主要针对想要经过学习编程找工做的角度来谈。前端

2)若是你的目标是找工做,就盯着就业市场看,而不是 Twitter 和 Medium 上的热点。还记得第一点吗?你必须设定一个很是精确的目标。诸如“我想成为一名开发人员并从事游戏行业”这样的目标就过于模糊。你的首要任务是什么?是寻找一个真实的开发工做,仍是在游戏行业工做?若是你在游戏行业找不到工做怎么办?你的城市没有此类公司,或者你达不到游戏公司的要求怎么办?其实不论你学习哪一种编程语言,我敢说未来某一天这些知识均可能用在游戏开发上,只要这是你的目标。你将须要学习大量的新东西。可是你有解决问题的能力和编程知识才能迈出第一步java

你是一名自学成才的开发人员,不是 MIT 的优秀毕业生,找到一份异地的工做会更难。我在2017年12月犯了一个错误:我认为首要任务是找到一份前端开发的工做。但我没意识到,在个人地区 C#/php/Java 的工做与前端 JS 工做的比例为9:1。所以,请查查你所在地区的公司,看看它们的职位和要求。node

(若是你的目标是转行,不妨从初级职位先入行,再不断调整到你指望的方向)webpack

3)永远永远不要假设在编程中什么更难什么更容易。当我决定学习前端时,我这样作了。这是一个巨大的错误。很差说前端比后端更容易,或是更难。关键是,你也没法知道本身会更喜欢什么,更适应什么。因此不要假设。永远不要认为 JavaScript 比 C 更容易或是更难。不一样工具对于不一样问题的有不一样的复杂性,你尚未到能区分什么“更难”什么“更容易”的程度,我也是。就别去衡量。你能说清,从如今开始的24个月内,在某平台上提高渲染和网络性能比优化基于地理空间数据预测天气的算法“更容易”吗?你肯定在复杂的实时应用程序中管理状态比编写着色器或教电脑如何翻译或绘画更容易吗?你根本就不知道。因此,千万不要作这种无脑的假设。git

4)坚持学习。你有多少时间学习编程?你是学生吗?仍是失业了(就像我同样)可是有足够的积蓄来投入学习。你的目标要符合实际,但要坚持。天天写1小时代码会比每周写一次7小时的代码会使你成为一个更好的程序员。程序员

5)没必要懂得职位所需的一切。对于框架和库尤为如此。顶级公司很是关注数据结构和算法,这代表你能够思考并解决问题。更具体地说,不管你选择何种编程语言(Java,JavaScript,C#,Python 和 PHP 中的任何一种均可能找到工做),尽量地学习它的基础知识。我学习了前端开发。我以为这须要从 html 到 dom,学大量的库,transpiling,webpack 等等。但实际上,在求职面试中,这些话题不多被问起,他们只想知道我是否真的了解 JavaScript。我申请了3个前端 React 工做,没有人关心你是否知道 React 的调用(个人意思是,若是你学习 React,你应该至少具有它的工做原理的基本知识),但成为一名优秀的 React 开发人员所需的核心知识就是了解 JavaScript。若是你了解 JavaScript 和 dom,那么学习 React 只须要一周的时间。不然你永远不会成为一个好的 React 开发者。高阶函数,this 绑定,这些是 React 开发人员天天须要真正面对的问题和知识,其他的都是谷歌搜索。这一样适用于任何其余语言。若是没有扎实的语言基础,各类 bug 会让你束手无策。仅仅读过一些东西,并不意味着你吸取了它,更不谈掌握它了。一个会 10 种技能/工具,但并不真正精通一个的人,很难取得别人信任。web

6)尝试寻找一个导师。Slacks, IRC, Discord 上不少人比你有经验,你也许能找到愿意长期帮助你的。感谢 freenode 的 javascript 频道全部成员对我学习的帮助(特别是 ljharb,slikts,stennowork,liste,innovati,zsoc,cjhonson,qswz,GreenJello,sillyslux)。请注意,我不是让大家去联系这些人,他们在讨论组中提供帮助而不是一对一。两个建议:1. 不要考验导师的耐心和意愿。若是你一直在问能够搜索或书上查到的基本问题,他们会厌烦并懒得回答你。2. 程序员,包括你在内,都但愿别人承认本身的聪明,我认为这是理性人的本质。你能够利用这一点,好比:若是你进入聊天室并写“平心而论,我以为在座各位不会绑定箭头函数”,你会获得20个回复。而若是你问“箭头函数怎么用?” 可能不会有任何答案。

(一个过来人的建议和指导对于学习很是有帮助,这是任何书本、教程或者视频都没法达到。关于这点,参与过编程教室码上行动的各位同窗应该深有体会)

7)了解什么是编程将数据做为输入,对它作一些处理,生成一个输出。这就是每一个程序所干的事情。把两个数字相加:输入数字 -> 处理 -> 输出总和。在屏幕上渲染3D模型:相机+顶点矩阵 -> 处理 -> 屏幕上的2D图像。在网站上设置你的我的资料图片:数据输入+地址 -> 处理 -> 来自服务器的响应。这就是编程的所有,一切都是为了计算。数据 -> 处理 -> 数据。不过我对数据结构和算法知之甚少。我不太能实现归并算法或实现复杂的数据结构,在面试中也没有真正要求它们。知道时间复杂度和不一样数据结构的应用对于个人面试来讲已经足够了。但在其余公司和职位上可能会有所不一样。

8)了解程序员作什么。他们经过代码解决问题。做为程序员,你须要解决问题(一般由你本身建立)。不能解决代码的问题,那要你何用。若是你认为跟随 youtube/udemy 上的一些废话视频可能会让你成为一名程序员,那就大错特错了。看别人替你解决问题意味着你没有提升问题解决技巧。因此当你没法理解某些代码时,别急着谷歌或问人。要知道,这就是你要面对的工做。善于解决问题,有些多是语法问题(如前所述),有些可能与性能有关,等等。学会使用调试器。代码只是想法的实现,习惯用铅笔和纸编程。定义好你的问题,输入,输出以及如何从一个到另外一个。整理你的代码,看看你乱七八糟的面条代码,看看你凌乱和命名不佳的函数和变量,超过几百行就难以维护的代码,试着改进它。

9)掌握计算机的基本常识。认真脸。你起码要了解冯·诺伊曼结构和内存模型,这些几小时就能学完。哪怕是经过维基百科、Youtube 或者是一些博客,至少作下这件事。搞懂内存模型和调用栈,你的代码水平将会提高,你也会码得更快。你不再会搞不清:为何你不能修改一个字符串,或者为何是经过引用而不是值来传递非基本类型。这对提高你的学习速度,加深你对计算机运行原理的了解具备重要意义。

10)不要跟着视频学习。你须要作得事情越高级,越小众,你能使用的资源就愈来愈少。你要习惯用谷歌也搜索不到多少信息的状况。你将会须要使用文档不多或者为零的程序库,须要查看代码来搞清楚为何这个库改变了那个对象类型,或者运行状况和预期不一样。去 Github 上看一些热门的库,那里有不少问题可研究。在你以前,那些优秀的工程师历来没遇到过这些问题。我知道这不容易,但这是个好习惯。我还没见到过哪一个编程问题在视频中比在出色的书或文章中写得更好。并且要注意,不少作这些课程的人并不必定是优秀的程序员;即便他们是,他们也不见得是好的老师。我不是说“不要使用视频”。有不少视频帮了我大忙,帮我理解概念,解决问题,以及看怎么使用一些技术。可是不到最后,不要用这个资源,不要依赖它。好比我本身很喜欢 Andrew Mead 的 React 课程,但若是我没有本身去研究,一遍遍尝试,那我看到过的内容都没变成我本身的。靠着某个视频,了解关于某个软件特定版本的例子,只是不得已的替代方案。

(你以为真正的编程大牛会成天开直播给你讲怎么写入门代码吗?)

11)调试和版本控制。这对于学习语言和计算机基础是最重要的,也是工做环境中最须要的东西。其次是工具的使用。若是你掌握 Java,那么学习 Spring 比学习 docker 和 git 要容易得多。但你可能会花 95% 的时间来编写 Spring 代码。又好比你掌握 Python,你能够在一个周末学会 Django,但须要花更多时间学会调试错误的 Python 代码。关于 IDE 也是,知道 5 个 IDE 不如熟练使用 1 个。这些未必是初级职位的必备技能,你能够不去了解它们,但这个东西是长期有用的。

调试 debug 版本控制是区分新手与程序员的重要标志,对求职也很加分,参考 开发5分钟,调试2小时 - 该如何debug?

12)不要试图一次学习太多东西。小步走,但要稳。我犯过这样的错,而且付出不小的代价。不是说读 Hennessy 和 Patterson 的著做没用,或者说关于设计模式的阅读是无用的,也不是说看 Youtube 视频、有趣的技术讨论、阅读行为驱动设计没用,可是还记得第一点吗?你必须明白什么是首要的,扎实走好每一小步。若是你和我同样,充满好奇心,那很好。可是,先找到一份工做,在一个温馨的环境中,拿着一份薪水,跟着资深开发者学习,而后回家尝试用 Rust 编程,看关于不可变性的谈话,难道不是更好吗?

关于招聘:

13)人脉 > 经验 > 知识。

大多数公司都是长期招聘,但没对外公布,可能他们的网站上连个“联系咱们”都没有。因此在找工做时,人脉相当重要。我强烈建议你加入当地线上的社区,线下的更好。我寄出的简历全都没有回应,我获得的全部面试机会都来自我认识的人。当对方知道你是个开发者时,可能会对你说,“你感兴趣的话,我能够把你的简历递给个人头儿。”

若是你是自学的开发,那求职可能有些难(不过这个视地区和职位而定)。尽管你技术很强,知识丰富,但你的简历上没有经验可写。只是说我会 Python,没人会给你面试机会,由于你无法证实。招了你可能意味着公司要赔钱。养着几个不产出还拿工资的开发者,人力部门不如作一些别的事。我知道技术过硬却无法展现是怎样地痛苦,但现实就是这样。

因此人脉以后,第二重要的是有经验。你有两个选择:参与开源项目(写点有用的库/模块,哪怕提交一个好的修改也能加分)或者开发一些人们会用到的东西,甚至是给别人无偿使用。我选择了第二种。我为咱们市的一个足球俱乐部开发了一个应用,这个俱乐部须要通知球员周日哪些青年球队会来比赛。这个应用算不上好,但每周数百人都要用到。你能用代码解决一个现实生活中的问题,知足人们的需求,已经很了不得了。我还给我叔叔写了一个短租网站,没有实时预约的复杂数据库,可是解决了他的问题。就算它有不少反模式,影响大吗?可能你作了一个精致的 Instagram 复刻版,代码也更清晰,可是会有人用它吗?其中有你的原创吗?可能你有一部智能电视,你老是要把硬盘里的各类节目拷贝到电视机上来看,为此感到心累时,有想过作些什么吗?你有一个路由器,还有一个能够安装软件的程序的电视机。不如花一个月写一个粗糙简陋,但却有用的 app,可让你的电脑和电视进行数据传输。这些写到简历上也很好看,由于他们给你机会来谈论你是怎样解决问题的,好比你什么地方作得好,什么地方作得很差。个人第一个 React app 没有用状态管理器,随后我遇到不少由此致使的问题,维护代码也愈来愈难。我遇到了问题,解决它,并且能知道个人解决办法是好是坏。看看你的周围,你能作哪些事情来帮人们解决问题?从你本身的问题开始,继而关注别人的,哪怕是作免费服务。而你用 Django+PostgreSQL 完美复刻 Twitter 有什么好谈的呢?

(不少人说学完基础不知道作什么,但其实身边到处均可能用到编程。咱们也举过不少例子,公众号Crossin的编程教室里回复关键字 项目

最后就是你的知识,并且这很重要。若是没人帮你递简历,说你是个优质资源,那知识就是你最后的王牌。你发布了两个安卓的应用,简历上至少有东西可写。可能你回答不了被问到的问题,但若是给你时间,你总能作出一个产品。因此知识成了你惟一的资源,但不那么有力。当你坐在一个 10 年经验的人面前,说着“value”而不是“variable”,别人就对你的水平有所了解了。假设没人推荐你,没人用你写的代码,你的 GitHub 上是一堆刚初始化或者废弃了的项目,或者是从教程里复制来的一些片断;假设你被问到一些基础问题(其实也是最难的),而你不能自信地给出一个清晰的答案,谁会付你钱呢?

14)小贴士1:若是在你正式找工做前有 6 至 7 个月的准备时间,我推荐学下 C 语言。这是一门很小的语言,但能够教会你不少。这么说吧,若是我在花 4 个月学习另外一门高阶语言以前,先花 2 个月学习 C 语言(天天至少 4 小时),而且解决一些 Leetcode 上简单和中等难度的问题,我会成为一名比如今更优秀的程序员。如今技术太多,高阶语言中有大量“噪音”。你很快就会从“我怎么样从 input 到 output ”这样的问题上被引诱到别的关注点上,而这倒是写一个完整代码最最基本的步骤。我知道编写“input”和“output”一点也不酷,但还记得第一点吗?咱们须要尽快找到一份让本身能挣钱的体面工做。学习 C 语言,可能起初比较慢。但当你学习下一门语言时,你最后会发现和使用 C 语言解决问题是同样的,只不过要使用无数的 API。

15)小贴士2:学会管理你的时间。你成天坐在电脑前学编程,顺手刷一刷各类网站颇有诱惑力的,但这些都是在浪费时间。若是你能把时间管理好,那你的准备时间能够大大缩减掉几个星期甚至几个月。

16)小贴士3:休息,社交,恋爱,娱乐,照顾本身,这些都超级重要。一我的坐在那里,成天看着博客,盯着Visual Studio,对你的精神健康没有好处,并且会让你和别人格格不入。努力学习,懂得自制,可是在生活的其余方面也要自制。由于一旦这个平衡被打破,其余地方也会出问题。

就写这么多,若是写太长了,请不要介意。但愿有人会以为这篇文章有帮助,且这只是我我的的看法,可能会有不少人不赞同。


做者:ep1939

原文地址:

reddit.com/r/learnprogr



════

其余文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | 如何debug? | Python单词表 | 知乎下载器 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 高考 | requests | AI平台

欢迎搜索及关注:Crossin的编程教室

相关文章
相关标签/搜索