登录
  • #码农类general
  • #工作信息
  • #求职
  • #实习
  • #zillow

小白‌‌‍‍‌‍‍‌‍‍‌‌‌‌‌‍‌‌‌‍‌‌‍‌‍‍‍‌‌‍‌‍的研究生转CS与找实习经验总结 Part4

破了洞的智囊
40315
12
小白的研究生转CS与找实习经验总结 Part4

Part1:1point3acres.comPart2:1point3acres.comPart3:1point3acres.com

已经有很久时间没有更新了,主要原因有几点。一是自己写完第三篇之后就进入了期末,非常忙; 二是虽然我没有更新,但是后台一直有在回复各种留言。其中有很多留言写得特别人站,特别扎心。更有厉害的人通过地里的树丝马迹找到了我本人的linkedin和微信,和我成为了朋友。第三呢,我也一直在构思这一篇收尾篇该怎么写,希望能讨论到一些私信给我的问题,融入一些自己开始实习后的感触等等。是的,这篇是这个系列的最后一篇了。下次等我全职稳定下来之后再继续更第二季。文末我会留下自己的微信和linkedin,有感兴趣的同学可以加一下。



稳健期

所谓稳健期,我觉得和上升期的一个区分点,就在于自己已经拿到很多面试了,各面试在你的日程表上排排坐吃果果,甚至已经有一些offer。上一篇我提到了上升期的刷题策略以及自我激励的方式,这里我主要想先分享一下自己在准备面试以及面试过程中的策略。

在前几篇中,有一个特别扎心的评论。一个很厉害的同学,名校,GPA4.0,CS背景,LeetCode已经刷了好几遍了,还有很厉害的项目背景,可惜就是找不到实习。他自己也拿到了很多面试,然而很遗憾都没有通过,于是乎来问问我有没有什么建议。

这位同学比我厉害太多。我自己是转专业的,LC刷了200题不到,也没有什么背景。我个人感觉,从简历上来说,他应该已经无可挑剔了,所以就像他说的一样,能拿到很多面试(比如Google)。而为什么面试没有成功呢,我觉得问题可能出在两个地方,一是面试前的准备,二是面试中的交流。

首先分享一下我自己关于面试前的准备的经验。当你刷了一定数量的题以后,拿到了面试,下一步就是针对这个公司、这个岗位有的放矢了。临阵磨枪主要有以下几个方面可以准备:1. LC以及其它平台上该公司的coding题(例如具有该公司tag的题)。2.网上,比如地里,career cup,glassdoor,etc. 中该公司的非coding技术题,比如编程语言基础问题、系统设计问题、操作系统、以及其它非coding的杂七杂八的问题等等。3.针对你岗位的知识点。比如我投的是data engineer,我就要多了解一下spark, hadoop等流行的分布式框架,大数据系统的一些基本原则和设计思想等等。4.该公司的特质。比如它的企业精神(使命、目标、价值观)是什么,主营业务是什么,竞争对手是谁,该公司的面试题的最大特点等等。

对于我来说,只有这四个点都准备了,才能算作是“准备充分”“问心无愧”。而如果你只是仗着自己的积累而不抱抱佛脚,挂面试的概率依然是很大的。当然,这么充分的准备,必然是针对你喜欢的公司。对于保底而投的其他公司,划划水碰运气也很正常。

往日积累、临阵磨枪、现场表现,这三点,是rock面试拿到offer的三大核心。我个人来看,其重要程度大致是3:3:4的一个比例。下面我就分享一下现场表现(phone or onsite)的个人心得。

交流、交流、交流。重要的事情说三遍。无论是电话面试,还是onsite,最重要的是交流。很多人的理想状态是,面试官给你布置一道题,然后你能bug free得很快写出最优解。但是这种程度有几点问题。第一,它很难做到。这取决于你平常的积累以及你遇到的什么题以及当场的状态。之前地里我看见有人分享过,以为自己做到了一个老题,兴高采烈地代码一通敲,结果被面试官告知写错了因为题目有变(或者说是陷阱)。更重要的是,如果你给自己这种完美的期望,很可能给自己很大的压力。实际发挥过程中,很有可能脑子卡壳,这时候便会突然紧张。最后,相比于一下子就默不作声把代码写好的人,面试官更喜欢和他一边交流一边将代码写完的人。

