小M,BitTiger学员,目前在湾区的一家公司做软件工程师。EE本科、EE研究生,EE实习背景,无CS背景,没有学过CS知识。在BitTiger学习后,拿到了硅谷公司的SDE offer和东部某银行的SDE offer。

我最近刚拿到三个offer,在这里跟大家分享如何从完全零基础一步一步成为硅谷软件工程师。我之前一点CS基础都没有,原本想要找EE方面工作,但由于领域的限制,最后不得不转CS。

 

为什么想转专业呢?我在转专业前又走过哪些弯路?

 

 

1.错过毕业之前的秋招

  去年五月毕业,求职却在同年三月才开始,浪费了前一年秋招的宝贵时间和机会。因为当时大家都说机会很多,不用着急,所以就错过了最好的时机。

 

2.硬件的学习与实习并没有带给自己成长

  由于学校知识并没有给面试带来太多的实用价值,毕业后一直都在自学准备硬件求职。后来去了一家硬件公司做FPGA testing的实习,说实话我的内心是拒绝的,因为做的不是核心技术(大部分本土硬件公司的核心技术不会对外国人开放),而且主动写码的机会不多(没错,硬件也是要写码的),我的工作就是处理我的advisor当天没处理完的test。可是advisor也并没有教给我在学校学不到的应用知识,每天就是硬着头皮自学。最烦心的是每天需要坐2h地铁+20min公交,来回就是五个小时,回到家还要学习准备面试,想要找全职的硬件工作。

 

但硬件市场是真的不景气,大多数公司不要应届生,加上自己在硬件这方面也没有特别突出的地方,所以投了几百封简历,却连个据信都没有。到后来整个人很疲惫,压抑了很久。不舍得放弃6年的专业,毕竟是投了时间和精力的,其实我并不在意薪水微薄,关键是工作能不能让我学到更多的知识,能不能成长。从我这次实习经历来看,并没有对这两方面有多少帮助。

 

3.下决心转CS

 基于上面的EE实习经历及求职经历,我开始思考该不该转行?因为当时很多身边的人,真正成功转CS的人并不多,大家还是关注在EE领域,或者回国。转行的决定很难,不知道如何下手,也很怕付出代价,毕竟是学了6年的专业,说放弃就放弃还是很心疼的。关键是不知道能不能转成功,转不成功该怎么办?纠结了很久很久,终于还是决定放手一搏。反正都是要学,CS开放的资源那么多,很多前辈又总结了经验,一旦找到工作,回报还是很可观的。毕竟当前的主要矛盾是生存。11月份辞了职,12月1号飞到了加州,准备边刷题边找工作。

 

转CS后如何展开学习准备

 

 

当时零基础,不知道tree,不知道hash table,更不知道dp,union found。特别害羞不好意思问人,就什么都憋着自己查。其实有时候1min找人能解答的问题,完全没必要花几小时甚至半天去查,效率非常低。我是这样找到适合自己的路的。

 

1.找前辈询问转专业的经验

   不能盲目听从,自己学会判断,别人的路不可复制。寻求前辈转专业需要准备的内容和执行的步骤。

 

2.花一周左右做career research。

了解前端、后端大致做什么,需要什么技术栈。我最后选择了后端。

  • 前端:相对简单,技术栈多而杂,更新换代特别快,面试注重技术,JS等;
  • 后端:相对难,技术栈更新慢,面试注重算法(看起来是有捷径可走),长远角度 pay 会相对高一些

 

根据前辈的建议和自己的研究,我做了初步学习计划:

 

1.选择一门合适的编程语言

  • Java,当下公司招聘最火的语言,空余的时间可以学习JavaScript 和 Python等
  • 资源: YouTube各种视频 + Tutorial Point(神器)

2.了解基础数据结构(array/tree/list/map/stack/queue)等等

3.刷Leetcode

4.查漏补缺,根据Job description学习比较常用的技术栈

5.准备 Resume 和 Projects

6.边学边投简历

 

在做学习计划时不要以刷题数目为直接导向,一定要确保基础知识没有死角,不能只刷array和tree,而stack不刷之类的。转专业同学,CS方面的基础知识要补好,这些都是在早期做学习计划的时候要做好的。

 

