登录
  • #申请总结
  • #eecs

EC‌‌‌‌‍‍‌‍‌‌‍‍‍‌‌‌‍‌‌‍‍‌‍‍‍‌‌‍‌‌‌‍E硕士从找工作碰壁到拿到Google offer

Baozhiyu0212
8360
28
大家好,先自报家门,美国中部大农村某校ECE专业硕士毕业,钢铁直男,毕业第一年混迹小公司随时准备跳槽,历经一年的努力转型Software Engineer

感谢地里大佬们提供的经验,成功拿到心仪公司software engineer全职工作offer,所以写下这篇经验回馈地里

由于不经常来这个板块,不确定这个经验是否适合这个板块,请谅解

这个帖子的关键词是“我做了什么”,希望我的经历与故事能对你有所帮助,所有的经验仅适合学生或Junior Engineer,以下内容均为个人见解,欢迎批评指正

(1)ECE与CS差别是什么?我是ECE专业找CS的工作容易吗?

ECE与CS的差别一言难尽。也许在外人看来可能都与写代码有关,但两者的关注方向不甚相同。当我做与ECE有关项目的时候,需要与开发板接口,寄存器,时钟,RT-thread,内存分配与管理,嵌入式系统设计与剪裁,kernel driver,传感器等等key words打交道。

而对于我目前接触的CS方向来说,key words则是算法与数据结构,OOP/D,数据库,网络编程,多线程,分布式系统,大数据,计算机视觉,人工智能。总的来说,如果你是ECE专业毕业,对CS fundamentals了解,并有一定的刷题经验,那差别可能不会很大。 换句说话,如果你是ECE想找与CS相关的工作,学好CS fundamentals,多刷题,你也可以找到一份与CS相关的好工作。

(2)我自学了什么?

在刚毕业的时候,我对CS了解有限,尝试面试了很多公司的software职位,屡屡碰壁。在地里大佬经验帖以及逐渐积累的面试经历帮助下,我找到了我需要加强/自学的东西,我个人总结成5个方面。

一个重要的前提是精通一个编程语言,我从嵌入式C转为C++ 选择编程语言的过程中在C++与Java之间有过纠结,但当时的我认为C++与C更像,更容易上手

1. 算法与数据结构 (最重要的一环,所有的面试都会与之有关)

2. OOP/D (一开始我几乎完全不了解这是什么,也很后悔硕士的时候没有选OO这门课,有些面试还会涉及到design pattern,但是如果没有几年的工作经验以及一定的代码量,很难对design pattern有深刻的认识,所以在Junior position的面试中只需基础了解)

3. OS/多线程 (有ECE经验,基础还算扎实)

4. 数据库 (完全不会,自学MySQL,不精,对某些面试会有帮助)

5. 网络编程 (有ECE经验,基础了解,但我平时不是很常用)

如果用一个公式来概括software engineer面试大概需要什么的话就是 offer = 精通一门OO编程语言 + 非常强的算法与数据结构基础(包括写代码的能力)+扎实的OOP基础 + (一系列其他加分项)+ 有效的交流

总结下来就是 算法与数据结构贼重要,OOP/D大多数面试都会涉及到,其他的部分不是所有的面试都一定用得到,但推荐至少有基础的学过。 当然,如果你申请的职位与某方向有关(比如网络工程师),那计算机网络这个方向也会特别重要。

(3) 我做了什么?

自学,查缺补漏+刷题

刷题是短时间提升你写代码能力以及面试能力的最有效的手段。直到刷了几个月题以后,我开始后悔为什么这么晚才刷。虽然有人会觉得刷题应付面试有些功利,但我觉得刷题是对你算法与数据结构能力的一种考察,也会对你谨慎全面思考问题的能力、逻辑思维能力有所帮助。 如果你的CS基础很好,刷题不会对你的水平有很大提高,但是会帮助你快速的理解问题,将问题转化为逻辑模型,并用代码实现的这些能力有帮助。以Google面试举例,有些Google的面试题很贴近生活,就好像你日常工作会碰到的问题一样,虽然考察的知识点也许不难,但是你需要在45分钟的时间内分析问题,与面试官交流细节,给出思路,写出代码,用test case简单测试,最后分析时间/空间复杂度。如果你给出的不是最优解,还会要求你优化。 如果你经常刷题训练自己,你的反应会更加迅速,拿到一道题就能有思路,提起笔就能开始写代码,这样你会有充足的时间去优化、去和面试官交流。 熟练的写出robust的代码>会做这道题。