下面我分享一下如何和面试官进行交流,即使你碰到的是你胜券在握的题:1.读题之后,首先是clarification,思考一下各种可能的情况给这道题带来的变数。比如,常见思考方向有:数组里的数都是整数吗?有负数吗?所有的数都是distinct的吗?数组已经排序好了吗?最大数和最小数是什么?会不会有溢出?我们处理的是一个多大量级的数据?输入会不会为空?等等。要积极和面试官交流这方面的想法,给他一个好的印象,让他知道你是一个积极沟通,且思维缜密的人。当你遇到的是熟悉题,你可以借此机会游刃有余地向面试官展示一下你的沟通能力,以及仔细检查一下这题和以前遇到的有什么不同的要求。当你遇到的是陌生题,可以在这个环节拖时间,争取思考的机会。

2.Clarification之后,列backbone。在我们刚学编程的时候,多多少少都会有老师跟你说写代码要先画流程图。虽然实际上画真正流程图的时候很少,但是其核心思想是,先做计划,再付诸行动。我现在的实习过程中,上司会先让我design一个system,我的设计方案和他交流过,给他审核通过以后,我才可以start coding。面试也一样,先设计,再写代码,这是模仿了真正工作中的情景,是一个人职业素养的体现。在电话面试的时候,你可以在文本编辑器里面先把自己要用到的API写一下,用注释的形式简要概括各API是干什么的,以及你的一个总体思路。在onsite的时候,你可以列一个简要的流程图。在你做计划的时候,要注意沟通的要点,一是你自己为什么打算这么做,二是有什么可能的其它替代方案,自己的方案为什么最好,有什么trade-off,三是您看我这么计划行不行,有什么建议。等到你的计划列完,面试官approve了以后,再写代码。

3.Coding。写代码时注意简洁,排版清楚,变量命名准确,以及遵守其它良好代码风格的要求。写代码的时候和面试官的交流点在于,一,实时通知你的面试官我在写的是什么, 二,我这段代码实现了之前计划中的xxx部分。写代码的过程中切忌一声不吭。每当你完成一部分的代码,都要注意和面试官互动交流。

4.时间空间复杂度分析。代码写完之后,即使面试官不问,也要主动在他面前推导一下时间和空间复杂度。注意表述清楚你自己的思考过程,并在最后给出清晰的最终答案。

5.拓展。一般面试官会主动有follow-up。会稍微改变一下题目条件、输入等等。我目前遇到最常见的改变就是“当输入的数据量变得特别大会怎样”。在应对follow-up问题是,和面试官交流的关键在于,条件的改变对整个程序的影响、你之前的设计哪些部份不需要改变、哪些需要改变、新的时间空间复杂度是多少。

以上便是我能总结出来的时机面试中可以进行互动和交流的关键点。很多中国学生的短板在于不会沟通交流,不会积极主动为自己赢得机会窗口,遇到困难不会巧妙地争取帮助。如果你认为自己是一个不太擅长交流的人,我的上述面试交流题纲可以称为一个参考,能让自己心中有个数,怎么样挑起话题,什么阶段交流什么内容,等等。

还有一个点就是behavior部分。behavior题目千千万,我也不想在这里探究,最重要的只有三个:1.Please provide a short self-intro2.Why you choose us?3.Do you have any questions for me?

这三个,在参加任何公司的面试之前都要好好准备。网上资料很多,我这里也就不写了。



实习开始后再回顾之前的准备

目前实习已经两周结束,自己学到了很多东西,也有很多感触,这里和大家分享一下。

第一点是“现学现用”。我曾经在之前的文章中强烈地批判了一个错误的观点:有的人不愿参加招聘会,不愿投简历,认为自己“没准备好”,想等自己“准备好了”,再找工作。我在之前就已经说过我为什么非常不赞成这种观点了,而在参加工作之后,更是感触深刻。