投简历需要很长的时间线,不是说投了就会有面试。作为一个new grad,如果是海投,命中率非常非常小。如果是别人内推,就算给你面试,从HR联系你,到最后约电话面试到最后现场面试是很长的时间,所以不用害怕,你有足够的时间准备,要相信自己。一旦有任何机会,都可以找人推。毕竟机会留给有准备的人,不然到时候身边有很好的资源,但自己没有准备好,就会丧失宝贵的机会。

 

做完学习计划后我的实际情况是自学 Java,不是很顺利。因为急于寻求快速入门的方法,任何一个大神说的话都盲目遵循,结果越来越不知道自己在学什么,因为没有上过算法课,Leetcode 的题都不会,非常挫败和沮丧。数据结构也不会用,算法答案看不懂,十分沮丧,怀疑自己的智商,严重否定自己,还曾经一度想放弃。

 

万事开头难,大家都是这样,开始刷100道题的时候,我感觉自己都不知道做什么,很多时候就是在背答案,甚至看不懂答案,但是这种情况一定要挺下来,因为大家智商都没有问题,就在于谁能够坚持。坚持到最后肯定会笑到最后。我一共刷了300多道题目,但身边有很多刷到400题的伙伴,在刷题过程也经历了不同的阶段。后面做的越来越多脑子里会形成自己的思路,一看就知道该用什么方法,而且都能有自己的优化,脑子会转的非常非常快。

 

  • 前 100 道 – 可能什么都不会,很挫败,前100道时间是最长的,大脑正在构建代码和逻辑思维,比较混乱。
  • 100 – 200 道 – 对于非hard题目,能写框架,但是代码能力欠佳,思维不缜密
  • 200 – 300 道 – 可以不借助于答案,独立思考,大部分情况算法都是对的,可能有bug
  • 300 – 400 道 – 放飞自我,得心应手, 能主动优化

 

如何刷题 – 初期

 

  • 按照BitTiger实战课每周上课讲的题目和留的作业刷题,都是比较高频的题目,大家可以在刷题初期到网上做下研究,有很多列表高频题。
  • 对于不会的题目,不要纠结,看十分钟没思路就看答案
  • 对于实在看不懂答案的题目,可以根据答案把代码敲一遍,敲完也许就懂了/在理解的基础上背答案,把不会的做个标记,及时询问解决
  • 除非有CS基础或者数学基础,不然先不用纠结最优解

 

如何刷题 – 中后期

 

  • 按照 Tag 刷题,先 easy 后 medium、hard 酌情
  • 如果有面试, 就按照公司 Tag /高频面经题
  • 真正理解不要背答案
  • 保证最优解,做完题记得思考一下时间复杂度,空间复杂度

 

学习过程中的几个经验

 

1.学会在压力中成长:

  • 我们要充分认清自己,人无完人,不可能所有知识一夜全学会,只能脚踏实地一步一个脚印的努力。
  • 答案看不懂,就带着test case走一遍,一遍不懂走两遍,两遍不懂走三遍,一直到懂为止
  • 不要遇到不懂去问,要独立思考,学习初期只能一遍遍不断重复,靠数量改变质量(适合小白)
  • 思考是否需要重新读一个master,报名学习机构还是坚持自学?因为朋友推荐系统性学习,所以我选择了报名BitTiger
  • 学会处理压力,处理焦躁情绪 ,可以通过运动来减缓焦虑,提高学习效率
  • 敲黑板!!抛弃一切不必要的社交。当时刚来加州,身边好多大牛,想着或许该好好社交一下,对以后工作有帮助。在什么都没有准备好的情况下浪费了很大精力。
  • 认清主要矛盾,当前主要矛盾是生存,是offer,因此放弃了很多社交玩乐活动。

 

2.伙伴的重要性

 

找伙伴一起学习是非常重要的,我刚来加州是自己一个人,那时候什么也不会,也没有人可以交流,很孤独凄凉。很感谢一个同为BitTiger学员的女生,她来湾区找工作,然后我们每天在一起刷题,成长非常快,可以互相交流,互相监督。大家可以上刷题群或者论坛发帖子,找寻一起刷题的小伙伴,2-3即可,人多也会效率低。还有讲题小组,每周互相讲题1-2次,一定要积极参与,每讲一道题就相当于自己在mock interview,伙伴会告诉你的缺陷在哪,帮你改进。

 

