坎德人的小包包

欧剃,游荡的坎德人,在他的旅途中收集了许许多多有趣的东西。

发表日期:2017-06-30

学员访谈:30岁才转行学编程是怎样一种体验

—— “沉迷写代码,跟紧老司机,而且永不言败”

作者:Brad Crispin


“沉迷写代码,跟紧老司机,而且永不言败”

人们经常问我,想知道我是怎么开始学编程的。当他们知道我30岁之后才转行学写代码的时候,往往都一脸惊讶。

我想谈谈我自己的故事,说说我自己是怎么从完全一无所知开始,到现在得以在优达学城这样一家硅谷的技术教育企业做全栈工程师的经历。特别是在当下,几乎每一个初级网络工程师的职位似乎都要求拥有“计算机相关学位或两年专业工作经验”的时候,我这种半路出家的人是怎么能找到一个稳定的开发工作的。

在这期间,我跟家人闹过别扭,耗尽了存款,自信心也被狠狠砸碎,还放弃过。之后,在一年的反思与回顾之后,我以全新的心态重新投入到学习之中,后来的情况,如你所见。

目前,我带领着一支有10名工程师的团队,负责几种核心系统的开发,包括报名系统、学生作业代码审查、课程导师辅导与实时帮助、课程论坛以及我们专门为学员量身定做的“Udacity Connect”教学计划。我们给成千上万的学生提供免费的编程入门和付费的纳米学位课程,提供先进的职业发展规划——比如人工智能、机器学习和无人驾驶车工程师等内容,以及一些更主流的软件工程开发课程,比如 React 、 iOS 和 Android 开发等。

从入门到放弃

大约在第七年个年头,我对人生中的第一份工作已经完全失去了信心,我完全无法忍受自己下半辈子都要继续干着同样一件事的想法,并且我决定,要成为一名软件工程师。我当时也不知道为啥就要走程序员这条路,就觉得自己像是着了魔一样,全身充满着想要用计算机做出点名堂的热情。但我的条件并不好,首先我并不擅长数学,其次我根本不认识任何做这一行的人,况且我完全不知道自己将面对的是什么,也不知道我会不会喜欢这类工作。我朋友们对此的表示是:① 你是不是有毛病吧? 以及 ② 你学这个年纪也太大了点吧?

2014年初,我参加了 General Assembly 公司在旧金山开办的 Ruby/Rails 编程集训营。那时搞这种培训的机构还不多,学习体验也比较原始。当时培训班上人超多(他们合并了两个类似的班级),大家的编程水平都参差不齐。课程设置一直在变,让人觉得混乱不堪。几个星期之后,学员中开始传着“之前的毕业生有的至今还没找到工作”之类的风言风语。大家明显陷入了一种群体性的焦虑情绪中——我们为这辞掉了工作,又交了万把块钱的学费,可这样真的能让我们成为真正的软件工程师吗?后来,在交第二个学期的学费之前,我就离开了那里。从现在看来,这段经历其实让我获益良多,它让我明白,这个行业其实有很多优秀的导师,也有很多同学经过努力,走上了优秀网络工程师的职业道路——虽然当时的我并不清楚这些。

接着我花了一个月时间,依靠自己的力量去自学 Javascript ,写出了一些前端开发的作品集,并试着去揽了一些小的外包项目来做。早期这样的专注还是富有成效的——我确实做出了一些东西。但这种乐观的情况并没能持续多久,在连续几个月处于这种不稳定的工作状态下之后,我心中再次充满疑虑。

这段自由职业的初级码农生涯,给我带来的体验是:

  • 我花在找项目上的时间跟写代码的时间差不多
  • 很难有条不紊地一个接一个做项目。
  • 我没法得到很多的技术反馈信息。
  • 缺乏稳定的收入,给家庭带来很多压力。
  • 没有人能告诉你,你学的东西到底对不对。

我觉得有点不知所措。我也开始去了解找一份全职的开发工作到底需要哪些技能。我听说,在硅谷有很多自学成才的程序员,但当我真正去看那些 IT 企业的职位要求的时候,却完全不像是这么回事。那真的让我非常困惑而且沮丧。几乎每一个初级网络工程师的招聘要求里都写着“要求拥有计算机相关学位或两年以上专业工作经验”。如果一定要有学位才能参加专业工作的话,没有学位的人怎么能拥有的了这”两年专业工作经验“呢?自学的程序员要怎么样才能找到工作?