不同公司使用不同的工具,而作为一个新来的,你会发现很多很多的都没有接触过,有相当多的东西要学。比如,我之前在做data pipeline的时候用的工具是kafka, spark, cassandra, zookeeper, mesos, nodejs等等,而现在我们用的是airflow, emr, spark, sqoop, hive, sql server等等,有相当多的东西之前都没有“学”过。比如说我的第一个任务是理解当前使用的C#代码,并且将它用python重写。我自己可是以前从未接触过C#代码,那怎么办?

很多人又一个学生时代的传统思维,那就是我要先系统地学一个东西,学会了再拿来使用、做项目。比如在大学里上课,先上一学期的java基础课,再上一个学期的java提高课,再通过考试、做作业来熟悉一下,最后来个项目,这样我的java已经“学会”了,就可以运用了。这么一个流程在工作中是不适用的。绝大多数的情况下,对于在工作中你所需要用到的工具,你完全没有时间去系统地“学习”它。而是只能从完全不懂,一边文档,一边问前辈问题,一边把自己的工作做了。是一个“现学现用”的模式,而不是“学了再用”的模式。

所以,这里重要的是你的学习能力和你的沟通能力,而其中沟通能力尤为重要。当自己在某些问题上卡壳了的时候,要积极地寻求帮助。有时候自己看一天文档都不能解决的问题,前辈一两句话就能把你点拨懂。我们在自己的日常学习生活中,也要注意培养这种现学现用的能力,不要认为自己总是一定要“学会”了,“准备充分”了,才能开始做事。就像我之前说的,即使你还没开始刷题,也要积极地利用秋招春招的机会多多参加career fair,广投简历,以面试为milestone激励自己现学现用,逐步成长。有时间可以参加参加含金量高的hackathon。

第二点,工作中真的用得到那些算法和数据结构吗?很少,几乎不用。很多码农的工作,主要还是实现一些系统啊、架构啊,或者前端啊等等,真正用到数据结构和算法的机会真的是少之又少。这点在crack code interview这本书中也提到过。那么,这些“屠龙之术”,既然用不到,又为何在面试中这么强调呢?主要有几个原因:1.算法数据结构,这是一个纯粹的思维和逻辑的训练。2.它提供了一个将不同水平、不同思维能力的人区分的一个标尺。3.它是测试你分析解决问题能力、沟通能力的一个介质。

意识到了这些以后,可能会对一些人在对于刷题这个问题上的看法有一些启发。至少我自己受到的启发是:刷题一定要积极思考,积极探索各种可能的方案,注重各方案的比较权衡,注意提取解题方案的核心思想。第二就是,刷题相比于项目,还是平常的项目积累更重要一点。多锻炼一些与人沟通的能力,多尝试使用新的工具、参加开源项目,对工作的帮助远比刷题大得多。



结语

大约一个月以前,当我邮箱中收到cisco offer的时候,我盯着它看了半天。因为,当我在准备cisco面试时,是我最痛苦和挣扎的时候。之前好多面试都杳无音信,早已被拒到麻木,课程又忙不过来。而那时的我,认为cisco是自己最后一根救命稻草。

后来,自己陆续收到了包括zillow, ebay等公司的offer,心态与当初已截然不同。因此,当看到这封邮件,触动自己回想起当初最艰难的岁月之时,仿佛有一种时空穿越感。

艾森豪威尔曾经说过:“在准备战争之时,我总会发现计划毫无用处,然而,计划却又是不可或缺的。”我们曾经也不只一次体会过,所谓“计划就是用来推翻的”,这一人生哲理。

是啊,当自己一路走来,再回头看看自己足迹的时候,会感到自己当初的很多想法,都是那么的可笑和幼稚。

虽然当初的计划已经面目全非,但是我们在前行的道路上,不断尝试、不断摸索、不断修正自己的预期、又不断成功和失败。自己计划的每一次变动,都是在实现更好的自己。

这可不就是成长么。



========想继续交流的童鞋可以加linkedin:linkedin.com或者微信:Karel_Skywalker记得备注



























12条回复
热度排序

发表回复