3.补充CS专业知识

在课余时间应该补充CS基础知识,充分利用网上的学习资源,合理安排时间刷题和学习。

  • 光刷题是远远不够的,算法不一定是最主要的。我面试时算法很简单,反而问了很多project出现的东西,例如kafaka、spark之类的技术问题。
  • 合理安排自己的学习时间,每周七天,每天刷题  6-8小时刷题,晚上2-3小时做project,project一定要知道你每一步在做什么,会被问到很多知识点,比如noSQL/mySQL区别等。
  • 投简历前根据JD来相应补充前端、后端比较火的技术栈:JS、RESTful API、Django、Spark、Kafka、databases, 时间有限,不求精,但得懂,面试的时候能有可聊的。
  • 选择合适的 project –  GitHub,BitTiger,Coursera, Udemy,Udacity,我一直跟着BitTiger做项目。

 

4.给自己明确Timeline

能三个月完成的事,绝不六个月完成,时间战线拉的越长效率越低,忘得越快。

  • 明确刷题周期:3个月(因人而异)
  • 这个刷题周期里需要完成多少题量,完成多少project,合理分配到每月、每天
  • 建议刷到200就开始要投简历,把握好时间线

 

 

求职进行时:我的经验

 

 

关于投简历

一定要投,不要害怕,湾区那么多软件公司,这个失败就下一个,什么公司都试一试,心仪的公司可以往后放一下。一份面试从HR电话 -> 安排 phone screen/OA -> 安排 onsite -> 出结果,周期很长,一般在 1 – 2 个月,所以不能干等。

 

利用一切可利用的时间海投。下载LinkedIn,Indeed,Glassdoor,把简历存在手机,任何时候都可以投,我在等饭等车的时候也会投简历,只要看到有匹配的关键字就投。虽然这样的命中率是3%以下,100个可能回3个,但等车的时间浪费也是浪费,还不如来换取这3%的回报。

 

内推效率最高,面试几率最大 ,一定要动用身边资源 (学长/学姐/朋友/亲戚)帮助内推,也可以去LinkedIn/微信群/BitTiger/各种求职贴吧找内推信息。先推不是很感兴趣的或没有冷冻期的公司练手,然后推特别感兴趣或FLAG大公司。不要在乎所谓的面子。

 

根据职位要求,适当改简历。前端/后端/Data 要有不同的简历和侧重点,并且根据每份工作的 Job description,简历要做适当调整(保证可以通过ATS)

 

关于面试准备

  • 充分了解自己的project,要涵盖所有可能面到的问题
  • 用一两句话概括project:做了什么,用了什么技术,看到了什么结果
  • 给每个project准备几个一般性的问题:遇到了什么困难(遇到的最大困难是什么),这个project有什么收获 等
  • 给自我介绍和简历介绍做一个cheat sheet,把不是很清楚的和记不太住的也写进去
  • 通过上网/前辈/面试过的朋友同学,找面经,多刷几遍高频题
  • 面试前一定要找人mock,没条件就自己给自己讲

 

关于面试进行时

  • 交流技巧很重要,一定要和面试官有互动,让他参与你的思考
  • 不要害羞,不懂就问,不确定的话,就问面试官这么做是否合适,看他的反应决定要不要继续这个思路,基本上面试官会引导你做出来
  • 适当的时候可以看一下cheat sheet
  • 预先准备两台电脑/实在没办法还可以寻求场外求助(不推荐)
  • 灵活处理面试时候可能遇到的各种bug, 遇到 block 的时候要沉着冷静,不要害怕和慌张,保持逻辑清晰

关于面试结束后

 

  • 及时发 follow up、感谢信 ,保留好联系方式,以后跳槽、再申请会用到
  • 录取了不要马上接 offer,学会 compete offer,有offer可以bid更好,没有也可以适当加价。
  • 被挂了,不悲观。很少有人第一个offer就会过, 越到后面就越得心应手。

 

面试就像打怪,可能因为级数不够等各种各样的原因失败了。但只要你的知识储备,算法刷题,口语跟上了,offer会在你不断打怪的过程中出现。