EE专业自学CS和job hunting经历

78547
150
[align="left"]基本情况:[/align][align="left"]
[/align][align="left"]





学校 北美一个综排不错但工科一般的学校
专业 本科EE+硕士EE
实习 没有technical实习,只在国内做过一个销售经理助理的实习
Offer Oracle, Amazon, Google (已通过了hiring committee review,hr说所有feedback都是strong positive,最后应该没有问题)
CS基础 几乎零基础,MS毕业前一学期刚学JAVA,应该是比一般EE的同学要差。优势是数学很好,从小学开始参加数学竞赛一直获得一等奖,应该对算法水平提升有帮助吧。

[/align]

[align="left"] 我整个的job hunting过程异常艰难,主要原因大家在看了我的基本背景后都能猜得到--非CS无实习。这里要给大家提个醒:背景真的非常非常非常重要!Facebook和LinkedIn直到最后都没有给我面试机会,原因就是简历差,所以同学们有机会一定要找实习啊!我简历差也确实是自己本科时没有注意,那时候大神们都在忙着找百度实习,微软实习。我也没闲着,把dota补兵和走位的技巧学得很溜,经常一人苦练微操,在同学眼中也算是一位“勤奋”的少年啦。直到来美国读MS,我才真正意识到,游戏终归是游戏,再怎么超神到下一局还是要从头开始,我还是得为将来作打算,所以来美国以后玩游戏比以前少了,读书比以前认真多了。[/align][align="left"]
[/align][align="left"] 然而,读书虽然认真了,方向却没有找对,我一直在学EE的课程,以为毕业之后很轻松能找到一份不错的工作,事实证明我想太多了。。。直到一个学姐告诉我美国的就业趋势之后,我总算才明白过来,开始想在学校里选修CS的课程,悲剧的是,想选修CS课程的人太多了,绝大多数好课选不到orz。。。不过,在我的耐心坚持下,终于从waiting list里面熬出头,排到了Algorithm Analysis 课,都没看pre-requisite,直接选了,就这样开始了我的programming 学习之旅。[/align][align="left"]
[/align][align="left"] Algorithm Analysis是我在研究生阶段听过的少数几门好课之一。在这门课上,我学到了对于之后找工作极为关键的算法,比如各种sorting algorithm,dynamic programming,greedy algorithm等等。虽然我认真消化了课上每一个算法,但还是在期中考试的时候遭遇惨败,原因前面也作了铺垫,考试的时候出现了binary tree这个词,我当然知道这不是指现实生活中的大树,但是也不懂其究竟为何。通过和同学交谈后,我知道有一门叫做 Data Structure 的课,是pre-requisite。之后,大家都在忙着找暑期的实习,看到各种CS大神找到Google,Facebook,Amazon的实习,我除了羡慕也有彷徨,那个时候Google对我来说是多么遥不可及,我不好意思和别人讲我也想去Google,因为太无厘头了。我也尝试着去学校career fair碰碰运气,但是连queue和stack都不知道是什么,也只能放弃了。[/align][align="left"]
[/align][align="left"] 就这样,进入了毕业季前的暑假,当时由于对找工作的难度预估不足,我在暑假居然先水了两个月的dota2,直到Ti4国际邀请赛结束以后我终于开始了学习,好在我自学的思路还比较清晰:data structure是算法的基础,我首先应该吃透每一个基本的数据结构。一开始比较困难,因为我编程语言水平太差,属于那种看得懂for循环,但是写的时候需要google一下语法的水平。。。于是我找来一本Head first JAVA,着重学习了一下基本语法以及类,这下终于能看懂binary tree的代码啦:-) (这里能看懂我在说什么的同学,说明你们的基础还不错) 万事开头难,JAVA语法懂了以后,我学起data structure速度明显快了很多,虽然不能熟练地写出每个数据结构,但是idea算是懂了。[/align][align="left"]
[/align][align="left"] 大概从9月初,我着重开始做leetcode,非常感谢同学推荐给我的leetcode,在这连续一个月的时间里,我感觉自己的编程水平突飞猛进。之前在算法课上都只是用伪代码学习了大概思想,leetcode则是给我提供了一个绝佳的练习平台。可以说,这一个月的刻苦练习,是实力的堆积,为面试打下了基础。我也在这一个月时间中领悟出了很多算法题的思考技巧和练习技巧。值得一提的是,我见到很多同学都有一个误区,就是leetcode题目刷越多遍越好。其实不然,我觉得做两遍是最佳的,关键是思考的角度要多样化,如果只是机械地刷5遍,6遍,那么你只是加深了记忆,甚至会禁锢思维。毕竟,你不能祈求面试时就考原题或简单变种吧。(虽然很多公司会考原题,甚至L家和F家也会考很多原题,但是这种押宝心态不靠谱。我自己面试Google时就没有一题是相似的,所以我们需要提高思考问题的能力,这才是王道。)[/align][align="left"]
[/align][align="left"] 从10月初开始,我觉得自己算法实力比较强了,开始广泛地投简历,在学校的求职平台上广撒网。当时的计划是,先从一些start up开始,寻找实战练习的机会。对于真正想去的大公司,我大概浏览了一下CareerCup上各大公司的题目,当时我的水平是Google会做大概70%的题目,Facebook会做大概80%的题目,LinkedIn,Oracle大概会做95%的题目,Amazon,Bloomberg题太多了,不过除design外都很简单。考虑到Google很多题就算会做也很难写得很快很漂亮,我就打算先投Google,这样一来可以积累大公司面试经验,二来挂了之后关小黑屋一年,来年可以尽快有机会重来。另外,Bloomberg也不太想去,所以也先投了,积累面试经验。对于剩下的比较想去的大公司,我想放到11月,这样有充足时间准备。This plan looks pretty nice, right? But ……我万万没有想到,Bloomberg一周不到就回复我说background doesn’t match. Google投过去之后就石沉大海,杳无音讯。第一波投的start up公司也都纷纷发来拒信。。。我凌乱了。。。我发现周围的同学都在calendar上安排着面试日程,而我现在居然一个面试都没有!!!之后,Google来学校进行on campus Interview,周围又有很多同学拿到了面试机会,而我仍然一个面试也没有。那段时间我感觉自己仿佛和其他同学生活在两个世界里,完全是一个局外人。我在linkedin上仔细看了很多同学的简历,确实心服口服,别人有很多牛实习牛项目,而我只有一个做销售助理的实习,如果我是hr,也肯定会把我刷掉的吧。[/align][align="left"]
[/align][align="left"] 虽然知道自身背景差,我仍然报有一丝希望,在linkedin上疯狂搜索在linkedin工作的校友,终于让我找到了一个学长和一个学姐,他们人很nice,帮我做了refer,可惜一直没有消息。学姐告诉我原来hr把我的简历挡掉了,我知道应该也是因为简历太差了,我周围都是CS专业的同学拿到了linkedin面试。我记得那天晚上,我非常苦闷,打电话给爸妈,他们安慰我说不需要这么着急找工作,可以先找实习,或是重新读CS master,甚至回国创业也行的。我听了感觉舒坦了很多,深夜又投了Glassdoor,岂料第二天早上7点起床就收到一封拒信。。。看来hr对我的背景真的是忍无可忍了。Amazon投过去也是杳无音讯,此时的我真的已经没有勇气再投Facebook了,我一个人趴在床上,思考着将来找不着工作又该如何自处,看着别人为准备面试忙碌的背影,我觉得自己就像是行尸走肉,我恨自己读错了专业,更恨自己本科虚度光阴![/align][align="left"]
[/align][align="left"] 然而,我也并没有让自己长时间萎靡,如果因为拿不到面试就这么颓,那自己也太没出息了!在逆境中尤其要鼓舞士气,动脑子来扭转局势。于是,我仔细分析了目前的情况:我leetcode做过一遍,算法比较好了,可就是拿不到面试,所以在接下来的一个月里,我不可以像其他同学一样再猛刷算法,而是要从软实力上下功夫。我想,hr据我的原因无外乎我不是CS专业,也没有practical working experience,前者既成事实,我无法改变,但对于后者,如果我能够把一些在校project实际展示出来,即便都是course project比较水,那也聊胜于无。于是,我申请了一个github,并在w3school上自习了html5,css等技术,把我的course project重新做成一个非常简单的网站,数据库的连接就用了amazon的AWS。我把github的链接放到了简历里面,并更换了新邮箱,重新投了一轮简历。虽然我仍然没有拿到Linkedin的面试,但是在同学的帮助下,Oracle的hr联系了我,事情终于有了转机。[/align][align="left"]
[/align][align="left"] 在准备Oracle面试的过程中,我把所有可能面试的team需要的qualifications都逐一学习了一遍,比如有些team需要 Operating Systems,我把Linux Semaphore,Concurrency Control,内存管理,调度等等重要章节都学习过了。比如,cloud team需要computer networking的知识,我把TCP/IP和web application等重要知识都google了一遍并加以记忆。再比如需要有些前端工作需要AJAX,JSON, XML等等,我也在w3school上一一看过。在这半个月时间里,我真的非常用功,因为我知道,每一个机会都来得那么不容易,一定要把握住![/align][align="left"]
[/align][align="left"] 有时候不得不说,机会是个很奇妙的东西!就在我Oracle onsite interview临近的时候,Google突然给我发来了phone interview的邀请,我真的是又惊又喜,离我投简历的时间过去了差不多两个月了,本以为我早已被Google遗忘!我抓紧再复习了一下常用算法,虽然有两个月没有碰算法了,但是在这段时间里我用JAVA coding的技能提高了不少,所以编程反而更加自信了。很幸运,Google 面试官很nice,没有纠缠于我的简历,而是给了我两道算法题,虽然未曾见过,但是只要冷静观察,两道题都不难解决,代码也都在20行以内。果然,第二个工作日,Google 的hr就发给我onsite邀请了。[/align][align="left"]
[/align][align="left"]之后,先飞去California的redwood city参加Oracle的onsite,面试官非常和蔼,他们围绕着简历中的project,提问了很多关于OS 和 database query optimization方面的问题,由于我之前复习十分到位,基本对答如流,所以如愿拿到了offer。之后是重头戏--Google的mountain view onsite interview。 首先真的是要感谢Google的hr美女,她在知道我没有工作经验以后帮我put a request to let interviewers test my general CS fundamentals. 所以整个面试都是以算法题为主,偶尔会有一些OOD题目和map reduce。算法题是新题,难度比CareerCup上略高一些,因为签了保密协议,所以不能透露具体题目。但是,总的来说以动态规划题目居多,需要有良好的观察,难度可以参看Leetcode的scramble string那题。[/align][align="left"]
[/align][align="left"]衷心祝愿还在为找工作而纠结的同学早日拿到面试!永远不要失去希望,要相信总会有公司给你面试的,只是机会还没有到![/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align][align="left"]
[/align]

补充内容 (2014-12-22 06:54):
谢谢大家,我已经签了Google。找工作真的不容易,尤其是对于和我一样简历比较差的同学。所以,我很乐意和大家探讨学习和面试的技巧,我入职以后,如果大家需要内推,我也会尽力帮忙的。
  • 146
150条回复