那段时间,抱着或许能得到一份工作的一线希望,我盲目地发出了许多申请,忐忑地研究着面试的流程。我发现,我在数据结构和算法等方面可算是一无所知,也完全不知道该从哪儿学起。突然之间,绝望击中了我。我离任何我想要的职位要求都差着十万八千里,就算人家肯垂青给我面试的机会,我也完全不懂得怎么样才能通过面试…

那时的我,觉得自己是多么微不足道啊。花了半年多时间,几乎耗尽了仅有的积蓄和家人的信任,却还只是一个只学了半桶水,只能做点外包的 Javascript “临时码农”。于是我做了一个实际的决定——放弃。我告诉朋友和家人,我犯了一个冲动而昂贵的错误,我重操旧业,找了一份和我原来职业类似的全职工作。

从放弃到重新入门

不久,我开始后悔了。有人说,只有放弃的人才是真的失败了,而我真的就那样放弃了么?

我在这样的状态中过了一年,始终无法将这个念头从脑海里赶走。不论是因为什么原因,我又继续尝试着写代码,这里写一点,那里做一点。编程似乎变成了一个令我苦恼的业余爱好,它占用了我大量的时间,还经常让我沮丧。我没能做出什么真正拿得出手的东西,但我永远无法摆脱编程对我的吸引,我渴望着创造的激情,而不是只能仰望着别人的作品。

我回顾了自己失败的原因:

  • 我放弃了
  • 我不知道自己在做什么
  • 我没能得到优质的项目经验或技术反馈

于是我给自己定了个计划:

  • 不能放弃
  • 找一个导师
  • 为了好的经验,就算白干也值得

我告诉身边的每一个人,就算我一年之前失败了,我还是要再努力一把。

首先,我需要工作经验。

重新入门靠实习

在这之前大约一年,我在 Hacker News 上看到一篇安全方面的文章,作者是 Loren Sands-Ramshaw 。好多年前我似乎曾经跟他念的是同一个大学——但当我在自由艺术之类课程的及格线上挣扎的时候,他已经精研计算机科学,去为 NSA 干活了。我还曾给他写过信,问了许多关于该怎么学习编程的问题,他给了我许多体贴而充满鼓励的答复。

我回想到之前这些事,就在领英上看了他的个人资料,发现他正在做一个名叫 Parlay 的“打赌” App :用 Meteor 开发的 Javascript 程序,用上了 Cordova 的服务端,以及一个比特币仓库。我立刻给他写了封信,自告奋勇希望参与开发。在一个简单的面试后,他同意让我加入开发工作,虽然只有一些象征性的薪酬。(顺便一说,他现在是 Meteor 和 Apollo 项目的核心开发者,以及高薪的技术顾问!)

这事完全改变了我的生命轨迹。我得到了机会,接下来,我只要努力把事办成就好了。

做个超级实习生

我原来的工作就属于客户服务行业,所以我的直觉告诉我,做实习工作,就要把手上的功课完成。当然这还不够,最重要的是对工作任务必须及时响应、态度积极以及全力投入。

  1. 要是没能把握住一条信息的意思,不要干坐着发呆超过5分钟,尽快把这事情搞明白。
  2. 只要有可能,尽量用“是”来回答。
  3. 在工作上超标准要求自己,投入额外的精力,你的实习导师会回应你的努力。
  4. 在你还没有付出努力去查找之前,不要一张口就问某段代码做什么用或者某个功能在哪里这样的低级问题,读代码,看文档,尝试理解它。这样即使问题还是没有解决,你也能获得更多的助益。

但是,你也不是没有报酬天天只要看文档的!对我来说,我在每天的任何时候都要尽可能提交代码,在凌晨两点发起的合并请求,就是我认真工作的最好证明。

如果你够严肃认真,如果你够投入其中,你就能学得很快。

实习体验:快速学习的秘诀就是要沉浸其中

从我自己的经验来说,学习编程和学习一门外语其实也非常相像。关键就在于,你必须让自己沉浸其中。大学时,我曾在俄国生活过几个月。完全接触不到你熟悉的语言,你变得极度渴望理解周遭发生的事情。这是一种实质性的痛苦。但沉浸其中几个星期之后,你会发现学习进度会呈指数式增长。

我尝试用同样的办法去学习编程。

沉浸其中,意味着 100% 的专注。如果可能的话,不要朋友,不要饮料,不要电视,专心读写代码。如果你分心看了五分钟新闻,小心,你可能已经破坏了专注状态。保持专注,保持耐心,你的头脑会适应的。在沉浸状态,你要消除一切可能分心的东西,在这之中你可能会发现,疑虑是对你影响最大的那个。而这投入与否,往往就是成功和失败之间的区别。