(4)我是怎么刷题的?

我刷题主要在leetcode。小弟才疏学浅,水平有限,与刷过几遍leetcode的大神不能比,目前leetcode进度70%,每周参加Leetcode Weekly Contest,名次大多在100-200之间,最好一次前30(佩服一下ASM大神们)。稳定做出前三题,最后一道hard题看状态。

1. 简单题。 对于新手来说,简单题是最容易上手且最容易做出来提升自信的题目。第一遍刷可以以AC为目标,但是我建议在刷题一段时间以后,回过头来看一看自己以前做过的题有没有更好的解法。我用某公司的onsite亲身经历来证明这一点。 题目如下,给定字符串A和B,A与B几乎相同但是仅多了一个char,求这个char。 这道题放在leetcode会是一道简单题,做法多种多样。在面试时,我先给出面试官两个最straight forward的解法,hashmap存char,A+B-,找出count不为0的char 以及 pointer遍历两个字符串。随即又想到了异或的做法。 面试官要求继续优化,我想到了与binary search有关,先设定字符串中没有duplicate,用binary search解决,之后对于任意字符串用binary search将时间复杂度优化为 average case O(logn) worst case O(n)。

一道简单题在面试给出了4种解法,面试官expect的比一道简单题更多。 简单题会有不简单(elegant)的解法。

2.中等难度题。 大量的去刷。这个难度的题与你面试中遇到的问题难度最为接近,你可以把这个难度的题当作面试的模拟。

3.难题。 我个人把难题分为几种:好题、题目本身不难但是test case极为复杂、题目很巧三个类型。

好题认真刷。什么是好题呢? 高频题或是不符合其他两种类型的题都算是好题。

题目本身不难但是test case极为复杂 ex leetcode atoi 题目本身不算很难,但是你需要应对各种各样的test case 这类往往在leetcode通过率较低。 如果你的面试时碰到了这样的问题,最重要的是和面试官交流,搞清楚如何应对每一种输入。负数怎么办,会不会出现小数,有leading zero怎么办,overflow怎么办等等。

题目很巧,这类题很tricky,如果你掌握了某个性质或者灵感爆发发现了某种规律,你1分钟就能做出来,但是如果你没有灵感爆发,你将做不出来这种题。这种题可以直接看答案了解一下就好了。以谷歌为例,谷歌明确表示了自己的面试不会出brain teaser或者 A~ha problem,就是指的这类题。

在刷题的过程要给自己时间的压力,通常一轮面试45-60分钟,可以参加weekly contest锻炼自己的有限的时间内写代码的能力

(5)我是怎么面试的?

不同的公司面试流程不同,有的公司喜欢问知识概念题,比如阐述一下xxx是如何工作的,有的公司喜欢问bq,比如亚马逊14条军规,但是几乎所有公司的onsite都会白板 coding。

我应对白板问题的流程大概是:

面试官提出问题 -> 我重复面试官的问题并尝试转化为数学/逻辑模型 -> 想一个基本的test case 与面试官讨论expected输出 来保证我确实理解了题目 -> 与面试官讨论assumption(比如输入是否保证valid,会不会出现overflow)-> 想几个corner case,一会写代码的时候需要注意 -> 给出一种思路(可以不是最优解)-> 写代码(think out loud 边写边解释)-> 用之前的test case跑一遍 -> 分析时间/空间复杂度 -> 面试官提出follow up或者优化 -> just do it

暂时想到了这么多,希望能有帮助!文字水平较差,写作文一直是老大难问题,好久没长篇的写中文了一下子还有点不适应,表达不清的地方还请谅解!
28条回复
热度排序

发表回复