Best Choice For Now
首先,我恭喜你们,你们做了一个从当前环境来说,比较正确的选择。我先简单说一下这个行业的优势。
硅谷工作机会多,待遇高
自从计算机被创造出来以后,就一直不停的创造着各种各样的职位。现在的计算机职位五花八门,既有最最古老的Software Engineer,也有后来出现的Data Engineer,Machine Learning Engineer,Site Reliability Engineer等。对于大部分来美国读本科硕士的人来说,找个计算机工作几乎成为了唯一可以留下的途径。21世纪是IT的世纪。很遗憾,生物目前并没有成为主流。
在美国,进入国际一流大企业要比国内容易的多了。所以来都来了,就得工作几年再走。因为回去就再也没有这种easy mode了。从中国本土直接面试进入Facebook,Google的人少之又少,难度相当大。当然除了技术,可能还需要运气。
相对公平
大学毕业的时候,很多同学通过家里关系进入了银行,医院,国家电网等很多羡煞旁人的单位。但是并没有听说过有多少人通过关系进入了百度,腾讯,阿里巴巴,这在其他行业是相当少见的。IT产业几乎可以说是公平竞争的最后一片净乐土(净土+乐土)。到了美国就更是这种情况了,互联网大公司在招聘方面有着自己的独特体制,对于Software Engineer有着严格的把关。你有多少水平,直接决定了你能进怎样的公司,决定了你能拿多少pacakge。而且80后出生的美国人,从小享受美帝迅速扩张带来的无限福利,和我们的社会主义核心价值观完全不同。他们根本不稀罕学Engieering。所以硅谷的主力军其实是中国和印度人。同时,深谙职场之道的印度人也已经迅速占领硅谷高层了。
大洗牌
高考是人生的第一次大洗牌,将高中同一个班级的不同学生分流到不同的大学,不论出生,只管考试分数。IT届的毕业生的招聘几乎可以说是第二次大洗牌。一个普通学校的CS毕业生,只要努力刻苦,都可以进入硅谷Top Tier的公司。而对于其他专业(比如机械,材料,化学等。不吹不黑,只说事实),即使是Stanford的硕士毕业生,也不一定能赶上IT薪资。所以,不管你学校排名如何,不管你曾经如何,只要你加入这个大洗牌的队伍。从此没人在乎什么C9,什么985,211。
硅谷这边找工作是不看文凭的,只要有能力,高中生都没问题,没有能力,博士生照拒。所以只要你的学校在美国还有个名字,你就可以来找工作,然后拼能力。学历不代表能力,这么简单的道理你觉得硅谷大佬会不懂?当然Oracle十年如一日始终坚持只招名校GPA高的,这个可以忽略了。当然顶级名校的校友网络是没法享受了。但是现在有了LinkedIn,只要你给自己包装好,去LinkedIn不断的骚扰,机会总会来的。
游戏规则造就了时势
刷题几乎成为了准备面试的代名词。而现在的游戏规则就是:要找工作就得洗刷刷,洗刷刷,洗刷刷。很多大公司,比如Google,Facebook等,New Grad面试是不面System design的,只面算法题。相传,现在硅谷的这种面试方式是从Google流传出去的。所以请感谢Google!Google用这种方式,让全世界的聪明人,只要通过短时间的训练,就可以迅速进入Google。让全世界的刻苦人,只要通过不停的训练,就可以进入Google。
你们觉得Google这样会把自己玩死吗?只招会刷题的能行吗?放心,Google是玩不死自己的。Google内部分工高度明确,每个底层码农都只负责的一小块,上面有大神级别的人物统筹兼顾,下面一群小码农负责搭积木。所以只要你够聪明,够勤快,你就可以成为你那一小块的大师。对于Google的底层码农来说,需要的知识面并不太多。你根本不需要那么宽的知识面:比如说,上能调javascript,下能撸linux内核。每个人做好自己的事情,把自己的事情做到极致,就构成了一个完善的产品。写前端,写android,写server的,并不需要知道怎么管理data center,怎么scale数据库。所以Google并不关心你的背景,只要你有能力解决问题,只要你smart,就会Hire你。而现在判断你是否能解决问题,是否smart的方法就是看你能否速度做出类似LeetCode题。这种简单粗暴的游戏方式简直可以说是百年难得一遇,一定要抓住。跟考研,考公务员比起来,这种制度真的太良心了。所以请你们多点点Google的广告。救世主。
在这种游戏规则下,我见过强人不需要CS的master就可以进入FLG。见过科班的弱人找不到工作。很多学习普普通通的人,通过几个月高强度的训练,一跃拿到各种offer。对于这些人,可能这辈子就这么学过两次,还有一次是高考。
当然对职业发展再说,光刷题肯定不行。不过,找到job之后,这些都可以从长计议。
当然对CS科班的同学来说,这种规则很不公平。他们很多人虽不一定达到了“上能调javascript性能,下能撸linux内核”的水平,但是他们毕竟也都是付出了四五年时间的,而这种刷题流都属于投机取巧,走了捷径。That is life。但是没办法,他们其实也得刷题。传说有人不刷题就可以进Google的,当然这种情况肯定有的。不过不刷题的人,一般很难横扫FLG+热门独角兽公司。当然,ACM选手不算,因为ACM的训练方式本来就是刷题。
所以,要想逆袭,就得洗刷刷,洗刷刷,洗刷刷。
入门门槛低,学习途径多
CS的入门门槛不高,而且一年比一年低(现在只用javascript就可以full stack了,十年前你敢想?),这得力于CS前辈们前赴后继的奋斗。一方面,CS届的大牛一直在将复杂的问题分层,让每一层的复杂度减少,降低到普通人类能够处理的范围。比如你们常见的TCP/IP network,常见的web application。另一方面,CS的大神们一直在努力开发出更好,更易用的Tools。比如现在创业没人用Php撸web了,都改用python,javascript,ruby了。你只需要照着教程慢慢抄,就可以写出一个像样的手机App。你只需要会AWS,就可以迅速构建出一个可以自己scalable的web server。
如果想快速入门,选一个比较容易上手的层是关键,比如Python或者NodeJs的full stack,Android或者iOS。一个从大一就开始学习这些的学生,会比一个大一就开始搞system programming和汇编的人更容易找到实习,而且学习曲线还不陡。
提升机会大
进入该行业之后,如果你仍然能保持积极的学习态度的话,就会积累大量的知识和财富,而这些也将迅速转化为财富!我前面的文章介绍了硅谷新手码农的薪资,对于老司机来说,收入可不止这么多。人有多大胆,地有多大产。当然,前提是你要保持积极的学习态度。当然,这都是后话。
转CS的一些建议
关于上课
首先,我不建议光刷题不上课的,毕竟有些基础知识还是很必要的。不然即使你找到了工作,你同事也很容易会觉得你sb,基本无法交谈。但是也切勿在课程上花太多的时间,毕竟耽误了课程,当sb,耽误了刷题,就GG了。有些太难的课程就别选了,难到一定程度,基本就没啥必要了。而且来了硅谷可以去Stanford上课,基本可以难的你欲仙欲死。福利好的公司还会报销学费。
不管你是否决定去拿一个CS Master,我都建议你们去看我推荐的那些公开课。申了CS master的同学,可以在学校学点计算机网络,Distributed System,Cloud Computing之类的,但是不要陷的太深,有些高难度的课对你找工作没太大用处。
如果认真学完,我可以说,除了一部分ACM牛人和和实习狂人外,你们其实和国内普通大学的科班水平已经差不多了。(用普通大学是为了排除一些个例,话不能说太绝对。)为什么这么说呢?你们也是知道国内那个教育模式的,基本上CS的低阶课不能调动起学生兴趣,CS的高阶课好多都会上成纯文科。你觉得你们在国内大学四年学到了啥吗?CS专业的很多本科生其实跟你们一样,很多ACM选手也是停留在“到此一游”的地步,并没有获奖。这些公开课的难度适中,讲授的所有东西都是CS必须知道的,也是面试中容易面到的。网上那些培训机构经常会给出一些常见面试范围,而这几门课都会cover。
来美国之前,我就把那几门课都上了。到了CMU,虽没有选OS,Complier这种难课,只选了中等难度的课,但是有Leader Board的课,我基本都Top,没有Leader Board的课,Project都满分。我觉得这些课对我有很大的影响,至少不会让你白浪费时间。
如果时间真的有限,那么还是必须看一下cs61b,把里面基础的数据结构都实现一遍,其实这也相当于在刷题了。如果有时间跟一下csapp就更好了,这本书把很多基础的概念都讲的很清楚。你可以把这门课上成文科(虽然效果有限),就是,去主要了解一下这本书里面最重要的几个概念,而不去做作业(讲processor的那块不用看,主要看公开课有的那几章),这样面试如果遇到有人问你一些基础概念,你还是能够很容易解释出来的。
记得多通过以下的方式锻炼自己的思维,比如“CS的人们遇到了什么问题,他们提出了什么解决方法,但是又引出了什么问题”。这个很有利于你把所有的知识点串联起来,比如说,一个Process慢,所以引入多了Process。多个Process切换开销大,所以引入了多了Thread,多个Thread可以共享资源,所以就会出现race condition,所以继续解决race condition。。。。这是学习CS基础课程很有用的一个模式。。CS里面的每个概念,都是因为需要才出现的,大多数都是为了解决现有的问题而产生的。而且大部分是可以直接运用到实际工作中的。这在其他行业真的很少见。因为是为了解决实际问题,所以大部分概念都很直接,很容易理解。对于这些概念,只有两种状态“你还没学的”和“你学会的”,很少有那种难到学不懂的。
另外,我在CMU认识一些进Google的同学,他们有学化学的,有学ME的,他们都至少上了一门类似61b的课,和一门CSAPP。
刷题
LeetCode的出现,彻底改变了北美码农就业的格局。让很多人可以顺利的进入一流国际大公司。现在,刷LeetCode,刷LintCode,几乎成为了很多人找工作的日常。不过,有人刷两个月横扫硅谷,也有人刷两年却灰溜溜的回国了。同时,硅谷也出现了大量的衍生产业,各种收费培训机构层出不穷。这些机构我没有参与过,所以不做任何评价。我知道的是师傅领进门,修行在个人,无论是专业大牛,还是是new grad,面试前都或多或少需要一些练习,不然就会出现这样的悲剧。Homebrew的作者Max Howell因为做不出一道leetcode的easy题,然后华丽的被Google拒了。有人说Google这样的面试很不科学,但是我们并没有办法改变游戏规则。平心而论,这道题即使对于New Grad来说都已经是送分题了,更别说高难度的面试了。(他面的应该是Senior以上的职位,属于要求很高的那种)。其实程序员和手艺活类似,如果想要要达到师匠级别的境界,肯定需要天赋和努力的。但是如果只想拿到一个硅谷150K美刀的pacakge,对于很多人来说,其实单单只是努力的问题。
从你决定开始的那一天,最好就开始刷了。刚开始如果有难度,可以抄,可以看别人答案。好多题目真不是一时半会能想出来的。
从很多人的求职经验贴中,你会发现他们一直在强调编程模板。一般Leetcode刷到第三遍或者第四遍的时候,很多人就会总结出属于自己的编程模板。Binary Seach,Linked List, Dynamic Programming, BFS, DFS 这些题型都是有很具体的模板的。如果早早的掌握了模板,就会写出准确性更高的代码,同时也能轻松应付基础面试的大部分题目。我个人觉得这些编程模板其实也属于一个人的代码风格,也就是你写代码的习惯。对于新手来说,不同时间对同一个题的写法可能相差十万八千里(每次都是重新想,重新写),而对老司机来说,每次他们都能写出几乎一样的代码(肌肉记忆,条件反射了),这就保证了解题的正确性。从简单的for loop和while loop来说,有些时候只是个人的选择习惯问题,有些时候却直接关系到代码的简洁程度(一般情况下,简洁的代码不容易出错)。但是如果每次刷一道题,或者一类题,都选择类似的解法,那们熟练度就很容易提升。
学校大部分课程,只讲概念,不关注具体的编程,导致对于即使在学校学过数据结构和算法的同学,也不能很轻松的上手Leetcode。所以我比较喜欢这本红书,它对每个涉及到的算法都提供了很好的实现,非常值得新手模仿学习。如果你的学校正在教授数据结构或者算法,那么你可以一边学习学校的理论知识,一边跟着这么书把算法都实现一遍,直到你自己可以写出跟书中差不多的代码(如果你发现你写的比书中好,欢迎贴出来大家一起学习。)。这么做,一方面可以提高自身编程习惯,一方面可以让你真的理解那些经典的算法。而且很多比较怪异的面试官就喜欢让你implement一些基本的算法,比如PriorityQueue,Union Found。
很多新手一打开leetcode,基于强烈的自我满足感,往往会尽力每一道题都自己想,这样又累,效率又低,还极容易产生很强烈的负面情绪。其实很多人刚开始做题的时候都是靠抄答案的,反正我第一次做two sum的时候就没想到那么巧妙的解法。所以不要觉得自己技不如人,很多找工作的人都经历过这一步,特别是刚入门的同学。
所以做不出来就去抄,但是理解之后按照自己的风格写出来。
从容易的开始
万事开头难。所以一开始千万不要给自己太难和太重的workload,很容易挫败自己。掌握了正确的学习方式,才能让你走的更远。在CS界,不是说越难的部分,岗位越多。比如Web,APP的职位远高于搞OS和搞Compiler的。
转专业的同学往往简历比较薄弱,没有project可以写。特别是没有CS学位的同学。其实有些地方是可以找到很好的project的。首先公开课的Project你是可以放到简历上的。其次,对于水平一般的同学,我推荐你们可以去Udemy上找找。10刀就可以换一个不错的Project,而且Udemy上的老师都是带着你一行一行写代码的,很适合新手入门。比如这个Web的课,非常基础,基本跟着老师敲一遍所有的代码,就可以算javascript full stack 入门了。这些都比较适合急着需要project填project版面的同学。
不想学Javascript的,也可以学Python的Full Stack。Python是可以用来面试的,你也省的学Java了。另外,Android和iOS也是比较容易入门的,基本上倒腾一两周,就可以写出一个像样的App。还有一个新兴的工作叫Data Engineer。这个工作主要负责Data的ETL,就是把用Hadoop把数据不停的倒腾来倒腾去。Hadoop的MapReduce那一套也是比较好上手的,简历上弄一个MapReduce的Project也是不错的(Udacity上有一个简单的课)。而且现在这玩意到处都用。