你怎么知道自己是不是已经沉浸其中了?如果你还没梦到自己在写代码,说明你投入的还不够。

每个机会都是有时间限制的,所以你得尽可能快地学习,试着将这种学习方式发挥到极致。

从实习到就业

当我完成实习,开始寻找一个正式工作的时候,我整理完善了之前的作品集,并把技能展示的重心放在 React 框架和 Node 环境的开发上——目前在这个方向上的职位需求还是相当多的,我很喜欢这方面的项目开发工作,而且我觉得在这个方面我成功的可能性更大。我的实习经历基本是基于 Node 的,于是我在 Udemy 上选了一门非常棒的课程,就是 Stephen Girder 老师上的 React+Redux 入门教程。在完成深入的 Javascript 开发岗位的实习之后,我发现自己的工作效率和自信都远胜以往—— React ?轻松愉快。 Redux ?没啥问题。GraphQL ?小菜一碟。沉浸式学习和导师的帮助确实成效显著。

在实习期间,我的导师 Loren 让我去优达学城学了一个和 Google 合作搞的浏览器渲染性能优化课程。那个课程非常棒,这也使我注意到那里提供一类针对职业发展专门制作的纳米学位课程。我对这个课程非常好奇,心里暗暗地记了下来。

当我在寻找网络工程师职位的时候,我又想到了这码事。我认为,一个正规的职业培训应该会对我有所帮助,于是我又去优达学城那里,详细地过了一遍他们的培训科目。在那时,优达学城的全栈工程师纳米学位只有 Python 方向的,而我个人更希望能针对全栈 Javascript 开发的方向。不过我的导师还是鼓励我,在时间允许的情况下,可以去学习一门强类型的语言。于是我选了 iOS 开发课程,学了 Swift ,实在是太有趣了。不过我并不是在建议你分散你有限的精力去同时学网页/移动页面和前后端的开发,特别是你如果还在找自己的第一份工作的话!(对了,优达学城现在已经有一个针对 React 方向的纳米学位课程了!)但我也还是强烈建议你去学一门强类型的语言——这改变了我写 Javascript 的代码风格。同时,我觉得优达学城在课程培训的过程中,有计划地帮助学员建立自己的作品集,还对学员的简历提供专业反馈和面试练习的做法,实在是给了我非常大的帮助。

随着课程接近尾声,当我终于开始寻找全职工作并为面试做好准备的时候,我从 Udacity-Blitz ——优达学城面向学员开放的外包平台——获得了一次面试机会,这个项目做的正是我所熟悉的 React 项目。当时,面试官告诉我,是因为我那三个月的 Javascript 实习经验和我的 React 作品集让我获得了面试机会。总的来说,对于这些外包项目,我认为你个人作品的质量比你为技术面试做的准备重要得多。如果你是一个纳米学位的毕业生,你一定要去 Udacity-Blitz 上试一试。他们已经为各类知名企业——包括优达学城自己——实施过数以百计的外包项目,我就是在那里找到一份临时工作,并获得我那“做个超级实习生”的经历的。

我努力完成了任务。六个星期之后,我获得了优达学城一份全职职位的面试机会。我花了大约两个星期仔细准备面试,具体采用的就是优达学城的技术岗位面试课程,可以说是非常详尽。这让我对技术面试有了一个概念框架,也给了我许多自信。具体面试的过程中,优达学城更强调解决问题的能力,重点在 code challenge 而不是单纯考算法题——我觉得这对行业来说是一个好的趋势——不过如果熟悉数据结构的话当然还是非常有帮助的。

我永远都感激 Oliver Cameron 给了我一个成为真正工程师的机会,也感谢后来 James Richards 让我尝试管理一支团队的这份信任。

最终的思考

反思我的软件工程师之路,我走了许多弯路,但也获得了一些经验。总的来说,在我失业的那一年里,我学会了谦卑、不懈以及专注。

我很幸运,能和超棒的同事一起,为价值观一致的公司,干一份我所热爱的工作。我的建议是:沉浸其中,跟紧导师,永不退缩。我保证,这肯定不是一件轻而易举的事。

(本文已投稿给「优达学城」并发表。 原作: Brad Crispin 译者:欧剃 转载请保留此信息)

编译来源: https://medium.com/udacity/how-i-learned-to-code-in-my-30s-61ad21180208

标签:UdacityTranslateNanodegree

Powered by Jekyll on Github.io
2022 © 欧剃