https://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=275823&extra=&page=1
小白的研究生转CS与找实习经验总结 Part 1
我的另一篇实习面经贴请见:http://www.1point3acres.com/bbs/ ... p;page=1#pid2993337
序 晚春四月,舒适的温度、盎然的生机、温暖的阳光,作为漂泊在北美转CS研究生的你,是否享受其中呢?气候与美景,它们就在那里,而不同的,是从中匆匆而过的游子的心情。
周围的人大抵可以分为两种,找到实习的和没找到实习的。虽然外表并无不同,但是心境明显有差。和找到实习的同学聊天,能明显感觉到他们的自信,对以及生活的热爱,甚至对未来的乐观。而没有找到实习的,往往是依旧汲汲于当下,耐心和希望一点一点被消磨殆尽,无暇消受眼前的春光。
是的,现实就是这么残酷,暑期实习像一道冷冰冰的墙,硬生生地将人分为两类。我曾经误打误撞进入一个本科生的就业讲座,台上分享经验的大四同学描述她在招聘会上所见的研究生之状态:“这是他们唯一的实习机会,于是便挤破了头往里钻,就像这个暑假找不到实习就活不下去了一样。”
是啊,尤其对于转专业来CS的同学,更不好过。找到实习与否,一定程度上成了衡量他们人生决策的标杆以及探测未来的水晶球。若成功,未来的信心喷涌而出,而若失败,身上的枷锁便又多一层。
而我很幸运,作为一个转专业学生,在四月找到了实习,此后,便发现身边的春光,从未如此明媚。
EE与CS 我本科来自国内某邮电大学的通信工程专业。曾经大二就萌生过转CS的想法,但是父母并没有十分支持,且认为放弃本校王牌专业而选择泯然众人的计算机有些亏,故放下了这个打算。现在想想,如果那时候就转了,现在会好过很多。
简单说下个人对EE和CS比较的看法吧。注意以下都是个人经验,难免有片面之处,勿喷。首先要强调一点的是,市场上对EE人才的要求,大多都高于CS。一般一个技能较为全面的EE人才,标配电子电路(各种门,半导体,电路)、计算机硬件(各种单片机,VHDL,C)、信号与统计(频谱、波、各种变换)以及编程技能(matlab仿真等等,甚至部分CS的编程)。这对电子、计算机、数学方面都有相对比较高的要求。而一个市场上抢手的entry level CS人才,只需掌握算法与数据结构、一到两种擅长的编程语言(前端/后端/data)、计算机基本知识(架构,OS)即可。CS人才虽然和EE各有所专,但是重大区别在于,CS一般对数学的要求不高,以及实习面试比较单一(算法与数据结构),更好准备。
虽然我本科EE方面的成绩都很高,但是EE依然给我一种hold不住的感觉。说信号与系统吧,就只知道最简单的,数学一难就懵逼;说单片机吧,玩过的比如什么58、arduino、树莓派、MSP430、FPGA等等,都觉得太基础,只能玩点小花样,遇到复杂的拓展也是懵逼;说电子电路吧,什么模电数电简直是深坑,要难可以难到无法想象;说计算机系统与结构吧。。。你确定要去写汇编?写硬件C?综上所述,EE给我的感觉就是,当我读完本科,我依然一无是处,到就业市场上没有拿得出手的像样技能。相比学金融的各种经济知识专有名词忽悠得风生水起,学CS的各种代码信手拈来写app做网页不在话下,EE的实用性落寞很多。
更重要的是市场需求问题。CS岗位如雨后春笋般冒出,各种所谓互联网+、基于CS的服务业等等,机会如爆炸式增长,大数据和人工智能也火得不行。而反观EE,摩尔定律走到了尽头、通信技术止步不前,整体景象比较平稳甚至有些悲观。唯独智能手机的兴起带动移动芯片发展、以及智能硬件的创业潮,为EE带来一丝生机,但这向上的势头却也不如CS当下的大数据、人工智能,以及前一段时间的移动互联网来得火。总体来说,EE还是十年前的EE,而CS早已不是十年前的CS。我现在学校(USC)的招聘会,CS岗位和EE岗位目测是5:1,而CS学生和EE学生基本是1:1,竞争激烈程度可见一斑。
所以,如果你在纠结要不要从EE转CS,我个人的建议是:只要你不是热爱EE,早转CS早好。
怎么转CS 这个问题要分几步走。首先,你本科的时候有学过这几门课么:算法、数据结构、操作系统、软件工程。尤其是算法与数据结构。没学过基本的算法与数据结构空谈转CS都是耍流氓。如果你萌生了转CS的打算,第一步就是学算法与数据结构,这是基本的基本。曾经一个谷歌面试官跟我说过,他们即使招产品经理,也会面试算法题,因此重要程度可见一斑。同时,这也是衡量你将来适不适合CS的一个小测试,如果你不能理解递归,不能将算法翻译成代码,对编程还有恐惧,那你有可能真的不适合CS。
接下来是确定方向,你是想走前端还是后端?想不想做Data Science?你的兴趣点在哪里,手机app,网页,还是机器学习?CS门类很多,所需要的技术栈也千差万别。除非你铁了心做全栈工程师,不然,像诺曼底登陆一样,找一个突破口登陆CS,至关重要。我个人选的方向是data。三个理由:1.大数据很火啊。2.本校(USC)的Data Informatics方向就是为培养新时代大数据人才而设立的,就是对标当前的大数据就业市场。3.大数据相关的技术,ML啊,AI啊,都很感兴趣。
确定了方向以后,自己需要规划成长路线。就像塞尔达荒野之息你进入每个大迷宫你都需要先拿到一份地图,然后根据地图上的任务点做规划。有人曾说目标与战略的区别,目标就是”我想登顶珠峰“,而战略就是你的规划:怎么去珠峰,带多少补给,天气怎样,怎么分配体力等等。转CS就是你的珠峰,就是你要打的boss。
有一种获得地图的方式推荐给大家,就是你搜你感兴趣的CS职位,它下面所需的技术栈是什么,哪些你已经会了,哪些你还不会。举个例子,我想做data方向,所需技术大概是一种编程语言(Java/c++/etc.)+ Python + SQL, 如果是data scientist,则还需要R,以及数学功底,如果是data engineer,则还需要Spark, Hadoop等等大数据框架。我一开始的时候,仅仅会Java,Python和SQL完全不会,更别提Spark, Hadoop, R了。
地图有了,下面如何规划路径呢?上网课啊!对于Python,我上了南大的《用Python玩转数据》,对于SQL,我上了杜克的《Managing Big Data Using MySQL》。上完这两门课以后,也算是对这两个技术入了门,为今后的深入研究打下了基础。
综上,如果你有了算法与数据结构基础,明确了转专业的方向,知道了所需要的技术栈,并且做好了规划,那么你就已经打败了至少50%的转CS学员,赢在了起跑线上。
准备实习 转了CS而不找CS实习,那和咸鱼有什么区别?而实习,必然和另一个词联系起来,那就是刷题。有人刷了很多题、刷了很多遍题,依然找不到工作,而有人没刷过题,或者只刷了很少的题,却找到了工作。原因很简单,正如不能以代码的行数来评判一个程序的质量一样,刷题的题数和你对算法的理解,并没有必然关系。
我个人直到找到实习,刷了约150道leetcode,全部都是简单题和中等题,难题一题没碰。说实话,如果你只是找实习,easy和medium足以应付大多数公司。关键是,你必须深刻了解每道题有多少种解决思路,每种思路的时间和空间复杂度是什么。我的建议是,如果以找实习为目标,精刷不超过150道的题,好题至少刷两遍,是最佳方案。
除了刷题,第二点面试常考的,就是各编程语言基础知识。比如java的继承多态等等。很多公司对算法要求不高,但特别喜欢问这方面的题。如果你恰巧想走java,那么推荐你两个资源,一是普林斯顿的算法1和算法2两门公开课,它不光教算法与数据结构,还教很多高级的java知识以及OOP设计思想,是非常实用的一门课。第二个资源是我自己以及小伙伴总结的Java高频面试triky 100题,可以在我的一个创业项目网站: https://smilelearn.stanford.edu,里面看到,进去以后搜关键词java,或者我的github:https://github.com/zhtpandog/One_Hundred_Tricky_Java_Questions,里面有整理版和详细的分析与解答。而如果你想走C++,推荐coursera上北京大学的一套系统课程,包括c,c++基础,面向对象设计,基础和高级数据结构和算法in C++。
第三点面试喜欢考的就是你对应岗位specific的知识。比如大数据方面,会问你大数据框架,spark, hadoop等等。
其他通用的问题,比如如何debug,OOP设计思想、系统设计、甚至OS以及统计等,如果有时间,不妨也准备一下。
因此,总结来看,日常技术方面的准备,包括刷题、编程语言基础、职位特定知识,以及其他通用知识点。
(未完待续) (后续准备要讲的内容:如何争取面试、如何准备面试、职业规划经验分享、软实力提升、找工作如何套磁如何networking、个人的转专业与求职道路经历分享,等等,如果各位看官有兴趣,请有米的捧个米场,多多写回复。如果受欢迎的话,我继续更。)
|