文科高考状元分享:如何大跨度转CS
我们今天要介绍的就是大跨度转CS的方法,如何从一个“门外汉”,成为靠谱的“CS人”。如何弥补自身知识背景的弱项,建立知识体系,扩展行业人脉,最终拿到job offer。
在这之前,我们需要解决两大问题,“是否能转”和“怎么转”。
是否能转
很多同学担心转CS门槛太高,望而却步。其实,我们通常说的“转CS”,并不是要大家成为计算机科学家,而是通过学习计算机科学、工程知识,获得在北美市场上寻找Software Development Engineer(软件开发工程师)以及类似工作的能力,同时获得合法工作身份。这个目标,对于转专业者而言,是现实的。
那么,现在在美国找到SDE工作的门槛到底在哪里呢?掌握了数据结构、系统、网络、组成等基本知识,加上Web/Mobile App、系统设计、数据库等一些进阶知识和技能,再加上一些项目经验或/和实习经验,我们就可能在美国找到SDE工作。具体的难易程度是跟随市场行情而变化的,我们现在正处在市场的调整期,找工作相对前几年要求高了一些。
通过h1b申请数据,我们可以看到,2011年到2015年市场比较热,h1b申请增加了几倍。2016年的h1b申请数却基本与2015年持平,可见市场正在调整。最近我们也见到一些大公司开始裁员或冻结招聘。但是,市场调整不一定是坏消息。它确实提高了我们找工作的难度,但也降低了h1b抽签的激烈程度;市场的健康调整,也使得更有诚意进入这个行业的人脱颖而出,既是挑战,也是机会。
很多同学关心:文科生或背景CS毫无关系的人能迈过找工作的门槛吗?这件事的答案因人而异,市场的变化也不能准确预测,但是从目前市场的状况来看,这些同学仍然有不少机会。有的担心是多余的,比如“没学过高数能否转CS”——其实高数和找SDE工作需要的技能关系不大。上面说的那些技能,文科生脱产学习,一年左右可以完成。
详细介绍怎样转CS之前,需要先声明:我们的经验仅限于北美IT职场,国内的情况不能涵盖在内。此外,这篇文章主要是对“门外汉”介绍转CS的基本情况,对“内行”而言,可能都是些老生常谈,如果有说错的地方,欢迎赐教。
怎么转?
首先,最好的方法当然是申请一个相关学位。如果你现在是或者即将成为美国留学生,拿着F1签证,那么你有两条可行道路:
1. 申请CS专业学位,或MIS/ECE等接近学位;
2. 曲线救国。如为文科生,也可以申请STATS/MS&E/Bus.Ana等STEM学位。
第一条很好理解,第二个是怎么回事呢?转CS,申请相关学位肯定是最好的。但有的同学已经在一个很好的大学,比如MIT、CMU、Stanford等等,但专业背景是文科,相关经验也不多。CS项目这几年竞争越发激烈,大部分大学不允许直接转系,如果外申CS学位,又有可能申不到这么好的学校,甚至要降格好几档。
那么,可以观察一下校内的专业,有没有和CS离得不太远、属于STEM的,允许你转系过去。这种办法,有利有弊。好处显而易见,我们不需要再折腾换学校,可以充分利用顶级名校的资源,多学一个专业的知识对长期职业发展也有一定好处,而且STEM专业可以解决你h1b专业相关性的问题,并给你3年的OPT。坏处也很明显,这些专业毕竟不是CS,学的很多东西和SDE工作没有直接的关系,会分散我们的精力。
另外,如果你不需要在北美解决工作身份问题,甚至可以不去修学位,自己学MOOC、做项目,也是有可能拿到不错的offer的,我们见过一些实例。从这里其实能看出,转专业其实是“八仙过海,各显神通”,我们需要根据自己的情况和周围的资源,以及变动中的市场情况,具体问题具体分析。盲目随大流很可能做不出对自己而言最优化的计划。
现在假设我们已经解决了或者放弃解决上学的问题,那么转CS到底需要学什么?我们可以看看Stanford、CMU等名校的CS本科生课单:
基本技能:编程基础,数学基础,数据结构与算法,计算机组成,操作系统,计算机网络等。
进阶技能:Web App and/or Mobile App,系统设计,机器学习,AI,大型软件设计,分布式系统,函数式编程等。
转专业因为时间和能力所限,不妨抓重点学习。比如Web App and/or Mobile App工作需求量较大,就可以多做项目积累经验。特别理论性的内容,可以等工作后再补。
不过,在北美职场,好好钻研数据结构与算法,刷题熟练,还是比较必要的。此外,还可以结合自己的背景选择更适合自己的方向,比如科学、工程类博士如果科研中经常涉及大数据处理,不妨考虑Data Scientist职位,转行的幅度可以缩小一些。
学习了一些知识,做了项目,简历渐渐充实起来,就可以找实习了。找到实习,通常需要这些条件:
1. 一定的项目积累,简历比较充实。
2. 实用的技能点,如前端。
3. 扎实的基础知识,如数据结构与算法,擅长的语言的深入理解。
4. 会沟通,推销自己。
参加Career Fair是非常有用的,因为可以和HR甚至Team Leader面对面交流,给面试的可能性提高不少。要学会沟通,cultural fit也是很多公司会考虑的重要条件。
实习是我们走向full time job的桥梁。不仅有可能带来return offer或更好的全职工作机会,而且能够丰富我们工业界的经验,实习过以后,阅读代码,理解需求,快速学习,解决问题,研究,沟通,proactivity(主动性)、抗压能力等各方面都可能显著提升,也会让我们对于以后具体想做的方向、想选择的公司和行业类型等思考得更清晰。
求职的最后一道关,是刷题。有一点需要强调,不同的公司对算法题的重视程度是不一样的。通常,互联网大公司比较重视算法题,中小企业和startup更重视对具体技术的掌握。
学习CS的资源
上课之外,学习CS的资源:
1.MOOC:Coursera, Udacity, CodeAcademy, Khan Academy(本科数学部分)...
2.教科书,Code Example + Introduction。
3.遇到问题?搜索StackOverflow。
4.学会看documentation(文档)。
5.博客、tutorial,如Tutorialspoint。
看中文还是英文呢?一般来说中文材料的错误相对多一些,但我觉得需要短时间大量汲取知识的时候,中文材料也可以看。有些大部头书籍,直接从英文入手太“吓人”,反而拉低了学习的效率。看不懂的时候用英文查就可以了。当然,不同的人学习习惯不一样,很多人根本不读教科书,而是去看博客、code example之类。只要方法适合自己就好。
精通CS任重道远,但从入门到Offer并不遥远。基本上,基础 + 进阶 + 实习 + 刷题 + \epsilon= Job Offer。 \epsilon是随机项,政策、市场的情况,以及纯粹的运气,我们是没法控制的。但是准备做的越好,同等条件下拿到offer的可能性越大。
讨论一些有趣的小问题
第一, 我们往往申请硕士学位,大跨度转专业的同学并没有相关的本科积累,prerequisite经常没上过。打开课本,好多概念都没学过。这种情况怎么办呢?
大的方针,老老实实补课。安排的比较成熟的课程都是循序渐进的,前几周会比较简单,抓紧那段时间赶快补习,一般老师也都很乐意帮助学生补习。很细节的东西可以暂时略过,请老师帮忙划一下重点可以提高效率和针对性。
还有一个办法,但是不能替代死功夫,但可以提高效率。当你见到一大堆陌生概念,云里雾里的时候,发挥你的GRE阅读理解技能。GRE阅读里面,经常出现很多生词,但我们还是能把题目做对,因为我们理解那些生词所发挥的功能,即使不认识,也能猜的八九不离十。举个简单例子,“A和B是同学”这句话,大家都知道什么意思。即使A和B这两个人我们不认识,还是知道这句话大概在表述什么,而且知道A和B都是人名。
同理,“奇异值分解能够用于任意m x n矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广”这句话,即使我们不知道什么叫奇异值分解、什么叫特征分解,甚至可能不知道什么叫矩阵和方阵(不要笑,我刚转学理科时候,真的不知道),但我们知道这句话表达了这么一个意思:“A能够适用于任意X,而B只能使用与特定类型的X,故A的适用范围更广”。
并且我们能猜出来,A和B是两种分解方法(虽然我们也不知道什么叫“分解”),X是一个基础的数学概念——矩阵和方阵,并且它好像是能用m x n来修饰的一个概念。这个结构理清了,我们就会知道,这几个概念的了解顺序应该是X->B->A,因为写作者谈论”奇异值分解”的时候假设我们知道“特征分解”,谈论两种分解的时候假设我们知道矩阵和方阵。那么我们补课的时候就有指引了——先去了解矩阵、方阵,再了解特征分解,最后再学习奇异值分解。
事实上,这正是线性代数教科书介绍这些概念的顺序。结合上面那个“文理科思维方式”的问题,我觉得学习一个学科,很大程度上就是熟悉和习惯这个学科思考时用的语言,至少这个步骤是跳不过去的。我们文科生都学过语言,很多人学得很好,所以不要自卑,你学的东西会派上用场的。
对了,别担心,学CS不会让你做奇异值分解。
第二, 这个问题也让我很头疼——很多知识点,还有刷题的题目,今天觉得懂了,明天就忘了。这意味着我们其实并不懂,还需要更深入的理解。对我比较有用的一个方法,是寻找知识点的关键点,就是从这个地方,可以把你的理解记忆像提起一串葡萄一样提起来的那个着力点。
比如说实现ArrayList,有很多methods要写,颇为繁琐,一个一个记忆恐怕记不住。但大部分methods都可以现推,没多大难度。这个知识点的关键,是动态更新Array的长度,它是整个类的枢纽,其他方法都是附着在它上面的,它也是ArrayList和Array最大的区别。把动态更新Array长度这个知识点搞清楚,如果面试官让你写这个类,你就能很快写出来。
最后,有同学问“文科和CS有什么交叉领域”。坦白地说,我现在还没发现。有的貌似交叉的领域,比如NLP等,还是CS知识、工具为主。我觉得大跨度转专业还是要有从零开始的觉悟,从零开始也是可以学好的,盲目追求“交叉点”其实反而会耽误自己的学习进度。
路漫漫其修远兮
最后分享一句阿尔伯特·加缪的话”There is scarcely any passion without struggle.”转专业的道路很辛苦,起初可能只有压力,找不到什么激情。但是坚持努力下去,慢慢就有了曙光,也会从代码中得到越来越多的乐趣。祝大家转CS成功!
微信号:wuhanqiantu
新东方出国留学是国内首批教育部认证留学机构,家长和学生可放心选择,随时掌握最新留学资讯,一起加入武汉前途出国留学追梦计划!
官方微信ID:wuhanqiantu
官方微博:@武汉新东方前途出国
扫一扫,成为武汉新东方前途出国微信好友!咨询留学问题。
预约电话:027-87210046(武昌)/82666820(汉口)